michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: * You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: "use strict"; michael@0: michael@0: const DEBUG = false; michael@0: function debug(s) { dump("-*- PhoneNumberService.js: " + s + "\n"); } michael@0: michael@0: const Cc = Components.classes; michael@0: const Ci = Components.interfaces; michael@0: const Cu = Components.utils; michael@0: michael@0: Cu.import("resource://gre/modules/XPCOMUtils.jsm"); michael@0: Cu.import("resource://gre/modules/Services.jsm"); michael@0: Cu.import("resource://gre/modules/DOMRequestHelper.jsm"); michael@0: Cu.import("resource://gre/modules/PhoneNumberUtils.jsm"); michael@0: Cu.import("resource://gre/modules/PhoneNumberNormalizer.jsm"); michael@0: michael@0: XPCOMUtils.defineLazyServiceGetter(this, "cpmm", michael@0: "@mozilla.org/childprocessmessagemanager;1", michael@0: "nsIMessageSender"); michael@0: michael@0: // PhoneNumberService michael@0: michael@0: function PhoneNumberService() michael@0: { michael@0: if (DEBUG) debug("Constructor"); michael@0: } michael@0: michael@0: PhoneNumberService.prototype = { michael@0: __proto__: DOMRequestIpcHelper.prototype, michael@0: michael@0: receiveMessage: function(aMessage) { michael@0: if (DEBUG) debug("receiveMessage: " + aMessage.name); michael@0: let msg = aMessage.json; michael@0: michael@0: let req = this.getRequest(msg.requestID); michael@0: if (!req) { michael@0: return; michael@0: } michael@0: michael@0: switch (aMessage.name) { michael@0: case "PhoneNumberService:FuzzyMatch:Return:KO": michael@0: Services.DOMRequest.fireError(req.request, msg.errorMsg); michael@0: break; michael@0: case "PhoneNumberService:FuzzyMatch:Return:OK": michael@0: Services.DOMRequest.fireSuccess(req.request, msg.result); michael@0: break; michael@0: default: michael@0: if (DEBUG) debug("Wrong message: " + aMessage.name); michael@0: } michael@0: this.removeRequest(msg.requestID); michael@0: }, michael@0: michael@0: fuzzyMatch: function(aNumber1, aNumber2) { michael@0: if (DEBUG) debug("fuzzyMatch: " + aNumber1 + ", " + aNumber2); michael@0: let request = this.createRequest(); michael@0: michael@0: if ((aNumber1 && !aNumber2) || (aNumber2 && !aNumber1)) { michael@0: // if only one of the numbers is empty/null/undefined and the other michael@0: // number is not, we can fire false result in next tick michael@0: Services.DOMRequest.fireSuccessAsync(request, false); michael@0: } else if ((aNumber1 === aNumber2) || michael@0: (PhoneNumberNormalizer.Normalize(aNumber1) === PhoneNumberNormalizer.Normalize(aNumber2))) { michael@0: // if we have a simple match fire successful request in next tick michael@0: Services.DOMRequest.fireSuccessAsync(request, true); michael@0: } else { michael@0: // invoke fuzzy matching in the parent michael@0: let options = { number1: aNumber1, number2: aNumber2 }; michael@0: cpmm.sendAsyncMessage("PhoneNumberService:FuzzyMatch", michael@0: {requestID: this.getRequestId({request: request}), michael@0: options: options}); michael@0: } michael@0: michael@0: return request; michael@0: }, michael@0: michael@0: normalize: function(aNumber) { michael@0: if (DEBUG) debug("normalize: " + aNumber); michael@0: return PhoneNumberNormalizer.Normalize(aNumber); michael@0: }, michael@0: michael@0: init: function(aWindow) { michael@0: if (DEBUG) debug("init call"); michael@0: this.initDOMRequestHelper(aWindow, [ michael@0: "PhoneNumberService:FuzzyMatch:Return:OK", michael@0: "PhoneNumberService:FuzzyMatch:Return:KO" michael@0: ]); michael@0: }, michael@0: michael@0: classID : Components.ID("{e2768710-eb17-11e2-91e2-0800200c9a66}"), michael@0: contractID : "@mozilla.org/phoneNumberService;1", michael@0: QueryInterface : XPCOMUtils.generateQI([Ci.nsIDOMGlobalPropertyInitializer, michael@0: Ci.nsISupportsWeakReference, michael@0: Ci.nsIObserver]), michael@0: } michael@0: michael@0: this.NSGetFactory = XPCOMUtils.generateNSGetFactory([PhoneNumberService]);