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

source: content/v_identity.js

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

if FROM-field is empty, mail will get sent with base identity. So display base identity instead!

  • Property mode set to 100644
File size: 14.2 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.storage.clean();
87        },
88        SaveInFolderDone: function (folderURI) {
89          Log.debug("SaveInFolderDone");
90          vI.storage.clean();
91        }
92      },
93
94      replacement_functions: {
95        LoadIdentity: function (startup) {
96          var identityElement = document.getElementById("msgIdentity");
97         
98          // identitykey and accountkey might not be set on new selectedItem, if it's a virtual identity
99          // on startup there might be no identitykey if a virtual identity is selected.
100          Log.debug("run adapted LoadIdentity startup=" + startup);
101         
102          let hasBaseId = identityElement.selectedItem.identityData.id.key;
103          if (hasBaseId == null) {
104            identityElement.selectedItem.setAttribute("identitykey", identityElement.getAttribute("identitykey"));
105            identityElement.selectedItem.setAttribute("accountkey", identityElement.getAttribute("accountkey"));
106          }
107          else {
108            identityElement.setAttribute("description", identityElement.selectedItem.getAttribute("description"));
109            identityElement.setAttribute("idDescription", identityElement.selectedItem.identityData.id.value);
110          }
111         
112          if (startup)
113            identityElement.identityData = identityElement.selectedItem.identityData.getDuplicate();
114          // else only values are copied into current identityData
115          else
116            identityElement.identityData.takeOverAvailableData(identityElement.selectedItem.identityData);
117         
118          gComposeNotificationBar.clearIdentityWarning();
119         
120          main.original_functions.LoadIdentity(startup);
121         
122          // store identitykey locally to enable restoring after selection of next virtual identity without identitykey
123          identityElement.setAttribute("identitykey", identityElement.selectedItem.getAttribute("identitykey"));
124         
125          identityElement.vid = identityElement.selectedItem.vid;
126         
127          identityElement.selectedItem.identityData.extras.setValuesToEnvironment()
128        },
129       
130        GenericSendMessage: function (msgType) {
131          try { // nice, but not required for sending messages
132            // if addressCol2 is focused while sending check storage for the entered address before continuing
133            vI.storage.awOnBlur(vI.storage.focusedElement, window);
134          } catch (e) {}
135
136          Log.debug("VIdentity_GenericSendMessage");
137         
138          // prevent sending if senders address is empty
139          if (!main.elements.Obj_MsgIdentity.label) {
140            Log.debug("VIdentity_GenericSendMessage: sender empty, aborting");
141            main.elements.Obj_MsgIdentity.blurEvent();
142            return;
143          }
144
145          // check via virtual / non-virtual constraints and storage results if mail should be sent
146          if (msgType == Ci.nsIMsgCompDeliverMode.Now) {
147            if ((main.elements.Obj_MsgIdentity.vid && vI.vIprefs.get("warn_virtual") &&
148                !(main.promptService.confirm(window, "Warning",
149                  main._stringBundle.GetStringFromName("vident.sendVirtual.warning")))) ||
150              (!main.elements.Obj_MsgIdentity.vid && vI.vIprefs.get("warn_nonvirtual") &&
151                !(main.promptService.confirm(window, "Warning",
152                  main._stringBundle.GetStringFromName("vident.sendNonvirtual.warning"))))) {
153
154              Log.debug("sending: --------------  aborted  ---------------------------------")
155              return;
156            }
157            if (vI.vIprefs.get("storage") && vI.vIprefs.get("storage_store")) {
158              var localeDatasourceAccess = new vI.rdfDatasourceAccess(window);
159              var returnValue = localeDatasourceAccess.storeVIdentityToAllRecipients(
160                main.elements.Obj_MsgIdentity.identityData, main._getRecipients())
161              if (returnValue.update == "takeover")
162                main.elements.Obj_MsgIdentity.selectedMenuItem =
163                  main.elements.Obj_MsgIdentity.addIdentityToMsgIdentityMenu(returnValue.storedIdentity);
164              if (returnValue.update == "takeover" || returnValue.update == "abort") {
165                Log.debug("sending: --------------  aborted  ---------------------------------")
166                return;
167              }
168            } else Log.debug("prepareSendMsg: storage deactivated");
169          }
170          main.original_functions.GenericSendMessage(msgType);
171        },
172      },
173
174      _getRecipients: function () {
175        var recipients = [];
176        for (var row = 1; row <= top.MAX_RECIPIENTS; row++) {
177          if (typeof awGetPopupElement(row).selectedItem == 'undefined')
178            continue;
179          var recipientType = awGetPopupElement(row).selectedItem.getAttribute("value");
180          if (recipientType == "addr_reply" || recipientType == "addr_followup" ||
181            main._recipientIsDoBcc(row) || awGetInputElement(row).value.match(/^\s*$/)) continue;
182          recipients.push({
183            recipient: awGetInputElement(row).value,
184            recipientType: recipientType
185          });
186        }
187        return recipients;
188      },
189
190      _recipientIsDoBcc: function (row) {
191        if (typeof awGetPopupElement(row).selectedItem == 'undefined')
192          return false;
193        var recipientType = awGetPopupElement(row).selectedItem.getAttribute("value");
194        if (recipientType != "addr_bcc" || !getCurrentIdentity().doBcc) return false
195
196        var doBccArray = gMsgCompose.compFields.splitRecipients(getCurrentIdentity().doBccList, false, {});
197
198        for (var index = 0; index < doBccArray.count; index++) {
199          if (doBccArray.StringAt(index) == awGetInputElement(row).value) {
200            Log.debug("_recipientIsDoBcc: ignoring doBcc field '" +
201              doBccArray.StringAt(index));
202            return true;
203          }
204        }
205        return false
206      },
207
208      // initialization //
209      init: function () {
210        if (!this.timeStampID) {
211          this.timeStampID = parseInt((new Date()).getTime() / 100) % 864000; // give object unified id (per day)
212          Log = vI.setupLogging("virtualIdentity.main[" + this.timeStampID + "]");
213        }
214        window.removeEventListener('load', main.init, false);
215        window.removeEventListener('compose-window-init', main.init, true);
216
217        Log.debug("init.")
218        main.unicodeConverter.charset = "UTF-8";
219       
220        if (!main.adapt_genericSendMessage()) {
221          Log.error("init failed.");
222          return;
223        }
224       
225        let statusbarLabel = document.getElementById("v_identity_logo_statusbar");
226        statusbarLabel.setAttribute("value", statusbarLabel.getAttribute("value") + vI.extensionVersion);
227       
228        gMsgCompose.RegisterStateListener(main.ComposeStateListener);
229        document.getElementById("virtualIdentityExtension_tooltipPopupset")
230          .addTooltip(document.getElementById("msgIdentity"), false);
231
232        main.AccountManagerObserver.register();
233
234        Log.debug("init done.")
235      },
236
237      initSystemStage2: function () {
238        Log.debug("initSystemStage2.");
239//         Log.debug("document.title=" + document.title + " gMsgCompose=" + gMsgCompose + " msgIdentityMenu=" + document.getElementById("msgIdentity"))
240        vI.storage.init();
241        vI.statusmenu.init();
242        new vI.smartIdentity(window, gMsgCompose, vI.storage);
243        Log.debug("initSystemStage2 done.")
244      },
245
246      adapt_loadIdentity: function () {
247        if (main.original_functions.LoadIdentity) return true; // only initialize this once
248        Log.debug("adapt LoadIdentity");
249        main.original_functions.LoadIdentity = LoadIdentity;
250        LoadIdentity = main.replacement_functions.LoadIdentity;
251        return true;
252      },
253
254      adapt_genericSendMessage: function () {
255        if (main.original_functions.GenericSendMessage) return true; // only initialize this once
256        Log.debug("adapt GenericSendMessage");
257        main.original_functions.GenericSendMessage = GenericSendMessage;
258        GenericSendMessage = main.replacement_functions.GenericSendMessage;
259        return true;
260      },
261
262      //  code adapted from http://xulsolutions.blogspot.com/2006/07/creating-uninstall-script-for.html
263      AccountManagerObserver: {
264        _uninstall: false,
265        observe: function (subject, topic, data) {
266          if (topic == "am-acceptChanges") {
267            Log.debug("account changes observed");
268            Log.debug("cleaning original msgIdentityPopup");
269            var MenuItems = main.elements.Obj_MsgIdentityPopup.childNodes;
270            while (MenuItems.length > 0) {
271              try {
272                MenuItems[0].clean();
273              } catch (e) {};
274              main.elements.Obj_MsgIdentityPopup.removeChild(MenuItems[0])
275            }
276            let msgIdentity = document.getElementById("msgIdentity")
277            let tmp_identity = msgIdentity.identityData;
278            msgIdentity.clean();
279            msgIdentity.init();
280            Log.debug("cleaning original msgIdentityPopup done.");
281            tmp_identity.existingID = tmp_identity.isExistingIdentity(false)
282            if (tmp_identity.existingID) {
283              tmp_identity.id.key = tmp_identity.existingID
284            } else {
285              tmp_identity.id.key = MailServices.accounts.defaultAccount.defaultIdentity.key
286            }
287            Log.debug("adding previous identity to msgIdentityMenu");
288            msgIdentity.selectedMenuItem = msgIdentity.addIdentityToMsgIdentityMenu(tmp_identity);
289            Log.debug("adding previous identity to msgIdentityMenu done.");
290          }
291        },
292        register: function () {
293          var obsService = Components.classes["@mozilla.org/observer-service;1"].
294          getService(Components.interfaces.nsIObserverService)
295          obsService.addObserver(this, "am-acceptChanges", false);
296        },
297        unregister: function () {
298          var obsService = Components.classes["@mozilla.org/observer-service;1"].
299          getService(Components.interfaces.nsIObserverService)
300          obsService.removeObserver(this, "am-acceptChanges");
301        }
302      }
303    }
304
305    main.elements.init_base();
306    main.elements.init_rest();
307    main.adapt_loadIdentity();
308   
309    window.addEventListener('compose-window-init', main.init, true);
310
311    window.addEventListener("unload", function (e) {
312      main.AccountManagerObserver.unregister();
313      try {
314        vI.statusmenu.removeObserver();
315      } catch (ex) {}
316    }, false);
317    vI.main = main;
318  }
319});
Note: See TracBrowser for help on using the repository browser.