зеркало из https://github.com/mozilla/gecko-dev.git
Bug 948743 - Query interface stat directly. r=vchang, r=acperez
This commit is contained in:
Родитель
551565a5c9
Коммит
13170da6b2
|
@ -8,6 +8,8 @@ const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
|
|||
|
||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
Cu.import("resource://gre/modules/NetUtil.jsm");
|
||||
Cu.import("resource://gre/modules/FileUtils.jsm");
|
||||
|
||||
const NETWORKSERVICE_CONTRACTID = "@mozilla.org/network/service;1";
|
||||
const NETWORKSERVICE_CID = Components.ID("{c14cabaf-bb8e-470d-a2f1-2cb6de6c5e5c}");
|
||||
|
@ -52,7 +54,7 @@ function NetworkService() {
|
|||
this.worker = new ChromeWorker("resource://gre/modules/net_worker.js");
|
||||
this.worker.onmessage = this.handleWorkerMessage.bind(this);
|
||||
this.worker.onerror = function onerror(event) {
|
||||
if(DEBUG) debug("Received error from worker: " + event.filename +
|
||||
if(DEBUG) debug("Received error from worker: " + event.filename +
|
||||
":" + event.lineno + ": " + event.message + "\n");
|
||||
// Prevent the event from bubbling any further.
|
||||
event.preventDefault();
|
||||
|
@ -107,18 +109,37 @@ NetworkService.prototype = {
|
|||
|
||||
getNetworkInterfaceStats: function(networkName, callback) {
|
||||
if(DEBUG) debug("getNetworkInterfaceStats for " + networkName);
|
||||
let file = new FileUtils.File("/proc/net/dev");
|
||||
|
||||
let params = {
|
||||
cmd: "getNetworkInterfaceStats",
|
||||
ifname: networkName
|
||||
};
|
||||
if (!file) {
|
||||
callback.networkStatsAvailable(false, -1, -1, new Date());
|
||||
return;
|
||||
}
|
||||
|
||||
params.report = true;
|
||||
params.isAsync = true;
|
||||
NetUtil.asyncFetch(file, function(inputStream, status) {
|
||||
let result = {
|
||||
success: true, // netd always return success even interface doesn't exist.
|
||||
rxBytes: 0,
|
||||
txBytes: 0
|
||||
};
|
||||
result.date = new Date();
|
||||
|
||||
this.controlMessage(params, function(result) {
|
||||
let success = !isError(result.resultCode);
|
||||
callback.networkStatsAvailable(success, result.rxBytes,
|
||||
if (Components.isSuccessCode(status)) {
|
||||
// Find record for corresponding interface.
|
||||
let statExpr = / +(\S+): +(\d+) +\d+ +\d+ +\d+ +\d+ +\d+ +\d+ +\d+ +(\d+) +\d+ +\d+ +\d+ +\d+ +\d+ +\d+ +\d+/;
|
||||
let data = NetUtil.readInputStreamToString(inputStream,
|
||||
inputStream.available()).split("\n");
|
||||
for (let i = 2; i < data.length; i++) {
|
||||
let parseResult = statExpr.exec(data[i]);
|
||||
if (parseResult && parseResult[1] === networkName) {
|
||||
result.rxBytes = parseInt(parseResult[2], 10);
|
||||
result.txBytes = parseInt(parseResult[3], 10);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
callback.networkStatsAvailable(result.success, result.rxBytes,
|
||||
result.txBytes, result.date);
|
||||
});
|
||||
},
|
||||
|
|
|
@ -142,19 +142,6 @@ function usbTetheringSuccess(params) {
|
|||
return true;
|
||||
}
|
||||
|
||||
function networkInterfaceStatsFail(params) {
|
||||
// Notify the main thread.
|
||||
postMessage(params);
|
||||
return true;
|
||||
}
|
||||
|
||||
function networkInterfaceStatsSuccess(params) {
|
||||
// Notify the main thread.
|
||||
params.txBytes = parseFloat(params.resultReason);
|
||||
postMessage(params);
|
||||
return true;
|
||||
}
|
||||
|
||||
function networkInterfaceAlarmFail(params) {
|
||||
// Notify the main thread.
|
||||
postMessage(params);
|
||||
|
@ -607,18 +594,6 @@ function stopSoftAP(params, callback) {
|
|||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function getRxBytes(params, callback) {
|
||||
let command = "interface readrxcounter " + params.ifname;
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function getTxBytes(params, callback) {
|
||||
params.rxBytes = parseFloat(params.resultReason);
|
||||
|
||||
let command = "interface readtxcounter " + params.ifname;
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function enableAlarm(params, callback) {
|
||||
let command = "bandwidth enable";
|
||||
return doCommand(command, callback);
|
||||
|
@ -933,24 +908,6 @@ function setUSBTethering(params) {
|
|||
return true;
|
||||
}
|
||||
|
||||
let gNetworkInterfaceStatsChain = [getRxBytes,
|
||||
getTxBytes,
|
||||
networkInterfaceStatsSuccess];
|
||||
|
||||
/**
|
||||
* handling main thread's get network interface stats request
|
||||
*/
|
||||
function getNetworkInterfaceStats(params) {
|
||||
debug("getNetworkInterfaceStats: " + params.ifname);
|
||||
|
||||
params.rxBytes = -1;
|
||||
params.txBytes = -1;
|
||||
params.date = new Date();
|
||||
|
||||
chain(params, gNetworkInterfaceStatsChain, networkInterfaceStatsFail);
|
||||
return true;
|
||||
}
|
||||
|
||||
let gNetworkInterfaceEnableAlarmChain = [enableAlarm,
|
||||
setQuota,
|
||||
setAlarm,
|
||||
|
|
Загрузка…
Ссылка в новой задаче