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 +}