This is just some static backup of the original site, don't expect every link to work!

source: content/v_identity.js @ 64a5f3

ng_0.9
Last change on this file since 64a5f3 was 64a5f3, checked in by rene <rene@…>, 4 years ago

rename old 'clone' items (no code changes)

  • Property mode set to 100644
File size: 17.9 KB
Line 
1/* ***** BEGIN LICENSE BLOCK *****
2    This program is free software; you can redistribute it and/or modify
3    it under the terms of the GNU General Public License as published by
4    the Free Software Foundation; either version 2 of the License, or
5    (at your option) any later version.
6
7    This program is distributed in the hope that it will be useful,
8    but WITHOUT ANY WARRANTY; without even the implied warranty of
9    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10    GNU General Public License for more details.
11
12    You should have received a copy of the GNU General Public License
13    along with this program; if not, write to the Free Software
14    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
15
16    The Original Code is the Virtual Identity Extension.
17
18    The Initial Developer of the Original Code is Rene Ejury.
19    Portions created by the Initial Developer are Copyright (C) 2007
20    the Initial Developer. All Rights Reserved.
21
22    Contributor(s):
23 * ***** END LICENSE BLOCK ***** */
24
25Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
26virtualIdentityExtension.ns(function () {
27  with(virtualIdentityExtension.LIB) {
28
29    let Log = vI.setupLogging("virtualIdentity.main");
30    Components.utils.import("resource://v_identity/vI_account.js", virtualIdentityExtension);
31    Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension);
32    Components.utils.import("resource://v_identity/vI_replyToSelf.js", virtualIdentityExtension);
33    Components.utils.import("resource://v_identity/vI_accountUtils.js", virtualIdentityExtension);
34    Components.utils.import("resource://v_identity/vI_identityData.js", virtualIdentityExtension);
35    Components.utils.import("resource://v_identity/vI_smartIdentity.js", virtualIdentityExtension);
36    Components.utils.import("resource://v_identity/vI_log.js", virtualIdentityExtension);
37    Components.utils.import("resource://v_identity/vI_rdfDatasource.js", virtualIdentityExtension);
38    Components.utils.import("resource:///modules/mailServices.js");
39
40    var main = {
41      timeStampID: null,
42      _smartIdentity: null,
43     
44      headerParser: Components.classes["@mozilla.org/messenger/headerparser;1"]
45        .getService(Components.interfaces.nsIMsgHeaderParser),
46
47      unicodeConverter: Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
48        .createInstance(Components.interfaces.nsIScriptableUnicodeConverter),
49
50      accountManager: Components.classes["@mozilla.org/messenger/account-manager;1"]
51        .getService(Components.interfaces.nsIMsgAccountManager),
52
53      promptService: Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
54              .getService(Ci.nsIPromptService),
55
56      _stringBundle: Services.strings.createBundle("chrome://v_identity/locale/v_identity.properties"),
57
58      // Those variables keep pointers to original functions which might get replaced later
59      original_functions: {
60        GenericSendMessage: null,
61        LoadIdentity: null
62      },
63
64      // some pointers to the layout-elements of the extension
65      elements: {
66        init_base: function () {
67          main.elements.Area_MsgIdentityHbox = document.getElementById("virtualIdentityExtension_msgIdentityHbox");
68          main.elements.Obj_MsgIdentity = document.getElementById("msgIdentity");
69        },
70        init_rest: function () {
71          main.elements.Obj_MsgIdentityPopup = document.getElementById("msgIdentityPopup");
72          main.elements.Obj_vILogo = document.getElementById("virtualIdentityExtension_Logo");
73        },
74        strings: null
75      },
76
77      ComposeStateListener: {
78        NotifyComposeBodyReady: function () {
79          Log.debug("NotifyComposeBodyReady");
80          main.initSystemStage2();
81        },
82        NotifyComposeFieldsReady: function () {
83          Log.debug("NotifyComposeFieldsReady");
84        },
85        ComposeProcessDone: function (aResult) {
86          Log.debug("StateListener reports ComposeProcessDone");
87          vI.vIaccount_removeUsedVIAccount();
88          vI.storage.clean();
89        },
90        SaveInFolderDone: function (folderURI) {
91          Log.debug("SaveInFolderDone");
92          vI.vIaccount_removeUsedVIAccount();
93          vI.storage.clean();
94        }
95      },
96
97      replacement_functions: {
98        LoadIdentity: function (startup) {
99          var identityElement = document.getElementById("msgIdentity");
100         
101          // identitykey and accountkey might not be set on new selectedItem, if it's a virtual identity
102          // on startup there might be no identitykey if a virtual identity is selected.
103          Log.debug("run adapted LoadIdentity startup=" + startup);
104         
105          let hasBaseId = identityElement.selectedItem.identityData.id.key;
106          if (hasBaseId == null) {
107            identityElement.selectedItem.setAttribute("identitykey", identityElement.getAttribute("identitykey"));
108            identityElement.selectedItem.setAttribute("accountkey", identityElement.getAttribute("accountkey"));
109          }
110          else {
111            identityElement.setAttribute("description", identityElement.selectedItem.getAttribute("description"));
112            identityElement.setAttribute("idDescription", identityElement.selectedItem.identityData.id.value);
113          }
114         
115          if (startup)
116            identityElement.identityData = identityElement.selectedItem.identityData.getDuplicate();
117          // else only values are copied into current identityData
118          else
119            identityElement.identityData.takeOverAvailableData(identityElement.selectedItem.identityData);
120         
121          gComposeNotificationBar.clearIdentityWarning();
122         
123          main.original_functions.LoadIdentity(startup);
124         
125          // store identitykey locally to enable restoring after selection of next virtual identity without identitykey
126          identityElement.setAttribute("identitykey", identityElement.selectedItem.getAttribute("identitykey"));
127         
128          identityElement.vid = identityElement.selectedItem.vid;
129         
130          identityElement.selectedItem.identityData.extras.setValuesToEnvironment()
131        },
132       
133        GenericSendMessage: function (msgType) {
134          try { // nice, but not required for sending messages
135            // if addressCol2 is focused while sending check storage for the entered address before continuing
136            vI.storage.awOnBlur(vI.storage.focusedElement, window);
137          } catch (e) {}
138
139          Log.debug("VIdentity_GenericSendMessage");
140
141  //           if (msgType == Components.interfaces.nsIMsgCompDeliverMode.Now)
142  //             vI.addReplyToSelf(window);
143
144          // check via virtual / non-virtual constraints and storage results if mail should be sent
145          if (msgType == Ci.nsIMsgCompDeliverMode.Now) {
146            if ((main.elements.Obj_MsgIdentity.vid && vI.vIprefs.get("warn_virtual") &&
147                !(main.promptService.confirm(window, "Warning",
148                  main._stringBundle.GetStringFromName("vident.sendVirtual.warning")))) ||
149              (!main.elements.Obj_MsgIdentity.vid && vI.vIprefs.get("warn_nonvirtual") &&
150                !(main.promptService.confirm(window, "Warning",
151                  main._stringBundle.GetStringFromName("vident.sendNonvirtual.warning"))))) {
152
153              Log.debug("sending: --------------  aborted  ---------------------------------")
154              return;
155            }
156            if (vI.vIprefs.get("storage") && vI.vIprefs.get("storage_store")) {
157              var localeDatasourceAccess = new vI.rdfDatasourceAccess(window);
158              var returnValue = localeDatasourceAccess.storeVIdentityToAllRecipients(
159                main.elements.Obj_MsgIdentity.identityData, main._getRecipients())
160              if (returnValue.update == "takeover")
161                main.elements.Obj_MsgIdentity.selectedMenuItem =
162                  main.elements.Obj_MsgIdentity.addIdentityToMsgIdentityMenu(returnValue.storedIdentity);
163              if (returnValue.update == "takeover" || returnValue.update == "abort") {
164                Log.debug("sending: --------------  aborted  ---------------------------------")
165                return;
166              }
167            } else Log.debug("prepareSendMsg: storage deactivated");
168          }
169          main.original_functions.GenericSendMessage(msgType);
170        },
171      },
172
173      remove: function () {
174        window.removeEventListener('compose-window-reopen', main.reopen, true);
175        window.removeEventListener('compose-window-close', main.close, true);
176        Log.debug("end. remove Account if there.")
177        vI.storage.clean();
178      },
179
180      _getRecipients: function () {
181        var recipients = [];
182        for (var row = 1; row <= top.MAX_RECIPIENTS; row++) {
183          if (typeof awGetPopupElement(row).selectedItem == 'undefined')
184            continue;
185          var recipientType = awGetPopupElement(row).selectedItem.getAttribute("value");
186          if (recipientType == "addr_reply" || recipientType == "addr_followup" ||
187            main._recipientIsDoBcc(row) || awGetInputElement(row).value.match(/^\s*$/)) continue;
188          recipients.push({
189            recipient: awGetInputElement(row).value,
190            recipientType: recipientType
191          });
192        }
193        return recipients;
194      },
195
196      _recipientIsDoBcc: function (row) {
197        if (typeof awGetPopupElement(row).selectedItem == 'undefined')
198          return false;
199        var recipientType = awGetPopupElement(row).selectedItem.getAttribute("value");
200        if (recipientType != "addr_bcc" || !getCurrentIdentity().doBcc) return false
201
202        var doBccArray = gMsgCompose.compFields.splitRecipients(getCurrentIdentity().doBccList, false, {});
203
204        for (var index = 0; index < doBccArray.count; index++) {
205          if (doBccArray.StringAt(index) == awGetInputElement(row).value) {
206            Log.debug("_recipientIsDoBcc: ignoring doBcc field '" +
207              doBccArray.StringAt(index));
208            return true;
209          }
210        }
211        return false
212      },
213
214      // initialization //
215      init: function () {
216        if (!this.timeStampID) {
217          this.timeStampID = parseInt((new Date()).getTime() / 100) % 864000; // give object unified id (per day)
218          Log = vI.setupLogging("virtualIdentity.main[" + this.timeStampID + "]");
219        }
220        window.removeEventListener('load', main.init, false);
221        window.removeEventListener('compose-window-init', main.init, true);
222        if (main.elements.Area_MsgIdentityHbox) return; // init done before, (?reopen)
223        Log.debug("init.")
224        main.unicodeConverter.charset = "UTF-8";
225       
226        if (!main.adapt_genericSendMessage()) {
227          Log.error("init failed.");
228          return;
229        }
230       
231        let statusbarLabel = document.getElementById("v_identity_logo_statusbar");
232        statusbarLabel.setAttribute("value", statusbarLabel.getAttribute("value") + vI.extensionVersion);
233       
234        gMsgCompose.RegisterStateListener(main.ComposeStateListener);
235        document.getElementById("virtualIdentityExtension_tooltipPopupset")
236          .addTooltip(document.getElementById("msgIdentity"), false);
237        window.addEventListener('compose-window-reopen', main.reopen, true);
238        window.addEventListener('compose-window-close', main.close, true);
239
240        main.AccountManagerObserver.register();
241
242        Log.debug("init done.")
243      },
244
245      initSystemStage2: function () {
246        Log.debug("initSystemStage2.");
247//         Log.debug("document.title=" + document.title + " gMsgCompose=" + gMsgCompose + " msgIdentityMenu=" + document.getElementById("msgIdentity"))
248//         vI.initReplyTo(window);
249        vI.storage.init();
250        vI.statusmenu.init();
251        new vI.smartIdentity(window, gMsgCompose, vI.storage);
252        Log.debug("initSystemStage2 done.")
253      },
254
255      close: function () {
256        vI.storage.clean();
257      },
258
259      adapt_interface: function () {
260        if (main.elements.Obj_MsgIdentityPopup) return; // only rearrange the interface once
261
262        // initialize the pointers to extension elements
263        main.elements.init_base()
264
265        // rearrange the positions of some elements
266        var parent_hbox = main.elements.Obj_MsgIdentity.parentNode;
267        var storage_box = document.getElementById("addresses-box");
268        var virtualIdentityExtension_autoReplyToSelfLabel = document.getElementById("virtualIdentityExtension_autoReplyToSelfLabelBox");
269
270        storage_box.removeChild(virtualIdentityExtension_autoReplyToSelfLabel);
271        parent_hbox.appendChild(virtualIdentityExtension_autoReplyToSelfLabel);
272        storage_box.removeChild(main.elements.Area_MsgIdentityHbox);
273        parent_hbox.appendChild(main.elements.Area_MsgIdentityHbox);
274
275        //main.elements.Obj_MsgIdentity.setAttribute("hidden", "true");
276        main.elements.Obj_MsgIdentity.previousSibling.setAttribute("control", "msgIdentity");
277
278        var access_label = parent_hbox.getElementsByAttribute("control", "msgIdentity")[0];
279        if (access_label) access_label.setAttribute("control", "msgIdentity");
280
281        // initialize the pointers to extension elements (initialize those earlier might brake the interface)
282        main.elements.init_rest();
283      },
284
285      adapt_loadIdentity: function () {
286        if (main.original_functions.LoadIdentity) return true; // only initialize this once
287        Log.debug("adapt LoadIdentity");
288        main.original_functions.LoadIdentity = LoadIdentity;
289        LoadIdentity = main.replacement_functions.LoadIdentity;
290        return true;
291      },
292
293      adapt_genericSendMessage: function () {
294        if (main.original_functions.GenericSendMessage) return true; // only initialize this once
295        Log.debug("adapt GenericSendMessage");
296        main.original_functions.GenericSendMessage = GenericSendMessage;
297        GenericSendMessage = main.replacement_functions.GenericSendMessage;
298        return true;
299      },
300
301      reopen: function () {
302        vI.clearDebugOutput();
303        Log.debug("composeDialog reopened. (msgType " + gMsgCompose.type + ")")
304        Log.debug("document.title=" + document.title + " gMsgCompose=" + gMsgCompose + " msgIdentityMenu=" + document.getElementById("msgIdentity"))
305
306        // clean all elements
307        document.getElementById("msgIdentity").clean();
308        vI.storage.clean(); // just to be sure!
309        Log.debug("everything cleaned.")
310
311        // register StateListener
312        gMsgCompose.RegisterStateListener(main.ComposeStateListener);
313
314        // now (re)init the elements
315        main.initSystemStage1();
316
317        vI.vIprefs.dropLocalChanges();
318
319        // NotifyComposeBodyReady is only triggered in reply-cases
320        // so activate stage2 in reply-cases trough StateListener
321        // in other cases directly
322        var msgComposeType = Components.interfaces.nsIMsgCompType;
323        switch (gMsgCompose.type) {
324        case msgComposeType.New:
325        case msgComposeType.NewsPost:
326        case msgComposeType.MailToUrl:
327        case msgComposeType.Draft:
328        case msgComposeType.Template:
329        case msgComposeType.ForwardAsAttachment:
330        case msgComposeType.ForwardInline:
331          main.initSystemStage2();
332          //             case msgComposeType.Reply:
333          //             case msgComposeType.ReplyAll:
334          //             case msgComposeType.ReplyToGroup:
335          //             case msgComposeType.ReplyToSender:
336          //             case msgComposeType.ReplyToSenderAndGroup:
337          //             case msgComposeType.ReplyWithTemplate:
338          //             case msgComposeType.ReplyToList:
339          //                 main.initSystemStage2() triggered trough NotifyComposeBodyReady;
340        }
341        Log.debug("reopen done.")
342      },
343
344      //  code adapted from http://xulsolutions.blogspot.com/2006/07/creating-uninstall-script-for.html
345      AccountManagerObserver: {
346        _uninstall: false,
347        observe: function (subject, topic, data) {
348          if (topic == "am-acceptChanges") {
349            Log.debug("account changes observed");
350            Log.debug("cleaning original msgIdentityPopup");
351            var MenuItems = main.elements.Obj_MsgIdentityPopup.childNodes;
352            while (MenuItems.length > 0) {
353              try {
354                MenuItems[0].clean();
355              } catch (e) {};
356              main.elements.Obj_MsgIdentityPopup.removeChild(MenuItems[0])
357            }
358            let msgIdentity = document.getElementById("msgIdentity")
359            let tmp_identity = msgIdentity.identityData;
360            msgIdentity.clean();
361            msgIdentity.init();
362            Log.debug("cleaning original msgIdentityPopup done.");
363            tmp_identity.existingID = tmp_identity.isExistingIdentity(false)
364            if (tmp_identity.existingID) {
365              tmp_identity.id.key = tmp_identity.existingID
366            } else {
367              tmp_identity.id.key = MailServices.accounts.defaultAccount.defaultIdentity.key
368            }
369            Log.debug("adding previous identity to msgIdentityMenu");
370            msgIdentity.selectedMenuItem = msgIdentity.addIdentityToMsgIdentityMenu(tmp_identity);
371            Log.debug("adding previous identity to msgIdentityMenu done.");
372          }
373        },
374        register: function () {
375          var obsService = Components.classes["@mozilla.org/observer-service;1"].
376          getService(Components.interfaces.nsIObserverService)
377          obsService.addObserver(this, "am-acceptChanges", false);
378        },
379        unregister: function () {
380          var obsService = Components.classes["@mozilla.org/observer-service;1"].
381          getService(Components.interfaces.nsIObserverService)
382          obsService.removeObserver(this, "am-acceptChanges");
383        }
384      }
385    }
386
387    main.elements.init_base();
388    main.elements.init_rest();
389    main.adapt_loadIdentity();
390   
391    window.addEventListener('compose-window-init', main.init, true);
392
393    window.addEventListener("unload", function (e) {
394      main.AccountManagerObserver.unregister();
395      try {
396        vI.statusmenu.removeObserver();
397      } catch (ex) {}
398    }, false);
399    vI.main = main;
400  }
401});
Note: See TracBrowser for help on using the repository browser.