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

source: content/v_identity.js @ e4b836

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

removed reply-to-self option

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