|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
|
3 * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 "use strict"; |
|
6 |
|
7 const DEBUG = false; |
|
8 function debug(s) { dump("-*- PhoneNumberService.js: " + s + "\n"); } |
|
9 |
|
10 const Cc = Components.classes; |
|
11 const Ci = Components.interfaces; |
|
12 const Cu = Components.utils; |
|
13 |
|
14 Cu.import("resource://gre/modules/XPCOMUtils.jsm"); |
|
15 Cu.import("resource://gre/modules/Services.jsm"); |
|
16 Cu.import("resource://gre/modules/DOMRequestHelper.jsm"); |
|
17 Cu.import("resource://gre/modules/PhoneNumberUtils.jsm"); |
|
18 Cu.import("resource://gre/modules/PhoneNumberNormalizer.jsm"); |
|
19 |
|
20 XPCOMUtils.defineLazyServiceGetter(this, "cpmm", |
|
21 "@mozilla.org/childprocessmessagemanager;1", |
|
22 "nsIMessageSender"); |
|
23 |
|
24 // PhoneNumberService |
|
25 |
|
26 function PhoneNumberService() |
|
27 { |
|
28 if (DEBUG) debug("Constructor"); |
|
29 } |
|
30 |
|
31 PhoneNumberService.prototype = { |
|
32 __proto__: DOMRequestIpcHelper.prototype, |
|
33 |
|
34 receiveMessage: function(aMessage) { |
|
35 if (DEBUG) debug("receiveMessage: " + aMessage.name); |
|
36 let msg = aMessage.json; |
|
37 |
|
38 let req = this.getRequest(msg.requestID); |
|
39 if (!req) { |
|
40 return; |
|
41 } |
|
42 |
|
43 switch (aMessage.name) { |
|
44 case "PhoneNumberService:FuzzyMatch:Return:KO": |
|
45 Services.DOMRequest.fireError(req.request, msg.errorMsg); |
|
46 break; |
|
47 case "PhoneNumberService:FuzzyMatch:Return:OK": |
|
48 Services.DOMRequest.fireSuccess(req.request, msg.result); |
|
49 break; |
|
50 default: |
|
51 if (DEBUG) debug("Wrong message: " + aMessage.name); |
|
52 } |
|
53 this.removeRequest(msg.requestID); |
|
54 }, |
|
55 |
|
56 fuzzyMatch: function(aNumber1, aNumber2) { |
|
57 if (DEBUG) debug("fuzzyMatch: " + aNumber1 + ", " + aNumber2); |
|
58 let request = this.createRequest(); |
|
59 |
|
60 if ((aNumber1 && !aNumber2) || (aNumber2 && !aNumber1)) { |
|
61 // if only one of the numbers is empty/null/undefined and the other |
|
62 // number is not, we can fire false result in next tick |
|
63 Services.DOMRequest.fireSuccessAsync(request, false); |
|
64 } else if ((aNumber1 === aNumber2) || |
|
65 (PhoneNumberNormalizer.Normalize(aNumber1) === PhoneNumberNormalizer.Normalize(aNumber2))) { |
|
66 // if we have a simple match fire successful request in next tick |
|
67 Services.DOMRequest.fireSuccessAsync(request, true); |
|
68 } else { |
|
69 // invoke fuzzy matching in the parent |
|
70 let options = { number1: aNumber1, number2: aNumber2 }; |
|
71 cpmm.sendAsyncMessage("PhoneNumberService:FuzzyMatch", |
|
72 {requestID: this.getRequestId({request: request}), |
|
73 options: options}); |
|
74 } |
|
75 |
|
76 return request; |
|
77 }, |
|
78 |
|
79 normalize: function(aNumber) { |
|
80 if (DEBUG) debug("normalize: " + aNumber); |
|
81 return PhoneNumberNormalizer.Normalize(aNumber); |
|
82 }, |
|
83 |
|
84 init: function(aWindow) { |
|
85 if (DEBUG) debug("init call"); |
|
86 this.initDOMRequestHelper(aWindow, [ |
|
87 "PhoneNumberService:FuzzyMatch:Return:OK", |
|
88 "PhoneNumberService:FuzzyMatch:Return:KO" |
|
89 ]); |
|
90 }, |
|
91 |
|
92 classID : Components.ID("{e2768710-eb17-11e2-91e2-0800200c9a66}"), |
|
93 contractID : "@mozilla.org/phoneNumberService;1", |
|
94 QueryInterface : XPCOMUtils.generateQI([Ci.nsIDOMGlobalPropertyInitializer, |
|
95 Ci.nsISupportsWeakReference, |
|
96 Ci.nsIObserver]), |
|
97 } |
|
98 |
|
99 this.NSGetFactory = XPCOMUtils.generateNSGetFactory([PhoneNumberService]); |