Bumping gaia.json for 2 gaia revision(s) a=gaia-bump
[gecko.git] / dom / wifi / DOMWifiP2pManager.js
blob1d3214d6352d00bd34970c4235c0e82d594bf4ce
1 /* -*- indent-tabs-mode: nil; js-indent-level: 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/. */
7 "use strict";
9 const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
11 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
12 Cu.import("resource://gre/modules/Services.jsm");
13 Cu.import("resource://gre/modules/DOMRequestHelper.jsm");
15 const DEBUG = false;
17 // interface MozWifiP2pGroupOwner implementation.
19 function MozWifiP2pGroupOwner(aGo) {
20   this.groupName = aGo.groupName;
21   this.macAddress = aGo.macAddress;
22   this.ipAddress = aGo.ipAddress;
23   this.passphrase = aGo.passphrase;
24   this.ssid = aGo.ssid;
25   this.wpsCapabilities = aGo.wpsCapabilities;
26   this.freq = aGo.freq;
27   this.isLocal = aGo.isLocal;
30 MozWifiP2pGroupOwner.prototype = {
31   classID: Components.ID("{a9b81450-349d-11e3-aa6e-0800200c9a66}"),
32   contractID: "@mozilla.org/wifip2pgroupowner;1",
33   QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports])
36 // interface MozWifiP2pManager implementation.
38 const MOZ_WIFIP2PMANAGER_CONTRACTID = "@mozilla.org/wifip2pmanager;1";
39 const MOZ_WIFIP2PMANAGER_CID        = Components.ID("{8d9125a0-3498-11e3-aa6e-0800200c9a66}");
41 function MozWifiP2pManager() {
42   this.defineEventHandlerGetterSetter("onstatuschange");
43   this.defineEventHandlerGetterSetter("onpeerinfoupdate");
44   this.defineEventHandlerGetterSetter("onenabled");
45   this.defineEventHandlerGetterSetter("ondisabled");
47   this.currentPeer = null;
48   this.enabled = false;
49   this.groupOwner = null;
52 // For smaller, read-only APIs, we expose any property that doesn't begin with
53 // an underscore.
54 function exposeReadOnly(obj) {
55   let exposedProps = {};
56   for (let i in obj) {
57     if (i[0] === "_") {
58       continue;
59     }
60     exposedProps[i] = "r";
61   }
63   obj.__exposedProps__ = exposedProps;
64   return obj;
67 function debug(msg) {
68   if (DEBUG) {
69     dump('-------------- MozWifiP2pManager: ' + msg);
70   }
73 MozWifiP2pManager.prototype = {
74   __proto__: DOMRequestIpcHelper.prototype,
76   classID:        MOZ_WIFIP2PMANAGER_CID,
77   contractID:     MOZ_WIFIP2PMANAGER_CONTRACTID,
78   QueryInterface: XPCOMUtils.generateQI([Ci.nsIDOMGlobalPropertyInitializer,
79                                          Ci.nsISupportsWeakReference,
80                                          Ci.nsIObserver,
81                                          Ci.nsISupports]),
83   //
84   // nsIDOMGlobalPropertyInitializer implementation.
85   //
87   init: function(aWindow) {
88     const messages = ["WifiP2pManager:setScanEnabled:Return:OK",
89                       "WifiP2pManager:setScanEnabled:Return:NO",
90                       "WifiP2pManager:getPeerList:Return:OK",
91                       "WifiP2pManager:getPeerList:Return:NO",
92                       "WifiP2pManager:connect:Return:OK",
93                       "WifiP2pManager:connect:Return:NO",
94                       "WifiP2pManager:disconnect:Return:OK",
95                       "WifiP2pManager:disconnect:Return:NO",
96                       "WifiP2pManager:setPairingConfirmation:Return",
97                       "WifiP2pManager:setDeviceName:Return:OK",
98                       "WifiP2pManager:setDeviceName:Return:NO",
100                       "WifiP2pManager:p2pDown",
101                       "WifiP2pManager:p2pUp",
102                       "WifiP2pManager:onconnecting",
103                       "WifiP2pManager:onconnected",
104                       "WifiP2pManager:ondisconnected",
105                       "WifiP2pManager:ongroupnstop",
106                       "WifiP2pManager:onconnectingfailed",
107                       "WifiP2pManager:onwpstimeout",
108                       "WifiP2pManager:onwpsfail",
109                       "WifiP2pManager:onpeerinfoupdate",
110                       ];
112     this.initDOMRequestHelper(aWindow, messages);
113     this._mm = Cc["@mozilla.org/childprocessmessagemanager;1"].getService(Ci.nsISyncMessageSender);
115     // Notify the internal a new DOM mananger is created.
116     let state = this._mm.sendSyncMessage("WifiP2pManager:getState")[0];
117     if (state) {
118       debug('State: ' + JSON.stringify(state));
119     } else {
120       debug('Failed to get state');
121     }
122   },
124   uninit: function() {
125   },
127   _sendMessageForRequest: function(name, data, request) {
128     let id = this.getRequestId(request);
129     this._mm.sendAsyncMessage(name, { data: data, rid: id, mid: this._id });
130   },
132   receiveMessage: function(aMessage) {
133     let msg = aMessage.json;
134     if (msg.mid && msg.mid !== this._id) {
135       return;
136     }
138     let request;
139     switch (aMessage.name) {
140      case "WifiP2pManager:setScanEnabled:Return:OK":
141         request = this.takeRequest(msg.rid);
142         Services.DOMRequest.fireSuccess(request, exposeReadOnly(msg.data));
143         break;
145       case "WifiP2pManager:setScanEnabled:Return:NO":
146         request = this.takeRequest(msg.rid);
147         Services.DOMRequest.fireError(request, "Unable to enable/disable Wifi P2P peer discovery.");
148         break;
150      case "WifiP2pManager:getPeerList:Return:OK":
151         request = this.takeRequest(msg.rid);
152         Services.DOMRequest.fireSuccess(request, msg.data);
153         break;
155       case "WifiP2pManager:getPeerList:Return:NO":
156         request = this.takeRequest(msg.rid);
157         Services.DOMRequest.fireError(request, "Unable to disable Wifi P2P peer discovery.");
158         break;
160       case "WifiP2pManager:connect:Return:OK":
161         request = this.takeRequest(msg.rid);
162         Services.DOMRequest.fireSuccess(request, exposeReadOnly(msg.data));
163         break;
165       case "WifiP2pManager:connect:Return:NO":
166         request = this.takeRequest(msg.rid);
167         Services.DOMRequest.fireError(request, "Unable to connect to Wifi P2P peer.");
168         break;
170       case "WifiP2pManager:disconnect:Return:OK":
171         request = this.takeRequest(msg.rid);
172         Services.DOMRequest.fireSuccess(request, exposeReadOnly(msg.data));
173         break;
175       case "WifiP2pManager:disconnect:Return:NO":
176         request = this.takeRequest(msg.rid);
177         Services.DOMRequest.fireError(request, "Unable to disconnect to Wifi P2P peer.");
178         break;
180       case "WifiP2pManager:setDeviceName:Return:OK":
181         request = this.takeRequest(msg.rid);
182         Services.DOMRequest.fireSuccess(request, exposeReadOnly(msg.data));
183         break;
185       case "WifiP2pManager:setDeviceName:Return:NO":
186         request = this.takeRequest(msg.rid);
187         Services.DOMRequest.fireError(request, "Unable to set device name.");
188         break;
190       case "WifiP2pManager:p2pDown":
191         this.enabled = false;
192         this.currentPeer = null;
193         this._fireEnabledOrDisabled(false);
194         break;
196       case "WifiP2pManager:p2pUp":
197         this.enabled = true;
198         this._fireEnabledOrDisabled(true);
199         break;
201       case "WifiP2pManager:onconnecting":
202         debug('onconnecting with peer: ' + JSON.stringify(msg.peer));
203         this.currentPeer = msg.peer;
204         this._fireStatusChangeEvent(msg.peer.address);
205         break;
207       case "WifiP2pManager:onconnected":
208         debug('onconnected with peer: ' + JSON.stringify(msg.peer));
209         this.currentPeer = msg.peer;
210         this.groupOwner = new MozWifiP2pGroupOwner(msg.groupOwner);
211         this._fireStatusChangeEvent(msg.peer.address);
212         break;
214       case "WifiP2pManager:ondisconnected":
215         debug('ondisconnected with peer: ' + JSON.stringify(msg.peer));
216         this.currentPeer = null;
217         this.groupOwner = null;
218         this._fireStatusChangeEvent(msg.peer.address);
219         break;
221       case "WifiP2pManager:onconnectingfailed":
222         this._fireStatusChangeEvent(null);
223         break;
225       case "WifiP2pManager:onwpstimeout":
226         this._fireStatusChangeEvent(null);
227         break;
229       case "WifiP2pManager:onwpsfail":
230         this._fireStatusChangeEvent(null);
231         break;
233       case "WifiP2pManager:onpeerinfoupdate":
234         this._firePeerInfoUpdateEvent();
235         break;
236     }
237   },
239   _firePeerInfoUpdateEvent: function PeerInfoUpdate() {
240     let evt = new this._window.Event("peerinfoupdate");
241     this.__DOM_IMPL__.dispatchEvent(evt);
242   },
244   _fireStatusChangeEvent: function WifiP2pStatusChange(peerAddress) {
245     let evt = new this._window.MozWifiP2pStatusChangeEvent("statuschange",
246                                                            { peerAddress: peerAddress });
247     this.__DOM_IMPL__.dispatchEvent(evt);
248   },
250   _fireEnabledOrDisabled: function enabledDisabled(enabled) {
251     let evt = new this._window.Event(enabled ? "enabled" : "disabled");
252     this.__DOM_IMPL__.dispatchEvent(evt);
253   },
255   //
256   // WifiP2pManager.webidl implementation.
257   //
259   enableScan: function () {
260     let request = this.createRequest();
261     this._sendMessageForRequest("WifiP2pManager:enableScan", null, request);
262     return request;
263   },
265   disableScan: function () {
266     let request = this.createRequest();
267     this._sendMessageForRequest("WifiP2pManager:disableScan", null, request);
268     return request;
269   },
271   setScanEnabled: function(enabled) {
272     let request = this.createRequest();
273     this._sendMessageForRequest("WifiP2pManager:setScanEnabled", enabled, request);
274     return request;
275   },
277   connect: function (address, wpsMethod, goIntent) {
278     let request = this.createRequest();
279     let connectionInfo = { address: address, wpsMethod: wpsMethod, goIntent: goIntent };
280     this._sendMessageForRequest("WifiP2pManager:connect", connectionInfo, request);
281     return request;
282   },
284   disconnect: function (address) {
285     let request = this.createRequest();
286     this._sendMessageForRequest("WifiP2pManager:disconnect", address, request);
287     return request;
288   },
290   getPeerList: function () {
291     let request = this.createRequest();
292     this._sendMessageForRequest("WifiP2pManager:getPeerList", null, request);
293     return request;
294   },
296   setPairingConfirmation: function (accepted, pin) {
297     let request = this.createRequest();
298     let result = { accepted: accepted, pin: pin };
299     this._sendMessageForRequest("WifiP2pManager:setPairingConfirmation", result, request);
300     return request;
301   },
303   setDeviceName: function(newDeviceName) {
304     let request = this.createRequest();
305     this._sendMessageForRequest("WifiP2pManager:setDeviceName", newDeviceName, request);
306     return request;
307   },
309   // Helpers.
310   defineEventHandlerGetterSetter: function(event) {
311     Object.defineProperty(this, event, {
312       get: function() {
313         return this.__DOM_IMPL__.getEventHandler(event);
314       },
316       set: function(handler) {
317         this.__DOM_IMPL__.setEventHandler(event, handler);
318       }
319     });
320   },
323 this.NSGetFactory = XPCOMUtils.generateNSGetFactory([MozWifiP2pManager, MozWifiP2pGroupOwner]);