dom/wifi/DOMWifiManager.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/dom/wifi/DOMWifiManager.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,430 @@
     1.4 +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     1.5 +/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
     1.6 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this file,
     1.8 + * You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.9 +
    1.10 +"use strict";
    1.11 +
    1.12 +const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
    1.13 +
    1.14 +Cu.import("resource://gre/modules/XPCOMUtils.jsm");
    1.15 +Cu.import("resource://gre/modules/Services.jsm");
    1.16 +Cu.import("resource://gre/modules/DOMRequestHelper.jsm");
    1.17 +
    1.18 +const DEBUG = false; // set to false to suppress debug messages
    1.19 +
    1.20 +const DOMWIFIMANAGER_CONTRACTID = "@mozilla.org/wifimanager;1";
    1.21 +const DOMWIFIMANAGER_CID        = Components.ID("{c9b5f09e-25d2-40ca-aef4-c4d13d93c706}");
    1.22 +
    1.23 +function MozWifiNetwork() {
    1.24 +}
    1.25 +
    1.26 +MozWifiNetwork.prototype = {
    1.27 +
    1.28 +  init: function(aWindow) {
    1.29 +    this._window = aWindow;
    1.30 +  },
    1.31 +
    1.32 +  __init: function(obj) {
    1.33 +    for (let key in obj) {
    1.34 +      this[key] = obj[key];
    1.35 +    }
    1.36 +  },
    1.37 +
    1.38 +  classID: Components.ID("{c01fd751-43c0-460a-8b64-abf652ec7220}"),
    1.39 +  contractID: "@mozilla.org/mozwifinetwork;1",
    1.40 +  QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports,
    1.41 +                                         Ci.nsIDOMGlobalPropertyInitializer])
    1.42 +};
    1.43 +
    1.44 +function MozWifiConnection(obj) {
    1.45 +  this.status = obj.status;
    1.46 +  this.network = obj.network;
    1.47 +}
    1.48 +
    1.49 +MozWifiConnection.prototype = {
    1.50 +  classID: Components.ID("{23579da4-201b-4319-bd42-9b7f337343ac}"),
    1.51 +  contractID: "@mozilla.org/mozwificonnection;1",
    1.52 +  QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports])
    1.53 +};
    1.54 +
    1.55 +function MozWifiConnectionInfo(obj) {
    1.56 +  this.signalStrength = obj.signalStrength;
    1.57 +  this.relSignalStrength = obj.relSignalStrength;
    1.58 +  this.linkSpeed = obj.linkSpeed;
    1.59 +  this.ipAddress = obj.ipAddress;
    1.60 +}
    1.61 +
    1.62 +MozWifiConnectionInfo.prototype = {
    1.63 +  classID: Components.ID("{83670352-6ed4-4c35-8de9-402296a1959c}"),
    1.64 +  contractID: "@mozilla.org/mozwificonnectioninfo;1",
    1.65 +  QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports])
    1.66 +}
    1.67 +
    1.68 +function DOMWifiManager() {
    1.69 +  this.defineEventHandlerGetterSetter("onstatuschange");
    1.70 +  this.defineEventHandlerGetterSetter("onconnectionInfoUpdate");
    1.71 +  this.defineEventHandlerGetterSetter("onenabled");
    1.72 +  this.defineEventHandlerGetterSetter("ondisabled");
    1.73 +}
    1.74 +
    1.75 +DOMWifiManager.prototype = {
    1.76 +  __proto__: DOMRequestIpcHelper.prototype,
    1.77 +  classDescription: "DOMWifiManager",
    1.78 +  classID: DOMWIFIMANAGER_CID,
    1.79 +  contractID: DOMWIFIMANAGER_CONTRACTID,
    1.80 +  QueryInterface: XPCOMUtils.generateQI([Ci.nsIDOMGlobalPropertyInitializer,
    1.81 +                                         Ci.nsISupportsWeakReference,
    1.82 +                                         Ci.nsIObserver]),
    1.83 +
    1.84 +  // nsIDOMGlobalPropertyInitializer implementation
    1.85 +  init: function(aWindow) {
    1.86 +    // Maintain this state for synchronous APIs.
    1.87 +    this._currentNetwork = null;
    1.88 +    this._connectionStatus = "disconnected";
    1.89 +    this._enabled = false;
    1.90 +    this._lastConnectionInfo = null;
    1.91 +
    1.92 +    const messages = ["WifiManager:getNetworks:Return:OK", "WifiManager:getNetworks:Return:NO",
    1.93 +                      "WifiManager:getKnownNetworks:Return:OK", "WifiManager:getKnownNetworks:Return:NO",
    1.94 +                      "WifiManager:associate:Return:OK", "WifiManager:associate:Return:NO",
    1.95 +                      "WifiManager:forget:Return:OK", "WifiManager:forget:Return:NO",
    1.96 +                      "WifiManager:wps:Return:OK", "WifiManager:wps:Return:NO",
    1.97 +                      "WifiManager:setPowerSavingMode:Return:OK", "WifiManager:setPowerSavingMode:Return:NO",
    1.98 +                      "WifiManager:setHttpProxy:Return:OK", "WifiManager:setHttpProxy:Return:NO",
    1.99 +                      "WifiManager:setStaticIpMode:Return:OK", "WifiManager:setStaticIpMode:Return:NO",
   1.100 +                      "WifiManager:wifiDown", "WifiManager:wifiUp",
   1.101 +                      "WifiManager:onconnecting", "WifiManager:onassociate",
   1.102 +                      "WifiManager:onconnect", "WifiManager:ondisconnect",
   1.103 +                      "WifiManager:onwpstimeout", "WifiManager:onwpsfail",
   1.104 +                      "WifiManager:onwpsoverlap", "WifiManager:connectionInfoUpdate",
   1.105 +                      "WifiManager:onconnectingfailed"];
   1.106 +    this.initDOMRequestHelper(aWindow, messages);
   1.107 +    this._mm = Cc["@mozilla.org/childprocessmessagemanager;1"].getService(Ci.nsISyncMessageSender);
   1.108 +
   1.109 +    var state = this._mm.sendSyncMessage("WifiManager:getState")[0];
   1.110 +    if (state) {
   1.111 +      this._currentNetwork = this._convertWifiNetwork(state.network);
   1.112 +      this._lastConnectionInfo = this._convertConnectionInfo(state.connectionInfo);
   1.113 +      this._enabled = state.enabled;
   1.114 +      this._connectionStatus = state.status;
   1.115 +      this._macAddress = state.macAddress;
   1.116 +    } else {
   1.117 +      this._currentNetwork = null;
   1.118 +      this._lastConnectionInfo = null;
   1.119 +      this._enabled = false;
   1.120 +      this._connectionStatus = "disconnected";
   1.121 +      this._macAddress = "";
   1.122 +    }
   1.123 +  },
   1.124 +
   1.125 +  _convertWifiNetworkToJSON: function(aNetwork) {
   1.126 +    let json = {};
   1.127 +
   1.128 +    for (let key in aNetwork) {
   1.129 +      // In WifiWorker.js there are lots of check using "key in network".
   1.130 +      // So if the value of any property of WifiNetwork is undefined, do not clone it.
   1.131 +      if (aNetwork[key] != undefined) {
   1.132 +        json[key] = aNetwork[key];
   1.133 +      }
   1.134 +    }
   1.135 +    return json;
   1.136 +  },
   1.137 +
   1.138 +  _convertWifiNetwork: function(aNetwork) {
   1.139 +    let network = aNetwork ? new this._window.MozWifiNetwork(aNetwork) : null;
   1.140 +    return network;
   1.141 +  },
   1.142 +
   1.143 +  _convertWifiNetworks: function(aNetworks) {
   1.144 +    let networks = [];
   1.145 +    for (let i in aNetworks) {
   1.146 +      networks.push(this._convertWifiNetwork(aNetworks[i]));
   1.147 +    }
   1.148 +    return networks;
   1.149 +  },
   1.150 +
   1.151 +  _convertConnection: function(aConn) {
   1.152 +    let conn = aConn ? new MozWifiConnection(aConn) : null;
   1.153 +    return conn;
   1.154 +  },
   1.155 +
   1.156 +  _convertConnectionInfo: function(aInfo) {
   1.157 +    let info = aInfo ? new MozWifiConnectionInfo(aInfo) : null;
   1.158 +    return info;
   1.159 +  },
   1.160 +
   1.161 +  _sendMessageForRequest: function(name, data, request) {
   1.162 +    let id = this.getRequestId(request);
   1.163 +    this._mm.sendAsyncMessage(name, { data: data, rid: id, mid: this._id });
   1.164 +  },
   1.165 +
   1.166 +  receiveMessage: function(aMessage) {
   1.167 +    let msg = aMessage.json;
   1.168 +    if (msg.mid && msg.mid != this._id)
   1.169 +      return;
   1.170 +
   1.171 +    let request;
   1.172 +    if (msg.rid) {
   1.173 +      request = this.takeRequest(msg.rid);
   1.174 +      if (!request) {
   1.175 +        return;
   1.176 +      }
   1.177 +    }
   1.178 +
   1.179 +    switch (aMessage.name) {
   1.180 +      case "WifiManager:getNetworks:Return:OK":
   1.181 +        Services.DOMRequest.fireSuccess(request, this._convertWifiNetworks(msg.data));
   1.182 +        break;
   1.183 +
   1.184 +      case "WifiManager:getNetworks:Return:NO":
   1.185 +        Services.DOMRequest.fireError(request, "Unable to scan for networks");
   1.186 +        break;
   1.187 +
   1.188 +      case "WifiManager:getKnownNetworks:Return:OK":
   1.189 +        Services.DOMRequest.fireSuccess(request, this._convertWifiNetworks(msg.data));
   1.190 +        break;
   1.191 +
   1.192 +      case "WifiManager:getKnownNetworks:Return:NO":
   1.193 +        Services.DOMRequest.fireError(request, "Unable to get known networks");
   1.194 +        break;
   1.195 +
   1.196 +      case "WifiManager:associate:Return:OK":
   1.197 +        Services.DOMRequest.fireSuccess(request, true);
   1.198 +        break;
   1.199 +
   1.200 +      case "WifiManager:associate:Return:NO":
   1.201 +        Services.DOMRequest.fireError(request, "Unable to add the network");
   1.202 +        break;
   1.203 +
   1.204 +      case "WifiManager:forget:Return:OK":
   1.205 +        Services.DOMRequest.fireSuccess(request, true);
   1.206 +        break;
   1.207 +
   1.208 +      case "WifiManager:forget:Return:NO":
   1.209 +        Services.DOMRequest.fireError(request, msg.data);
   1.210 +        break;
   1.211 +
   1.212 +      case "WifiManager:wps:Return:OK":
   1.213 +        Services.DOMRequest.fireSuccess(request, msg.data);
   1.214 +        break;
   1.215 +
   1.216 +      case "WifiManager:wps:Return:NO":
   1.217 +        Services.DOMRequest.fireError(request, msg.data);
   1.218 +        break;
   1.219 +
   1.220 +      case "WifiManager:setPowerSavingMode:Return:OK":
   1.221 +        Services.DOMRequest.fireSuccess(request, msg.data);
   1.222 +        break;
   1.223 +
   1.224 +      case "WifiManager:setPowerSavingMode:Return:NO":
   1.225 +        Services.DOMRequest.fireError(request, msg.data);
   1.226 +        break;
   1.227 +
   1.228 +      case "WifiManager:setHttpProxy:Return:OK":
   1.229 +        Services.DOMRequest.fireSuccess(request, msg.data);
   1.230 +        break;
   1.231 +
   1.232 +      case "WifiManager:setHttpProxy:Return:NO":
   1.233 +        Services.DOMRequest.fireError(request, msg.data);
   1.234 +        break;
   1.235 +
   1.236 +      case "WifiManager:setStaticIpMode:Return:OK":
   1.237 +        Services.DOMRequest.fireSuccess(request, msg.data);
   1.238 +        break;
   1.239 +
   1.240 +      case "WifiManager:setStaticIpMode:Return:NO":
   1.241 +        Services.DOMRequest.fireError(request, msg.data);
   1.242 +        break;
   1.243 +
   1.244 +      case "WifiManager:wifiDown":
   1.245 +        this._enabled = false;
   1.246 +        this._currentNetwork = null;
   1.247 +        this._fireEnabledOrDisabled(false);
   1.248 +        break;
   1.249 +
   1.250 +      case "WifiManager:wifiUp":
   1.251 +        this._enabled = true;
   1.252 +        this._macAddress = msg.macAddress;
   1.253 +        this._fireEnabledOrDisabled(true);
   1.254 +        break;
   1.255 +
   1.256 +      case "WifiManager:onconnecting":
   1.257 +        this._currentNetwork = this._convertWifiNetwork(msg.network);
   1.258 +        this._connectionStatus = "connecting";
   1.259 +        this._fireStatusChangeEvent();
   1.260 +        break;
   1.261 +
   1.262 +      case "WifiManager:onassociate":
   1.263 +        this._currentNetwork = this._convertWifiNetwork(msg.network);
   1.264 +        this._connectionStatus = "associated";
   1.265 +        this._fireStatusChangeEvent();
   1.266 +        break;
   1.267 +
   1.268 +      case "WifiManager:onconnect":
   1.269 +        this._currentNetwork = this._convertWifiNetwork(msg.network);
   1.270 +        this._connectionStatus = "connected";
   1.271 +        this._fireStatusChangeEvent();
   1.272 +        break;
   1.273 +
   1.274 +      case "WifiManager:ondisconnect":
   1.275 +        this._currentNetwork = null;
   1.276 +        this._connectionStatus = "disconnected";
   1.277 +        this._lastConnectionInfo = null;
   1.278 +        this._fireStatusChangeEvent();
   1.279 +        break;
   1.280 +
   1.281 +      case "WifiManager:onwpstimeout":
   1.282 +        this._currentNetwork = null;
   1.283 +        this._connectionStatus = "wps-timedout";
   1.284 +        this._lastConnectionInfo = null;
   1.285 +        this._fireStatusChangeEvent();
   1.286 +        break;
   1.287 +
   1.288 +      case "WifiManager:onwpsfail":
   1.289 +        this._currentNetwork = null;
   1.290 +        this._connectionStatus = "wps-failed";
   1.291 +        this._lastConnectionInfo = null;
   1.292 +        this._fireStatusChangeEvent();
   1.293 +        break;
   1.294 +
   1.295 +      case "WifiManager:onwpsoverlap":
   1.296 +        this._currentNetwork = null;
   1.297 +        this._connectionStatus = "wps-overlapped";
   1.298 +        this._lastConnectionInfo = null;
   1.299 +        this._fireStatusChangeEvent();
   1.300 +        break;
   1.301 +
   1.302 +      case "WifiManager:connectionInfoUpdate":
   1.303 +        this._lastConnectionInfo = this._convertConnectionInfo(msg);
   1.304 +        this._fireConnectionInfoUpdate(msg);
   1.305 +        break;
   1.306 +      case "WifiManager:onconnectingfailed":
   1.307 +        this._currentNetwork = null;
   1.308 +        this._connectionStatus = "connectingfailed";
   1.309 +        this._lastConnectionInfo = null;
   1.310 +        this._fireStatusChangeEvent();
   1.311 +        break;
   1.312 +    }
   1.313 +  },
   1.314 +
   1.315 +  _fireStatusChangeEvent: function StatusChangeEvent() {
   1.316 +    var event = new this._window.MozWifiStatusChangeEvent("statuschange",
   1.317 +                                                          { network: this._currentNetwork,
   1.318 +                                                            status: this._connectionStatus
   1.319 +                                                          });
   1.320 +    this.__DOM_IMPL__.dispatchEvent(event);
   1.321 +  },
   1.322 +
   1.323 +  _fireConnectionInfoUpdate: function onConnectionInfoUpdate(info) {
   1.324 +    var evt = new this._window.MozWifiConnectionInfoEvent("connectioninfoupdate",
   1.325 +                                                          { network: this._currentNetwork,
   1.326 +                                                            signalStrength: info.signalStrength,
   1.327 +                                                            relSignalStrength: info.relSignalStrength,
   1.328 +                                                            linkSpeed: info.linkSpeed,
   1.329 +                                                            ipAddress: info.ipAddress,
   1.330 +                                                          });
   1.331 +    this.__DOM_IMPL__.dispatchEvent(evt);
   1.332 +  },
   1.333 +
   1.334 +  _fireEnabledOrDisabled: function enabledDisabled(enabled) {
   1.335 +    var evt = new this._window.Event(enabled ? "enabled" : "disabled");
   1.336 +    this.__DOM_IMPL__.dispatchEvent(evt);
   1.337 +  },
   1.338 +
   1.339 +  getNetworks: function getNetworks() {
   1.340 +    var request = this.createRequest();
   1.341 +    this._sendMessageForRequest("WifiManager:getNetworks", null, request);
   1.342 +    return request;
   1.343 +  },
   1.344 +
   1.345 +  getKnownNetworks: function getKnownNetworks() {
   1.346 +    var request = this.createRequest();
   1.347 +    this._sendMessageForRequest("WifiManager:getKnownNetworks", null, request);
   1.348 +    return request;
   1.349 +  },
   1.350 +
   1.351 +  associate: function associate(network) {
   1.352 +    var request = this.createRequest();
   1.353 +    this._sendMessageForRequest("WifiManager:associate",
   1.354 +                                this._convertWifiNetworkToJSON(network), request);
   1.355 +    return request;
   1.356 +  },
   1.357 +
   1.358 +  forget: function forget(network) {
   1.359 +    var request = this.createRequest();
   1.360 +    this._sendMessageForRequest("WifiManager:forget",
   1.361 +                                this._convertWifiNetworkToJSON(network), request);
   1.362 +    return request;
   1.363 +  },
   1.364 +
   1.365 +  wps: function wps(detail) {
   1.366 +    var request = this.createRequest();
   1.367 +    this._sendMessageForRequest("WifiManager:wps", detail, request);
   1.368 +    return request;
   1.369 +  },
   1.370 +
   1.371 +  setPowerSavingMode: function setPowerSavingMode(enabled) {
   1.372 +    var request = this.createRequest();
   1.373 +    this._sendMessageForRequest("WifiManager:setPowerSavingMode", enabled, request);
   1.374 +    return request;
   1.375 +  },
   1.376 +
   1.377 +  setHttpProxy: function setHttpProxy(network, info) {
   1.378 +    var request = this.createRequest();
   1.379 +    this._sendMessageForRequest("WifiManager:setHttpProxy",
   1.380 +                                { network: this._convertWifiNetworkToJSON(network), info:info}, request);
   1.381 +    return request;
   1.382 +  },
   1.383 +
   1.384 +  setStaticIpMode: function setStaticIpMode(network, info) {
   1.385 +    var request = this.createRequest();
   1.386 +    this._sendMessageForRequest("WifiManager:setStaticIpMode",
   1.387 +                                { network: this._convertWifiNetworkToJSON(network), info: info}, request);
   1.388 +    return request;
   1.389 +  },
   1.390 +
   1.391 +  get enabled() {
   1.392 +    return this._enabled;
   1.393 +  },
   1.394 +
   1.395 +  get macAddress() {
   1.396 +    return this._macAddress;
   1.397 +  },
   1.398 +
   1.399 +  get connection() {
   1.400 +    let _connection = this._convertConnection({ status: this._connectionStatus,
   1.401 +                                                network: this._currentNetwork,
   1.402 +                                              });
   1.403 +    return _connection;
   1.404 +  },
   1.405 +
   1.406 +  get connectionInformation() {
   1.407 +    return this._lastConnectionInfo;
   1.408 +  },
   1.409 +
   1.410 +  defineEventHandlerGetterSetter: function(name) {
   1.411 +    Object.defineProperty(this, name, {
   1.412 +      get: function() {
   1.413 +        return this.__DOM_IMPL__.getEventHandler(name);
   1.414 +      },
   1.415 +      set: function(handler) {
   1.416 +        this.__DOM_IMPL__.setEventHandler(name, handler);
   1.417 +      }
   1.418 +    });
   1.419 +  },
   1.420 +};
   1.421 +
   1.422 +this.NSGetFactory = XPCOMUtils.generateNSGetFactory([
   1.423 +  DOMWifiManager, MozWifiNetwork, MozWifiConnection, MozWifiConnectionInfo
   1.424 +]);
   1.425 +
   1.426 +let debug;
   1.427 +if (DEBUG) {
   1.428 +  debug = function (s) {
   1.429 +    dump("-*- DOMWifiManager component: " + s + "\n");
   1.430 +  };
   1.431 +} else {
   1.432 +  debug = function (s) {};
   1.433 +}

mercurial