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

source: content/v_identity.js @ 71a07e

ng_0.9
Last change on this file since 71a07e was 71a07e, checked in by rene <rene@…>, 8 years ago

cleanup

  • Property mode set to 100644
File size: 19.5 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/plugins/signatureSwitch.js", virtualIdentityExtension);
35    Components.utils.import("resource://v_identity/vI_identityData.js", virtualIdentityExtension);
36    Components.utils.import("resource://v_identity/vI_smartIdentity.js", virtualIdentityExtension);
37
38    var main = {
39      initTime: null,
40      _smartIdentity: null,
41
42      headerParser: Components.classes["@mozilla.org/messenger/headerparser;1"]
43        .getService(Components.interfaces.nsIMsgHeaderParser),
44
45      unicodeConverter: Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
46        .createInstance(Components.interfaces.nsIScriptableUnicodeConverter),
47
48      accountManager: Components.classes["@mozilla.org/messenger/account-manager;1"]
49        .getService(Components.interfaces.nsIMsgAccountManager),
50
51
52      // Those variables keep pointers to original functions which might get replaced later
53      original_functions: {
54        GenericSendMessage: null,
55        FillIdentityList: null
56      },
57
58      // some pointers to the layout-elements of the extension
59      elements: {
60        init_base: function () {
61          main.elements.Area_MsgIdentityHbox = document.getElementById("virtualIdentityExtension_msgIdentityHbox");
62          main.elements.Obj_MsgIdentity = document.getElementById("msgIdentity");
63        },
64        init_rest: function () {
65          main.elements.Obj_MsgIdentityPopup = document.getElementById("msgIdentityPopup");
66          main.elements.Obj_vILogo = document.getElementById("virtualIdentityExtension_Logo");
67        },
68        strings: null
69      },
70
71      ComposeStateListener: {
72        NotifyComposeBodyReady: function () {
73          Log.debug("NotifyComposeBodyReady");
74          main.initSystemStage2();
75        },
76        NotifyComposeFieldsReady: function () {
77          Log.debug("NotifyComposeFieldsReady");
78        },
79        ComposeProcessDone: function (aResult) {
80          Log.debug("StateListener reports ComposeProcessDone");
81          vI.vIaccount_removeUsedVIAccount();
82          main.storage.clean();
83        },
84        SaveInFolderDone: function (folderURI) {
85          Log.debug("SaveInFolderDone");
86          vI.vIaccount_removeUsedVIAccount();
87          main.storage.clean();
88        }
89      },
90
91      replacement_functions: {
92        FillIdentityList: function (menulist) {
93          Log.debug("mod. FillIdentityList");
94          var accounts = virtualIdentityExtension.getAccountsArray();
95          for (let acc = 0; acc < accounts.length; acc++) {
96            let server = accounts[acc].incomingServer;
97            if (!server)
98              continue;
99
100            // check for VirtualIdentity Account
101            try {
102              vI.prefroot.getBoolPref("mail.account." + accounts[acc].key + ".vIdentity");
103              continue;
104            } catch (e) {};
105            let account = accounts[acc];
106            let identities = virtualIdentityExtension.getIdentitiesArray(account);
107
108            if (identities.length == 0)
109              continue;
110
111            for (let i = 0; i < identities.length; i++) {
112              let identity = identities[i];
113              let item = menulist.appendItem(identity.identityName, identity.key,
114                account.incomingServer.prettyName);
115              item.setAttribute("accountkey", account.key);
116              if (i == 0) {
117                // Mark the first identity as default.
118                item.setAttribute("default", "true");
119              }
120            }
121          }
122        },
123
124        GenericSendMessageInProgress: false,
125        GenericSendMessage: function (msgType) {
126          if (main.replacement_functions.GenericSendMessageInProgress) return;
127          main.replacement_functions.GenericSendMessageInProgress = true;
128
129          // if addressCol2 is focused while sending check storage for the entered address before continuing
130          main.storage.awOnBlur(main.storage.focusedElement, window);
131
132          Log.debug("VIdentity_GenericSendMessage");
133
134          Log.debug("VIdentity_GenericSendMessage top=" + top);
135
136          if (msgType == Components.interfaces.nsIMsgCompDeliverMode.Now)
137            vI.addReplyToSelf(window);
138
139          var vid = document.getElementById("virtualIdentityExtension_msgIdentityClone").vid
140          var virtualIdentityData = document.getElementById("virtualIdentityExtension_msgIdentityClone").identityData;
141
142          let returnValue = vI.vIaccount_prepareSendMsg(vid, msgType, virtualIdentityData,
143            main.accountManager.getIdentity(main.elements.Obj_MsgIdentity.value),
144            main._getRecipients(), window);
145          if (returnValue.update == "abort") {
146            main.replacement_functions.GenericSendMessageInProgress = false;
147            Log.debug("sending: --------------  aborted  ---------------------------------")
148            return;
149          } else if (returnValue.update == "takeover") {
150            var msgIdentityCloneElem = document.getElementById("virtualIdentityExtension_msgIdentityClone");
151            msgIdentityCloneElem.selectedMenuItem = msgIdentityCloneElem.addIdentityToCloneMenu(returnValue.storedIdentity);
152            main.replacement_functions.GenericSendMessageInProgress = false;
153            Log.debug("sending: --------------  aborted  ---------------------------------")
154            return;
155          }
156
157          if (vid) main.addVirtualIdentityToMsgIdentityMenu();
158
159          // final check if eyerything is nice before we handover to the real sending...
160          if (vI.vIaccount_finalCheck(virtualIdentityData, getCurrentIdentity())) {
161            main.replacement_functions.GenericSendMessageInProgress = false;
162            main.original_functions.GenericSendMessage(msgType);
163          }
164          // sending or saving is done (or skipped), if aborted we must restore interface settings for further use
165          main.removeVirtualIdentityFromMsgIdentityMenu();
166          // restore enigmail 'current' identity - has been changed while trying to sent
167          if (typeof Enigmail != 'undefined') Enigmail.msg.identity = getCurrentIdentity();
168
169          main.replacement_functions.GenericSendMessageInProgress = false;
170          //            Log.debug("original_functions.GenericSendMessage done");
171        },
172
173        replace_FillIdentityList: function () {
174          //~ Log.debug("replace FillIdentityList");
175          main.original_functions.FillIdentityList = FillIdentityList;
176          FillIdentityList = main.replacement_functions.FillIdentityList;
177        }
178      },
179
180      remove: function () {
181        window.removeEventListener('compose-window-reopen', main.reopen, true);
182        window.removeEventListener('compose-window-close', main.close, true);
183        Log.debug("end. remove Account if there.")
184        main.storage.clean();
185      },
186
187      _getRecipients: function () {
188        var recipients = [];
189        for (var row = 1; row <= top.MAX_RECIPIENTS; row++) {
190          var recipientType = awGetPopupElement(row).selectedItem.getAttribute("value");
191          if (recipientType == "addr_reply" || recipientType == "addr_followup" ||
192            main._recipientIsDoBcc(row) || awGetInputElement(row).value.match(/^\s*$/)) continue;
193          recipients.push({
194            recipient: awGetInputElement(row).value,
195            recipientType: recipientType
196          });
197        }
198        return recipients;
199      },
200
201      _recipientIsDoBcc: function (row) {
202        var recipientType = awGetPopupElement(row).selectedItem.getAttribute("value");
203        if (recipientType != "addr_bcc" || !getCurrentIdentity().doBcc) return false
204
205        var doBccArray = gMsgCompose.compFields.splitRecipients(getCurrentIdentity().doBccList, false, {});
206
207        for (var index = 0; index < doBccArray.count; index++) {
208          if (doBccArray.StringAt(index) == awGetInputElement(row).value) {
209            Log.debug("_recipientIsDoBcc: ignoring doBcc field '" +
210              doBccArray.StringAt(index));
211            return true;
212          }
213        }
214        return false
215      },
216
217      // initialization //
218      init: function () {
219        if (!main.initTime)
220          main.initTime = (new Date()).toLocaleTimeString();
221        Log.debug("init set main-time " + main.initTime);
222        window.removeEventListener('load', main.init, false);
223        window.removeEventListener('compose-window-init', main.init, true);
224        if (main.elements.Area_MsgIdentityHbox) return; // init done before, (?reopen)
225        Log.debug("init.")
226        main.unicodeConverter.charset = "UTF-8";
227        if (!main.adapt_genericSendMessage()) {
228          Log.error("init failed.");
229          return;
230        }
231
232        main.adapt_interface();
233        gMsgCompose.RegisterStateListener(main.ComposeStateListener);
234        document.getElementById("virtualIdentityExtension_tooltipPopupset")
235          .addTooltip(document.getElementById("virtualIdentityExtension_msgIdentityClone"), false);
236        window.addEventListener('compose-window-reopen', main.reopen, true);
237        window.addEventListener('compose-window-close', main.close, true);
238
239        // append observer to virtualIdentityExtension_fccSwitch, because it does'n work with real identities (hidden by css)
240        document.getElementById("virtualIdentityExtension_fccSwitch").appendChild(document.getElementById("virtualIdentityExtension_msgIdentityClone_observer").cloneNode(false));
241
242        main.AccountManagerObserver.register();
243
244        main.initSystemStage1();
245        Log.debug("init done.")
246      },
247
248      initSystemStage1: function () {
249        Log.debug("initSystemStage1. main-time " + main.initTime);
250        document.getElementById("virtualIdentityExtension_msgIdentityClone").init();
251        vI.statusmenu.init();
252        Log.debug("initSystemStage1 done.")
253      },
254
255      initSystemStage2: function () {
256        Log.debug("initSystemStage2. main-time " + main.initTime);
257        Log.debug("document.title=" + document.title + " gMsgCompose=" + gMsgCompose + " msgIdentityClone=" + document.getElementById("virtualIdentityExtension_msgIdentityClone"))
258        vI.initReplyTo(window);
259        main.storage.init();
260        new vI.smartIdentity(window, gMsgCompose, main.storage);
261        Log.debug("initSystemStage2 done.")
262      },
263
264      close: function () {
265        main.storage.clean();
266      },
267
268      adapt_interface: function () {
269        if (main.elements.Obj_MsgIdentityPopup) return; // only rearrange the interface once
270
271        // initialize the pointers to extension elements
272        main.elements.init_base()
273
274        // rearrange the positions of some elements
275        var parent_hbox = main.elements.Obj_MsgIdentity.parentNode;
276        var storage_box = document.getElementById("addresses-box");
277        var virtualIdentityExtension_autoReplyToSelfLabel = document.getElementById("virtualIdentityExtension_autoReplyToSelfLabelBox");
278
279        storage_box.removeChild(virtualIdentityExtension_autoReplyToSelfLabel);
280        parent_hbox.appendChild(virtualIdentityExtension_autoReplyToSelfLabel);
281        storage_box.removeChild(main.elements.Area_MsgIdentityHbox);
282        parent_hbox.appendChild(main.elements.Area_MsgIdentityHbox);
283
284        main.elements.Obj_MsgIdentity.setAttribute("hidden", "true");
285        main.elements.Obj_MsgIdentity.previousSibling.setAttribute("control", "virtualIdentityExtension_msgIdentityClone");
286
287        var access_label = parent_hbox.getElementsByAttribute("control", "msgIdentity")[0];
288        if (access_label) access_label.setAttribute("control", "virtualIdentityExtension_msgIdentityClone");
289
290        // initialize the pointers to extension elements (initialize those earlier might brake the interface)
291        main.elements.init_rest();
292      },
293
294      adapt_genericSendMessage: function () {
295        if (main.original_functions.GenericSendMessage) return true; // only initialize this once
296        Log.debug("adapt GenericSendMessage");
297        main.original_functions.GenericSendMessage = GenericSendMessage;
298        GenericSendMessage = main.replacement_functions.GenericSendMessage;
299        return true;
300      },
301
302      reopen: function () {
303        vI.clearDebugOutput();
304        Log.debug("composeDialog reopened. (msgType " + gMsgCompose.type + ")")
305        Log.debug("document.title=" + document.title + " gMsgCompose=" + gMsgCompose + " msgIdentityClone=" + document.getElementById("virtualIdentityExtension_msgIdentityClone"))
306
307        // clean all elements
308        document.getElementById("virtualIdentityExtension_msgIdentityClone").clean();
309        main.storage.clean(); // just to be sure!
310        Log.debug("everything cleaned.")
311
312        // register StateListener
313        gMsgCompose.RegisterStateListener(main.ComposeStateListener);
314
315        // now (re)init the elements
316        main.initSystemStage1();
317
318        vI.vIprefs.dropLocalChanges();
319
320        // NotifyComposeBodyReady is only triggered in reply-cases
321        // so activate stage2 in reply-cases trough StateListener
322        // in other cases directly
323        var msgComposeType = Components.interfaces.nsIMsgCompType;
324        switch (gMsgCompose.type) {
325        case msgComposeType.New:
326        case msgComposeType.NewsPost:
327        case msgComposeType.MailToUrl:
328        case msgComposeType.Draft:
329        case msgComposeType.Template:
330        case msgComposeType.ForwardAsAttachment:
331        case msgComposeType.ForwardInline:
332          main.initSystemStage2();
333          //             case msgComposeType.Reply:
334          //             case msgComposeType.ReplyAll:
335          //             case msgComposeType.ReplyToGroup:
336          //             case msgComposeType.ReplyToSender:
337          //             case msgComposeType.ReplyToSenderAndGroup:
338          //             case msgComposeType.ReplyWithTemplate:
339          //             case msgComposeType.ReplyToList:
340          //                 main.initSystemStage2() triggered trough NotifyComposeBodyReady;
341        }
342        Log.debug("reopen done.")
343      },
344
345      tempStorage: {
346        BaseIdentity: null,
347        NewIdentity: null
348      },
349
350      __setSelectedIdentity: function (menuItem) {
351        main.elements.Obj_MsgIdentity.selectedItem = menuItem;
352        main.elements.Obj_MsgIdentity.setAttribute("label", menuItem.getAttribute("label"));
353        main.elements.Obj_MsgIdentity.setAttribute("accountname", menuItem.getAttribute("accountname"));
354        main.elements.Obj_MsgIdentity.setAttribute("value", menuItem.getAttribute("value"));
355      },
356
357      // sets the values of the dropdown-menu to the ones of the newly created account
358      addVirtualIdentityToMsgIdentityMenu: function () {
359        main.tempStorage.BaseIdentity = main.elements.Obj_MsgIdentity.selectedItem;
360        main.tempStorage.NewIdentity = document.createElement("menuitem");
361        main.tempStorage.NewIdentity.className = "identity-popup-item";
362
363        // set the account name in the choosen menu item
364        main.tempStorage.NewIdentity.setAttribute("label", vI.get_vIaccount().defaultIdentity.identityName);
365        main.tempStorage.NewIdentity.setAttribute("accountname", " - " + vI.get_vIaccount().incomingServer.prettyName);
366        main.tempStorage.NewIdentity.setAttribute("accountkey", vI.get_vIaccount().key);
367        main.tempStorage.NewIdentity.setAttribute("value", vI.get_vIaccount().defaultIdentity.key);
368
369        main.elements.Obj_MsgIdentityPopup.appendChild(main.tempStorage.NewIdentity);
370        main.__setSelectedIdentity(main.tempStorage.NewIdentity);
371      },
372
373      removeVirtualIdentityFromMsgIdentityMenu: function () {
374        if (!main.tempStorage.BaseIdentity) return; // don't try to remove Item twice
375        try { // might not exist anymore (window closed), so just try to remove it
376          document.getElementById("msgIdentity").firstChild.removeChild(main.tempStorage.NewIdentity);
377          main.__setSelectedIdentity(main.tempStorage.BaseIdentity);
378        } catch (e) {};
379        main.tempStorage.NewIdentity = null;
380        main.tempStorage.BaseIdentity = null;
381      },
382
383      prepareAccount: function () {
384        main.removeVirtualIdentityFromMsgIdentityMenu(); // just to be sure that nothing is left (maybe last time sending was irregularily stopped)
385        vI.vIaccount_createAccount(document.getElementById("virtualIdentityExtension_msgIdentityClone").identityData,
386          main.accountManager.getIdentity(main.elements.Obj_MsgIdentity.value));
387        main.addVirtualIdentityToMsgIdentityMenu();
388      },
389
390      //  code adapted from http://xulsolutions.blogspot.com/2006/07/creating-uninstall-script-for.html
391      AccountManagerObserver: {
392        _uninstall: false,
393        observe: function (subject, topic, data) {
394          if (topic == "am-smtpChanges") {
395            Log.debug("smtp changes observed");
396            var virtualIdentityExtension_msgIdentityClone = document.getElementById("virtualIdentityExtension_msgIdentityClone");
397            document.getAnonymousElementByAttribute(virtualIdentityExtension_msgIdentityClone, "class", "smtpServerListHbox").refresh();
398          }
399          if (topic == "am-acceptChanges") {
400            Log.debug("account changes observed");
401            document.getElementById("virtualIdentityExtension_msgIdentityClone").clean();
402            document.getElementById("virtualIdentityExtension_msgIdentityClone").init();
403          }
404        },
405        register: function () {
406          var obsService = Components.classes["@mozilla.org/observer-service;1"].
407          getService(Components.interfaces.nsIObserverService)
408          obsService.addObserver(this, "am-smtpChanges", false);
409          obsService.addObserver(this, "am-acceptChanges", false);
410        },
411        unregister: function () {
412          var obsService = Components.classes["@mozilla.org/observer-service;1"].
413          getService(Components.interfaces.nsIObserverService)
414          obsService.removeObserver(this, "am-smtpChanges");
415          obsService.removeObserver(this, "am-acceptChanges");
416        }
417      }
418    }
419
420
421    main.replacement_functions.replace_FillIdentityList();
422    window.addEventListener('compose-window-init', main.init, true);
423
424    window.addEventListener("unload", function (e) {
425      main.AccountManagerObserver.unregister();
426      try {
427        vI.statusmenu.removeObserver();
428      } catch (ex) {}
429    }, false);
430    vI.main = main;
431  }
432});
Note: See TracBrowser for help on using the repository browser.