1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/wifi/DOMWifiP2pManager.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,323 @@ 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; 1.19 + 1.20 +// interface MozWifiP2pGroupOwner implementation. 1.21 + 1.22 +function MozWifiP2pGroupOwner(aGo) { 1.23 + this.groupName = aGo.groupName; 1.24 + this.macAddress = aGo.macAddress; 1.25 + this.ipAddress = aGo.ipAddress; 1.26 + this.passphrase = aGo.passphrase; 1.27 + this.ssid = aGo.ssid; 1.28 + this.wpsCapabilities = aGo.wpsCapabilities; 1.29 + this.freq = aGo.freq; 1.30 + this.isLocal = aGo.isLocal; 1.31 +} 1.32 + 1.33 +MozWifiP2pGroupOwner.prototype = { 1.34 + classID: Components.ID("{a9b81450-349d-11e3-aa6e-0800200c9a66}"), 1.35 + contractID: "@mozilla.org/wifip2pgroupowner;1", 1.36 + QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports]) 1.37 +}; 1.38 + 1.39 +// interface MozWifiP2pManager implementation. 1.40 + 1.41 +const MOZ_WIFIP2PMANAGER_CONTRACTID = "@mozilla.org/wifip2pmanager;1"; 1.42 +const MOZ_WIFIP2PMANAGER_CID = Components.ID("{8d9125a0-3498-11e3-aa6e-0800200c9a66}"); 1.43 + 1.44 +function MozWifiP2pManager() { 1.45 + this.defineEventHandlerGetterSetter("onstatuschange"); 1.46 + this.defineEventHandlerGetterSetter("onpeerinfoupdate"); 1.47 + this.defineEventHandlerGetterSetter("onenabled"); 1.48 + this.defineEventHandlerGetterSetter("ondisabled"); 1.49 + 1.50 + this.currentPeer = null; 1.51 + this.enabled = false; 1.52 + this.groupOwner = null; 1.53 +} 1.54 + 1.55 +// For smaller, read-only APIs, we expose any property that doesn't begin with 1.56 +// an underscore. 1.57 +function exposeReadOnly(obj) { 1.58 + let exposedProps = {}; 1.59 + for (let i in obj) { 1.60 + if (i[0] === "_") { 1.61 + continue; 1.62 + } 1.63 + exposedProps[i] = "r"; 1.64 + } 1.65 + 1.66 + obj.__exposedProps__ = exposedProps; 1.67 + return obj; 1.68 +} 1.69 + 1.70 +function debug(msg) { 1.71 + if (DEBUG) { 1.72 + dump('-------------- MozWifiP2pManager: ' + msg); 1.73 + } 1.74 +} 1.75 + 1.76 +MozWifiP2pManager.prototype = { 1.77 + __proto__: DOMRequestIpcHelper.prototype, 1.78 + 1.79 + classID: MOZ_WIFIP2PMANAGER_CID, 1.80 + contractID: MOZ_WIFIP2PMANAGER_CONTRACTID, 1.81 + QueryInterface: XPCOMUtils.generateQI([Ci.nsIDOMGlobalPropertyInitializer, 1.82 + Ci.nsISupportsWeakReference, 1.83 + Ci.nsIObserver, 1.84 + Ci.nsISupports]), 1.85 + 1.86 + // 1.87 + // nsIDOMGlobalPropertyInitializer implementation. 1.88 + // 1.89 + 1.90 + init: function(aWindow) { 1.91 + const messages = ["WifiP2pManager:setScanEnabled:Return:OK", 1.92 + "WifiP2pManager:setScanEnabled:Return:NO", 1.93 + "WifiP2pManager:getPeerList:Return:OK", 1.94 + "WifiP2pManager:getPeerList:Return:NO", 1.95 + "WifiP2pManager:connect:Return:OK", 1.96 + "WifiP2pManager:connect:Return:NO", 1.97 + "WifiP2pManager:disconnect:Return:OK", 1.98 + "WifiP2pManager:disconnect:Return:NO", 1.99 + "WifiP2pManager:setPairingConfirmation:Return", 1.100 + "WifiP2pManager:setDeviceName:Return:OK", 1.101 + "WifiP2pManager:setDeviceName:Return:NO", 1.102 + 1.103 + "WifiP2pManager:p2pDown", 1.104 + "WifiP2pManager:p2pUp", 1.105 + "WifiP2pManager:onconnecting", 1.106 + "WifiP2pManager:onconnected", 1.107 + "WifiP2pManager:ondisconnected", 1.108 + "WifiP2pManager:ongroupnstop", 1.109 + "WifiP2pManager:onconnectingfailed", 1.110 + "WifiP2pManager:onwpstimeout", 1.111 + "WifiP2pManager:onwpsfail", 1.112 + "WifiP2pManager:onpeerinfoupdate", 1.113 + ]; 1.114 + 1.115 + this.initDOMRequestHelper(aWindow, messages); 1.116 + this._mm = Cc["@mozilla.org/childprocessmessagemanager;1"].getService(Ci.nsISyncMessageSender); 1.117 + 1.118 + // Notify the internal a new DOM mananger is created. 1.119 + let state = this._mm.sendSyncMessage("WifiP2pManager:getState")[0]; 1.120 + if (state) { 1.121 + debug('State: ' + JSON.stringify(state)); 1.122 + } else { 1.123 + debug('Failed to get state'); 1.124 + } 1.125 + }, 1.126 + 1.127 + uninit: function() { 1.128 + }, 1.129 + 1.130 + _sendMessageForRequest: function(name, data, request) { 1.131 + let id = this.getRequestId(request); 1.132 + this._mm.sendAsyncMessage(name, { data: data, rid: id, mid: this._id }); 1.133 + }, 1.134 + 1.135 + receiveMessage: function(aMessage) { 1.136 + let msg = aMessage.json; 1.137 + if (msg.mid && msg.mid !== this._id) { 1.138 + return; 1.139 + } 1.140 + 1.141 + let request; 1.142 + switch (aMessage.name) { 1.143 + case "WifiP2pManager:setScanEnabled:Return:OK": 1.144 + request = this.takeRequest(msg.rid); 1.145 + Services.DOMRequest.fireSuccess(request, exposeReadOnly(msg.data)); 1.146 + break; 1.147 + 1.148 + case "WifiP2pManager:setScanEnabled:Return:NO": 1.149 + request = this.takeRequest(msg.rid); 1.150 + Services.DOMRequest.fireError(request, "Unable to enable/disable Wifi P2P peer discovery."); 1.151 + break; 1.152 + 1.153 + case "WifiP2pManager:getPeerList:Return:OK": 1.154 + request = this.takeRequest(msg.rid); 1.155 + Services.DOMRequest.fireSuccess(request, msg.data); 1.156 + break; 1.157 + 1.158 + case "WifiP2pManager:getPeerList:Return:NO": 1.159 + request = this.takeRequest(msg.rid); 1.160 + Services.DOMRequest.fireError(request, "Unable to disable Wifi P2P peer discovery."); 1.161 + break; 1.162 + 1.163 + case "WifiP2pManager:connect:Return:OK": 1.164 + request = this.takeRequest(msg.rid); 1.165 + Services.DOMRequest.fireSuccess(request, exposeReadOnly(msg.data)); 1.166 + break; 1.167 + 1.168 + case "WifiP2pManager:connect:Return:NO": 1.169 + request = this.takeRequest(msg.rid); 1.170 + Services.DOMRequest.fireError(request, "Unable to connect to Wifi P2P peer."); 1.171 + break; 1.172 + 1.173 + case "WifiP2pManager:disconnect:Return:OK": 1.174 + request = this.takeRequest(msg.rid); 1.175 + Services.DOMRequest.fireSuccess(request, exposeReadOnly(msg.data)); 1.176 + break; 1.177 + 1.178 + case "WifiP2pManager:disconnect:Return:NO": 1.179 + request = this.takeRequest(msg.rid); 1.180 + Services.DOMRequest.fireError(request, "Unable to disconnect to Wifi P2P peer."); 1.181 + break; 1.182 + 1.183 + case "WifiP2pManager:setDeviceName:Return:OK": 1.184 + request = this.takeRequest(msg.rid); 1.185 + Services.DOMRequest.fireSuccess(request, exposeReadOnly(msg.data)); 1.186 + break; 1.187 + 1.188 + case "WifiP2pManager:setDeviceName:Return:NO": 1.189 + request = this.takeRequest(msg.rid); 1.190 + Services.DOMRequest.fireError(request, "Unable to set device name."); 1.191 + break; 1.192 + 1.193 + case "WifiP2pManager:p2pDown": 1.194 + this.enabled = false; 1.195 + this.currentPeer = null; 1.196 + this._fireEnabledOrDisabled(false); 1.197 + break; 1.198 + 1.199 + case "WifiP2pManager:p2pUp": 1.200 + this.enabled = true; 1.201 + this._fireEnabledOrDisabled(true); 1.202 + break; 1.203 + 1.204 + case "WifiP2pManager:onconnecting": 1.205 + debug('onconnecting with peer: ' + JSON.stringify(msg.peer)); 1.206 + this.currentPeer = msg.peer; 1.207 + this._fireStatusChangeEvent(msg.peer.address); 1.208 + break; 1.209 + 1.210 + case "WifiP2pManager:onconnected": 1.211 + debug('onconnected with peer: ' + JSON.stringify(msg.peer)); 1.212 + this.currentPeer = msg.peer; 1.213 + this.groupOwner = new MozWifiP2pGroupOwner(msg.groupOwner); 1.214 + this._fireStatusChangeEvent(msg.peer.address); 1.215 + break; 1.216 + 1.217 + case "WifiP2pManager:ondisconnected": 1.218 + debug('ondisconnected with peer: ' + JSON.stringify(msg.peer)); 1.219 + this.currentPeer = null; 1.220 + this.groupOwner = null; 1.221 + this._fireStatusChangeEvent(msg.peer.address); 1.222 + break; 1.223 + 1.224 + case "WifiP2pManager:onconnectingfailed": 1.225 + this._fireStatusChangeEvent(null); 1.226 + break; 1.227 + 1.228 + case "WifiP2pManager:onwpstimeout": 1.229 + this._fireStatusChangeEvent(null); 1.230 + break; 1.231 + 1.232 + case "WifiP2pManager:onwpsfail": 1.233 + this._fireStatusChangeEvent(null); 1.234 + break; 1.235 + 1.236 + case "WifiP2pManager:onpeerinfoupdate": 1.237 + this._firePeerInfoUpdateEvent(); 1.238 + break; 1.239 + } 1.240 + }, 1.241 + 1.242 + _firePeerInfoUpdateEvent: function PeerInfoUpdate() { 1.243 + let evt = new this._window.Event("peerinfoupdate"); 1.244 + this.__DOM_IMPL__.dispatchEvent(evt); 1.245 + }, 1.246 + 1.247 + _fireStatusChangeEvent: function WifiP2pStatusChange(peerAddress) { 1.248 + let evt = new this._window.MozWifiP2pStatusChangeEvent("statuschange", 1.249 + { peerAddress: peerAddress }); 1.250 + this.__DOM_IMPL__.dispatchEvent(evt); 1.251 + }, 1.252 + 1.253 + _fireEnabledOrDisabled: function enabledDisabled(enabled) { 1.254 + let evt = new this._window.Event(enabled ? "enabled" : "disabled"); 1.255 + this.__DOM_IMPL__.dispatchEvent(evt); 1.256 + }, 1.257 + 1.258 + // 1.259 + // WifiP2pManager.webidl implementation. 1.260 + // 1.261 + 1.262 + enableScan: function () { 1.263 + let request = this.createRequest(); 1.264 + this._sendMessageForRequest("WifiP2pManager:enableScan", null, request); 1.265 + return request; 1.266 + }, 1.267 + 1.268 + disableScan: function () { 1.269 + let request = this.createRequest(); 1.270 + this._sendMessageForRequest("WifiP2pManager:disableScan", null, request); 1.271 + return request; 1.272 + }, 1.273 + 1.274 + setScanEnabled: function(enabled) { 1.275 + let request = this.createRequest(); 1.276 + this._sendMessageForRequest("WifiP2pManager:setScanEnabled", enabled, request); 1.277 + return request; 1.278 + }, 1.279 + 1.280 + connect: function (address, wpsMethod, goIntent) { 1.281 + let request = this.createRequest(); 1.282 + let connectionInfo = { address: address, wpsMethod: wpsMethod, goIntent: goIntent }; 1.283 + this._sendMessageForRequest("WifiP2pManager:connect", connectionInfo, request); 1.284 + return request; 1.285 + }, 1.286 + 1.287 + disconnect: function (address) { 1.288 + let request = this.createRequest(); 1.289 + this._sendMessageForRequest("WifiP2pManager:disconnect", address, request); 1.290 + return request; 1.291 + }, 1.292 + 1.293 + getPeerList: function () { 1.294 + let request = this.createRequest(); 1.295 + this._sendMessageForRequest("WifiP2pManager:getPeerList", null, request); 1.296 + return request; 1.297 + }, 1.298 + 1.299 + setPairingConfirmation: function (accepted, pin) { 1.300 + let request = this.createRequest(); 1.301 + let result = { accepted: accepted, pin: pin }; 1.302 + this._sendMessageForRequest("WifiP2pManager:setPairingConfirmation", result, request); 1.303 + return request; 1.304 + }, 1.305 + 1.306 + setDeviceName: function(newDeviceName) { 1.307 + let request = this.createRequest(); 1.308 + this._sendMessageForRequest("WifiP2pManager:setDeviceName", newDeviceName, request); 1.309 + return request; 1.310 + }, 1.311 + 1.312 + // Helpers. 1.313 + defineEventHandlerGetterSetter: function(event) { 1.314 + Object.defineProperty(this, event, { 1.315 + get: function() { 1.316 + return this.__DOM_IMPL__.getEventHandler(event); 1.317 + }, 1.318 + 1.319 + set: function(handler) { 1.320 + this.__DOM_IMPL__.setEventHandler(event, handler); 1.321 + } 1.322 + }); 1.323 + }, 1.324 +}; 1.325 + 1.326 +this.NSGetFactory = XPCOMUtils.generateNSGetFactory([MozWifiP2pManager, MozWifiP2pGroupOwner]);