/firefox-14.0.1/mozilla-release/dom/wifi/DOMWifiManager.js

# · JavaScript · 295 lines · 236 code · 50 blank · 9 comment · 22 complexity · 7b66bdc127f5b197bcf317482c2466b3 MD5 · raw file

  1. /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
  3. /* This Source Code Form is subject to the terms of the Mozilla Public
  4. * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  5. * You can obtain one at http://mozilla.org/MPL/2.0/. */
  6. "use strict";
  7. const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
  8. Cu.import("resource://gre/modules/XPCOMUtils.jsm");
  9. Cu.import("resource://gre/modules/Services.jsm");
  10. Cu.import("resource://gre/modules/DOMRequestHelper.jsm");
  11. const DEBUG = false; // set to false to suppress debug messages
  12. const DOMWIFIMANAGER_CONTRACTID = "@mozilla.org/wifimanager;1";
  13. const DOMWIFIMANAGER_CID = Components.ID("{2cf775a7-1837-410c-9e26-323c42e076da}");
  14. function DOMWifiManager() {
  15. }
  16. DOMWifiManager.prototype = {
  17. __proto__: DOMRequestIpcHelper.prototype,
  18. classID: DOMWIFIMANAGER_CID,
  19. classInfo: XPCOMUtils.generateCI({classID: DOMWIFIMANAGER_CID,
  20. contractID: DOMWIFIMANAGER_CONTRACTID,
  21. classDescription: "DOMWifiManager",
  22. interfaces: [Ci.nsIDOMWifiManager],
  23. flags: Ci.nsIClassInfo.DOM_OBJECT}),
  24. QueryInterface: XPCOMUtils.generateQI([Ci.nsIDOMWifiManager,
  25. Ci.nsIDOMGlobalPropertyInitializer]),
  26. // nsIDOMGlobalPropertyInitializer implementation
  27. init: function(aWindow) {
  28. let principal = aWindow.document.nodePrincipal;
  29. let secMan = Cc["@mozilla.org/scriptsecuritymanager;1"].getService(Ci.nsIScriptSecurityManager);
  30. let perm = (principal == secMan.getSystemPrincipal()) ?
  31. Ci.nsIPermissionManager.ALLOW_ACTION :
  32. Services.perms.testExactPermission(principal.URI, "wifi-manage");
  33. // Only pages with perm set can use the wifi manager.
  34. this._hasPrivileges = perm == Ci.nsIPermissionManager.ALLOW_ACTION;
  35. // Maintain this state for synchronous APIs.
  36. this._currentNetwork = null;
  37. this._connectionStatus = "disconnected";
  38. this._enabled = true;
  39. this._lastConnectionInfo = null;
  40. const messages = ["WifiManager:setEnabled:Return:OK", "WifiManager:setEnabled:Return:NO",
  41. "WifiManager:getNetworks:Return:OK", "WifiManager:getNetworks:Return:NO",
  42. "WifiManager:associate:Return:OK", "WifiManager:associate:Return:NO",
  43. "WifiManager:forget:Return:OK", "WifiManager:forget:Return:NO",
  44. "WifiManager:onconnecting", "WifiManager:onassociate",
  45. "WifiManager:onconnect", "WifiManager:ondisconnect",
  46. "WifiManager:connectionInfoUpdate"];
  47. this.initHelper(aWindow, messages);
  48. this._mm = Cc["@mozilla.org/childprocessmessagemanager;1"].getService(Ci.nsISyncMessageSender);
  49. var state = this._mm.sendSyncMessage("WifiManager:getState")[0];
  50. if (state) {
  51. this._currentNetwork = state.network;
  52. this._lastConnectionInfo = state.connectionInfo;
  53. this._enabled = state.enabled;
  54. this._connectionStatus = state.status;
  55. } else {
  56. this._currentNetwork = null;
  57. this._lastConnectionInfo = null;
  58. this._enabled = false;
  59. this._connectionStatus = "disconnected";
  60. }
  61. },
  62. uninit: function() {
  63. this._onConnecting = null;
  64. this._onAssociate = null;
  65. this._onConnect = null;
  66. this._onDisconnect = null;
  67. this._onConnectionInfoUpdate = null;
  68. },
  69. _sendMessageForRequest: function(name, data, request) {
  70. let id = this.getRequestId(request);
  71. this._mm.sendAsyncMessage(name, { data: data, rid: id, mid: this._id });
  72. },
  73. receiveMessage: function(aMessage) {
  74. let msg = aMessage.json;
  75. if (msg.mid && msg.mid != this._id)
  76. return;
  77. let request;
  78. switch (aMessage.name) {
  79. case "WifiManager:setEnabled:Return:OK":
  80. request = this.takeRequest(msg.rid);
  81. this._enabled = msg.data;
  82. if (!this._enabled)
  83. this._currentNetwork = null;
  84. Services.DOMRequest.fireSuccess(request, true);
  85. break;
  86. case "WifiManager:setEnabled:Return:NO":
  87. request = this.takeRequest(msg.rid);
  88. Services.DOMRequest.fireError(request, "Unable to initialize wifi");
  89. break;
  90. case "WifiManager:getNetworks:Return:OK":
  91. request = this.takeRequest(msg.rid);
  92. Services.DOMRequest.fireSuccess(request, msg.data);
  93. break;
  94. case "WifiManager:getNetworks:Return:NO":
  95. request = this.takeRequest(msg.rid);
  96. Services.DOMRequest.fireError(request, "Unable to scan for networks");
  97. break;
  98. case "WifiManager:associate:Return:OK":
  99. request = this.takeRequest(msg.rid);
  100. Services.DOMRequest.fireSuccess(request, true);
  101. break;
  102. case "WifiManager:associate:Return:NO":
  103. request = this.takeRequest(msg.rid);
  104. Services.DOMRequest.fireError(request, "Unable to add the network");
  105. break;
  106. case "WifiManager:forget:Return:OK":
  107. request = this.takeRequest(msg.rid);
  108. Services.DOMRequest.fireSuccess(request, true);
  109. break;
  110. case "WifiManager:forget:Return:NO":
  111. request = this.takeRequest(msg.rid);
  112. Services.DOMRequest.fireError(request, msg.data);
  113. break;
  114. case "WifiManager:onconnecting":
  115. this._currentNetwork = msg.network;
  116. this._connectionStatus = "connecting";
  117. this._fireStatusChangeEvent();
  118. break;
  119. case "WifiManager:onassociate":
  120. this._currentNetwork = msg.network;
  121. this._connectionStatus = "associated";
  122. this._fireStatusChangeEvent();
  123. break;
  124. case "WifiManager:onconnect":
  125. this._currentNetwork = msg.network;
  126. this._connectionStatus = "connected";
  127. this._fireStatusChangeEvent();
  128. break;
  129. case "WifiManager:ondisconnect":
  130. this._currentNetwork = null;
  131. this._connectionStatus = "disconnected";
  132. this._lastConnectionInfo = null;
  133. this._fireStatusChangeEvent();
  134. break;
  135. case "WifiManager:connectionInfoUpdate":
  136. this._lastConnectionInfo = msg;
  137. this._fireConnectionInfoUpdate(msg);
  138. break;
  139. }
  140. },
  141. _fireStatusChangeEvent: function StatusChangeEvent() {
  142. if (this._onStatusChange) {
  143. var event = new WifiStatusChangeEvent(this._currentNetwork,
  144. this._connectionStatus);
  145. this._onStatusChange.handleEvent(event);
  146. }
  147. },
  148. _fireConnectionInfoUpdate: function connectionInfoUpdate(info) {
  149. if (this._onConnectionInfoUpdate) {
  150. var evt = new ConnectionInfoUpdate(this._currentNetwork,
  151. info.signalStrength,
  152. info.relSignalStrength,
  153. info.linkSpeed);
  154. this._onConnectionInfoUpdate.handleEvent(evt);
  155. }
  156. },
  157. // nsIDOMWifiManager
  158. setEnabled: function nsIDOMWifiManager_setEnabled(enabled) {
  159. if (!this._hasPrivileges)
  160. throw new Components.Exception("Denied", Cr.NS_ERROR_FAILURE);
  161. var request = this.createRequest();
  162. this._sendMessageForRequest("WifiManager:setEnabled", enabled, request);
  163. return request;
  164. },
  165. getNetworks: function nsIDOMWifiManager_getNetworks() {
  166. if (!this._hasPrivileges)
  167. throw new Components.Exception("Denied", Cr.NS_ERROR_FAILURE);
  168. var request = this.createRequest();
  169. this._sendMessageForRequest("WifiManager:getNetworks", null, request);
  170. return request;
  171. },
  172. associate: function nsIDOMWifiManager_associate(network) {
  173. if (!this._hasPrivileges)
  174. throw new Components.Exception("Denied", Cr.NS_ERROR_FAILURE);
  175. var request = this.createRequest();
  176. this._sendMessageForRequest("WifiManager:associate", network, request);
  177. return request;
  178. },
  179. forget: function nsIDOMWifiManager_forget(network) {
  180. if (!this._hasPrivileges)
  181. throw new Components.Exception("Denied", Cr.NS_ERROR_FAILURE);
  182. var request = this.createRequest();
  183. this._sendMessageForRequest("WifiManager:forget", network, request);
  184. return request;
  185. },
  186. get enabled() {
  187. if (!this._hasPrivileges)
  188. throw new Components.Exception("Denied", Cr.NS_ERROR_FAILURE);
  189. return this._enabled;
  190. },
  191. get connection() {
  192. if (!this._hasPrivileges)
  193. throw new Components.Exception("Denied", Cr.NS_ERROR_FAILURE);
  194. return { status: this._connectionStatus, network: this._currentNetwork };
  195. },
  196. get connectionInfo() {
  197. if (!this._hasPrivileges)
  198. throw new Components.Exception("Denied", Cr.NS_ERROR_FAILURE);
  199. return this._lastConnectionInfo;
  200. },
  201. set onstatuschange(callback) {
  202. if (!this._hasPrivileges)
  203. throw new Components.Exception("Denied", Cr.NS_ERROR_FAILURE);
  204. this._onStatusChange = callback;
  205. },
  206. set connectionInfoUpdate(callback) {
  207. if (!this._hasPrivileges)
  208. throw new Components.Exception("Denied", Cr.NS_ERROR_FAILURE);
  209. this._onConnectionInfoUpdate = callback;
  210. }
  211. };
  212. function WifiStatusChangeEvent(network) {
  213. this.network = network;
  214. }
  215. WifiStatusChangeEvent.prototype = {
  216. QueryInterface: XPCOMUtils.generateQI([Ci.nsIDOMWifiStatusChangeEvent]),
  217. classInfo: XPCOMUtils.generateCI({classID: Components.ID("{f28c1ae7-4db7-4a4d-bb06-737eb04ad700}"),
  218. contractID: "@mozilla.org/wifi/statechange-event;1",
  219. interfaces: [Ci.nsIDOMWifiStatusChangeEvent],
  220. flags: Ci.nsIClassInfo.DOM_OBJECT,
  221. classDescription: "Wifi State Change Event"})
  222. };
  223. function ConnectionInfoUpdate(network, signalStrength, relSignalStrength, linkSpeed) {
  224. this.network = network;
  225. this.signalStrength = signalStrength;
  226. this.relSignalStrength = relSignalStrength;
  227. this.linkSpeed = linkSpeed;
  228. }
  229. ConnectionInfoUpdate.prototype = {
  230. QueryInterface: XPCOMUtils.generateQI([Ci.nsIDOMWifiConnectionInfoEvent]),
  231. classInfo: XPCOMUtils.generateCI({classID: Components.ID("{aba4c481-7ea2-464a-b14c-7254a5c99454}"),
  232. contractID: "@mozilla.org/wifi/connectioninfo-event;1",
  233. interfaces: [Ci.nsIDOMWifiConnectionInfoEvent],
  234. flags: Ci.nsIClassInfo.DOM_OBJECT,
  235. classDescription: "Wifi Connection Info Event"})
  236. };
  237. const NSGetFactory = XPCOMUtils.generateNSGetFactory([DOMWifiManager]);
  238. let debug;
  239. if (DEBUG) {
  240. debug = function (s) {
  241. dump("-*- DOMWifiManager component: " + s + "\n");
  242. };
  243. } else {
  244. debug = function (s) {};
  245. }