|
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 |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 this.EXPORTED_SYMBOLS = ["Status"]; |
|
6 |
|
7 const Cc = Components.classes; |
|
8 const Ci = Components.interfaces; |
|
9 const Cr = Components.results; |
|
10 const Cu = Components.utils; |
|
11 |
|
12 Cu.import("resource://services-sync/constants.js"); |
|
13 Cu.import("resource://gre/modules/Log.jsm"); |
|
14 Cu.import("resource://services-sync/identity.js"); |
|
15 Cu.import("resource://services-sync/browserid_identity.js"); |
|
16 Cu.import("resource://gre/modules/Services.jsm"); |
|
17 Cu.import("resource://services-common/async.js"); |
|
18 |
|
19 this.Status = { |
|
20 _log: Log.repository.getLogger("Sync.Status"), |
|
21 __authManager: null, |
|
22 ready: false, |
|
23 |
|
24 get _authManager() { |
|
25 if (this.__authManager) { |
|
26 return this.__authManager; |
|
27 } |
|
28 let service = Components.classes["@mozilla.org/weave/service;1"] |
|
29 .getService(Components.interfaces.nsISupports) |
|
30 .wrappedJSObject; |
|
31 let idClass = service.fxAccountsEnabled ? BrowserIDManager : IdentityManager; |
|
32 this.__authManager = new idClass(); |
|
33 // .initialize returns a promise, so we need to spin until it resolves. |
|
34 let cb = Async.makeSpinningCallback(); |
|
35 this.__authManager.initialize().then(cb, cb); |
|
36 cb.wait(); |
|
37 return this.__authManager; |
|
38 }, |
|
39 |
|
40 get service() { |
|
41 return this._service; |
|
42 }, |
|
43 |
|
44 set service(code) { |
|
45 this._log.debug("Status.service: " + this._service + " => " + code); |
|
46 this._service = code; |
|
47 }, |
|
48 |
|
49 get login() { |
|
50 return this._login; |
|
51 }, |
|
52 |
|
53 set login(code) { |
|
54 this._log.debug("Status.login: " + this._login + " => " + code); |
|
55 this._login = code; |
|
56 |
|
57 if (code == LOGIN_FAILED_NO_USERNAME || |
|
58 code == LOGIN_FAILED_NO_PASSWORD || |
|
59 code == LOGIN_FAILED_NO_PASSPHRASE) { |
|
60 this.service = CLIENT_NOT_CONFIGURED; |
|
61 } else if (code != LOGIN_SUCCEEDED) { |
|
62 this.service = LOGIN_FAILED; |
|
63 } else { |
|
64 this.service = STATUS_OK; |
|
65 } |
|
66 }, |
|
67 |
|
68 get sync() { |
|
69 return this._sync; |
|
70 }, |
|
71 |
|
72 set sync(code) { |
|
73 this._log.debug("Status.sync: " + this._sync + " => " + code); |
|
74 this._sync = code; |
|
75 this.service = code == SYNC_SUCCEEDED ? STATUS_OK : SYNC_FAILED; |
|
76 }, |
|
77 |
|
78 get eol() { |
|
79 let modePref = PREFS_BRANCH + "errorhandler.alert.mode"; |
|
80 try { |
|
81 return Services.prefs.getCharPref(modePref) == "hard-eol"; |
|
82 } catch (ex) { |
|
83 return false; |
|
84 } |
|
85 }, |
|
86 |
|
87 get engines() { |
|
88 return this._engines; |
|
89 }, |
|
90 |
|
91 set engines([name, code]) { |
|
92 this._log.debug("Status for engine " + name + ": " + code); |
|
93 this._engines[name] = code; |
|
94 |
|
95 if (code != ENGINE_SUCCEEDED) { |
|
96 this.service = SYNC_FAILED_PARTIAL; |
|
97 } |
|
98 }, |
|
99 |
|
100 // Implement toString because adding a logger introduces a cyclic object |
|
101 // value, so we can't trivially debug-print Status as JSON. |
|
102 toString: function toString() { |
|
103 return "<Status" + |
|
104 ": login: " + Status.login + |
|
105 ", service: " + Status.service + |
|
106 ", sync: " + Status.sync + ">"; |
|
107 }, |
|
108 |
|
109 checkSetup: function checkSetup() { |
|
110 let result = this._authManager.currentAuthState; |
|
111 if (result == STATUS_OK) { |
|
112 Status.service = result; |
|
113 return result; |
|
114 } |
|
115 |
|
116 Status.login = result; |
|
117 return Status.service; |
|
118 }, |
|
119 |
|
120 resetBackoff: function resetBackoff() { |
|
121 this.enforceBackoff = false; |
|
122 this.backoffInterval = 0; |
|
123 this.minimumNextSync = 0; |
|
124 }, |
|
125 |
|
126 resetSync: function resetSync() { |
|
127 // Logger setup. |
|
128 let logPref = PREFS_BRANCH + "log.logger.status"; |
|
129 let logLevel = "Trace"; |
|
130 try { |
|
131 logLevel = Services.prefs.getCharPref(logPref); |
|
132 } catch (ex) { |
|
133 // Use default. |
|
134 } |
|
135 this._log.level = Log.Level[logLevel]; |
|
136 |
|
137 this._log.info("Resetting Status."); |
|
138 this.service = STATUS_OK; |
|
139 this._login = LOGIN_SUCCEEDED; |
|
140 this._sync = SYNC_SUCCEEDED; |
|
141 this._engines = {}; |
|
142 this.partial = false; |
|
143 } |
|
144 }; |
|
145 |
|
146 // Initialize various status values. |
|
147 Status.resetBackoff(); |
|
148 Status.resetSync(); |