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

Changeset 509348


Ignore:
Timestamp:
Nov 3, 2014, 12:35:40 PM (8 years ago)
Author:
rene <rene@…>
Branches:
ng_0.9
Children:
7204cb
Parents:
3c9c29
Message:

code formatting (no code changes)

Files:
38 edited

Legend:

Unmodified
Added
Removed
  • content/accountManagerOverlays/vI_am-Overlay.js

    r3c9c29 r509348  
    2424
    2525Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
    26 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) {
    27 function orig_onAccept() {};
    28 var am_Overlay = {
    29     onAccept : function(aServerKeyToSelect, aFocusList) {
     26virtualIdentityExtension.ns(function () {
     27  with(virtualIdentityExtension.LIB) {
     28    function orig_onAccept() {};
     29    var am_Overlay = {
     30      onAccept: function (aServerKeyToSelect, aFocusList) {
    3031        orig_onAccept();
    3132        var gObserver = Components.classes["@mozilla.org/observer-service;1"].
    32             getService(Components.interfaces.nsIObserverService);
     33        getService(Components.interfaces.nsIObserverService);
    3334        gObserver.notifyObservers(null, "am-acceptChanges", "other");
    34     },
    35    
    36     init : function() {
     35      },
     36
     37      init: function () {
    3738        orig_onAccept = onAccept;
    3839        onAccept = am_Overlay.onAccept;
     40      }
    3941    }
    40 }
    41 window.addEventListener('load', am_Overlay.init, false);
    42 }});
     42    window.addEventListener('load', am_Overlay.init, false);
     43  }
     44});
  • content/accountManagerOverlays/vI_am-smtpOverlay.js

    r3c9c29 r509348  
    2424
    2525Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
    26 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) {
    27 var am_smtpOverlay = {
    28     refreshServerList : function(aServerKeyToSelect, aFocusList) {
     26virtualIdentityExtension.ns(function () {
     27  with(virtualIdentityExtension.LIB) {
     28    var am_smtpOverlay = {
     29      refreshServerList: function (aServerKeyToSelect, aFocusList) {
    2930        gSmtpServerListWindow.orig_refreshServerList(aServerKeyToSelect, aFocusList);
    3031        var gObserver = Components.classes["@mozilla.org/observer-service;1"].
    31             getService(Components.interfaces.nsIObserverService);
     32        getService(Components.interfaces.nsIObserverService);
    3233        gObserver.notifyObservers(null, "am-smtpChanges", "other");
    33     },
    34    
    35     init : function() {
     34      },
     35
     36      init: function () {
    3637        gSmtpServerListWindow.orig_refreshServerList = gSmtpServerListWindow.refreshServerList;
    3738        gSmtpServerListWindow.refreshServerList = am_smtpOverlay.refreshServerList;
     39      }
    3840    }
    39 }
    40 window.addEventListener('load', am_smtpOverlay.init, false);
    41 }});
     41    window.addEventListener('load', am_smtpOverlay.init, false);
     42  }
     43});
  • content/prefDialog/vI_prefDialog.js

    r3c9c29 r509348  
    2424
    2525Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
    26 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) {
    27 
    28 Components.utils.import("resource://gre/modules/AddonManager.jsm");
    29 let Log = vI.setupLogging("virtualIdentity.prefDialog");
    30 
    31 var prefDialog = {
    32     toggleHelp : function() {
    33         var browserElem = document.getElementById("virtualIdentityExtension_remoteBrowserBox");
    34         if (browserElem.getAttribute("hidden")) {
    35             window.resizeBy( 200, 0);
    36             browserElem.removeAttribute("hidden");
    37         } else {
    38             window.resizeBy( -(browserElem.clientWidth+7), 0);
    39             browserElem.setAttribute("hidden", "true");
    40         }
    41         prefDialog.updateHelpUrl();
    42     },
    43 
    44     updateHelpUrl : function(tabpanel) {
    45         var browserElem = document.getElementById("virtualIdentityExtension_remoteBrowserBox");
    46         if (browserElem.getAttribute("hidden")) return;             // don't load any url if browser is hidden
    47         var panelIndex = (tabpanel)?tabpanel:document.getElementById('prefTabbox').selectedIndex
    48         var prefTree = document.getElementById('prefTabbox').selectedPanel.getElementsByAttribute("class", "vIprefTree")[0];
    49         var currentVersion = document.getElementById("virtualIdentityExtension_extVersion").getAttribute("value").split(/\./);
    50         var extVersion = currentVersion[0] + "." + currentVersion[1];
    51         var url = "https://www.absorb.it/virtual-id/wiki/docs/" + extVersion + "/tab" + panelIndex + "/tree" + prefTree.currentIndex;
    52         document.getElementById("virtualIdentityExtension_remoteBrowserBox").url = url;
    53     },
    54 
    55     preferences : Components.classes["@mozilla.org/preferences-service;1"]
    56                 .getService(Components.interfaces.nsIPrefService)
    57                 .getBranch("extensions.virtualIdentity."),
    58                
    59     unicodeConverter : Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
    60                 .createInstance(Components.interfaces.nsIScriptableUnicodeConverter),
    61    
    62     selectFile : function(elementID) {
     26virtualIdentityExtension.ns(function () {
     27  with(virtualIdentityExtension.LIB) {
     28
     29    Components.utils.import("resource://gre/modules/AddonManager.jsm");
     30    let Log = vI.setupLogging("virtualIdentity.prefDialog");
     31
     32    var prefDialog = {
     33      toggleHelp: function () {
     34        var browserElem = document.getElementById("virtualIdentityExtension_remoteBrowserBox");
     35        if (browserElem.getAttribute("hidden")) {
     36          window.resizeBy(200, 0);
     37          browserElem.removeAttribute("hidden");
     38        } else {
     39          window.resizeBy(-(browserElem.clientWidth + 7), 0);
     40          browserElem.setAttribute("hidden", "true");
     41        }
     42        prefDialog.updateHelpUrl();
     43      },
     44
     45      updateHelpUrl: function (tabpanel) {
     46        var browserElem = document.getElementById("virtualIdentityExtension_remoteBrowserBox");
     47        if (browserElem.getAttribute("hidden")) return; // don't load any url if browser is hidden
     48        var panelIndex = (tabpanel) ? tabpanel : document.getElementById('prefTabbox').selectedIndex
     49        var prefTree = document.getElementById('prefTabbox').selectedPanel.getElementsByAttribute("class", "vIprefTree")[0];
     50        var currentVersion = document.getElementById("virtualIdentityExtension_extVersion").getAttribute("value").split(/\./);
     51        var extVersion = currentVersion[0] + "." + currentVersion[1];
     52        var url = "https://www.absorb.it/virtual-id/wiki/docs/" + extVersion + "/tab" + panelIndex + "/tree" + prefTree.currentIndex;
     53        document.getElementById("virtualIdentityExtension_remoteBrowserBox").url = url;
     54      },
     55
     56      preferences: Components.classes["@mozilla.org/preferences-service;1"]
     57        .getService(Components.interfaces.nsIPrefService)
     58        .getBranch("extensions.virtualIdentity."),
     59
     60      unicodeConverter: Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
     61        .createInstance(Components.interfaces.nsIScriptableUnicodeConverter),
     62
     63      selectFile: function (elementID) {
    6364        dump("selectFile\n");
    6465        var filePicker = Components.classes["@mozilla.org/filepicker;1"]
    65             .createInstance(Components.interfaces.nsIFilePicker);
     66          .createInstance(Components.interfaces.nsIFilePicker);
    6667        var file = Components.classes["@mozilla.org/file/local;1"]
    67             .createInstance(Components.interfaces.nsIFile);
     68          .createInstance(Components.interfaces.nsIFile);
    6869        var defaultPath = Components.classes["@mozilla.org/file/directory_service;1"]
    69                     .getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile).path;
     70          .getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile).path;
    7071
    7172        try {
    72             file.initWithPath(document.getElementById(elementID).value);
     73          file.initWithPath(document.getElementById(elementID).value);
     74          filePicker.displayDirectory = file.parent;
     75          filePicker.defaultString = file.leafName;
     76        } catch (NS_ERROR_FILE_UNRECOGNIZED_PATH) {
     77          try {
     78            // try linux delimiter
     79            file.initWithPath(defaultPath + "/" + document.getElementById(elementID).value);
    7380            filePicker.displayDirectory = file.parent;
    7481            filePicker.defaultString = file.leafName;
     82          } catch (NS_ERROR_FILE_UNRECOGNIZED_PATH) {
     83            try {
     84              // use windows delimiter
     85              file.initWithPath(defaultPath + "\\" + document.getElementById(elementID).value);
     86              filePicker.displayDirectory = file.parent;
     87              filePicker.defaultString = file.leafName;
     88            } catch (NS_ERROR_FILE_UNRECOGNIZED_PATH) {};
     89          }
    7590        }
    76         catch(NS_ERROR_FILE_UNRECOGNIZED_PATH) {
    77             try {
    78                 // try linux delimiter
    79                 file.initWithPath(defaultPath + "/" + document.getElementById(elementID).value);
    80                 filePicker.displayDirectory = file.parent;
    81                 filePicker.defaultString = file.leafName;
    82             } catch (NS_ERROR_FILE_UNRECOGNIZED_PATH) {
    83                 try {
    84                     // use windows delimiter
    85                     file.initWithPath(defaultPath + "\\" + document.getElementById(elementID).value);
    86                     filePicker.displayDirectory = file.parent;
    87                     filePicker.defaultString = file.leafName;
    88                 } catch (NS_ERROR_FILE_UNRECOGNIZED_PATH) { };
     91
     92        filePicker.init(window, "", Components.interfaces.nsIFilePicker.modeSave);
     93
     94        if (filePicker.show() != Components.interfaces.nsIFilePicker.returnCancel) {
     95          if (filePicker.file.parent.path == defaultPath)
     96            document.getElementById(elementID).setAttribute("value", filePicker.file.leafName);
     97          else
     98            document.getElementById(elementID).setAttribute("value", filePicker.file.path);
     99        }
     100      },
     101
     102      base: {
     103        _elementIDs: ["VIdent_identity.doFcc",
     104          "VIdent_identity.fccFolderPickerMode",
     105          "VIdent_identity.fccFolder",
     106          "VIdent_identity.fccReplyFollowsParent",
     107          "VIdent_identity.draftFolderPickerMode",
     108          "VIdent_identity.draftFolder",
     109          "VIdent_identity.stationeryFolderPickerMode",
     110          "VIdent_identity.stationeryFolder",
     111          "VIdent_identity.copySMIMESettings",
     112          "VIdent_identity.copyAttachVCardSettings",
     113          "VIdent_identity.smart_reply",
     114          "VIdent_identity.smart_detectByReceivedHeader",
     115          "VIdent_identity.smart_reply_for_newsgroups",
     116          "VIdent_identity.show_status",
     117          "VIdent_identity.show_smtp",
     118          "VIdent_identity.fcc_show_switch",
     119          "VIdent_identity.menu_entry",
     120          "VIdent_identity.smart_reply_headers",
     121          "VIdent_identity.smart_reply_filter",
     122          "VIdent_identity.smart_draft",
     123          "VIdent_identity.smart_reply_notification",
     124          "VIdent_identity.get_header_notification",
     125          "VIdent_identity.smart_reply_defaultFullName",
     126          "VIdent_identity.smart_reply_ignoreFullName",
     127          "VIdent_identity.smart_reply_searchBaseIdentity",
     128          "VIdent_identity.autoTimestamp",
     129          "VIdent_identity.autoTimeString",
     130          "VIdent_identity.autoTimeFormat",
     131          "VIdent_identity.notification_timeout",
     132          "VIdent_identity.debug_notification",
     133          "VIdent_identity.debug_to_file",
     134          "VIdent_identity.debug_to_file_path",
     135          "VIdent_identity.warn_nonvirtual",
     136          "VIdent_identity.warn_virtual",
     137          "VIdent_identity.hide_signature",
     138          "VIdent_identity.hide_sMime_messageSignature",
     139          "VIdent_identity.hide_openPGP_messageSignature",
     140          "VIdent_identity.storage",
     141          "VIdent_identity.storage_store",
     142          "VIdent_identity.storage_store_base_id",
     143          "VIdent_identity.storage_store_SMTP",
     144          "VIdent_identity.storage_dont_update_multiple",
     145          "VIdent_identity.storage_show_switch",
     146          "VIdent_identity.storage_show_baseID_switch",
     147          "VIdent_identity.storage_show_SMTP_switch",
     148          "VIdent_identity.storage_colorIndication",
     149          "VIdent_identity.storage_warn_update",
     150          "VIdent_identity.storage_warn_vI_replace",
     151          "VIdent_identity.storage_notification",
     152          "VIdent_identity.storage_getOneOnly",
     153          "VIdent_identity.storage_timeFormat",
     154          "VIdent_identity.storageExtras_returnReciept",
     155          "VIdent_identity.storageExtras_fcc",
     156          "VIdent_identity.storageExtras_characterEncoding",
     157          "VIdent_identity.storageExtras_messageFormat",
     158          "VIdent_identity.storageExtras_sMime_messageEncryption",
     159          "VIdent_identity.storageExtras_sMime_messageSignature",
     160          "VIdent_identity.storageExtras_openPGP_messageEncryption",
     161          "VIdent_identity.storageExtras_openPGP_messageSignature",
     162          "VIdent_identity.storageExtras_openPGP_PGPMIME",
     163          "VIdent_identity.idSelection_storage_prefer_smart_reply",
     164          "VIdent_identity.idSelection_storage_ignore_smart_reply",
     165          "VIdent_identity.idSelection_ask",
     166          "VIdent_identity.idSelection_ask_always",
     167          "VIdent_identity.idSelection_autocreate",
     168          "VIdent_identity.idSelection_preferExisting",
     169          "VIdent_identity.idSelection_ignoreIDs",
     170          "VIdent_identity.autoReplyToSelf"
     171        ],
     172
     173        init: function () {
     174          // initialize the default window values...
     175          for (var i = 0; i < prefDialog.base._elementIDs.length; i++) {
     176            var elementID = prefDialog.base._elementIDs[i];
     177            var element = document.getElementById(elementID);
     178            if (!element) break;
     179            var eltType = element.localName;
     180            //              try {
     181            if (eltType == "radiogroup")
     182              element.selectedItem = element.childNodes[
     183                prefDialog.preferences.getIntPref(element.getAttribute("prefstring"))];
     184            else if (eltType == "checkbox")
     185              element.checked =
     186              prefDialog.preferences.getBoolPref(element.getAttribute("prefstring"));
     187            else if (eltType == "textbox")
     188              if (element.getAttribute("preftype") == "int")
     189                element.setAttribute("value",
     190                  prefDialog.preferences.getIntPref(element.getAttribute("prefstring")));
     191              else {
     192                element.setAttribute("value",
     193                  prefDialog.unicodeConverter.ConvertToUnicode(prefDialog.preferences.getCharPref(element.getAttribute("prefstring"))));
     194              } else if (eltType == "listbox")
     195              element.value =
     196              prefDialog.preferences.getCharPref(element.getAttribute("prefstring"));
     197            //              } catch (ex) {}
     198            //             dump("setting textbox value: " + element.getAttribute("prefstring") + " " + element.getAttribute("value") + "\n");
     199          }
     200        },
     201
     202        savePrefs: function () {
     203          for (var i = 0; i < prefDialog.base._elementIDs.length; i++) {
     204            var elementID = prefDialog.base._elementIDs[i];
     205            var element = document.getElementById(elementID);
     206            if (!element) break;
     207            var eltType = element.localName;
     208            if (eltType == "radiogroup")
     209              prefDialog.preferences.setIntPref(
     210                element.getAttribute("prefstring"), parseInt(element.value));
     211            else if (eltType == "checkbox")
     212              prefDialog.preferences.setBoolPref(
     213                element.getAttribute("prefstring"), element.checked);
     214            else if (eltType == "textbox") {
     215              if (element.getAttribute("preftype") == "int")
     216                prefDialog.preferences.setIntPref(
     217                  element.getAttribute("prefstring"), element.value);
     218              else prefDialog.preferences.setCharPref(
     219                element.getAttribute("prefstring"), prefDialog.unicodeConverter.ConvertFromUnicode(element.value));
     220            } else if (eltType == "listbox")
     221              prefDialog.preferences.setCharPref(element.getAttribute("prefstring"), element.value);
     222          }
     223        },
     224
     225        modifyAttribute: function (elemID, attribute, value) {
     226          if (value) document.getElementById(elemID).removeAttribute(attribute);
     227          else document.getElementById(elemID).setAttribute(attribute, "true");
     228        },
     229
     230        constraints: function () {
     231          var storage = document.getElementById("VIdent_identity.storage").checked;
     232          var smartDraft = document.getElementById("VIdent_identity.smart_draft").checked;
     233          var smartReply = document.getElementById("VIdent_identity.smart_reply").checked;
     234          var mAttr = prefDialog.base.modifyAttribute;
     235
     236          // idSelectionConstraint
     237          var idSelectionConstraint = (storage || smartReply || smartDraft);
     238          mAttr("VIdent_identity.idSelection_ask", "disabled", idSelectionConstraint);
     239          mAttr("VIdent_identity.idSelection_ask_always", "disabled", idSelectionConstraint);
     240          mAttr("VIdent_identity.idSelection_autocreate", "disabled", idSelectionConstraint);
     241          mAttr("VIdent_identity.idSelection_autocreate.desc", "disabled", idSelectionConstraint);
     242          mAttr("VIdent_identity.idSelection_preferExisting", "disabled", idSelectionConstraint);
     243          mAttr("selection", "featureDisabled", idSelectionConstraint);
     244          mAttr("toCompose", "featureDisabled", idSelectionConstraint);
     245
     246          // idSelectionInputConstraint
     247          var idSelectionInputConstraint = (storage && smartReply);
     248          mAttr("VIdent_identity.idSelection_storage_prefer_smart_reply", "disabled", idSelectionInputConstraint);
     249          mAttr("VIdent_identity.idSelection_storage_ignore_smart_reply", "disabled", idSelectionInputConstraint);
     250          if (idSelectionInputConstraint) prefDialog.base.idSelectionResultConstraint();
     251
     252          // sourceEmailConstraint
     253          var sourceEmailConstraint = (smartReply || smartDraft);
     254          mAttr("sourceEmail", "featureDisabled", sourceEmailConstraint);
     255          mAttr("toSelection", "featureDisabled", sourceEmailConstraint);
     256
     257        },
     258
     259        idSelectionResultConstraint: function () {
     260          var ask = document.getElementById("VIdent_identity.idSelection_ask")
     261          var ask_always = document.getElementById("VIdent_identity.idSelection_ask_always")
     262          var autocreate = document.getElementById("VIdent_identity.idSelection_autocreate")
     263          var autocreate_desc = document.getElementById("VIdent_identity.idSelection_autocreate.desc")
     264          ask_always.setAttribute("disabled", (autocreate.checked || !ask.checked))
     265          autocreate.setAttribute("disabled", (ask.checked && ask_always.checked))
     266          autocreate_desc.setAttribute("disabled", (ask.checked && ask_always.checked))
     267          autocreate_desc.setAttribute("hidden", !ask.checked)
     268        },
     269
     270        smartReplyConstraint: function (element) {
     271          var mAttr = prefDialog.base.modifyAttribute;
     272          mAttr("VIdent_identity.smart_reply_for_newsgroups", "disabled", element.checked);
     273          mAttr("VIdent_identity.smart_reply_headers", "disabled", element.checked);
     274          mAttr("VIdent_identity.smart_reply_filter", "disabled", element.checked);
     275          mAttr("VIdent_identity.smart_reply_defaultFullName", "disabled", element.checked);
     276          mAttr("VIdent_identity.smart_reply_ignoreFullName", "disabled", element.checked);
     277          mAttr("VIdent_identity.smart_reply_headers_reset", "disabled", element.checked);
     278          mAttr("VIdent_identity.smart_detectByReceivedHeader", "disabled", element.checked);
     279          prefDialog.base.constraints();
     280        },
     281
     282        smartReplyHeaderReset: function () {
     283          var textfield = document.getElementById("VIdent_identity.smart_reply_headers")
     284          textfield.value = "envelope-to\nx-original-to\nto\ncc"
     285        },
     286
     287        smartReplyHideSignature: function () {
     288          // check for signature_switch extension
     289          AddonManager.getAddonByID("{2ab1b709-ba03-4361-abf9-c50b964ff75d}", function (addon) {
     290            if (addon && !addon.userDisabled && !addon.appDisable) {
     291              document.getElementById("VIdent_identity.HideSignature.warning").setAttribute("hidden", "true");
     292              document.getElementById("VIdent_identity.hide_signature").setAttribute("disabled", "false");
    89293            }
     294          });
     295        },
     296
     297        autoTimestampConstraint: function (element) {
     298          var mAttr = prefDialog.base.modifyAttribute;
     299          mAttr("VIdent_identity.autoTimestamp.options", "hidden", element.checked);
     300        },
     301
     302        storageConstraint: function (element) {
     303          var mAttr = prefDialog.base.modifyAttribute;
     304          mAttr("VIdent_identity.storage_store", "disabled", element.checked);
     305          mAttr("VIdent_identity.storage_store_base_id", "disabled", element.checked);
     306          mAttr("VIdent_identity.storage_store_SMTP", "disabled", element.checked);
     307          mAttr("VIdent_identity.storage_dont_update_multiple", "disabled", element.checked);
     308          mAttr("VIdent_identity.storage_show_switch", "disabled", element.checked);
     309          mAttr("VIdent_identity.storage_show_baseID_switch", "disabled", element.checked);
     310          mAttr("VIdent_identity.storage_show_SMTP_switch", "disabled", element.checked);
     311          mAttr("VIdent_identity.storage_colorIndication", "disabled", element.checked);
     312          mAttr("VIdent_identity.storage_warn_update", "disabled", element.checked);
     313          mAttr("VIdent_identity.storage_warn_vI_replace", "disabled", element.checked);
     314          mAttr("VIdent_identity.storage_notification", "disabled", element.checked);
     315          mAttr("VIdent_identity.storage_getOneOnly", "disabled", element.checked);
     316          mAttr("VIdent_identity.storageExtras_returnReciept", "disabled", element.checked);
     317          mAttr("VIdent_identity.storageExtras_fcc", "disabled", element.checked);
     318          mAttr("VIdent_identity.storageExtras_characterEncoding", "disabled", element.checked);
     319          mAttr("VIdent_identity.storageExtras_messageFormat", "disabled", element.checked);
     320          mAttr("VIdent_identity.storageExtras_sMime_messageEncryption", "disabled", element.checked);
     321          mAttr("VIdent_identity.storageExtras_sMime_messageSignature", "disabled", element.checked);
     322          mAttr("VIdent_identity.storageExtras_openPGP_messageEncryption", "disabled", element.checked);
     323          mAttr("VIdent_identity.storageExtras_openPGP_messageSignature", "disabled", element.checked);
     324          mAttr("VIdent_identity.storageExtras_openPGP_PGPMIME", "disabled", element.checked);
     325          mAttr("storageOut", "featureDisabled", element.checked);
     326          mAttr("storageUp", "featureDisabled", element.checked);
     327          mAttr("storageUpDown", "featureDisabled", element.checked);
     328          prefDialog.base.constraints();
     329        },
     330
     331        menuButtonConstraints: function (elem) {
     332          var mAttr = prefDialog.base.modifyAttribute;
     333          var valueParam = (document.getElementById("viewGroup").getAttribute("hidden") == "true"); // true -> removeAttribute
     334          var dialogElem = document.getElementById("vI_prefDialog");
     335          mAttr("logoButton2", "hidden", valueParam);
     336          mAttr("toggleIcon", "open", valueParam);
     337          document.getAnonymousElementByAttribute(dialogElem, "class", "box-inherit dialog-content-box").removeAttribute("flex");
     338        },
     339
     340        flipMenuButtons: function (elem) {
     341          var mAttr = prefDialog.base.modifyAttribute;
     342          var valueParam = (elem.getAttribute("open") == "true");
     343          var dialogElem = document.getElementById("vI_prefDialog");
     344          var oldContentElemHeight = document.getAnonymousElementByAttribute(dialogElem, "class", "box-inherit dialog-content-box").clientHeight;
     345          mAttr("viewGroup", "hidden", !valueParam);
     346          mAttr("logoButton2", "hidden", valueParam);
     347          mAttr(elem.id, "open", valueParam);
     348          window.resizeBy(0, document.getAnonymousElementByAttribute(dialogElem, "class", "box-inherit dialog-content-box").clientHeight - oldContentElemHeight);
     349        },
     350
     351        initTreeValues: function () {
     352          var prefTrees = document.getElementById("prefTabbox").getElementsByAttribute("class", "vIprefTree");
     353          for (var i = 0; i < prefTrees.length; i++) prefTrees[i].currentIndex = 0;
    90354        }
    91        
    92         filePicker.init(window, "", Components.interfaces.nsIFilePicker.modeSave);
    93        
    94         if (filePicker.show() != Components.interfaces.nsIFilePicker.returnCancel) {
    95             if (filePicker.file.parent.path == defaultPath)
    96                 document.getElementById(elementID).setAttribute("value", filePicker.file.leafName);
    97             else
    98                 document.getElementById(elementID).setAttribute("value", filePicker.file.path);
    99         }
    100     },
    101                            
    102     base : {
    103         _elementIDs : [ "VIdent_identity.doFcc",
    104                 "VIdent_identity.fccFolderPickerMode",
    105                 "VIdent_identity.fccFolder",
    106                 "VIdent_identity.fccReplyFollowsParent",
    107                 "VIdent_identity.draftFolderPickerMode",
    108                 "VIdent_identity.draftFolder",
    109                 "VIdent_identity.stationeryFolderPickerMode",
    110                 "VIdent_identity.stationeryFolder",
    111                 "VIdent_identity.copySMIMESettings",
    112                 "VIdent_identity.copyAttachVCardSettings",
    113                 "VIdent_identity.smart_reply",
    114                 "VIdent_identity.smart_detectByReceivedHeader",
    115                 "VIdent_identity.smart_reply_for_newsgroups",
    116                 "VIdent_identity.show_status",
    117                 "VIdent_identity.show_smtp",
    118                 "VIdent_identity.fcc_show_switch",
    119                 "VIdent_identity.menu_entry",
    120                 "VIdent_identity.smart_reply_headers",
    121                 "VIdent_identity.smart_reply_filter",
    122                 "VIdent_identity.smart_draft",
    123                 "VIdent_identity.smart_reply_notification",
    124                 "VIdent_identity.get_header_notification",
    125                 "VIdent_identity.smart_reply_defaultFullName",
    126                 "VIdent_identity.smart_reply_ignoreFullName",
    127                 "VIdent_identity.smart_reply_searchBaseIdentity",
    128                 "VIdent_identity.autoTimestamp",
    129                 "VIdent_identity.autoTimeString",
    130                 "VIdent_identity.autoTimeFormat",
    131                 "VIdent_identity.notification_timeout",
    132                 "VIdent_identity.debug_notification",
    133                 "VIdent_identity.debug_to_file",
    134                 "VIdent_identity.debug_to_file_path",
    135                 "VIdent_identity.warn_nonvirtual",
    136                 "VIdent_identity.warn_virtual",
    137                 "VIdent_identity.hide_signature",
    138                 "VIdent_identity.hide_sMime_messageSignature",
    139                 "VIdent_identity.hide_openPGP_messageSignature",
    140                 "VIdent_identity.storage",
    141                 "VIdent_identity.storage_store",
    142                 "VIdent_identity.storage_store_base_id",
    143                 "VIdent_identity.storage_store_SMTP",
    144                 "VIdent_identity.storage_dont_update_multiple",
    145                 "VIdent_identity.storage_show_switch",
    146                 "VIdent_identity.storage_show_baseID_switch",
    147                 "VIdent_identity.storage_show_SMTP_switch",
    148                 "VIdent_identity.storage_colorIndication",
    149                 "VIdent_identity.storage_warn_update",
    150                 "VIdent_identity.storage_warn_vI_replace",
    151                 "VIdent_identity.storage_notification",
    152                 "VIdent_identity.storage_getOneOnly",
    153                 "VIdent_identity.storage_timeFormat",
    154                 "VIdent_identity.storageExtras_returnReciept",
    155                 "VIdent_identity.storageExtras_fcc",
    156                 "VIdent_identity.storageExtras_characterEncoding",
    157                 "VIdent_identity.storageExtras_messageFormat",
    158                 "VIdent_identity.storageExtras_sMime_messageEncryption",
    159                 "VIdent_identity.storageExtras_sMime_messageSignature",
    160                 "VIdent_identity.storageExtras_openPGP_messageEncryption",
    161                 "VIdent_identity.storageExtras_openPGP_messageSignature",
    162                 "VIdent_identity.storageExtras_openPGP_PGPMIME",
    163                 "VIdent_identity.idSelection_storage_prefer_smart_reply",
    164                 "VIdent_identity.idSelection_storage_ignore_smart_reply",
    165                 "VIdent_identity.idSelection_ask",
    166                 "VIdent_identity.idSelection_ask_always",
    167                 "VIdent_identity.idSelection_autocreate",
    168                 "VIdent_identity.idSelection_preferExisting",
    169                 "VIdent_identity.idSelection_ignoreIDs",
    170                 "VIdent_identity.autoReplyToSelf"],
    171    
    172         init : function() {
    173         // initialize the default window values...
    174             for( var i = 0; i < prefDialog.base._elementIDs.length; i++ ) {
    175                 var elementID = prefDialog.base._elementIDs[i];
    176                 var element = document.getElementById(elementID);
    177                 if (!element) break;
    178                 var eltType = element.localName;
    179 //              try {
    180                     if (eltType == "radiogroup")
    181                         element.selectedItem = element.childNodes[
    182                             prefDialog.preferences.getIntPref(element.getAttribute("prefstring"))];
    183                     else if (eltType == "checkbox")
    184                         element.checked =
    185                             prefDialog.preferences.getBoolPref(element.getAttribute("prefstring"));
    186                     else if (eltType == "textbox")
    187                         if (element.getAttribute("preftype") == "int")
    188                             element.setAttribute("value",
    189                             prefDialog.preferences.getIntPref(element.getAttribute("prefstring")) );
    190                         else {
    191                             element.setAttribute("value",
    192                             prefDialog.unicodeConverter.ConvertToUnicode(prefDialog.preferences.getCharPref(element.getAttribute("prefstring"))) );
    193                         }
    194                     else if (eltType == "listbox")
    195                         element.value =
    196                             prefDialog.preferences.getCharPref(element.getAttribute("prefstring"));
    197 //              } catch (ex) {}
    198 //             dump("setting textbox value: " + element.getAttribute("prefstring") + " " + element.getAttribute("value") + "\n");
    199             }
    200         },
    201 
    202         savePrefs : function() {
    203             for( var i = 0; i < prefDialog.base._elementIDs.length; i++ ) {
    204                 var elementID = prefDialog.base._elementIDs[i];
    205                 var element = document.getElementById(elementID);
    206                 if (!element) break;
    207                 var eltType = element.localName;
    208                 if (eltType == "radiogroup")
    209                     prefDialog.preferences.setIntPref(
    210                         element.getAttribute("prefstring"), parseInt(element.value));
    211                 else if (eltType == "checkbox")
    212                     prefDialog.preferences.setBoolPref(
    213                         element.getAttribute("prefstring"), element.checked);
    214                 else if (eltType == "textbox") {
    215                     if (element.getAttribute("preftype") == "int")
    216                         prefDialog.preferences.setIntPref(
    217                             element.getAttribute("prefstring"), element.value);
    218                     else prefDialog.preferences.setCharPref(
    219                             element.getAttribute("prefstring"), prefDialog.unicodeConverter.ConvertFromUnicode(element.value));
    220                 }
    221                 else if (eltType == "listbox")
    222                     prefDialog.preferences.setCharPref(element.getAttribute("prefstring"), element.value);
    223             }
    224         },
    225        
    226         modifyAttribute : function(elemID, attribute, value) {
    227             if (value) document.getElementById(elemID).removeAttribute(attribute);
    228             else document.getElementById(elemID).setAttribute(attribute, "true");
    229         },
    230 
    231         constraints : function() {
    232             var storage = document.getElementById("VIdent_identity.storage").checked;
    233             var smartDraft = document.getElementById("VIdent_identity.smart_draft").checked;
    234             var smartReply = document.getElementById("VIdent_identity.smart_reply").checked;
    235             var mAttr = prefDialog.base.modifyAttribute;
    236 
    237             // idSelectionConstraint
    238             var idSelectionConstraint = (storage || smartReply || smartDraft);
    239             mAttr("VIdent_identity.idSelection_ask","disabled",idSelectionConstraint);
    240             mAttr("VIdent_identity.idSelection_ask_always","disabled",idSelectionConstraint);
    241             mAttr("VIdent_identity.idSelection_autocreate","disabled",idSelectionConstraint);
    242             mAttr("VIdent_identity.idSelection_autocreate.desc","disabled",idSelectionConstraint);
    243             mAttr("VIdent_identity.idSelection_preferExisting","disabled",idSelectionConstraint);
    244             mAttr("selection","featureDisabled",idSelectionConstraint);
    245             mAttr("toCompose","featureDisabled",idSelectionConstraint);
    246 
    247             // idSelectionInputConstraint
    248             var idSelectionInputConstraint = (storage && smartReply);
    249             mAttr("VIdent_identity.idSelection_storage_prefer_smart_reply","disabled",idSelectionInputConstraint);
    250             mAttr("VIdent_identity.idSelection_storage_ignore_smart_reply","disabled",idSelectionInputConstraint);
    251             if (idSelectionInputConstraint) prefDialog.base.idSelectionResultConstraint();
    252 
    253             // sourceEmailConstraint
    254             var sourceEmailConstraint = (smartReply || smartDraft);
    255             mAttr("sourceEmail","featureDisabled",sourceEmailConstraint);
    256             mAttr("toSelection","featureDisabled",sourceEmailConstraint);
    257 
    258         },
    259 
    260         idSelectionResultConstraint : function() {
    261             var ask = document.getElementById("VIdent_identity.idSelection_ask")
    262             var ask_always = document.getElementById("VIdent_identity.idSelection_ask_always")
    263             var autocreate = document.getElementById("VIdent_identity.idSelection_autocreate")
    264             var autocreate_desc = document.getElementById("VIdent_identity.idSelection_autocreate.desc")
    265             ask_always.setAttribute("disabled", (autocreate.checked || !ask.checked))
    266             autocreate.setAttribute("disabled", (ask.checked && ask_always.checked))
    267             autocreate_desc.setAttribute("disabled", (ask.checked && ask_always.checked))
    268             autocreate_desc.setAttribute("hidden", !ask.checked)
    269         },
    270 
    271         smartReplyConstraint : function(element) {
    272             var mAttr = prefDialog.base.modifyAttribute;
    273             mAttr("VIdent_identity.smart_reply_for_newsgroups","disabled",element.checked);
    274             mAttr("VIdent_identity.smart_reply_headers","disabled",element.checked);
    275             mAttr("VIdent_identity.smart_reply_filter","disabled",element.checked);
    276             mAttr("VIdent_identity.smart_reply_defaultFullName","disabled",element.checked);
    277             mAttr("VIdent_identity.smart_reply_ignoreFullName","disabled",element.checked);
    278             mAttr("VIdent_identity.smart_reply_headers_reset","disabled",element.checked);
    279             mAttr("VIdent_identity.smart_detectByReceivedHeader","disabled",element.checked);
    280             prefDialog.base.constraints();
    281         },
    282        
    283         smartReplyHeaderReset : function() {
    284             var textfield = document.getElementById("VIdent_identity.smart_reply_headers")
    285             textfield.value = "envelope-to\nx-original-to\nto\ncc"
    286         },
    287        
    288         smartReplyHideSignature : function() {
    289           // check for signature_switch extension
    290           AddonManager.getAddonByID("{2ab1b709-ba03-4361-abf9-c50b964ff75d}", function(addon) {
    291             if (addon && !addon.userDisabled && !addon.appDisable) {
    292                 document.getElementById("VIdent_identity.HideSignature.warning").setAttribute("hidden", "true");
    293                 document.getElementById("VIdent_identity.hide_signature").setAttribute("disabled", "false");
    294             }
    295           });
    296         },
    297        
    298         autoTimestampConstraint : function(element) {
    299             var mAttr = prefDialog.base.modifyAttribute;
    300             mAttr("VIdent_identity.autoTimestamp.options","hidden",element.checked);
    301         },
    302        
    303         storageConstraint : function(element) {
    304             var mAttr = prefDialog.base.modifyAttribute;
    305             mAttr("VIdent_identity.storage_store","disabled",element.checked);
    306             mAttr("VIdent_identity.storage_store_base_id","disabled",element.checked);
    307             mAttr("VIdent_identity.storage_store_SMTP","disabled",element.checked);
    308             mAttr("VIdent_identity.storage_dont_update_multiple","disabled",element.checked);
    309             mAttr("VIdent_identity.storage_show_switch","disabled",element.checked);
    310             mAttr("VIdent_identity.storage_show_baseID_switch","disabled",element.checked);
    311             mAttr("VIdent_identity.storage_show_SMTP_switch","disabled",element.checked);
    312             mAttr("VIdent_identity.storage_colorIndication","disabled",element.checked);
    313             mAttr("VIdent_identity.storage_warn_update","disabled",element.checked);
    314             mAttr("VIdent_identity.storage_warn_vI_replace","disabled",element.checked);
    315             mAttr("VIdent_identity.storage_notification","disabled",element.checked);
    316             mAttr("VIdent_identity.storage_getOneOnly","disabled",element.checked);
    317             mAttr("VIdent_identity.storageExtras_returnReciept","disabled",element.checked);
    318             mAttr("VIdent_identity.storageExtras_fcc","disabled",element.checked);
    319             mAttr("VIdent_identity.storageExtras_characterEncoding","disabled",element.checked);
    320             mAttr("VIdent_identity.storageExtras_messageFormat","disabled",element.checked);
    321             mAttr("VIdent_identity.storageExtras_sMime_messageEncryption","disabled",element.checked);
    322             mAttr("VIdent_identity.storageExtras_sMime_messageSignature","disabled",element.checked);
    323             mAttr("VIdent_identity.storageExtras_openPGP_messageEncryption","disabled",element.checked);
    324             mAttr("VIdent_identity.storageExtras_openPGP_messageSignature","disabled",element.checked);
    325             mAttr("VIdent_identity.storageExtras_openPGP_PGPMIME","disabled",element.checked);
    326             mAttr("storageOut","featureDisabled",element.checked);
    327             mAttr("storageUp","featureDisabled",element.checked);
    328             mAttr("storageUpDown","featureDisabled",element.checked);
    329             prefDialog.base.constraints();
    330         },
    331 
    332         menuButtonConstraints : function(elem) {
    333             var mAttr = prefDialog.base.modifyAttribute;
    334             var valueParam = (document.getElementById("viewGroup").getAttribute("hidden") == "true");   // true -> removeAttribute
    335             var dialogElem = document.getElementById("vI_prefDialog");
    336             mAttr("logoButton2","hidden", valueParam);
    337             mAttr("toggleIcon","open", valueParam);
    338             document.getAnonymousElementByAttribute(dialogElem, "class", "box-inherit dialog-content-box").removeAttribute("flex");
    339         },
    340 
    341         flipMenuButtons : function(elem) {
    342             var mAttr = prefDialog.base.modifyAttribute;
    343             var valueParam = (elem.getAttribute("open") == "true");
    344             var dialogElem = document.getElementById("vI_prefDialog");
    345             var oldContentElemHeight = document.getAnonymousElementByAttribute(dialogElem, "class", "box-inherit dialog-content-box").clientHeight;
    346             mAttr("viewGroup","hidden", !valueParam);
    347             mAttr("logoButton2","hidden", valueParam);
    348             mAttr(elem.id,"open", valueParam);
    349             window.resizeBy( 0, document.getAnonymousElementByAttribute(dialogElem, "class", "box-inherit dialog-content-box").clientHeight - oldContentElemHeight);
    350         },
    351        
    352         initTreeValues : function() {
    353             var prefTrees = document.getElementById("prefTabbox").getElementsByAttribute("class", "vIprefTree");
    354             for (var i=0 ; i<prefTrees.length; i++) prefTrees[i].currentIndex = 0;
    355         }
    356     },
    357 
    358     init : function() {
    359         prefDialog.unicodeConverter.charset="UTF-8";
    360         prefDialog.base.init();
    361         vI.onInitCopiesAndFolders()
     355      },
     356
     357      init: function () {
     358        prefDialog.unicodeConverter.charset = "UTF-8";
     359        prefDialog.base.init();
     360        vI.onInitCopiesAndFolders()
    362361
    363362        // check for enigmail extension
    364         AddonManager.getAddonByID("{847b3a00-7ab1-11d4-8f02-006008948af5}", function(addon) {
     363        AddonManager.getAddonByID("{847b3a00-7ab1-11d4-8f02-006008948af5}", function (addon) {
    365364          if (addon && !addon.userDisabled && !addon.appDisable) {
    366365            document.getElementById("openPGPencryption").removeAttribute("hidden");
    367366            document.getElementById("VIdent_identity.hide_openPGP_messageSignature").removeAttribute("hidden");
    368367          }
    369         }); 
    370 
    371         prefDialog.base.smartReplyConstraint(document.getElementById("VIdent_identity.smart_reply"));
    372         prefDialog.base.smartReplyHideSignature();
    373         prefDialog.base.storageConstraint(document.getElementById("VIdent_identity.storage"));
    374         prefDialog.base.autoTimestampConstraint(document.getElementById("VIdent_identity.autoTimestamp"));
    375         prefDialog.base.constraints();
    376         prefDialog.base.menuButtonConstraints();
    377         prefDialog.base.initTreeValues();
    378 
    379     },
    380    
    381     savePrefs : function() {
    382         // Copy all changes to Elements
    383         vI.onSaveCopiesAndFolders();
    384         prefDialog.base.savePrefs();
    385     },
    386 
    387     openURL : function(aURL) {
     368        });
     369
     370        prefDialog.base.smartReplyConstraint(document.getElementById("VIdent_identity.smart_reply"));
     371        prefDialog.base.smartReplyHideSignature();
     372        prefDialog.base.storageConstraint(document.getElementById("VIdent_identity.storage"));
     373        prefDialog.base.autoTimestampConstraint(document.getElementById("VIdent_identity.autoTimestamp"));
     374        prefDialog.base.constraints();
     375        prefDialog.base.menuButtonConstraints();
     376        prefDialog.base.initTreeValues();
     377
     378      },
     379
     380      savePrefs: function () {
     381        // Copy all changes to Elements
     382        vI.onSaveCopiesAndFolders();
     383        prefDialog.base.savePrefs();
     384      },
     385
     386      openURL: function (aURL) {
    388387        var uri = Components.classes["@mozilla.org/network/standard-url;1"].createInstance(Components.interfaces.nsIURI);
    389388        var protocolSvc = Components.classes["@mozilla.org/uriloader/external-protocol-service;1"].getService(Components.interfaces.nsIExternalProtocolService);
     
    391390        uri.spec = aURL;
    392391        protocolSvc.loadUrl(uri);
     392      }
    393393    }
    394 }
    395 vI.prefDialog = prefDialog;
    396 }});
     394    vI.prefDialog = prefDialog;
     395  }
     396});
  • content/prefDialog/vI_prefDialog_FolderPicker.js

    r3c9c29 r509348  
    1 
    21/**
    3 * some code copied and adapted from Thunderbird Sources
    4 * thanks to all Thunderbird Developers
    5 */
     2 * some code copied and adapted from Thunderbird Sources
     3 * thanks to all Thunderbird Developers
     4 */
    65
    76/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
     
    4443
    4544Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
    46 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) {
    47 
    48 var gFccRadioElemChoice, gDraftsRadioElemChoice, gTmplRadioElemChoice;
    49 var gFccRadioElemChoiceLocked, gDraftsRadioElemChoiceLocked, gTmplRadioElemChoiceLocked;
    50 var gDefaultPickerMode = "3";
    51 
    52 var gFccFolderWithDelim, gDraftsFolderWithDelim, gTemplatesFolderWithDelim;
    53 
    54 // Picker IDs
    55 var fccAccountPickerId = "msgFccAccountPicker";
    56 var fccFolderPickerId = "msgFccFolderPicker";
    57 var draftsAccountPickerId = "msgDraftsAccountPicker";
    58 var draftsFolderPickerId = "msgDraftsFolderPicker";
    59 var tmplAccountPickerId = "msgStationeryAccountPicker";
    60 var tmplFolderPickerId = "msgStationeryFolderPicker";
    61 
    62 var _GetMsgFolderFromUri = function(uri, checkFolderAttributes)
    63 {
    64     let msgfolder = null;
    65     if (typeof MailUtils != 'undefined') {
    66     return MailUtils.getFolderForURI(uri, checkFolderAttributes);
    67     }
    68     try { // Postbox
    69     let resource = GetResourceFromUri(uri);
    70     msgfolder = resource.QueryInterface(Components.interfaces.nsIMsgFolder);
    71     if (checkFolderAttributes) {
    72         if (!(msgfolder && (msgfolder.parent || msgfolder.isServer))) {
    73         msgfolder = null;
     45virtualIdentityExtension.ns(function () {
     46  with(virtualIdentityExtension.LIB) {
     47
     48    var gFccRadioElemChoice, gDraftsRadioElemChoice, gTmplRadioElemChoice;
     49    var gFccRadioElemChoiceLocked, gDraftsRadioElemChoiceLocked, gTmplRadioElemChoiceLocked;
     50    var gDefaultPickerMode = "3";
     51
     52    var gFccFolderWithDelim, gDraftsFolderWithDelim, gTemplatesFolderWithDelim;
     53
     54    // Picker IDs
     55    var fccAccountPickerId = "msgFccAccountPicker";
     56    var fccFolderPickerId = "msgFccFolderPicker";
     57    var draftsAccountPickerId = "msgDraftsAccountPicker";
     58    var draftsFolderPickerId = "msgDraftsFolderPicker";
     59    var tmplAccountPickerId = "msgStationeryAccountPicker";
     60    var tmplFolderPickerId = "msgStationeryFolderPicker";
     61
     62    var _GetMsgFolderFromUri = function (uri, checkFolderAttributes) {
     63      let msgfolder = null;
     64      if (typeof MailUtils != 'undefined') {
     65        return MailUtils.getFolderForURI(uri, checkFolderAttributes);
     66      }
     67      try { // Postbox
     68        let resource = GetResourceFromUri(uri);
     69        msgfolder = resource.QueryInterface(Components.interfaces.nsIMsgFolder);
     70        if (checkFolderAttributes) {
     71          if (!(msgfolder && (msgfolder.parent || msgfolder.isServer))) {
     72            msgfolder = null;
     73          }
    7474        }
    75     }
    76     }
    77     catch (ex) {
    78     //dump("failed to get the folder resource\n");
    79     }
    80     return msgfolder;
    81 }
    82  
    83 var setDefaultCopiesAndFoldersPrefs = function(identity, server, accountData)
    84 {
    85     var am = Components.classes["@mozilla.org/messenger/account-manager;1"].getService(Components.interfaces.nsIMsgAccountManager);
    86     var rootFolder = am.defaultAccount.incomingServer.rootFolder
    87 
    88     var fccElement = document.getElementById("VIdent_identity.fccFolder")
    89     var fccElementValue = fccElement.getAttribute("value");
    90     if (!fccElementValue || !GetMsgFolderFromUri(fccElementValue, false))
    91         fccElement.setAttribute("value", rootFolder.server.serverURI + gFccFolderWithDelim)
    92 
    93     var draftElement = document.getElementById("VIdent_identity.draftFolder")
    94     var draftElementValue = draftElement.getAttribute("value");
    95     if (!draftElementValue || !GetMsgFolderFromUri(draftElementValue, false))
    96         draftElement.setAttribute("value", rootFolder.server.serverURI + gDraftsFolderWithDelim)
    97 
    98     var stationeryElement = document.getElementById("VIdent_identity.stationeryFolder")
    99     var stationeryElementValue = stationeryElement.getAttribute("value");
    100     if (!stationeryElementValue || !GetMsgFolderFromUri(stationeryElementValue, false))
    101         stationeryElement.setAttribute("value", rootFolder.server.serverURI + gTemplatesFolderWithDelim)
    102 }
    103 
    104 
    105 var onInitCopiesAndFolders = function()
    106 {
    107     SetSpecialFolderNamesWithDelims();
    108     SetGlobalRadioElemChoices();
    109 
    110     setDefaultCopiesAndFoldersPrefs();
    111 
    112     SetFolderDisplay(gFccRadioElemChoice, gFccRadioElemChoiceLocked,
    113                      "VIdent_fcc",
    114                      fccAccountPickerId,
    115                      "VIdent_identity.fccFolder",
    116                      fccFolderPickerId);
    117 
    118     SetFolderDisplay(gDraftsRadioElemChoice, gDraftsRadioElemChoiceLocked,
    119                      "VIdent_draft",
    120                      draftsAccountPickerId,
    121                      "VIdent_identity.draftFolder",
    122                      draftsFolderPickerId);
    123 
    124     SetFolderDisplay(gTmplRadioElemChoice, gTmplRadioElemChoiceLocked,
    125                      "VIdent_tmpl",
    126                      tmplAccountPickerId,
    127                      "VIdent_identity.stationeryFolder",
    128                      tmplFolderPickerId);
    129 
    130     setupFccItems();
    131 }
    132 
    133 // Initialize the picker mode choices (account/folder picker) into global vars
    134 var SetGlobalRadioElemChoices = function()
    135 {
    136     var pickerModeElement = document.getElementById("VIdent_identity.fccFolderPickerMode");
    137     gFccRadioElemChoice = pickerModeElement.getAttribute("value");
    138     gFccRadioElemChoiceLocked = pickerModeElement.getAttribute("disabled");
    139     if (!gFccRadioElemChoice) gFccRadioElemChoice = gDefaultPickerMode;
    140 
    141     pickerModeElement = document.getElementById("VIdent_identity.draftFolderPickerMode");
    142     gDraftsRadioElemChoice = pickerModeElement.getAttribute("value");
    143     gDraftsRadioElemChoiceLocked = pickerModeElement.getAttribute("disabled");
    144     if (!gDraftsRadioElemChoice) gDraftsRadioElemChoice = gDefaultPickerMode;
    145 
    146     pickerModeElement = document.getElementById("VIdent_identity.stationeryFolderPickerMode");
    147     gTmplRadioElemChoice = pickerModeElement.getAttribute("value");
    148     gTmplRadioElemChoiceLocked = pickerModeElement.getAttribute("disabled");
    149     if (!gTmplRadioElemChoice) gTmplRadioElemChoice = gDefaultPickerMode;
    150 }
    151 
    152 /*
    153  * Set Account and Folder elements based on the values read from
    154  * preferences file. Default picker mode, if none specified at this stage, is
    155  * set to 1 i.e., Other picker displaying the folder value read from the
    156  * preferences file.
    157  */
    158 var SetFolderDisplay = function(pickerMode, disableMode,
    159                           radioElemPrefix,
    160                           accountPickerId,
    161                           folderPickedField,
    162                           folderPickerId)
    163 {
    164     if (!pickerMode)
     75      } catch (ex) {
     76        //dump("failed to get the folder resource\n");
     77      }
     78      return msgfolder;
     79    }
     80
     81    var setDefaultCopiesAndFoldersPrefs = function (identity, server, accountData) {
     82      var am = Components.classes["@mozilla.org/messenger/account-manager;1"].getService(Components.interfaces.nsIMsgAccountManager);
     83      var rootFolder = am.defaultAccount.incomingServer.rootFolder
     84
     85      var fccElement = document.getElementById("VIdent_identity.fccFolder")
     86      var fccElementValue = fccElement.getAttribute("value");
     87      if (!fccElementValue || !GetMsgFolderFromUri(fccElementValue, false))
     88        fccElement.setAttribute("value", rootFolder.server.serverURI + gFccFolderWithDelim)
     89
     90      var draftElement = document.getElementById("VIdent_identity.draftFolder")
     91      var draftElementValue = draftElement.getAttribute("value");
     92      if (!draftElementValue || !GetMsgFolderFromUri(draftElementValue, false))
     93        draftElement.setAttribute("value", rootFolder.server.serverURI + gDraftsFolderWithDelim)
     94
     95      var stationeryElement = document.getElementById("VIdent_identity.stationeryFolder")
     96      var stationeryElementValue = stationeryElement.getAttribute("value");
     97      if (!stationeryElementValue || !GetMsgFolderFromUri(stationeryElementValue, false))
     98        stationeryElement.setAttribute("value", rootFolder.server.serverURI + gTemplatesFolderWithDelim)
     99    }
     100
     101
     102    var onInitCopiesAndFolders = function () {
     103      SetSpecialFolderNamesWithDelims();
     104      SetGlobalRadioElemChoices();
     105
     106      setDefaultCopiesAndFoldersPrefs();
     107
     108      SetFolderDisplay(gFccRadioElemChoice, gFccRadioElemChoiceLocked,
     109        "VIdent_fcc",
     110        fccAccountPickerId,
     111        "VIdent_identity.fccFolder",
     112        fccFolderPickerId);
     113
     114      SetFolderDisplay(gDraftsRadioElemChoice, gDraftsRadioElemChoiceLocked,
     115        "VIdent_draft",
     116        draftsAccountPickerId,
     117        "VIdent_identity.draftFolder",
     118        draftsFolderPickerId);
     119
     120      SetFolderDisplay(gTmplRadioElemChoice, gTmplRadioElemChoiceLocked,
     121        "VIdent_tmpl",
     122        tmplAccountPickerId,
     123        "VIdent_identity.stationeryFolder",
     124        tmplFolderPickerId);
     125
     126      setupFccItems();
     127    }
     128
     129    // Initialize the picker mode choices (account/folder picker) into global vars
     130    var SetGlobalRadioElemChoices = function () {
     131      var pickerModeElement = document.getElementById("VIdent_identity.fccFolderPickerMode");
     132      gFccRadioElemChoice = pickerModeElement.getAttribute("value");
     133      gFccRadioElemChoiceLocked = pickerModeElement.getAttribute("disabled");
     134      if (!gFccRadioElemChoice) gFccRadioElemChoice = gDefaultPickerMode;
     135
     136      pickerModeElement = document.getElementById("VIdent_identity.draftFolderPickerMode");
     137      gDraftsRadioElemChoice = pickerModeElement.getAttribute("value");
     138      gDraftsRadioElemChoiceLocked = pickerModeElement.getAttribute("disabled");
     139      if (!gDraftsRadioElemChoice) gDraftsRadioElemChoice = gDefaultPickerMode;
     140
     141      pickerModeElement = document.getElementById("VIdent_identity.stationeryFolderPickerMode");
     142      gTmplRadioElemChoice = pickerModeElement.getAttribute("value");
     143      gTmplRadioElemChoiceLocked = pickerModeElement.getAttribute("disabled");
     144      if (!gTmplRadioElemChoice) gTmplRadioElemChoice = gDefaultPickerMode;
     145    }
     146
     147    /*
     148     * Set Account and Folder elements based on the values read from
     149     * preferences file. Default picker mode, if none specified at this stage, is
     150     * set to 1 i.e., Other picker displaying the folder value read from the
     151     * preferences file.
     152     */
     153    var SetFolderDisplay = function (pickerMode, disableMode,
     154      radioElemPrefix,
     155      accountPickerId,
     156      folderPickedField,
     157      folderPickerId) {
     158      if (!pickerMode)
    165159        pickerMode = gDefaultPickerMode;
    166160
    167     var selectAccountRadioId = radioElemPrefix + "_selectAccount";
    168     var selectAccountRadioElem = document.getElementById(selectAccountRadioId);
    169     var selectFolderRadioId = radioElemPrefix + "_selectFolder";
    170     var selectFolderRadioElem = document.getElementById(selectFolderRadioId);
    171     var accountPicker = document.getElementById(accountPickerId);
    172     var folderPicker = document.getElementById(folderPickerId);
    173     var rg = selectAccountRadioElem.radioGroup;
    174 
    175     var folderPickedElement = document.getElementById(folderPickedField);
    176     var uri = folderPickedElement.getAttribute("value");
    177     // Get message folder from the given uri. Second argument (false) siginifies
    178     // that there is no need to check for the existence of special folders as
    179     // these folders are created on demand at runtime in case of imap accounts.
    180     // For POP3 accounts, special folders are created at the account creation time.
    181     var msgFolder = GetMsgFolderFromUri(uri, false);
    182     vI.InitFolderDisplays(msgFolder, accountPickerId, folderPickerId)
    183 
    184     switch (pickerMode)
    185     {
    186         case "0" :
    187             rg.selectedItem = selectAccountRadioElem;
    188             SetPickerEnabling(accountPickerId, folderPickerId);
    189             break;
    190 
    191         case "1"  :
    192             rg.selectedItem = selectFolderRadioElem;
    193             SetPickerEnabling(folderPickerId, accountPickerId);
    194             break;
    195     case "2"  :
    196         rg.selectedItem = document.getElementById(radioElemPrefix + "_Settings_Of_Default");
    197         folderPicker.setAttribute("disabled", "true");
    198         accountPicker.setAttribute("disabled", "true");
    199             break;
    200     case "3"  :
    201         rg.selectedItem = document.getElementById(radioElemPrefix + "_Settings_Of_Account");
    202         folderPicker.setAttribute("disabled", "true");
    203         accountPicker.setAttribute("disabled", "true");
    204             break;
    205 
    206         default :
    207             alert("Error in setting initial folder display on pickers\n");
    208             break;
    209     }
    210 
    211     // Check to see if we need to lock page elements. Disable radio buttons
    212     // and account/folder pickers when locked.
    213     if (disableMode) {
    214       selectAccountRadioElem.setAttribute("disabled","true");
    215       selectFolderRadioElem.setAttribute("disabled","true");
    216       accountPicker.setAttribute("disabled","true");
    217       folderPicker.setAttribute("disabled","true");
    218     }
    219 }
    220 
    221 // Need to append special folders when account picker is selected.
    222 // Create a set of global special folder vars to be suffixed to the
    223 // server URI of the selected account.
    224 var SetSpecialFolderNamesWithDelims = function()
    225 {
    226     var folderDelim = "/";
    227     /* we use internal names known to everyone like "Sent", "Templates" and "Drafts" */
    228 
    229     gFccFolderWithDelim = folderDelim + "Sent";
    230     gDraftsFolderWithDelim = folderDelim + "Drafts";
    231     gTemplatesFolderWithDelim = folderDelim + "Templates";
    232 }
    233 
    234 var onSaveCopiesAndFolders = function()
    235 {
    236     vI.SaveFolderSettings( gFccRadioElemChoice,
    237                         "doFcc",
    238                         gFccFolderWithDelim,
    239                         fccAccountPickerId,
    240                         fccFolderPickerId,
    241                         "VIdent_identity.fccFolder",
    242                         "VIdent_identity.fccFolderPickerMode" );
    243 
    244     vI.SaveFolderSettings( gDraftsRadioElemChoice,
    245                         "messageDrafts",
    246                         gDraftsFolderWithDelim,
    247                         draftsAccountPickerId,
    248                         draftsFolderPickerId,
    249                         "VIdent_identity.draftFolder",
    250                         "VIdent_identity.draftFolderPickerMode" );
    251 
    252     vI.SaveFolderSettings( gTmplRadioElemChoice,
    253                         "messageTemplates",
    254                         gTemplatesFolderWithDelim,
    255                         tmplAccountPickerId,
    256                         tmplFolderPickerId,
    257                         "VIdent_identity.stationeryFolder",
    258                         "VIdent_identity.stationeryFolderPickerMode" );
    259 }
    260 
    261 // Check the Fcc Self item and setup associated picker state
    262 var setupFccItems = function()
    263 {
    264     var broadcaster = document.getElementById("VIdent_broadcaster_doFcc");
    265 
    266     var checked = document.getElementById("VIdent_identity.doFcc").checked;
    267     if (checked) {
     161      var selectAccountRadioId = radioElemPrefix + "_selectAccount";
     162      var selectAccountRadioElem = document.getElementById(selectAccountRadioId);
     163      var selectFolderRadioId = radioElemPrefix + "_selectFolder";
     164      var selectFolderRadioElem = document.getElementById(selectFolderRadioId);
     165      var accountPicker = document.getElementById(accountPickerId);
     166      var folderPicker = document.getElementById(folderPickerId);
     167      var rg = selectAccountRadioElem.radioGroup;
     168
     169      var folderPickedElement = document.getElementById(folderPickedField);
     170      var uri = folderPickedElement.getAttribute("value");
     171      // Get message folder from the given uri. Second argument (false) siginifies
     172      // that there is no need to check for the existence of special folders as
     173      // these folders are created on demand at runtime in case of imap accounts.
     174      // For POP3 accounts, special folders are created at the account creation time.
     175      var msgFolder = GetMsgFolderFromUri(uri, false);
     176      vI.InitFolderDisplays(msgFolder, accountPickerId, folderPickerId)
     177
     178      switch (pickerMode) {
     179      case "0":
     180        rg.selectedItem = selectAccountRadioElem;
     181        SetPickerEnabling(accountPickerId, folderPickerId);
     182        break;
     183
     184      case "1":
     185        rg.selectedItem = selectFolderRadioElem;
     186        SetPickerEnabling(folderPickerId, accountPickerId);
     187        break;
     188      case "2":
     189        rg.selectedItem = document.getElementById(radioElemPrefix + "_Settings_Of_Default");
     190        folderPicker.setAttribute("disabled", "true");
     191        accountPicker.setAttribute("disabled", "true");
     192        break;
     193      case "3":
     194        rg.selectedItem = document.getElementById(radioElemPrefix + "_Settings_Of_Account");
     195        folderPicker.setAttribute("disabled", "true");
     196        accountPicker.setAttribute("disabled", "true");
     197        break;
     198
     199      default:
     200        alert("Error in setting initial folder display on pickers\n");
     201        break;
     202      }
     203
     204      // Check to see if we need to lock page elements. Disable radio buttons
     205      // and account/folder pickers when locked.
     206      if (disableMode) {
     207        selectAccountRadioElem.setAttribute("disabled", "true");
     208        selectFolderRadioElem.setAttribute("disabled", "true");
     209        accountPicker.setAttribute("disabled", "true");
     210        folderPicker.setAttribute("disabled", "true");
     211      }
     212    }
     213
     214    // Need to append special folders when account picker is selected.
     215    // Create a set of global special folder vars to be suffixed to the
     216    // server URI of the selected account.
     217    var SetSpecialFolderNamesWithDelims = function () {
     218      var folderDelim = "/";
     219      /* we use internal names known to everyone like "Sent", "Templates" and "Drafts" */
     220
     221      gFccFolderWithDelim = folderDelim + "Sent";
     222      gDraftsFolderWithDelim = folderDelim + "Drafts";
     223      gTemplatesFolderWithDelim = folderDelim + "Templates";
     224    }
     225
     226    var onSaveCopiesAndFolders = function () {
     227      vI.SaveFolderSettings(gFccRadioElemChoice,
     228        "doFcc",
     229        gFccFolderWithDelim,
     230        fccAccountPickerId,
     231        fccFolderPickerId,
     232        "VIdent_identity.fccFolder",
     233        "VIdent_identity.fccFolderPickerMode");
     234
     235      vI.SaveFolderSettings(gDraftsRadioElemChoice,
     236        "messageDrafts",
     237        gDraftsFolderWithDelim,
     238        draftsAccountPickerId,
     239        draftsFolderPickerId,
     240        "VIdent_identity.draftFolder",
     241        "VIdent_identity.draftFolderPickerMode");
     242
     243      vI.SaveFolderSettings(gTmplRadioElemChoice,
     244        "messageTemplates",
     245        gTemplatesFolderWithDelim,
     246        tmplAccountPickerId,
     247        tmplFolderPickerId,
     248        "VIdent_identity.stationeryFolder",
     249        "VIdent_identity.stationeryFolderPickerMode");
     250    }
     251
     252    // Check the Fcc Self item and setup associated picker state
     253    var setupFccItems = function () {
     254      var broadcaster = document.getElementById("VIdent_broadcaster_doFcc");
     255
     256      var checked = document.getElementById("VIdent_identity.doFcc").checked;
     257      if (checked) {
    268258        broadcaster.removeAttribute("disabled");
    269259        SetupFccPickerState(gFccRadioElemChoice,
    270                             fccAccountPickerId,
    271                             fccFolderPickerId);
    272       }
    273     else
     260          fccAccountPickerId,
     261          fccFolderPickerId);
     262      } else
    274263        broadcaster.setAttribute("disabled", "true");
    275 }
    276 
    277 // Set up picker settings for Sent Folder
    278 var SetupFccPickerState = function(pickerMode, accountPickerId, folderPickerId)
    279 {
    280     switch (pickerMode) {
    281         case "0" :
    282             if (!gFccRadioElemChoiceLocked)
    283               SetPickerEnabling(accountPickerId, folderPickerId);
    284             SetRadioButtons("VIdent_fcc_selectAccount", "VIdent_fcc_selectFolder");
    285             break;
    286    
    287         case "1" :
    288             if (!gFccRadioElemChoiceLocked)
    289               SetPickerEnabling(folderPickerId, accountPickerId);
    290             SetRadioButtons("VIdent_fcc_selectFolder", "VIdent_fcc_selectAccount");
    291             break;
    292 
    293         default :
    294           document.getElementById(folderPickerId).setAttribute("disabled", "true");
    295           document.getElementById(accountPickerId).setAttribute("disabled", "true");
    296             break;
    297     }
    298 }
    299 
    300 // Enable and disable pickers based on the radio element clicked
    301 var SetPickerEnabling = function(enablePickerId, disablePickerId)
    302 {
    303     var activePicker = document.getElementById(enablePickerId);
    304     activePicker.removeAttribute("disabled");
    305 
    306     var inactivePicker = document.getElementById(disablePickerId);
    307     inactivePicker.setAttribute("disabled", "true");
    308 }
    309 
    310 // Set radio element choices and picker states
    311 var setPickersState = function(enablePickerId, disablePickerId, event)
    312 {
    313     SetPickerEnabling(enablePickerId, disablePickerId);
    314 
    315     var radioElemValue = event.target.value;
    316    
    317     switch (event.target.id) {
    318     case "VIdent_fcc_Settings_Of_Account":
    319     case "VIdent_fcc_Settings_Of_Default":
    320         document.getElementById(enablePickerId).setAttribute("disabled", "true");
    321         case "VIdent_fcc_selectAccount":
    322         case "VIdent_fcc_selectFolder" :
    323             gFccRadioElemChoice = radioElemValue;   
    324             break;
    325     case "VIdent_draft_Settings_Of_Account":
    326     case "VIdent_draft_Settings_Of_Default":
    327         document.getElementById(enablePickerId).setAttribute("disabled", "true");
    328         case "VIdent_draft_selectAccount":
    329         case "VIdent_draft_selectFolder" :
    330             gDraftsRadioElemChoice = radioElemValue;   
    331             break;
    332     case "VIdent_tmpl_Settings_Of_Account":
    333     case "VIdent_tmpl_Settings_Of_Default":
    334         document.getElementById(enablePickerId).setAttribute("disabled", "true");
    335         case "VIdent_tmpl_selectFolder" :
    336         case "VIdent_tmpl_selectAccount":
    337             gTmplRadioElemChoice = radioElemValue;   
    338             break;
    339         default :
    340             alert("Error in setting picker state. " + event.target.id + "\n");
    341             return;
    342     }
    343    
    344     switch (event.target.id) {
    345         case "VIdent_fcc_Settings_Of_Account":
    346     case "VIdent_fcc_Settings_Of_Default":
    347         document.getElementById("VIdent_identity.fccReplyFollowsParent").setAttribute("disabled","true");
    348         break;
    349         case "VIdent_fcc_selectAccount":
    350         case "VIdent_fcc_selectFolder" :
    351         document.getElementById("VIdent_identity.fccReplyFollowsParent").removeAttribute("disabled")
    352             break;
    353      }
    354 }
    355 
    356 // This routine is to restore the correct radio element
    357 // state when the fcc self checkbox broadcasts the change
    358 var SetRadioButtons = function(selectPickerId, unselectPickerId)
    359 {
    360     var activeRadioElem = document.getElementById(selectPickerId);
    361     activeRadioElem.radioGroup.selectedItem = activeRadioElem;
    362 }
    363 vI.onInitCopiesAndFolders = onInitCopiesAndFolders;
    364 vI.onSaveCopiesAndFolders = onSaveCopiesAndFolders;
    365 vI.setPickersState = setPickersState;
    366 vI.gFccRadioElemChoice = gFccRadioElemChoice;
    367 vI.gDraftsRadioElemChoice = gDraftsRadioElemChoice;
    368 vI.gTmplRadioElemChoice = gTmplRadioElemChoice;
    369 
    370 // patch for https://bugzilla.mozilla.org/show_bug.cgi?id=889022, see there
    371 Components.utils.import("resource:///modules/MailUtils.js");
    372 if (typeof(GetMsgFolderFromUri) != "function") {
    373     var GetMsgFolderFromUri = _GetMsgFolderFromUri;
    374 }
    375 
    376 }});
     264    }
     265
     266    // Set up picker settings for Sent Folder
     267    var SetupFccPickerState = function (pickerMode, accountPickerId, folderPickerId) {
     268      switch (pickerMode) {
     269      case "0":
     270        if (!gFccRadioElemChoiceLocked)
     271          SetPickerEnabling(accountPickerId, folderPickerId);
     272        SetRadioButtons("VIdent_fcc_selectAccount", "VIdent_fcc_selectFolder");
     273        break;
     274
     275      case "1":
     276        if (!gFccRadioElemChoiceLocked)
     277          SetPickerEnabling(folderPickerId, accountPickerId);
     278        SetRadioButtons("VIdent_fcc_selectFolder", "VIdent_fcc_selectAccount");
     279        break;
     280
     281      default:
     282        document.getElementById(folderPickerId).setAttribute("disabled", "true");
     283        document.getElementById(accountPickerId).setAttribute("disabled", "true");
     284        break;
     285      }
     286    }
     287
     288    // Enable and disable pickers based on the radio element clicked
     289    var SetPickerEnabling = function (enablePickerId, disablePickerId) {
     290      var activePicker = document.getElementById(enablePickerId);
     291      activePicker.removeAttribute("disabled");
     292
     293      var inactivePicker = document.getElementById(disablePickerId);
     294      inactivePicker.setAttribute("disabled", "true");
     295    }
     296
     297    // Set radio element choices and picker states
     298    var setPickersState = function (enablePickerId, disablePickerId, event) {
     299      SetPickerEnabling(enablePickerId, disablePickerId);
     300
     301      var radioElemValue = event.target.value;
     302
     303      switch (event.target.id) {
     304      case "VIdent_fcc_Settings_Of_Account":
     305      case "VIdent_fcc_Settings_Of_Default":
     306        document.getElementById(enablePickerId).setAttribute("disabled", "true");
     307      case "VIdent_fcc_selectAccount":
     308      case "VIdent_fcc_selectFolder":
     309        gFccRadioElemChoice = radioElemValue;
     310        break;
     311      case "VIdent_draft_Settings_Of_Account":
     312      case "VIdent_draft_Settings_Of_Default":
     313        document.getElementById(enablePickerId).setAttribute("disabled", "true");
     314      case "VIdent_draft_selectAccount":
     315      case "VIdent_draft_selectFolder":
     316        gDraftsRadioElemChoice = radioElemValue;
     317        break;
     318      case "VIdent_tmpl_Settings_Of_Account":
     319      case "VIdent_tmpl_Settings_Of_Default":
     320        document.getElementById(enablePickerId).setAttribute("disabled", "true");
     321      case "VIdent_tmpl_selectFolder":
     322      case "VIdent_tmpl_selectAccount":
     323        gTmplRadioElemChoice = radioElemValue;
     324        break;
     325      default:
     326        alert("Error in setting picker state. " + event.target.id + "\n");
     327        return;
     328      }
     329
     330      switch (event.target.id) {
     331      case "VIdent_fcc_Settings_Of_Account":
     332      case "VIdent_fcc_Settings_Of_Default":
     333        document.getElementById("VIdent_identity.fccReplyFollowsParent").setAttribute("disabled", "true");
     334        break;
     335      case "VIdent_fcc_selectAccount":
     336      case "VIdent_fcc_selectFolder":
     337        document.getElementById("VIdent_identity.fccReplyFollowsParent").removeAttribute("disabled")
     338        break;
     339      }
     340    }
     341
     342    // This routine is to restore the correct radio element
     343    // state when the fcc self checkbox broadcasts the change
     344    var SetRadioButtons = function (selectPickerId, unselectPickerId) {
     345      var activeRadioElem = document.getElementById(selectPickerId);
     346      activeRadioElem.radioGroup.selectedItem = activeRadioElem;
     347    }
     348    vI.onInitCopiesAndFolders = onInitCopiesAndFolders;
     349    vI.onSaveCopiesAndFolders = onSaveCopiesAndFolders;
     350    vI.setPickersState = setPickersState;
     351    vI.gFccRadioElemChoice = gFccRadioElemChoice;
     352    vI.gDraftsRadioElemChoice = gDraftsRadioElemChoice;
     353    vI.gTmplRadioElemChoice = gTmplRadioElemChoice;
     354
     355    // patch for https://bugzilla.mozilla.org/show_bug.cgi?id=889022, see there
     356    Components.utils.import("resource:///modules/MailUtils.js");
     357    if (typeof (GetMsgFolderFromUri) != "function") {
     358      var GetMsgFolderFromUri = _GetMsgFolderFromUri;
     359    }
     360
     361  }
     362});
  • content/prefDialog/vI_prefDialog_TB3FolderPicker.js

    r3c9c29 r509348  
    1 
    21/**
    3 * some code copied and adapted from Thunderbird Sources
    4 * thanks to all Thunderbird Developers
    5 */
     2 * some code copied and adapted from Thunderbird Sources
     3 * thanks to all Thunderbird Developers
     4 */
    65
    76/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
     
    4443
    4544Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
    46 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) {
     45virtualIdentityExtension.ns(function () {
     46  with(virtualIdentityExtension.LIB) {
    4747
    48 var InitFolderDisplays = function(msgFolder, accountPickerId, folderPickerId) {
    49     var accountPicker = document.getElementById(accountPickerId);
    50     var folderPicker = document.getElementById(folderPickerId);
    51     InitFolderDisplay(msgFolder.server.rootFolder, accountPicker);
    52     InitFolderDisplay(msgFolder, folderPicker);
    53 }
     48    var InitFolderDisplays = function (msgFolder, accountPickerId, folderPickerId) {
     49      var accountPicker = document.getElementById(accountPickerId);
     50      var folderPicker = document.getElementById(folderPickerId);
     51      InitFolderDisplay(msgFolder.server.rootFolder, accountPicker);
     52      InitFolderDisplay(msgFolder, folderPicker);
     53    }
    5454
    55 // Initialize the folder display based on prefs values
    56 var InitFolderDisplay = function(folder, folderPicker) {
    57     try {
    58       folderPicker.firstChild.selectFolder(folder);
    59     } catch(ex) {
    60       folderPicker.setAttribute("label", folder.prettyName);
     55    // Initialize the folder display based on prefs values
     56    var InitFolderDisplay = function (folder, folderPicker) {
     57      try {
     58        folderPicker.firstChild.selectFolder(folder);
     59      } catch (ex) {
     60        folderPicker.setAttribute("label", folder.prettyName);
     61      }
     62      folderPicker.folder = folder;
    6163    }
    62     folderPicker.folder = folder;
    63 }
    6464
    65 // Capture any menulist changes
    66 var noteSelectionChange = function(radioItemId, aEvent)
    67 {
    68     var checkedElem = document.getElementById(radioItemId);
    69     var folder = aEvent.target._folder;
    70     var modeValue  = checkedElem.value;
    71     var radioGroup = checkedElem.radioGroup.getAttribute("id");
    72     var picker;
    73     switch (radioGroup)
    74     {
    75         case "VIdent_doFcc" :
    76             vI.gFccRadioElemChoice = modeValue;
    77             picker = document.getElementById("msgFccFolderPicker");
    78             break;
    79    
    80         case "VIdent_messageDrafts" :
    81             vI.gDraftsRadioElemChoice = modeValue;
    82             picker = document.getElementById("msgDraftsFolderPicker");
    83             break;
     65    // Capture any menulist changes
     66    var noteSelectionChange = function (radioItemId, aEvent) {
     67      var checkedElem = document.getElementById(radioItemId);
     68      var folder = aEvent.target._folder;
     69      var modeValue = checkedElem.value;
     70      var radioGroup = checkedElem.radioGroup.getAttribute("id");
     71      var picker;
     72      switch (radioGroup) {
     73      case "VIdent_doFcc":
     74        vI.gFccRadioElemChoice = modeValue;
     75        picker = document.getElementById("msgFccFolderPicker");
     76        break;
    8477
    85         case "VIdent_messageTemplates" :
    86             vI.gTmplRadioElemChoice = modeValue;
    87             picker = document.getElementById("msgStationeryFolderPicker");
    88             break;
     78      case "VIdent_messageDrafts":
     79        vI.gDraftsRadioElemChoice = modeValue;
     80        picker = document.getElementById("msgDraftsFolderPicker");
     81        break;
     82
     83      case "VIdent_messageTemplates":
     84        vI.gTmplRadioElemChoice = modeValue;
     85        picker = document.getElementById("msgStationeryFolderPicker");
     86        break;
     87      }
     88      picker.folder = folder;
     89      picker.setAttribute("label", folder.prettyName);
    8990    }
    90     picker.folder = folder;
    91     picker.setAttribute("label", folder.prettyName);
    92 }
    9391
    94 // Save folder settings and radio element choices
    95 var SaveFolderSettings = function(radioElemChoice,
    96                             radioGroupId,
    97                             folderSuffix,
    98                             accountPickerId,
    99                             folderPickerId,
    100                             folderElementId,
    101                             folderPickerModeId)
    102 {
    103     var formElement = document.getElementById(folderElementId);
    104     var uri = "";
     92    // Save folder settings and radio element choices
     93    var SaveFolderSettings = function (radioElemChoice,
     94      radioGroupId,
     95      folderSuffix,
     96      accountPickerId,
     97      folderPickerId,
     98      folderElementId,
     99      folderPickerModeId) {
     100      var formElement = document.getElementById(folderElementId);
     101      var uri = "";
    105102
    106     switch (radioElemChoice)
    107     {
    108         case "0" :
    109             uri = document.getElementById(accountPickerId).selectedItem._folder.URI;
    110             if (uri) {
    111                 // Create  Folder URI
    112                 uri = uri + folderSuffix;
    113             }
    114             break;
     103      switch (radioElemChoice) {
     104      case "0":
     105        uri = document.getElementById(accountPickerId).selectedItem._folder.URI;
     106        if (uri) {
     107          // Create  Folder URI
     108          uri = uri + folderSuffix;
     109        }
     110        break;
    115111
    116         case "1" :
    117             uri = document.getElementById(folderPickerId).folder.URI;
    118             break;
     112      case "1":
     113        uri = document.getElementById(folderPickerId).folder.URI;
     114        break;
    119115
    120         default :
    121             break;
     116      default:
     117        break;
     118      }
     119      formElement.setAttribute("value", uri);
     120
     121      formElement = document.getElementById(folderPickerModeId);
     122      formElement.setAttribute("value", radioElemChoice);
    122123    }
    123     formElement.setAttribute("value", uri);
    124 
    125     formElement = document.getElementById(folderPickerModeId);
    126     formElement.setAttribute("value", radioElemChoice);
    127 }
    128 vI.InitFolderDisplays = InitFolderDisplays;
    129 vI.SaveFolderSettings = SaveFolderSettings;
    130 vI.noteSelectionChange = noteSelectionChange;
    131 }});
     124    vI.InitFolderDisplays = InitFolderDisplays;
     125    vI.SaveFolderSettings = SaveFolderSettings;
     126    vI.noteSelectionChange = noteSelectionChange;
     127  }
     128});
  • content/vI_Dialog.js

    r3c9c29 r509348  
    2424
    2525Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
    26 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) {
    27 var Dialog = {
    28     setDescription : function(object, description) {
    29         var new_text = document.createTextNode(description);
    30         object.appendChild(new_text);
    31     },
     26virtualIdentityExtension.ns(function () {
     27  with(virtualIdentityExtension.LIB) {
     28    var Dialog = {
     29      setDescription: function (object, description) {
     30        var new_text = document.createTextNode(description);
     31        object.appendChild(new_text);
     32      },
    3233
    33     init : function(warning) {
    34         document.getElementById("virtualIdentityExtension_Dialog").setAttribute("class", warning.class);
    35         Dialog.setDescription(document.getElementById("virtualIdentityExtension_Dialog_title"), warning.title);
    36         Dialog.setDescription(document.getElementById("virtualIdentityExtension_Dialog_recLabel"), warning.recLabel);
    37         Dialog.setDescription(document.getElementById("virtualIdentityExtension_Dialog_recipient"), warning.recipient);
    38         document.getElementById("virtualIdentityExtension_Dialog_browser").outputString = warning.warning;
    39         Dialog.setDescription(document.getElementById("virtualIdentityExtension_Dialog_query"), warning.query);
    40         // show abort button
    41         if (warning.class == "replaceVIdentity") {
    42             document.documentElement.getButton("extra1").hidden = true;
    43             document.documentElement.getButton("extra2").hidden = true;
    44         }
    45     }
    46 }
    47 vI.Dialog = Dialog;
    48 }});
     34      init: function (warning) {
     35        document.getElementById("virtualIdentityExtension_Dialog").setAttribute("class", warning.class);
     36        Dialog.setDescription(document.getElementById("virtualIdentityExtension_Dialog_title"), warning.title);
     37        Dialog.setDescription(document.getElementById("virtualIdentityExtension_Dialog_recLabel"), warning.recLabel);
     38        Dialog.setDescription(document.getElementById("virtualIdentityExtension_Dialog_recipient"), warning.recipient);
     39        document.getElementById("virtualIdentityExtension_Dialog_browser").outputString = warning.warning;
     40        Dialog.setDescription(document.getElementById("virtualIdentityExtension_Dialog_query"), warning.query);
     41        // show abort button
     42        if (warning.class == "replaceVIdentity") {
     43          document.documentElement.getButton("extra1").hidden = true;
     44          document.documentElement.getButton("extra2").hidden = true;
     45        }
     46      }
     47    }
     48    vI.Dialog = Dialog;
     49  }
     50});
  • content/vI_getHeader.js

    r3c9c29 r509348  
    2727
    2828Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
    29 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) {
     29virtualIdentityExtension.ns(function () {
     30  with(virtualIdentityExtension.LIB) {
    3031
    31 Components.utils.import("resource://v_identity/stdlib/msgHdrUtils.js", virtualIdentityExtension);
    32 Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension);
    33 let Log = vI.setupLogging("virtualIdentity.getHeader");
     32    Components.utils.import("resource://v_identity/stdlib/msgHdrUtils.js", virtualIdentityExtension);
     33    Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension);
     34    let Log = vI.setupLogging("virtualIdentity.getHeader");
    3435
    35 // var storedHeaders = { };
    36 var getHeader = {
    37     unicodeConverter : Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
    38             .createInstance(Components.interfaces.nsIScriptableUnicodeConverter),
     36    // var storedHeaders = { };
     37    var getHeader = {
     38      unicodeConverter: Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
     39        .createInstance(Components.interfaces.nsIScriptableUnicodeConverter),
    3940
    40     headerToSearch : null,
    41    
    42     prefObserverToSearchArray : function() {
    43         var headerList = getHeader.unicodeConverter.ConvertToUnicode(vI.vIprefs.get("smart_reply_headers")).split(/\n/)
    44        
    45         getHeader.headerToSearch = [];
    46        
    47         // prepare headerToSearch for speedup.
    48         for (var index = 0; index < headerList.length; index++) {
    49             var headerToSearch_splitted = headerList[index].split(/:/)
    50             // use first part (all before ':') as the header name
    51             var headerNameToSearch = headerToSearch_splitted[0].toLowerCase()
    52             // check second or third part for any number
    53             var headerNumberToSearch = null;
    54             if (headerToSearch_splitted.length > 1) parseInt(headerToSearch_splitted[1]);
    55             if ((!headerNumberToSearch || isNaN(headerNumberToSearch)) && headerToSearch_splitted.length > 2) headerNumberToSearch = parseInt(headerToSearch_splitted[2]);
    56            
    57             // create header name to store the value
    58             var headerNameToStore = headerNameToSearch;
    59             if (headerNumberToSearch && !isNaN(headerNumberToSearch)) headerNameToStore += ":" + headerNumberToSearch
    60            
    61             getHeader.headerToSearch.push({ headerNameToSearch : headerNameToSearch, headerNumberToSearch : headerNumberToSearch,
    62                     headerNameToStore : headerNameToStore });
    63         }
    64     },
     41      headerToSearch: null,
    6542
    66     getHeader: function() {
    67       vI.clearDebugOutput();
    68       if (!getHeader.headerToSearch) getHeader.prefObserverToSearchArray()
    69      
    70       vI.msgHdrGetHeaders(getHeader.hdr, function (aHeaders) {
    71         let label = "";
    72         if (aHeaders.has("list-id")) {
    73           getHeader.hdr.setStringProperty("vI_list-id","found");
    74           Log.debug("found header: list-id  ...stored to recognize mailing-list");
     43      prefObserverToSearchArray: function () {
     44        var headerList = getHeader.unicodeConverter.ConvertToUnicode(vI.vIprefs.get("smart_reply_headers")).split(/\n/)
     45
     46        getHeader.headerToSearch = [];
     47
     48        // prepare headerToSearch for speedup.
     49        for (var index = 0; index < headerList.length; index++) {
     50          var headerToSearch_splitted = headerList[index].split(/:/)
     51            // use first part (all before ':') as the header name
     52          var headerNameToSearch = headerToSearch_splitted[0].toLowerCase()
     53            // check second or third part for any number
     54          var headerNumberToSearch = null;
     55          if (headerToSearch_splitted.length > 1) parseInt(headerToSearch_splitted[1]);
     56          if ((!headerNumberToSearch || isNaN(headerNumberToSearch)) && headerToSearch_splitted.length > 2) headerNumberToSearch = parseInt(headerToSearch_splitted[2]);
     57
     58          // create header name to store the value
     59          var headerNameToStore = headerNameToSearch;
     60          if (headerNumberToSearch && !isNaN(headerNumberToSearch)) headerNameToStore += ":" + headerNumberToSearch
     61
     62          getHeader.headerToSearch.push({
     63            headerNameToSearch: headerNameToSearch,
     64            headerNumberToSearch: headerNumberToSearch,
     65            headerNameToStore: headerNameToStore
     66          });
    7567        }
    76         if (aHeaders.has("received")) {
    77           getHeader.hdr.setStringProperty("vI_received","found");
    78           Log.debug("found header: received  ...stored to recognize received mail");
    79         }
    80         if (aHeaders.has("content-base")) {
    81           getHeader.hdr.setStringProperty("vI_content_base","found");
    82           Log.debug("found header: content-base  ...stored to recognize blog/news-feed");
    83         }
    84         for (let index = 0; index < getHeader.headerToSearch.length; index++) {
    85           let {headerNameToSearch: headerNameToSearch, headerNumberToSearch: headerNumberToSearch,
    86             headerNameToStore: headerNameToStore} = getHeader.headerToSearch[index];
    87           if (aHeaders.has(headerNameToSearch)) {
    88             let value = "";
    89             let values = aHeaders.getAll(headerNameToSearch);
    90             if (!headerNumberToSearch || isNaN(headerNumberToSearch))
    91               for (let i = 0; i < values.length;)
    92                 value += ((value)?(", "):("")) + values[i++];
    93             else value = values[headerNumberToSearch-1];
    94             if (value) {
    95               getHeader.hdr.setStringProperty("vI_" + headerNameToStore,
    96                 getHeader.unicodeConverter.ConvertFromUnicode(value) + getHeader.unicodeConverter.Finish());
    97              
    98               let storedValue = getHeader.hdr.getProperty("vI_" + headerNameToStore);
    99               let storedConvValue = getHeader.unicodeConverter.ConvertToUnicode(storedValue);
    100              
    101               Log.debug("found header: " + headerNameToStore +
     68      },
     69
     70      getHeader: function () {
     71        vI.clearDebugOutput();
     72        if (!getHeader.headerToSearch) getHeader.prefObserverToSearchArray()
     73
     74        vI.msgHdrGetHeaders(getHeader.hdr, function (aHeaders) {
     75          let label = "";
     76          if (aHeaders.has("list-id")) {
     77            getHeader.hdr.setStringProperty("vI_list-id", "found");
     78            Log.debug("found header: list-id  ...stored to recognize mailing-list");
     79          }
     80          if (aHeaders.has("received")) {
     81            getHeader.hdr.setStringProperty("vI_received", "found");
     82            Log.debug("found header: received  ...stored to recognize received mail");
     83          }
     84          if (aHeaders.has("content-base")) {
     85            getHeader.hdr.setStringProperty("vI_content_base", "found");
     86            Log.debug("found header: content-base  ...stored to recognize blog/news-feed");
     87          }
     88          for (let index = 0; index < getHeader.headerToSearch.length; index++) {
     89            let {
     90              headerNameToSearch: headerNameToSearch,
     91              headerNumberToSearch: headerNumberToSearch,
     92              headerNameToStore: headerNameToStore
     93            } = getHeader.headerToSearch[index];
     94            if (aHeaders.has(headerNameToSearch)) {
     95              let value = "";
     96              let values = aHeaders.getAll(headerNameToSearch);
     97              if (!headerNumberToSearch || isNaN(headerNumberToSearch))
     98                for (let i = 0; i < values.length;)
     99                  value += ((value) ? (", ") : ("")) + values[i++];
     100              else value = values[headerNumberToSearch - 1];
     101              if (value) {
     102                getHeader.hdr.setStringProperty("vI_" + headerNameToStore,
     103                  getHeader.unicodeConverter.ConvertFromUnicode(value) + getHeader.unicodeConverter.Finish());
     104
     105                let storedValue = getHeader.hdr.getProperty("vI_" + headerNameToStore);
     106                let storedConvValue = getHeader.unicodeConverter.ConvertToUnicode(storedValue);
     107
     108                Log.debug("found header: " + headerNameToStore +
    102109                  " - stored as '" + storedConvValue + "'");
    103               label += (label)?"\n":""
    104               label += headerNameToStore + ":\t" + storedConvValue
     110                label += (label) ? "\n" : ""
     111                label += headerNameToStore + ":\t" + storedConvValue
     112              }
    105113            }
    106114          }
    107         }
    108         vI.GetHeaderNotification.info(label);
    109       });
    110     },
    111    
    112     setupEventListener: function() {
    113         getHeader.unicodeConverter.charset = "UTF-8";
    114        
     115          vI.GetHeaderNotification.info(label);
     116        });
     117      },
     118
     119      setupEventListener: function () {
     120        getHeader.unicodeConverter.charset = "UTF-8";
     121
    115122        // read headers later if msg is loaded completely - this ensures compatibility to Thunderbird Conversation
    116123        getHeader.orig_OnMsgLoaded = OnMsgLoaded;
    117124        OnMsgLoaded = getHeader.OnMsgLoaded;
    118125
    119     },
    120    
    121     OnMsgLoaded: function(url) {
    122         const Cc = Components.classes;
    123         const Ci = Components.interfaces;
    124         // Necko URL, so convert it into a message header
     126      },
     127
     128      OnMsgLoaded: function (url) {
     129        const Cc = Components.classes;
     130        const Ci = Components.interfaces;
     131        // Necko URL, so convert it into a message header
    125132        let ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
    126133        var neckoURL = ioService.newURI(null, null, url.baseURI);
    127         neckoURL.QueryInterface(Ci.nsIMsgMessageUrl);
    128        
    129         getHeader.hdr = neckoURL.messageHeader;
    130         if (getHeader.hdr) getHeader.getHeader();
     134        neckoURL.QueryInterface(Ci.nsIMsgMessageUrl);
     135
     136        getHeader.hdr = neckoURL.messageHeader;
     137        if (getHeader.hdr) getHeader.getHeader();
    131138        getHeader.orig_OnMsgLoaded(url);
    132     }
    133 }
     139      }
     140    }
    134141
    135142
    136 var prefObserver = {
    137     unicodeConverter : Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
    138             .createInstance(Components.interfaces.nsIScriptableUnicodeConverter),
    139            
    140     observer_added : false,
    141    
    142     init : function() {
    143       vI.vIprefs.addObserver("smart_reply_headers", this.observe, this);
    144     },
    145    
    146     cleanup : function() {
    147       let self = this;
    148       vI.vIprefs.removeObserver("smart_reply_headers", self.observe);
    149     },
    150    
    151     observe: function(self, subject, topic, data) {
    152         if (topic == "nsPref:changed") {
    153             // remove (old) prepared headerArray
    154             getHeader.headerToSearch = null;
    155             ReloadMessage();
    156         }
    157     },
     143    var prefObserver = {
     144      unicodeConverter: Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
     145        .createInstance(Components.interfaces.nsIScriptableUnicodeConverter),
    158146
    159 }
    160 addEventListener('messagepane-loaded', getHeader.setupEventListener, true);
    161 window.addEventListener("load", function(e) { prefObserver.init(); }, false);
    162 window.addEventListener("unload", function(e) { prefObserver.cleanup(); }, false);
    163 // vI.storedHeaders = storedHeaders;
    164 }});
     147      observer_added: false,
     148
     149      init: function () {
     150        vI.vIprefs.addObserver("smart_reply_headers", this.observe, this);
     151      },
     152
     153      cleanup: function () {
     154        let self = this;
     155        vI.vIprefs.removeObserver("smart_reply_headers", self.observe);
     156      },
     157
     158      observe: function (self, subject, topic, data) {
     159        if (topic == "nsPref:changed") {
     160          // remove (old) prepared headerArray
     161          getHeader.headerToSearch = null;
     162          ReloadMessage();
     163        }
     164      },
     165
     166    }
     167    addEventListener('messagepane-loaded', getHeader.setupEventListener, true);
     168    window.addEventListener("load", function (e) {
     169      prefObserver.init();
     170    }, false);
     171    window.addEventListener("unload", function (e) {
     172      prefObserver.cleanup();
     173    }, false);
     174    // vI.storedHeaders = storedHeaders;
     175  }
     176});
  • content/vI_overlay.js

    r3c9c29 r509348  
    11  /* ***** 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.
     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.
    66
    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.
     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.
    1111
    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
     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
    1515
    16     The Original Code is the Virtual Identity Extension.
     16      The Original Code is the Virtual Identity Extension.
    1717
    18     The Initial Developer of the Original Code is Rene Ejury.
    19     Portions created by the Initial Developer are Copyright (C) 2011
    20     the Initial Developer. All Rights Reserved.
     18      The Initial Developer of the Original Code is Rene Ejury.
     19      Portions created by the Initial Developer are Copyright (C) 2011
     20      the Initial Developer. All Rights Reserved.
    2121
    22     Contributor(s):
    23  * ***** END LICENSE BLOCK ***** */
     22      Contributor(s):
     23   * ***** END LICENSE BLOCK ***** */
    2424
    25 Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
    26 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) {
    27  
    28 let Log = vI.setupLogging("virtualIdentity.overlay");
     25  Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
     26  virtualIdentityExtension.ns(function () {
     27    with(virtualIdentityExtension.LIB) {
    2928
    30 Components.utils.import("resource://v_identity/vI_rdfDatasource.js", virtualIdentityExtension);
    31 Components.utils.import("resource://v_identity/vI_account.js", virtualIdentityExtension);
    32 Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension);
     29      let Log = vI.setupLogging("virtualIdentity.overlay");
    3330
    34 Components.utils.import("resource://gre/modules/AddonManager.jsm"); 
     31      Components.utils.import("resource://v_identity/vI_rdfDatasource.js", virtualIdentityExtension);
     32      Components.utils.import("resource://v_identity/vI_account.js", virtualIdentityExtension);
     33      Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension);
    3534
    36 const virtualIdentity_ID="{dddd428e-5ac8-4a81-9f78-276c734f75b8}"
    37 AddonManager.getAddonByID(virtualIdentity_ID, function(addon) {
    38   if (addon)
    39     vI.extensionVersion = addon.version;
    40 });
     35      Components.utils.import("resource://gre/modules/AddonManager.jsm");
     36
     37      const virtualIdentity_ID = "{dddd428e-5ac8-4a81-9f78-276c734f75b8}"
     38      AddonManager.getAddonByID(virtualIdentity_ID, function (addon) {
     39        if (addon)
     40          vI.extensionVersion = addon.version;
     41      });
    4142
    4243
    43 function extensionInit() {
    44   Log.debug("init")
    45   vI.upgrade.quickUpgrade();
    46   vI.vIaccount_cleanupSystem(); // always clean leftover accounts and directories
    47  
    48   if (vI.vIprefs.get("error_console")) {
    49     document.getElementById("virtualIdentityExtension_vIErrorBoxSplitter").removeAttribute("hidden");
    50     document.getElementById("virtualIdentityExtension_vIErrorBox").removeAttribute("hidden");
    51     document.getElementById("virtualIdentityExtension_vIErrorBox").setAttribute("class", "console-box");
    52     vI.prefroot.setBoolPref("javascript.options.showInConsole", true);
    53     vI.prefroot.setBoolPref("browser.dom.window.dump.enabled", true);
    54     vI.prefroot.setBoolPref("javascript.options.strict", true);
    55   }
    56 }
     44      function extensionInit() {
     45        Log.debug("init")
     46        vI.upgrade.quickUpgrade();
     47        vI.vIaccount_cleanupSystem(); // always clean leftover accounts and directories
    5748
    58 addEventListener('messagepane-loaded', extensionInit, true);
    59 // this is the entry place, nameSpaceWrapper is loaded and the show can start
    60 try {
    61   Components.utils.import("resource://v_identity/plugins/conversations.js", virtualIdentityExtension);
    62 } catch(e) {
    63   vI.dumpCallStack(e);
    64 }
     49        if (vI.vIprefs.get("error_console")) {
     50          document.getElementById("virtualIdentityExtension_vIErrorBoxSplitter").removeAttribute("hidden");
     51          document.getElementById("virtualIdentityExtension_vIErrorBox").removeAttribute("hidden");
     52          document.getElementById("virtualIdentityExtension_vIErrorBox").setAttribute("class", "console-box");
     53          vI.prefroot.setBoolPref("javascript.options.showInConsole", true);
     54          vI.prefroot.setBoolPref("browser.dom.window.dump.enabled", true);
     55          vI.prefroot.setBoolPref("javascript.options.strict", true);
     56        }
     57      }
     58
     59      addEventListener('messagepane-loaded', extensionInit, true);
     60      // this is the entry place, nameSpaceWrapper is loaded and the show can start
     61      try {
     62        Components.utils.import("resource://v_identity/plugins/conversations.js", virtualIdentityExtension);
     63      } catch (e) {
     64        vI.dumpCallStack(e);
     65      }
    6566
    6667
    67 }});
     68    }
     69  });
  • content/vI_rdfAccountMismatchDialog.js

    r3c9c29 r509348  
    2424
    2525Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
    26 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) {
    27 let Log = vI.setupLogging("virtualIdentity.rdfAccountMismatchDialog");
     26virtualIdentityExtension.ns(function () {
     27  with(virtualIdentityExtension.LIB) {
     28    let Log = vI.setupLogging("virtualIdentity.rdfAccountMismatchDialog");
    2829
    29 var rdfAccountMismatchDialog = {
    30     mismatchItems : null,
    31     type : null,
     30    var rdfAccountMismatchDialog = {
     31      mismatchItems: null,
     32      type: null,
    3233
    33     init : function() {
    34         rdfAccountMismatchDialog.type = window.arguments[0];
     34      init: function () {
     35        rdfAccountMismatchDialog.type = window.arguments[0];
    3536        rdfAccountMismatchDialog.mismatchItems = window.arguments[1];
    3637
     
    3839        document.getElementById("virtualIdentityExtension_rdfAccountMismatchDialog_vbox_" + rdfAccountMismatchDialog.type).removeAttribute("hidden");
    3940        document.getElementById("virtualIdentityExtension_rdfAccountMismatchDialog_listhead_" + rdfAccountMismatchDialog.type).removeAttribute("hidden");
    40        
    41         for (var i = 0; i < rdfAccountMismatchDialog.mismatchItems.length; i++) {
    42 //             var label = document.createElement("label");
    43             var listitem = document.createElement("listitem");
    44             listitem.setAttribute("id", "virtualIdentityExtension_mismatchLine_" + i);
    45             listitem.setAttribute("class", "mismatchLine");
    46             listitem.setAttribute("type",rdfAccountMismatchDialog.type);
    47             listitem.setAttribute("oldkey",rdfAccountMismatchDialog.mismatchItems[i].oldkey);
    48             listitem.setAttribute("label",rdfAccountMismatchDialog.mismatchItems[i].label);
    49             listitem.setAttribute("ext1",rdfAccountMismatchDialog.mismatchItems[i].ext1);
    50             listitem.setAttribute("ext2",rdfAccountMismatchDialog.mismatchItems[i].ext2);
    51             listitem.setAttribute("count",rdfAccountMismatchDialog.mismatchItems[i].count);
    52             document.getElementById("virtualIdentityExtension_rdfAccountMismatchDialog_listbox").appendChild(listitem)
    53         }
    54     },
    5541
    56     accept : function() {
    5742        for (var i = 0; i < rdfAccountMismatchDialog.mismatchItems.length; i++) {
    58             rdfAccountMismatchDialog.mismatchItems[i].key = document.getElementById("virtualIdentityExtension_mismatchLine_" + i).key
     43          //             var label = document.createElement("label");
     44          var listitem = document.createElement("listitem");
     45          listitem.setAttribute("id", "virtualIdentityExtension_mismatchLine_" + i);
     46          listitem.setAttribute("class", "mismatchLine");
     47          listitem.setAttribute("type", rdfAccountMismatchDialog.type);
     48          listitem.setAttribute("oldkey", rdfAccountMismatchDialog.mismatchItems[i].oldkey);
     49          listitem.setAttribute("label", rdfAccountMismatchDialog.mismatchItems[i].label);
     50          listitem.setAttribute("ext1", rdfAccountMismatchDialog.mismatchItems[i].ext1);
     51          listitem.setAttribute("ext2", rdfAccountMismatchDialog.mismatchItems[i].ext2);
     52          listitem.setAttribute("count", rdfAccountMismatchDialog.mismatchItems[i].count);
     53          document.getElementById("virtualIdentityExtension_rdfAccountMismatchDialog_listbox").appendChild(listitem)
    5954        }
    60         /* window.argument[2] stores callback parent */
     55      },
     56
     57      accept: function () {
     58        for (var i = 0; i < rdfAccountMismatchDialog.mismatchItems.length; i++) {
     59          rdfAccountMismatchDialog.mismatchItems[i].key = document.getElementById("virtualIdentityExtension_mismatchLine_" + i).key
     60        }
     61        /* window.argument[2] stores callback parent */
    6162        window.arguments[2].repairAccountMismatch(rdfAccountMismatchDialog.type, rdfAccountMismatchDialog.mismatchItems);
    62     }
    63 }
    64 window.addEventListener("load", rdfAccountMismatchDialog.init, false);
    65 vI.rdfAccountMismatchDialog = rdfAccountMismatchDialog;
    66 }});
     63      }
     64    }
     65    window.addEventListener("load", rdfAccountMismatchDialog.init, false);
     66    vI.rdfAccountMismatchDialog = rdfAccountMismatchDialog;
     67  }
     68});
  • content/vI_rdfDataEditor.js

    r3c9c29 r509348  
    2424
    2525Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
    26 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) {
     26virtualIdentityExtension.ns(function () {
     27  with(virtualIdentityExtension.LIB) {
    2728
    28 Components.utils.import("resource://v_identity/vI_identityData.js", virtualIdentityExtension);
    29 let Log = vI.setupLogging("virtualIdentity.rdfDataEditor");
    30 Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension);
     29    Components.utils.import("resource://v_identity/vI_identityData.js", virtualIdentityExtension);
     30    let Log = vI.setupLogging("virtualIdentity.rdfDataEditor");
     31    Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension);
    3132
    32 var rdfDataEditor = {
    33     __rdfDatasource : null,
    34     __rdfDataTree : null,
    35     __type : null,
    36     __recipient : null,
    37     __identityData : null,
    38    
    39     __populateIdentityMenu : function() {
    40         var listitem = document.createElement("menuitem");
    41         listitem.setAttribute("label", "");
    42         document.getElementById("virtualIdentityExtension_IdentityListPopup").appendChild(listitem);
    43         document.getElementById("virtualIdentityExtension_IdentityList").selectedItem = listitem;
    44         var separator = document.createElement("menuseparator");
    45         document.getElementById("virtualIdentityExtension_IdentityListPopup").appendChild(separator);
     33    var rdfDataEditor = {
     34      __rdfDatasource: null,
     35      __rdfDataTree: null,
     36      __type: null,
     37      __recipient: null,
     38      __identityData: null,
    4639
    47         FillIdentityList(document.getElementById("virtualIdentityExtension_IdentityList"))
    48     },
     40      __populateIdentityMenu: function () {
     41        var listitem = document.createElement("menuitem");
     42        listitem.setAttribute("label", "");
     43        document.getElementById("virtualIdentityExtension_IdentityListPopup").appendChild(listitem);
     44        document.getElementById("virtualIdentityExtension_IdentityList").selectedItem = listitem;
     45        var separator = document.createElement("menuseparator");
     46        document.getElementById("virtualIdentityExtension_IdentityListPopup").appendChild(separator);
    4947
    50     init : function() {
    51         if (window.arguments[0]["recipientCol"])
    52             rdfDataEditor.__recipient = window.arguments[0]["recipientCol"];
    53         rdfDataEditor.__type = window.arguments[1];
    54         rdfDataEditor.__rdfDatasource = window.arguments[2];
    55         rdfDataEditor.__rdfDataTree = window.arguments[3];
    56         ;
    57         rdfDataEditor.__identityData = new vI.identityData();
    58         rdfDataEditor.__identityData.copy(window.arguments[0].identityData);
     48        FillIdentityList(document.getElementById("virtualIdentityExtension_IdentityList"))
     49      },
    5950
    60        
    61         // set recipient
    62         document.getElementById("recipient").value = rdfDataEditor.__recipient;
    63        
    64         // set type of entry (and populate Menu)
    65         var typeMenuPopup = document.getElementById("type_menu_popup")
    66         for each (var typeField in Array("email", "maillist", "newsgroup", "filter")) {
    67             var menuitem = document.createElement("menuitem");
    68             var label = Components.classes["@mozilla.org/intl/stringbundle;1"]
    69               .getService(Components.interfaces.nsIStringBundleService)
    70               .createBundle("chrome://v_identity/locale/vI_rdfDataEditor.properties")
    71               .GetStringFromName("vI_rdfDataTree.dataType." + typeField);
    72             menuitem.setAttribute("label", label);
    73             menuitem.setAttribute("key", typeField);
    74             typeMenuPopup.appendChild(menuitem);
    75             if (typeField == rdfDataEditor.__type) document.getElementById("type_menu").selectedItem = menuitem
    76         }
    77        
    78         // set sender
    79         document.getElementById("sender").value = rdfDataEditor.__identityData.combinedName;
     51      init: function () {
     52        if (window.arguments[0]["recipientCol"])
     53          rdfDataEditor.__recipient = window.arguments[0]["recipientCol"];
     54        rdfDataEditor.__type = window.arguments[1];
     55        rdfDataEditor.__rdfDatasource = window.arguments[2];
     56        rdfDataEditor.__rdfDataTree = window.arguments[3];;
     57        rdfDataEditor.__identityData = new vI.identityData();
     58        rdfDataEditor.__identityData.copy(window.arguments[0].identityData);
    8059
    81         // set Identity
    82         rdfDataEditor.__populateIdentityMenu();
    83         var MenuItems = document.getElementById("virtualIdentityExtension_IdentityListPopup").childNodes;
    84         for (var index = 0; index < MenuItems.length; index++) {
    85             if (MenuItems[index].getAttribute("value") == rdfDataEditor.__identityData.id.key) {
    86                 document.getElementById("virtualIdentityExtension_IdentityList").selectedItem =
    87                         MenuItems[index];
    88                 break;
    89             }
    90         }
    9160
    92         // set SMTP
    93         document.getElementById("virtualIdentityExtension_smtpServerListHbox").addNoneServer(); // add non (not stored) Server
    94         document.getElementById("virtualIdentityExtension_smtpServerListHbox").smtp = rdfDataEditor.__identityData.smtp.keyNice;
    95        
    96         // set extra values
     61        // set recipient
     62        document.getElementById("recipient").value = rdfDataEditor.__recipient;
     63
     64        // set type of entry (and populate Menu)
     65        var typeMenuPopup = document.getElementById("type_menu_popup")
     66        for each(var typeField in Array("email", "maillist", "newsgroup", "filter")) {
     67          var menuitem = document.createElement("menuitem");
     68          var label = Components.classes["@mozilla.org/intl/stringbundle;1"]
     69            .getService(Components.interfaces.nsIStringBundleService)
     70            .createBundle("chrome://v_identity/locale/vI_rdfDataEditor.properties")
     71            .GetStringFromName("vI_rdfDataTree.dataType." + typeField);
     72          menuitem.setAttribute("label", label);
     73          menuitem.setAttribute("key", typeField);
     74          typeMenuPopup.appendChild(menuitem);
     75          if (typeField == rdfDataEditor.__type) document.getElementById("type_menu").selectedItem = menuitem
     76        }
     77
     78        // set sender
     79        document.getElementById("sender").value = rdfDataEditor.__identityData.combinedName;
     80
     81        // set Identity
     82        rdfDataEditor.__populateIdentityMenu();
     83        var MenuItems = document.getElementById("virtualIdentityExtension_IdentityListPopup").childNodes;
     84        for (var index = 0; index < MenuItems.length; index++) {
     85          if (MenuItems[index].getAttribute("value") == rdfDataEditor.__identityData.id.key) {
     86            document.getElementById("virtualIdentityExtension_IdentityList").selectedItem =
     87              MenuItems[index];
     88            break;
     89          }
     90        }
     91
     92        // set SMTP
     93        document.getElementById("virtualIdentityExtension_smtpServerListHbox").addNoneServer(); // add non (not stored) Server
     94        document.getElementById("virtualIdentityExtension_smtpServerListHbox").smtp = rdfDataEditor.__identityData.smtp.keyNice;
     95
     96        // set extra values
    9797        rdfDataEditor.__identityData.extras.setValuesToEnvironment();
    98         this.hideUnusedEditorFields();
     98        this.hideUnusedEditorFields();
    9999        Log.debug("init done");
    100     },
    101    
    102     hideUnusedEditorFields : function() {
    103       var allHidden = true;
    104       var hide = (document.getElementById("vI_storageExtras_hideUnusedEditorFields").getAttribute("checked") == "true")
    105       rdfDataEditor.__identityData.extras.loopThroughExtras(
    106         function(extra) {
    107           var hidden = hide && !vI.vIprefs.get(extra.option);
    108           document.getElementById("vI_" + extra.option).setAttribute("hidden", hidden)
    109           document.getElementById("vI_" + extra.option + "_store").setAttribute("hidden", hidden)
    110           if (!hidden) allHidden = false
    111         } );
    112       document.getElementById("storeValue").setAttribute("hidden", allHidden)
    113       // resize the window to the content
    114       window.sizeToContent();
    115     },
     100      },
    116101
    117     identityExtras_adapt: function(sourceId, targetId) {
    118       var checked = document.getElementById(sourceId).getAttribute("checked");
    119       if (targetId) var target = document.getElementById(targetId)
    120       else var target = document.getElementById(sourceId.replace(/_store/,""))
    121       if (checked == "true") target.removeAttribute("disabled")
    122       else target.setAttribute("disabled", "true");
    123     },
    124  
    125     blurEvent : function(elementId) {
    126         var elem = document.getElementById(elementId);
    127         var localIdentityData = new vI.identityData(elem.value, null, null, null, null, null, null);
    128         elem.value = localIdentityData.combinedName;                   
    129     },
    130    
    131     accept : function() {
    132         Log.debug("accept");
     102      hideUnusedEditorFields: function () {
     103        var allHidden = true;
     104        var hide = (document.getElementById("vI_storageExtras_hideUnusedEditorFields").getAttribute("checked") == "true")
     105        rdfDataEditor.__identityData.extras.loopThroughExtras(
     106          function (extra) {
     107            var hidden = hide && !vI.vIprefs.get(extra.option);
     108            document.getElementById("vI_" + extra.option).setAttribute("hidden", hidden)
     109            document.getElementById("vI_" + extra.option + "_store").setAttribute("hidden", hidden)
     110            if (!hidden) allHidden = false
     111          });
     112        document.getElementById("storeValue").setAttribute("hidden", allHidden)
     113          // resize the window to the content
     114        window.sizeToContent();
     115      },
     116
     117      identityExtras_adapt: function (sourceId, targetId) {
     118        var checked = document.getElementById(sourceId).getAttribute("checked");
     119        if (targetId) var target = document.getElementById(targetId)
     120        else var target = document.getElementById(sourceId.replace(/_store/, ""))
     121        if (checked == "true") target.removeAttribute("disabled")
     122        else target.setAttribute("disabled", "true");
     123      },
     124
     125      blurEvent: function (elementId) {
     126        var elem = document.getElementById(elementId);
     127        var localIdentityData = new vI.identityData(elem.value, null, null, null, null, null, null);
     128        elem.value = localIdentityData.combinedName;
     129      },
     130
     131      accept: function () {
     132        Log.debug("accept");
    133133        var localIdentityData = new vI.identityData(document.getElementById("sender").value, null,
    134             document.getElementById("virtualIdentityExtension_IdentityList").selectedItem.getAttribute("value"),
    135             document.getElementById("virtualIdentityExtension_SmtpServerList").selectedItem.getAttribute("key"));
     134          document.getElementById("virtualIdentityExtension_IdentityList").selectedItem.getAttribute("value"),
     135          document.getElementById("virtualIdentityExtension_SmtpServerList").selectedItem.getAttribute("key"));
    136136        localIdentityData.extras.getValuesFromEnvironment();
    137137        rdfDataEditor.__rdfDatasource.updateRDF(
    138                 document.getElementById("recipient").value,
    139                 document.getElementById("type_menu").selectedItem.getAttribute("key"),
    140                 localIdentityData,
    141                 true, true, rdfDataEditor.__recipient, rdfDataEditor.__type, true);
    142         Log.debug("updateRDF done " + localIdentityData.extras.status());
    143         return document.getElementById("type_menu").selectedItem.getAttribute("key");
    144     }
    145 }
    146 vI.rdfDataEditor = rdfDataEditor;
    147 }});
     138          document.getElementById("recipient").value,
     139          document.getElementById("type_menu").selectedItem.getAttribute("key"),
     140          localIdentityData,
     141          true, true, rdfDataEditor.__recipient, rdfDataEditor.__type, true);
     142        Log.debug("updateRDF done " + localIdentityData.extras.status());
     143        return document.getElementById("type_menu").selectedItem.getAttribute("key");
     144      }
     145    }
     146    vI.rdfDataEditor = rdfDataEditor;
     147  }
     148});
  • content/vI_rdfDataTree.js

    r3c9c29 r509348  
    3030
    3131Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
    32 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) {
    33 
    34 let Log = vI.setupLogging("virtualIdentity.rdfDataTree");
    35 
    36 Components.utils.import("resource://v_identity/vI_identityData.js", virtualIdentityExtension);
    37 Components.utils.import("resource://v_identity/vI_rdfDatasource.js", virtualIdentityExtension);
    38 Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension);
    39 
    40 //prepares an object for easy comparison against another. for strings, lowercases them
    41 var prepareForComparison = function(element, field) {
    42     if (field == "changedCol") {
     32virtualIdentityExtension.ns(function () {
     33  with(virtualIdentityExtension.LIB) {
     34
     35    let Log = vI.setupLogging("virtualIdentity.rdfDataTree");
     36
     37    Components.utils.import("resource://v_identity/vI_identityData.js", virtualIdentityExtension);
     38    Components.utils.import("resource://v_identity/vI_rdfDatasource.js", virtualIdentityExtension);
     39    Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension);
     40
     41    //prepares an object for easy comparison against another. for strings, lowercases them
     42    var prepareForComparison = function (element, field) {
     43      if (field == "changedCol") {
    4344        field = "changed"
    44     }
    45     if (field == "usedCol") {
     45      }
     46      if (field == "usedCol") {
    4647        field = "used"
    47     }
    48     var o = element[field];
    49     if (typeof o == "string") { return o.toLowerCase().replace(/\"/g,""); }
    50     return "";
    51 };
    52 
    53 
    54 var rdfDataTree = function(treeType, rdfDatasource) {
    55     this.treeType = treeType;
    56     this._rdfDatasource = rdfDatasource;
    57     this.filterText = "";
    58     this.loadTable();
    59 };
    60 
    61 rdfDataTree.prototype = {
    62     idTable : null,
    63     idData : null,
    64     filterText : null,
    65     treeType : null,
    66     _rdfDatasource : null,
    67 
    68     get treeElem() { return document.getElementById("rdfDataTree_" + this.treeType); },
    69     get tabElem() { return document.getElementById(this.treeType + "Tab"); },
    70    
    71     //this function is called every time the tree is sorted, filtered, or reloaded
    72     loadTable : function() {
    73 //         Log.debug("loadTable.");
    74         //remember scroll position. this is useful if this is an editable table
    75         //to prevent the user from losing the row they edited
    76         var topVisibleRow = null;
    77         if (this.idTable)
     48      }
     49      var o = element[field];
     50      if (typeof o == "string") {
     51        return o.toLowerCase().replace(/\"/g, "");
     52      }
     53      return "";
     54    };
     55
     56
     57    var rdfDataTree = function (treeType, rdfDatasource) {
     58      this.treeType = treeType;
     59      this._rdfDatasource = rdfDatasource;
     60      this.filterText = "";
     61      this.loadTable();
     62    };
     63
     64    rdfDataTree.prototype = {
     65      idTable: null,
     66      idData: null,
     67      filterText: null,
     68      treeType: null,
     69      _rdfDatasource: null,
     70
     71      get treeElem() {
     72        return document.getElementById("rdfDataTree_" + this.treeType);
     73      },
     74      get tabElem() {
     75        return document.getElementById(this.treeType + "Tab");
     76      },
     77
     78      //this function is called every time the tree is sorted, filtered, or reloaded
     79      loadTable: function () {
     80        //         Log.debug("loadTable.");
     81        //remember scroll position. this is useful if this is an editable table
     82        //to prevent the user from losing the row they edited
     83        var topVisibleRow = null;
     84        if (this.idTable)
    7885          topVisibleRow = this.treeElem.treeBoxObject.getFirstVisibleRow();
    79         if (this.idData == null) {
    80             this.idData = [];
    81             this._rdfDatasource.readAllEntriesFromRDF(this.addNewDatum, this.treeType, this.idData);
    82         }
    83         if (this.filterText == "") {
    84             //show all of them
    85             this.idTable = this.idData;
    86         } else {
    87             //filter out the ones we want to display
    88             var curTable = [];
    89             var curFilterText = this.filterText;
    90             this.idData.forEach(function(element) {
    91                 //we'll match on every property
    92                 for (var i in element) {
    93                     if (prepareForComparison(element, i).indexOf(curFilterText) != -1) {
    94                         curTable.push(element);
    95                         break;
    96                     }
    97                 }
    98             });
    99             this.idTable = curTable;
    100         }   
    101        
    102         this.sort();
    103        
    104         //restore scroll position
    105         if (topVisibleRow && topVisibleRow <= this.idTable.length) {
    106             this.treeElem.treeBoxObject.scrollToRow(topVisibleRow);
    107         }
    108 
    109         // set Tab label
    110         this.tabElem.setAttribute("label", this.treeType + " (" + this.idTable.length + ")");
    111 //         Log.debug("loadTable done.");
    112     },
    113 
    114     addNewDatum : function(resource, name, localIdentityData, idData, used, changed) {
    115         var usedDate = "", changedDate = "";
     86        if (this.idData == null) {
     87          this.idData = [];
     88          this._rdfDatasource.readAllEntriesFromRDF(this.addNewDatum, this.treeType, this.idData);
     89        }
     90        if (this.filterText == "") {
     91          //show all of them
     92          this.idTable = this.idData;
     93        } else {
     94          //filter out the ones we want to display
     95          var curTable = [];
     96          var curFilterText = this.filterText;
     97          this.idData.forEach(function (element) {
     98            //we'll match on every property
     99            for (var i in element) {
     100              if (prepareForComparison(element, i).indexOf(curFilterText) != -1) {
     101                curTable.push(element);
     102                break;
     103              }
     104            }
     105          });
     106          this.idTable = curTable;
     107        }
     108
     109        this.sort();
     110
     111        //restore scroll position
     112        if (topVisibleRow && topVisibleRow <= this.idTable.length) {
     113          this.treeElem.treeBoxObject.scrollToRow(topVisibleRow);
     114        }
     115
     116        // set Tab label
     117        this.tabElem.setAttribute("label", this.treeType + " (" + this.idTable.length + ")");
     118        //         Log.debug("loadTable done.");
     119      },
     120
     121      addNewDatum: function (resource, name, localIdentityData, idData, used, changed) {
     122        var usedDate = "",
     123          changedDate = "";
    116124        var format = vI.prefroot.getCharPref("extensions.virtualIdentity.storage_timeFormat")
    117125        if (format != "") {
    118             if (used) usedDate = new Date(parseFloat(used)).toLocaleFormat(format);
    119             if (changed) changedDate = new Date(parseFloat(changed)).toLocaleFormat(format);
     126          if (used) usedDate = new Date(parseFloat(used)).toLocaleFormat(format);
     127          if (changed) changedDate = new Date(parseFloat(changed)).toLocaleFormat(format);
    120128        } else {
    121             if (used) usedDate = new Date(parseFloat(used)).toLocaleString();
    122             if (changed) changedDate = new Date(parseFloat(changed)).toLocaleString();
    123         }
    124         var pref = {    recipientCol : name,
    125                 indexCol : idData.length + 1 + ".",
    126                 senderCol : localIdentityData.combinedName,
    127                 smtpCol : localIdentityData.smtp.value,
    128 //              smtpKey : localIdentityData.smtp.key,
    129                 idCol : localIdentityData.id.value,
    130                 usedCol : usedDate,
    131                 used : used,
    132                 changedCol : changedDate,
    133                 changed : changed,
    134 //              idKey : localIdentityData.id.key,
    135                 resource : resource,
    136                 identityData : localIdentityData}
    137 //      Log.debug("addNewDatum.");
    138         localIdentityData.extras.addPrefs(pref);
    139         idData.push(pref);
    140     },
    141     sort : function(columnName) {
    142 //      Log.debug("sort: " + columnName);
    143         var order = this.treeElem.getAttribute("sortDirection") == "ascending" ? 1 : -1;
    144         // if the column is passed and it's already sorted by that column, reverse sort
    145         if (columnName && (this.treeElem.getAttribute("sortResource") == columnName)) {
    146                 order *= -1;
    147         }
    148        
    149         function columnSort(a, b) {
     129          if (used) usedDate = new Date(parseFloat(used)).toLocaleString();
     130          if (changed) changedDate = new Date(parseFloat(changed)).toLocaleString();
     131        }
     132        var pref = {
     133            recipientCol: name,
     134            indexCol: idData.length + 1 + ".",
     135            senderCol: localIdentityData.combinedName,
     136            smtpCol: localIdentityData.smtp.value,
     137            //              smtpKey : localIdentityData.smtp.key,
     138            idCol: localIdentityData.id.value,
     139            usedCol: usedDate,
     140            used: used,
     141            changedCol: changedDate,
     142            changed: changed,
     143            //              idKey : localIdentityData.id.key,
     144            resource: resource,
     145            identityData: localIdentityData
     146          }
     147          //        Log.debug("addNewDatum.");
     148        localIdentityData.extras.addPrefs(pref);
     149        idData.push(pref);
     150      },
     151      sort: function (columnName) {
     152        //      Log.debug("sort: " + columnName);
     153        var order = this.treeElem.getAttribute("sortDirection") == "ascending" ? 1 : -1;
     154        // if the column is passed and it's already sorted by that column, reverse sort
     155        if (columnName && (this.treeElem.getAttribute("sortResource") == columnName)) {
     156          order *= -1;
     157        }
     158
     159        function columnSort(a, b) {
    150160          try {
    151             if (prepareForComparison(a, columnName) >
    152                 prepareForComparison(b, columnName)) return 1 * order;
    153             if (prepareForComparison(a, columnName) <
    154                 prepareForComparison(b, columnName)) return -1 * order;
    155           } catch(e) {};
    156             return 0;
    157         }
    158        
    159         if (!columnName)
     161            if (prepareForComparison(a, columnName) >
     162              prepareForComparison(b, columnName)) return 1 * order;
     163            if (prepareForComparison(a, columnName) <
     164              prepareForComparison(b, columnName)) return -1 * order;
     165          } catch (e) {};
     166          return 0;
     167        }
     168
     169        if (!columnName)
    160170          columnName = this.treeElem.getAttribute("sortResource")
    161        
     171
    162172        this.idTable.sort(columnSort);
    163        
    164         //setting these will make the sort option persist
    165         this.treeElem.setAttribute("sortDirection", order == 1 ? "ascending" : "descending");
    166         this.treeElem.setAttribute("sortResource", columnName);
    167        
    168         this.treeElem.view = new rdfDataTreeCollection.treeView(this.idTable);
    169        
    170         //set the appropriate attributes to show to indicator
    171         var cols = this.treeElem.getElementsByTagName("treecol");
    172         for (var i = 0; i < cols.length; i++) {
    173             cols[i].removeAttribute("sortDirection");
    174             if (cols[i].id.match(columnName))
    175                 cols[i].setAttribute("sortDirection", order == 1 ? "ascending" : "descending");
    176         }
    177     }
    178 };
    179 
    180 var rdfDataTreeCollection = {
    181     promptService : Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
    182             .getService(Components.interfaces.nsIPromptService),
    183 
    184     treeTypes : Array("email", "maillist", "newsgroup", "filter"),
    185 
    186     trees : {},
    187     tabbox : null,
    188    
    189     _strings : null,
    190     _rdfDatasource : null,
    191    
    192     onTabSelect : function () {
    193         rdfDataTreeCollection.hideInfoBox();
    194         if (rdfDataTreeCollection.tabbox) {
    195             rdfDataTreeCollection.moveConstraints();
    196             rdfDataTreeCollection.updateButtonMenu();
    197         }
    198     },
    199    
    200     onselect : function () {
    201         rdfDataTreeCollection.moveConstraints();
    202         rdfDataTreeCollection.updateButtonMenu();
    203 
    204         var tree = rdfDataTreeCollection.trees[rdfDataTreeCollection.tabbox.selectedPanel.id];
    205         var htmlBox = document.getElementById("rdfDataTreeCollectionInfoBox")
    206         if (tree.treeElem.view.selection.count != 1)
    207             { rdfDataTreeCollection.hideInfoBox(); return; }
    208        
    209         var identityData = tree.idTable[tree.treeElem.currentIndex]["identityData"];
    210         var _identityInfo =
    211             "<div id='recipientLabel'>" +
    212                 tree.idTable[tree.treeElem.currentIndex]["recipientCol"].replace(/>/g,"&gt;").replace(/</g,"&lt;") +
    213             "</div><div id='vICard'>" +
    214             "<table><tr>" +
    215                 "<td class='image'><img src='chrome://v_identity/skin/vi-info.png' /></td>" +
    216                 "<td class='identityTable'>" +
    217                     "<div class='name'>" + identityData.combinedNameHtml + "</div>" +   
    218                     "<table><tbody>" + identityData.getMatrix() + "</tbody></table>" +
    219                 "</td>" +
    220             "</tr></table></div>"
    221 
    222         htmlBox.outputString = _identityInfo;
    223         rdfDataTreeCollection.infoBoxHidden = false;
    224         htmlBox.setAttribute("style", "height:" + htmlBox.contentDocument.lastChild.scrollHeight +"px");
    225         rdfDataTreeCollection.overflow(); // better resize one time too much, mozilla is still magic  :)
    226     },
    227 
    228     init : function() {
    229         rdfDataTreeCollection.tabbox = document.getElementById("TreeTabbox");
    230         rdfDataTreeCollection._strings = Components.classes["@mozilla.org/intl/stringbundle;1"]
     173
     174        //setting these will make the sort option persist
     175        this.treeElem.setAttribute("sortDirection", order == 1 ? "ascending" : "descending");
     176        this.treeElem.setAttribute("sortResource", columnName);
     177
     178        this.treeElem.view = new rdfDataTreeCollection.treeView(this.idTable);
     179
     180        //set the appropriate attributes to show to indicator
     181        var cols = this.treeElem.getElementsByTagName("treecol");
     182        for (var i = 0; i < cols.length; i++) {
     183          cols[i].removeAttribute("sortDirection");
     184          if (cols[i].id.match(columnName))
     185            cols[i].setAttribute("sortDirection", order == 1 ? "ascending" : "descending");
     186        }
     187      }
     188    };
     189
     190    var rdfDataTreeCollection = {
     191      promptService: Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
     192        .getService(Components.interfaces.nsIPromptService),
     193
     194      treeTypes: Array("email", "maillist", "newsgroup", "filter"),
     195
     196      trees: {},
     197      tabbox: null,
     198
     199      _strings: null,
     200      _rdfDatasource: null,
     201
     202      onTabSelect: function () {
     203        rdfDataTreeCollection.hideInfoBox();
     204        if (rdfDataTreeCollection.tabbox) {
     205          rdfDataTreeCollection.moveConstraints();
     206          rdfDataTreeCollection.updateButtonMenu();
     207        }
     208      },
     209
     210      onselect: function () {
     211        rdfDataTreeCollection.moveConstraints();
     212        rdfDataTreeCollection.updateButtonMenu();
     213
     214        var tree = rdfDataTreeCollection.trees[rdfDataTreeCollection.tabbox.selectedPanel.id];
     215        var htmlBox = document.getElementById("rdfDataTreeCollectionInfoBox")
     216        if (tree.treeElem.view.selection.count != 1) {
     217          rdfDataTreeCollection.hideInfoBox();
     218          return;
     219        }
     220
     221        var identityData = tree.idTable[tree.treeElem.currentIndex]["identityData"];
     222        var _identityInfo =
     223          "<div id='recipientLabel'>" +
     224          tree.idTable[tree.treeElem.currentIndex]["recipientCol"].replace(/>/g, "&gt;").replace(/</g, "&lt;") +
     225          "</div><div id='vICard'>" +
     226          "<table><tr>" +
     227          "<td class='image'><img src='chrome://v_identity/skin/vi-info.png' /></td>" +
     228          "<td class='identityTable'>" +
     229          "<div class='name'>" + identityData.combinedNameHtml + "</div>" +
     230          "<table><tbody>" + identityData.getMatrix() + "</tbody></table>" +
     231          "</td>" +
     232          "</tr></table></div>"
     233
     234        htmlBox.outputString = _identityInfo;
     235        rdfDataTreeCollection.infoBoxHidden = false;
     236        htmlBox.setAttribute("style", "height:" + htmlBox.contentDocument.lastChild.scrollHeight + "px");
     237        rdfDataTreeCollection.overflow(); // better resize one time too much, mozilla is still magic  :)
     238      },
     239
     240      init: function () {
     241        rdfDataTreeCollection.tabbox = document.getElementById("TreeTabbox");
     242        rdfDataTreeCollection._strings = Components.classes["@mozilla.org/intl/stringbundle;1"]
    231243          .getService(Components.interfaces.nsIStringBundleService)
    232244          .createBundle("chrome://v_identity/locale/vI_rdfDataEditor.properties");
    233245
    234         rdfDataTreeCollection._rdfDatasource = new vI.rdfDatasource("virtualIdentity.rdf");
    235        
    236         for each (var treeType in rdfDataTreeCollection.treeTypes)
    237             rdfDataTreeCollection.trees[treeType] = new rdfDataTree(treeType, rdfDataTreeCollection._rdfDatasource);
    238     },
    239    
    240     clean : function() {
     246        rdfDataTreeCollection._rdfDatasource = new vI.rdfDatasource("virtualIdentity.rdf");
     247
     248        for each(var treeType in rdfDataTreeCollection.treeTypes)
     249        rdfDataTreeCollection.trees[treeType] = new rdfDataTree(treeType, rdfDataTreeCollection._rdfDatasource);
     250      },
     251
     252      clean: function () {
    241253        if (rdfDataTreeCollection._rdfDatasource) rdfDataTreeCollection._rdfDatasource.clean();
    242     },
    243 
    244     get _braille() {
    245         var braille = false;
    246         try {   braille = (vI.prefroot.getCharPref("accessibility.usebrailledisplay") ||
    247                 vI.prefroot.getCharPref("accessibility.usetexttospeech")); }
    248         catch (e) { };
    249         return braille;
    250     },
    251 
    252     // generic custom tree view stuff
    253     treeView : function (table) {
    254         this.rowCount = table.length;
    255         this.getCellText = function(row, col) {
    256             var retValue = table[row][col.id.substr(0,col.id.indexOf("_"))];
    257             if (!rdfDataTreeCollection._braille && (retValue == "no" || retValue == "yes"))
    258                 return ""; // image will be used as indicator
    259             else return retValue;
    260         };
    261         this.getCellValue = function(row, col) {
    262             return this.getCellText(row, col);
    263         };
    264         this.setTree = function(treebox) {
    265             this.treebox = treebox;
    266         };
    267         this.isEditable = function(row, col) {
    268             return col.editable;
    269         };
    270         this.isContainer = function(row){ return false; };
    271         this.isSeparator = function(row){ return false; };
    272         this.isSorted = function(){ return false; };
    273         this.getLevel = function(row){ return 0; };
    274         this.getImageSrc = function(row,col){ return null; };
    275         this.getRowProperties = function(row,props){};
    276         this.getCellProperties = function(row,col,props){};
    277         this.getColumnProperties = function(colid,col,props){};
    278         this.cycleHeader = function(col, elem) {
    279             var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
    280             if (treeType != "filter")
    281                 rdfDataTreeCollection.trees[treeType].sort(col.id.substr(0,col.id.indexOf("_")));
    282         };
    283         this.getCellProperties = function(row,col,props){
    284             var returnValue = null;
    285             if (!rdfDataTreeCollection._braille) {
    286                 var aserv=Components.classes["@mozilla.org/atom-service;1"].
    287                     getService(Components.interfaces.nsIAtomService);
    288                 if (typeof props == 'undefined') {
    289                     // Requires Gecko 22
    290                     switch (table[row][col.id.substr(0,col.id.indexOf("_"))]) {
    291                         case "yes": returnValue = aserv.getAtom("yes"); break;
    292                         case "no":  returnValue = aserv.getAtom("no"); break;
    293                     }
    294                 } else {
    295                     // Obsolete since Gecko 22
    296                     switch (table[row][col.id.substr(0,col.id.indexOf("_"))]) {
    297                         case "yes": props.AppendElement(aserv.getAtom("yes")); break;
    298                         case "no":  props.AppendElement(aserv.getAtom("no")); break;
    299                     }
    300                 }
     254      },
     255
     256      get _braille() {
     257        var braille = false;
     258        try {
     259          braille = (vI.prefroot.getCharPref("accessibility.usebrailledisplay") ||
     260            vI.prefroot.getCharPref("accessibility.usetexttospeech"));
     261        } catch (e) {};
     262        return braille;
     263      },
     264
     265      // generic custom tree view stuff
     266      treeView: function (table) {
     267        this.rowCount = table.length;
     268        this.getCellText = function (row, col) {
     269          var retValue = table[row][col.id.substr(0, col.id.indexOf("_"))];
     270          if (!rdfDataTreeCollection._braille && (retValue == "no" || retValue == "yes"))
     271            return ""; // image will be used as indicator
     272          else return retValue;
     273        };
     274        this.getCellValue = function (row, col) {
     275          return this.getCellText(row, col);
     276        };
     277        this.setTree = function (treebox) {
     278          this.treebox = treebox;
     279        };
     280        this.isEditable = function (row, col) {
     281          return col.editable;
     282        };
     283        this.isContainer = function (row) {
     284          return false;
     285        };
     286        this.isSeparator = function (row) {
     287          return false;
     288        };
     289        this.isSorted = function () {
     290          return false;
     291        };
     292        this.getLevel = function (row) {
     293          return 0;
     294        };
     295        this.getImageSrc = function (row, col) {
     296          return null;
     297        };
     298        this.getRowProperties = function (row, props) {};
     299        this.getCellProperties = function (row, col, props) {};
     300        this.getColumnProperties = function (colid, col, props) {};
     301        this.cycleHeader = function (col, elem) {
     302          var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
     303          if (treeType != "filter")
     304            rdfDataTreeCollection.trees[treeType].sort(col.id.substr(0, col.id.indexOf("_")));
     305        };
     306        this.getCellProperties = function (row, col, props) {
     307          var returnValue = null;
     308          if (!rdfDataTreeCollection._braille) {
     309            var aserv = Components.classes["@mozilla.org/atom-service;1"].
     310            getService(Components.interfaces.nsIAtomService);
     311            if (typeof props == 'undefined') {
     312              // Requires Gecko 22
     313              switch (table[row][col.id.substr(0, col.id.indexOf("_"))]) {
     314              case "yes":
     315                returnValue = aserv.getAtom("yes");
     316                break;
     317              case "no":
     318                returnValue = aserv.getAtom("no");
     319                break;
     320              }
     321            } else {
     322              // Obsolete since Gecko 22
     323              switch (table[row][col.id.substr(0, col.id.indexOf("_"))]) {
     324              case "yes":
     325                props.AppendElement(aserv.getAtom("yes"));
     326                break;
     327              case "no":
     328                props.AppendElement(aserv.getAtom("no"));
     329                break;
     330              }
    301331            }
    302             return returnValue;
    303         };
    304     },
    305 
    306    
    307     __setFilter : function (text) {
    308         // loop trough all trees
    309         for each (var treeType in rdfDataTreeCollection.treeTypes) {
    310             var tree = rdfDataTreeCollection.trees[treeType];
    311             tree.filterText = text;
    312             tree.loadTable();
    313         }
    314     },
    315 
    316     inputFilter : function(event) {
     332          }
     333          return returnValue;
     334        };
     335      },
     336
     337
     338      __setFilter: function (text) {
     339        // loop trough all trees
     340        for each(var treeType in rdfDataTreeCollection.treeTypes) {
     341          var tree = rdfDataTreeCollection.trees[treeType];
     342          tree.filterText = text;
     343          tree.loadTable();
     344        }
     345      },
     346
     347      inputFilter: function (event) {
    317348        var value = "";
    318349        if (typeof event.target.value == "string") {
    319             value = event.target.value.toLowerCase().replace(/\"/g,"");
    320         }
    321         rdfDataTreeCollection.__setFilter(value);
    322         document.getElementById("clearFilter").disabled = value.length == 0;
    323     },
    324    
    325     clearFilter : function() {
    326         document.getElementById("clearFilter").disabled = true;
    327         var filterElement = document.getElementById("filter");
    328         filterElement.focus();
    329         filterElement.value = "";
    330         rdfDataTreeCollection.__setFilter("");
    331     },
    332    
    333     __updateMenu : function(modifySelected, removeSelected) {
    334         var tree = rdfDataTreeCollection.trees[rdfDataTreeCollection.tabbox.selectedPanel.id];
    335         var noSelections = (tree.treeElem.view.selection.count == 0)
    336         modifySelected.setAttribute("disabled", noSelections)
    337         removeSelected.setAttribute("disabled", noSelections)   
    338     },
    339    
    340     updateButtonMenu : function() {
    341         rdfDataTreeCollection.__updateMenu(
    342             document.getElementById("editButton_" + rdfDataTreeCollection.tabbox.selectedPanel.id),
    343             document.getElementById("deleteButton_" + rdfDataTreeCollection.tabbox.selectedPanel.id))
    344     },
    345    
    346     updateContextMenu : function() {
    347         rdfDataTreeCollection.__updateMenu(
    348             document.getElementById("context_modifySelected"),
    349             document.getElementById("context_removeSelected"))
    350     },
    351    
    352     updateMenu : function() {
    353         rdfDataTreeCollection.__updateMenu(
    354             document.getElementById("menu_modifySelected"),
    355             document.getElementById("menu_removeSelected"))
    356     },
    357 
    358     modifySelected : function() {
    359         var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
    360         var tree = rdfDataTreeCollection.trees[treeType];
    361         if (tree.treeElem.view.selection.count == 0) return;
    362         if (tree.treeElem.view.selection.count > 5) {
    363             var warning = rdfDataTreeCollection._strings.GetStringFromName("vI_rdfDataTree.modify.Warning1") + " " +
    364                 tree.treeElem.view.selection.count + " " +
    365                 rdfDataTreeCollection._strings.GetStringFromName("vI_rdfDataTree.modify.Warning2")
    366             if (!rdfDataTreeCollection.promptService.confirm(window,"Warning",warning)) return;
    367         }
    368        
    369         var start = new Object(); var end = new Object();
    370         var numRanges = tree.treeElem.view.selection.getRangeCount();
    371 
    372         var retVar = { treeType: null };
    373         for (var t=0; t<numRanges; t++){
    374             tree.treeElem.view.selection.getRangeAt(t,start,end);
    375             for (var v=start.value; v<=end.value; v++)
    376                 window.openDialog("chrome://v_identity/content/vI_rdfDataEditor.xul",0,
    377                     "chrome, dialog, modal, alwaysRaised, resizable=yes",
    378                     tree.idTable[v], treeType,
    379                     rdfDataTreeCollection._rdfDatasource, retVar).focus();
    380         }
    381        
    382         // reload all trees (multiple types might have changed)
    383         for each (var treeType in rdfDataTreeCollection.treeTypes) {
    384             rdfDataTreeCollection.trees[treeType].idData = null;
    385             rdfDataTreeCollection.trees[treeType].loadTable()
    386         }
    387         rdfDataTreeCollection.tabbox.selectedTab = document.getElementById(retVar.treeType + "Tab");
    388         rdfDataTreeCollection.hideInfoBox();
    389     },
    390    
    391     removeSelected : function() {
    392         var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
    393         var tree = rdfDataTreeCollection.trees[treeType];
    394         if (tree.treeElem.view.selection.count == 0) return;
    395         var warning = rdfDataTreeCollection._strings.GetStringFromName("vI_rdfDataTree.remove.Warning1") + " " +
    396             tree.treeElem.view.selection.count + " " +
    397             rdfDataTreeCollection._strings.GetStringFromName("vI_rdfDataTree.remove.Warning2")
    398        
    399         if (!rdfDataTreeCollection.promptService.confirm(window,"Warning",warning)) return;
    400        
    401         var start = new Object(); var end = new Object();
    402         var numRanges = tree.treeElem.view.selection.getRangeCount();
    403 
    404         for (var t=0; t<numRanges; t++){
    405             tree.treeElem.view.selection.getRangeAt(t,start,end);
    406             for (var v=start.value; v<=end.value; v++){
    407                 rdfDataTreeCollection._rdfDatasource.removeVIdentityFromRDF(tree.idTable[v]["resource"], treeType)
    408             }
    409         }
    410        
    411         tree.idData = null; tree.idTable = null;
    412         tree.loadTable();
    413         rdfDataTreeCollection.hideInfoBox();
    414     },
    415    
    416     moveConstraints : function() {
    417         var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
    418         if (treeType != "filter") return;
    419         var tree = rdfDataTreeCollection.trees[treeType];
    420         if (tree.treeElem.view.selection.count == 0) {
    421             document.getElementById("reorderUpButton_filter").setAttribute("disabled","true");
    422             document.getElementById("reorderDownButton_filter").setAttribute("disabled","true");
    423             return;
    424         };
    425         var start = new Object(); var end = new Object();
    426         var numRanges = tree.treeElem.view.selection.getRangeCount();
    427         if (numRanges > 1) {
    428             document.getElementById("reorderUpButton_filter").setAttribute("disabled","true");
    429             document.getElementById("reorderDownButton_filter").setAttribute("disabled","true");
    430             return;
    431         }
    432         tree.treeElem.view.selection.getRangeAt(0,start,end);
    433         if (start.value > 0)
    434             document.getElementById("reorderUpButton_filter").removeAttribute("disabled");
    435         else    document.getElementById("reorderUpButton_filter").setAttribute("disabled","true");
    436         if (end.value < tree.idTable.length - 1)
    437             document.getElementById("reorderDownButton_filter").removeAttribute("disabled");
    438         else    document.getElementById("reorderDownButton_filter").setAttribute("disabled","true");
    439     },
    440 
    441     moveUpSelected : function() {
    442         var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
    443         if (treeType != "filter") return; // just to be safe, button should be disabled
    444         var tree = rdfDataTreeCollection.trees[treeType];
    445         if (tree.treeElem.view.selection.count == 0) return; // just to be safe, button should be disabled
    446 
    447         var start = new Object(); var end = new Object();
    448         var numRanges = tree.treeElem.view.selection.getRangeCount();
    449         if (numRanges > 1) return;  // just to be safe, button should be disabled
    450        
    451         tree.treeElem.view.selection.getRangeAt(0,start,end);
    452         for (var v=start.value; v<=end.value; v++){
    453             var resource = rdfDataTreeCollection._rdfDatasource.filterContainer.RemoveElementAt(v+1, true);
    454             rdfDataTreeCollection._rdfDatasource.filterContainer.InsertElementAt(resource,v,true);
    455         }
    456         tree.idData = null; tree.idTable = null;
    457         tree.loadTable();
    458         tree.treeElem.view.selection.rangedSelect(start.value-1,end.value-1,false);
    459     },
    460 
    461     moveDownSelected : function() {
    462         var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
    463         if (treeType != "filter") return; // just to be safe, button should be disabled
    464         var tree = rdfDataTreeCollection.trees[treeType];
    465         if (tree.treeElem.view.selection.count == 0) return; // just to be safe, button should be disabled
    466 
    467         var start = new Object(); var end = new Object();
    468         var numRanges = tree.treeElem.view.selection.getRangeCount();
    469         if (numRanges > 1) return;  // just to be safe, button should be disabled
    470        
    471         tree.treeElem.view.selection.getRangeAt(0,start,end);
    472         for (var v=end.value; v>=start.value; v--){
    473             var resource = rdfDataTreeCollection._rdfDatasource.filterContainer.RemoveElementAt(v+1, true);
    474             rdfDataTreeCollection._rdfDatasource.filterContainer.InsertElementAt(resource,v+2,true);
    475         }
    476         tree.idData = null; tree.idTable = null;
    477         tree.loadTable();
    478         tree.treeElem.view.selection.rangedSelect(start.value+1,end.value+1,false);
    479     },
    480 
    481     infoBoxHidden : true,
    482     overflow : function() {
    483         if (rdfDataTreeCollection.infoBoxHidden) return;
    484         var htmlBox = document.getElementById("rdfDataTreeCollectionInfoBox")
    485         htmlBox.setAttribute("style", "height:" + htmlBox.contentDocument.lastChild.scrollHeight +"px");
    486     },
    487 
    488     hideInfoBox : function() {
    489         rdfDataTreeCollection.infoBoxHidden = true;
    490         document.getElementById("rdfDataTreeCollectionInfoBox").setAttribute("style", "height:0px");
    491         for each (var treeType in rdfDataTreeCollection.treeTypes) {
    492             try { if (rdfDataTreeCollection.trees[treeType])
    493                 rdfDataTreeCollection.trees[treeType].treeElem.view.selection.selectNone() } catch (e) { }
    494         }
    495     },
    496 
    497     selectAll : function() {
    498         var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
    499         var tree = rdfDataTreeCollection.trees[treeType];
    500         tree.treeElem.view.selection.selectAll();
    501     },
    502    
    503     newItem : function() {
    504         var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
    505         var newItemPreset = { identityData : new vI.identityData ("", null, null, vI.NO_SMTP_TAG, null, null) };
    506         var retVar = { treeType: null };
    507 
    508         window.openDialog("chrome://v_identity/content/vI_rdfDataEditor.xul",0,
    509             "chrome, dialog, modal, alwaysRaised, resizable=yes",
    510             newItemPreset, treeType,
    511             rdfDataTreeCollection._rdfDatasource, retVar).focus();
    512 
    513         // reload all trees (multiple types might have changed)
    514         for each (var treeType in rdfDataTreeCollection.treeTypes) {
    515             rdfDataTreeCollection.trees[treeType].idData = null;
    516             rdfDataTreeCollection.trees[treeType].idTable = null;
    517             rdfDataTreeCollection.trees[treeType].loadTable()
    518         }
    519         rdfDataTreeCollection.tabbox.selectedTab = document.getElementById(retVar.treeType + "Tab");
    520         rdfDataTreeCollection.hideInfoBox();
    521     }
    522 };
    523 
    524 vI.rdfDataTreeCollection = rdfDataTreeCollection;
    525 vI.rdfDataTree = rdfDataTree;
    526 }});
     350          value = event.target.value.toLowerCase().replace(/\"/g, "");
     351        }
     352        rdfDataTreeCollection.__setFilter(value);
     353        document.getElementById("clearFilter").disabled = value.length == 0;
     354      },
     355
     356      clearFilter: function () {
     357        document.getElementById("clearFilter").disabled = true;
     358        var filterElement = document.getElementById("filter");
     359        filterElement.focus();
     360        filterElement.value = "";
     361        rdfDataTreeCollection.__setFilter("");
     362      },
     363
     364      __updateMenu: function (modifySelected, removeSelected) {
     365        var tree = rdfDataTreeCollection.trees[rdfDataTreeCollection.tabbox.selectedPanel.id];
     366        var noSelections = (tree.treeElem.view.selection.count == 0)
     367        modifySelected.setAttribute("disabled", noSelections)
     368        removeSelected.setAttribute("disabled", noSelections)
     369      },
     370
     371      updateButtonMenu: function () {
     372        rdfDataTreeCollection.__updateMenu(
     373          document.getElementById("editButton_" + rdfDataTreeCollection.tabbox.selectedPanel.id),
     374          document.getElementById("deleteButton_" + rdfDataTreeCollection.tabbox.selectedPanel.id))
     375      },
     376
     377      updateContextMenu: function () {
     378        rdfDataTreeCollection.__updateMenu(
     379          document.getElementById("context_modifySelected"),
     380          document.getElementById("context_removeSelected"))
     381      },
     382
     383      updateMenu: function () {
     384        rdfDataTreeCollection.__updateMenu(
     385          document.getElementById("menu_modifySelected"),
     386          document.getElementById("menu_removeSelected"))
     387      },
     388
     389      modifySelected: function () {
     390        var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
     391        var tree = rdfDataTreeCollection.trees[treeType];
     392        if (tree.treeElem.view.selection.count == 0) return;
     393        if (tree.treeElem.view.selection.count > 5) {
     394          var warning = rdfDataTreeCollection._strings.GetStringFromName("vI_rdfDataTree.modify.Warning1") + " " +
     395            tree.treeElem.view.selection.count + " " +
     396            rdfDataTreeCollection._strings.GetStringFromName("vI_rdfDataTree.modify.Warning2")
     397          if (!rdfDataTreeCollection.promptService.confirm(window, "Warning", warning)) return;
     398        }
     399
     400        var start = new Object();
     401        var end = new Object();
     402        var numRanges = tree.treeElem.view.selection.getRangeCount();
     403
     404        var retVar = {
     405          treeType: null
     406        };
     407        for (var t = 0; t < numRanges; t++) {
     408          tree.treeElem.view.selection.getRangeAt(t, start, end);
     409          for (var v = start.value; v <= end.value; v++)
     410            window.openDialog("chrome://v_identity/content/vI_rdfDataEditor.xul", 0,
     411              "chrome, dialog, modal, alwaysRaised, resizable=yes",
     412              tree.idTable[v], treeType,
     413              rdfDataTreeCollection._rdfDatasource, retVar).focus();
     414        }
     415
     416        // reload all trees (multiple types might have changed)
     417        for each(var treeType in rdfDataTreeCollection.treeTypes) {
     418          rdfDataTreeCollection.trees[treeType].idData = null;
     419          rdfDataTreeCollection.trees[treeType].loadTable()
     420        }
     421        rdfDataTreeCollection.tabbox.selectedTab = document.getElementById(retVar.treeType + "Tab");
     422        rdfDataTreeCollection.hideInfoBox();
     423      },
     424
     425      removeSelected: function () {
     426        var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
     427        var tree = rdfDataTreeCollection.trees[treeType];
     428        if (tree.treeElem.view.selection.count == 0) return;
     429        var warning = rdfDataTreeCollection._strings.GetStringFromName("vI_rdfDataTree.remove.Warning1") + " " +
     430          tree.treeElem.view.selection.count + " " +
     431          rdfDataTreeCollection._strings.GetStringFromName("vI_rdfDataTree.remove.Warning2")
     432
     433        if (!rdfDataTreeCollection.promptService.confirm(window, "Warning", warning)) return;
     434
     435        var start = new Object();
     436        var end = new Object();
     437        var numRanges = tree.treeElem.view.selection.getRangeCount();
     438
     439        for (var t = 0; t < numRanges; t++) {
     440          tree.treeElem.view.selection.getRangeAt(t, start, end);
     441          for (var v = start.value; v <= end.value; v++) {
     442            rdfDataTreeCollection._rdfDatasource.removeVIdentityFromRDF(tree.idTable[v]["resource"], treeType)
     443          }
     444        }
     445
     446        tree.idData = null;
     447        tree.idTable = null;
     448        tree.loadTable();
     449        rdfDataTreeCollection.hideInfoBox();
     450      },
     451
     452      moveConstraints: function () {
     453        var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
     454        if (treeType != "filter") return;
     455        var tree = rdfDataTreeCollection.trees[treeType];
     456        if (tree.treeElem.view.selection.count == 0) {
     457          document.getElementById("reorderUpButton_filter").setAttribute("disabled", "true");
     458          document.getElementById("reorderDownButton_filter").setAttribute("disabled", "true");
     459          return;
     460        };
     461        var start = new Object();
     462        var end = new Object();
     463        var numRanges = tree.treeElem.view.selection.getRangeCount();
     464        if (numRanges > 1) {
     465          document.getElementById("reorderUpButton_filter").setAttribute("disabled", "true");
     466          document.getElementById("reorderDownButton_filter").setAttribute("disabled", "true");
     467          return;
     468        }
     469        tree.treeElem.view.selection.getRangeAt(0, start, end);
     470        if (start.value > 0)
     471          document.getElementById("reorderUpButton_filter").removeAttribute("disabled");
     472        else document.getElementById("reorderUpButton_filter").setAttribute("disabled", "true");
     473        if (end.value < tree.idTable.length - 1)
     474          document.getElementById("reorderDownButton_filter").removeAttribute("disabled");
     475        else document.getElementById("reorderDownButton_filter").setAttribute("disabled", "true");
     476      },
     477
     478      moveUpSelected: function () {
     479        var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
     480        if (treeType != "filter") return; // just to be safe, button should be disabled
     481        var tree = rdfDataTreeCollection.trees[treeType];
     482        if (tree.treeElem.view.selection.count == 0) return; // just to be safe, button should be disabled
     483
     484        var start = new Object();
     485        var end = new Object();
     486        var numRanges = tree.treeElem.view.selection.getRangeCount();
     487        if (numRanges > 1) return; // just to be safe, button should be disabled
     488
     489        tree.treeElem.view.selection.getRangeAt(0, start, end);
     490        for (var v = start.value; v <= end.value; v++) {
     491          var resource = rdfDataTreeCollection._rdfDatasource.filterContainer.RemoveElementAt(v + 1, true);
     492          rdfDataTreeCollection._rdfDatasource.filterContainer.InsertElementAt(resource, v, true);
     493        }
     494        tree.idData = null;
     495        tree.idTable = null;
     496        tree.loadTable();
     497        tree.treeElem.view.selection.rangedSelect(start.value - 1, end.value - 1, false);
     498      },
     499
     500      moveDownSelected: function () {
     501        var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
     502        if (treeType != "filter") return; // just to be safe, button should be disabled
     503        var tree = rdfDataTreeCollection.trees[treeType];
     504        if (tree.treeElem.view.selection.count == 0) return; // just to be safe, button should be disabled
     505
     506        var start = new Object();
     507        var end = new Object();
     508        var numRanges = tree.treeElem.view.selection.getRangeCount();
     509        if (numRanges > 1) return; // just to be safe, button should be disabled
     510
     511        tree.treeElem.view.selection.getRangeAt(0, start, end);
     512        for (var v = end.value; v >= start.value; v--) {
     513          var resource = rdfDataTreeCollection._rdfDatasource.filterContainer.RemoveElementAt(v + 1, true);
     514          rdfDataTreeCollection._rdfDatasource.filterContainer.InsertElementAt(resource, v + 2, true);
     515        }
     516        tree.idData = null;
     517        tree.idTable = null;
     518        tree.loadTable();
     519        tree.treeElem.view.selection.rangedSelect(start.value + 1, end.value + 1, false);
     520      },
     521
     522      infoBoxHidden: true,
     523      overflow: function () {
     524        if (rdfDataTreeCollection.infoBoxHidden) return;
     525        var htmlBox = document.getElementById("rdfDataTreeCollectionInfoBox")
     526        htmlBox.setAttribute("style", "height:" + htmlBox.contentDocument.lastChild.scrollHeight + "px");
     527      },
     528
     529      hideInfoBox: function () {
     530        rdfDataTreeCollection.infoBoxHidden = true;
     531        document.getElementById("rdfDataTreeCollectionInfoBox").setAttribute("style", "height:0px");
     532        for each(var treeType in rdfDataTreeCollection.treeTypes) {
     533          try {
     534            if (rdfDataTreeCollection.trees[treeType])
     535              rdfDataTreeCollection.trees[treeType].treeElem.view.selection.selectNone()
     536          } catch (e) {}
     537        }
     538      },
     539
     540      selectAll: function () {
     541        var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
     542        var tree = rdfDataTreeCollection.trees[treeType];
     543        tree.treeElem.view.selection.selectAll();
     544      },
     545
     546      newItem: function () {
     547        var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
     548        var newItemPreset = {
     549          identityData: new vI.identityData("", null, null, vI.NO_SMTP_TAG, null, null)
     550        };
     551        var retVar = {
     552          treeType: null
     553        };
     554
     555        window.openDialog("chrome://v_identity/content/vI_rdfDataEditor.xul", 0,
     556          "chrome, dialog, modal, alwaysRaised, resizable=yes",
     557          newItemPreset, treeType,
     558          rdfDataTreeCollection._rdfDatasource, retVar).focus();
     559
     560        // reload all trees (multiple types might have changed)
     561        for each(var treeType in rdfDataTreeCollection.treeTypes) {
     562          rdfDataTreeCollection.trees[treeType].idData = null;
     563          rdfDataTreeCollection.trees[treeType].idTable = null;
     564          rdfDataTreeCollection.trees[treeType].loadTable()
     565        }
     566        rdfDataTreeCollection.tabbox.selectedTab = document.getElementById(retVar.treeType + "Tab");
     567        rdfDataTreeCollection.hideInfoBox();
     568      }
     569    };
     570
     571    vI.rdfDataTreeCollection = rdfDataTreeCollection;
     572    vI.rdfDataTree = rdfDataTree;
     573  }
     574});
  • content/vI_smartIdentity.js

    r3c9c29 r509348  
    2424
    2525Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
    26 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) {
    27 
    28 let Log = vI.setupLogging("virtualIdentity.smartIdentity");
    29 
    30 Components.utils.import("resource://v_identity/vI_identityData.js", virtualIdentityExtension);
    31 Components.utils.import("resource://v_identity/vI_smartIdentityCollection.js", virtualIdentityExtension);
    32 Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension);
    33 
    34 var smartIdentity = {
    35     messenger : Components.classes["@mozilla.org/messenger;1"].createInstance()
    36         .QueryInterface(Components.interfaces.nsIMessenger),
    37    
    38     stringBundle : Components.classes["@mozilla.org/intl/stringbundle;1"]
     26virtualIdentityExtension.ns(function () {
     27  with(virtualIdentityExtension.LIB) {
     28
     29    let Log = vI.setupLogging("virtualIdentity.smartIdentity");
     30
     31    Components.utils.import("resource://v_identity/vI_identityData.js", virtualIdentityExtension);
     32    Components.utils.import("resource://v_identity/vI_smartIdentityCollection.js", virtualIdentityExtension);
     33    Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension);
     34
     35    var smartIdentity = {
     36      messenger: Components.classes["@mozilla.org/messenger;1"].createInstance()
     37        .QueryInterface(Components.interfaces.nsIMessenger),
     38
     39      stringBundle: Components.classes["@mozilla.org/intl/stringbundle;1"]
    3940        .getService(Components.interfaces.nsIStringBundleService)
    4041        .createBundle("chrome://v_identity/locale/v_identity.properties"),
    4142
    42     _smartIdentityCollection : null,
    43        
    44     // After Loading the MessageComposeDialog, check if smartIdentity is needed
    45     init : function(currentWindow) {
    46         var msgHdr;
    47         var msgComposeTypeReference = Components.interfaces.nsIMsgCompType;
    48         var newsgroup = gMsgCompose.compFields.newsgroups;
    49         var autocreate = false;
    50         Log.debug("msgComposeTypeReference = " + gMsgCompose.type);
    51         switch (gMsgCompose.type) {
    52             case msgComposeTypeReference.Reply:
    53             case msgComposeTypeReference.ReplyAll:
    54             case msgComposeTypeReference.ReplyToGroup: // reply to a newsgroup, would possibly be stopped later
    55             case msgComposeTypeReference.ReplyToSender:
    56             case msgComposeTypeReference.ReplyToSenderAndGroup: // reply to a newsgroup, would possibly be stopped later
    57             case msgComposeTypeReference.ReplyWithTemplate:
    58             case msgComposeTypeReference.ReplyToList:
    59                 Log.debug("Reply");
    60                 msgHdr = smartIdentity.messenger.
    61                     messageServiceFromURI(gMsgCompose.originalMsgURI).messageURIToMsgHdr(gMsgCompose.originalMsgURI);
    62                 smartIdentity._smartIdentityCollection = new vI.smartIdentityCollection(msgHdr, getCurrentIdentity(), document.getElementById("virtualIdentityExtension_msgIdentityClone").vid, newsgroup, this._getRecipients(currentWindow));
    63                 smartIdentity._smartIdentityCollection.Reply();
    64                 autocreate = false; break;
    65             case msgComposeTypeReference.Draft:
    66             case msgComposeTypeReference.Template:
    67                 Log.debug("Draft");
    68                 msgHdr = smartIdentity.messenger.
    69                     messageServiceFromURI(gMsgCompose.compFields.draftId).messageURIToMsgHdr(gMsgCompose.compFields.draftId);
    70                 smartIdentity._smartIdentityCollection = new vI.smartIdentityCollection(msgHdr, getCurrentIdentity(), document.getElementById("virtualIdentityExtension_msgIdentityClone").vid, newsgroup, this._getRecipients(currentWindow));
    71                 smartIdentity._smartIdentityCollection.Draft();
    72                 autocreate = false; break;
    73             case msgComposeTypeReference.ForwardAsAttachment:
    74             case msgComposeTypeReference.ForwardInline:
    75             case msgComposeTypeReference.New:
    76             case msgComposeTypeReference.NewsPost:
    77             case msgComposeTypeReference.MailToUrl:
    78                 Log.debug("New Mail");
    79                 smartIdentity._smartIdentityCollection = new vI.smartIdentityCollection(null, getCurrentIdentity(), document.getElementById("virtualIdentityExtension_msgIdentityClone").vid, newsgroup, this._getRecipients(currentWindow));   
    80                 // to enable composing new email with new identity: identity is hidden in subject line
    81                 // used for instance from conversation addon
    82                 var subject = gMsgCompose.compFields.subject.split(/\n/);
    83                 if (subject.length > 1 && subject[1] == "virtualIdentityExtension") {
    84                     Log.debug("NewMail() found stored identity preset: " + subject[2]);
    85                     smartIdentity._smartIdentityCollection.__parseHeadersWithArray(subject[2], smartIdentity._smartIdentityCollection._allIdentities);
    86                     gMsgCompose.compFields.subject = subject[0];
    87                     document.getElementById("msgSubject").value = subject[0];
    88                 }
    89                 else smartIdentity._smartIdentityCollection.NewMail();
    90                 autocreate = true; break;
    91         }
    92         if (smartIdentity._smartIdentityCollection._allIdentities.number > 0) smartIdentity.__smartIdentitySelection(autocreate);
    93     },
    94    
    95     _getRecipients : function(currentWindow) {
    96         var recipients = [];
    97         for (var row = 1; row <= top.MAX_RECIPIENTS; row ++) {
    98             var recipientType = currentWindow.awGetPopupElement(row).selectedItem.getAttribute("value");
    99             if (recipientType == "addr_reply" || recipientType == "addr_followup" ||
    100                 vI.storage.isDoBcc(row, currentWindow) || currentWindow.awGetInputElement(row).value.match(/^\s*$/) ) continue;
    101             recipients.push( { recipient: currentWindow.awGetInputElement(row).value, recipientType : recipientType } );
    102         }
    103         return recipients;
    104     },
    105    
    106     __smartIdentitySelection : function(autocreate) {
    107         Log.debug("__smartIdentitySelection autocreate=" + autocreate);
    108        
    109         if (vI.vIprefs.get("idSelection_preferExisting")) {
    110             var existingIDIndex = smartIdentity._smartIdentityCollection._foundExistingIdentity();
    111             if (existingIDIndex) {
    112                 Log.debug("found existing Identity, use without interaction.");
    113                 // add all Indentities to Clone Menu before selecting and leaving the function
    114                 document.getElementById("virtualIdentityExtension_msgIdentityClone").addIdentitiesToCloneMenu(smartIdentity._smartIdentityCollection._allIdentities);
    115                 smartIdentity.changeIdentityToSmartIdentity(smartIdentity._smartIdentityCollection._allIdentities, existingIDIndex.key);
    116                 return;
    117             }
    118         }
    119        
    120         document.getElementById("virtualIdentityExtension_msgIdentityClone").addIdentitiesToCloneMenu(smartIdentity._smartIdentityCollection._allIdentities);
    121         Log.debug("__smartIdentitySelection _allIdentities.number=" +
    122                 smartIdentity._smartIdentityCollection._allIdentities.number +
    123                 " _ask_always=" + vI.vIprefs.get("idSelection_ask_always") +
    124                 " _ask=" + vI.vIprefs.get("idSelection_ask"));
    125         if (!autocreate && vI.vIprefs.get("idSelection_ask") &&
    126             ((smartIdentity._smartIdentityCollection._allIdentities.number == 1 && vI.vIprefs.get("idSelection_ask_always"))
    127                 || smartIdentity._smartIdentityCollection._allIdentities.number > 1)) {
    128             for (var index = 0; index < smartIdentity._smartIdentityCollection._allIdentities.number; index++) {
    129                 Log.debug("smartIdentityReplyDialog index=" + index + ": '" + smartIdentity._smartIdentityCollection._allIdentities.identityDataCollection[index].combinedName + "' "
    130                     + "(" + smartIdentity._smartIdentityCollection._allIdentities.identityDataCollection[index].id.value + "," + smartIdentity._smartIdentityCollection._allIdentities.identityDataCollection[index].smtp.value + ")");
    131             }
    132             window.openDialog("chrome://v_identity/content/vI_smartReplyDialog.xul",0,
    133                     "chrome, dialog, modal, alwaysRaised, resizable=yes",
    134                      smartIdentity._smartIdentityCollection._allIdentities,
    135                     /* callback: */ smartIdentity.changeIdentityToSmartIdentity).focus();
    136         }
    137         else if (autocreate || vI.vIprefs.get("idSelection_autocreate")) {
    138             smartIdentity.changeIdentityToSmartIdentity(smartIdentity._smartIdentityCollection._allIdentities, 0);
    139         }   
    140     },
    141    
    142     changeIdentityToSmartIdentity : function(allIdentities, selectedValue) {
    143         Log.debug("changeIdentityToSmartIdentity selectedValue=" + selectedValue + " from " + allIdentities.number);
    144         Log.debug("changeIdentityToSmartIdentity selectedValue=" + selectedValue + ": '" + allIdentities.identityDataCollection[selectedValue].combinedName + "' "
    145             + "(" + allIdentities.identityDataCollection[selectedValue].id.value + "," + allIdentities.identityDataCollection[selectedValue].smtp.value + ")");
    146         document.getElementById("virtualIdentityExtension_msgIdentityClone").selectedMenuItem = allIdentities.menuItems[selectedValue];
    147         if (document.getElementById("virtualIdentityExtension_msgIdentityClone").vid) {
    148             var label=smartIdentity.stringBundle.GetStringFromName("vident.smartIdentity.vIUsage");
    149             if (allIdentities.number > 1) label += " "
    150                 + smartIdentity.stringBundle.GetStringFromName("vident.smartIdentity.moreThanOne");
    151             vI.SmartReplyNotification.info(label + ".");
    152         }
    153         smartIdentity.__removeSmartIdentityFromRecipients(allIdentities, selectedValue);
    154     },
    155    
    156     __removeSmartIdentityFromRecipients : function(allIdentities, index) {
    157         if (!vI.vIprefs.get("idSelection_removeSmartIdentityFromRecipients")) return;
    158        
    159         // check if selected email is defined as doBcc address. If so, it should not be removed.
    160         var skip_bcc = false;
    161         if (getCurrentIdentity().doBcc) {
    162             var bcc_addresses = new vI.identityCollection();
    163             smartIdentity.__parseHeadersWithArray(getCurrentIdentity().doBccList, bcc_addresses);
    164            
    165             for (var i = 0; i < bcc_addresses.number; i++) {
    166                 if (allIdentities.identityDataCollection[index].email == bcc_addresses.identityDataCollection[i].email) {
    167                     skip_bcc = true; break;
    168                 }
    169             }
    170         }
    171        
    172         // check if there is more than one recipient for this mail. If not, preserve the only one existing.
    173         var recipientCount = 0;
    174         for (var row = 1; row <= top.MAX_RECIPIENTS; row ++) {
    175             var recipientType = awGetPopupElement(row).selectedItem.getAttribute("value");
    176             if (recipientType == "addr_to" || recipientType == "addr_cc") recipientCount++;
    177         }
    178         if (recipientCount < 2) return;
    179        
    180        
    181         for (var row = 1; row <= top.MAX_RECIPIENTS; row ++) {
    182             var popup = awGetPopupElement(row);
    183             var input = awGetInputElement(row);
    184             var recipientType = popup.selectedItem.getAttribute("value");
    185             // if the entry is not a recipient, just continue
    186             if (recipientType == "addr_reply" || recipientType == "addr_followup") continue;
    187             // check if the entry is used as a BCC selected in account settings
    188             if (recipientType == "addr_bcc" && skip_bcc) continue;
    189             // check if entry is matching senders address, if so, remove it
    190             if (input.value == allIdentities.identityDataCollection[index].email ||
    191                 input.value == allIdentities.identityDataCollection[index].combinedName) {
    192                     awSetInputAndPopupValue(input, "", popup, "addr_to", -1);
    193                     awCleanupRows()
    194                     vI.SmartReplyNotification.info(" " + smartIdentity.stringBundle.GetStringFromName("vident.smartIdentity.remRecipient"));
    195                     break;
    196             }
    197         }
    198     }
    199 }
    200 vI.smartIdentity = smartIdentity;
    201 }});
     43      _smartIdentityCollection: null,
     44
     45      // After Loading the MessageComposeDialog, check if smartIdentity is needed
     46      init: function (currentWindow) {
     47        var msgHdr;
     48        var msgComposeTypeReference = Components.interfaces.nsIMsgCompType;
     49        var newsgroup = gMsgCompose.compFields.newsgroups;
     50        var autocreate = false;
     51        Log.debug("msgComposeTypeReference = " + gMsgCompose.type);
     52        switch (gMsgCompose.type) {
     53        case msgComposeTypeReference.Reply:
     54        case msgComposeTypeReference.ReplyAll:
     55        case msgComposeTypeReference.ReplyToGroup: // reply to a newsgroup, would possibly be stopped later
     56        case msgComposeTypeReference.ReplyToSender:
     57        case msgComposeTypeReference.ReplyToSenderAndGroup: // reply to a newsgroup, would possibly be stopped later
     58        case msgComposeTypeReference.ReplyWithTemplate:
     59        case msgComposeTypeReference.ReplyToList:
     60          Log.debug("Reply");
     61          msgHdr = smartIdentity.messenger.
     62          messageServiceFromURI(gMsgCompose.originalMsgURI).messageURIToMsgHdr(gMsgCompose.originalMsgURI);
     63          smartIdentity._smartIdentityCollection = new vI.smartIdentityCollection(msgHdr, getCurrentIdentity(), document.getElementById("virtualIdentityExtension_msgIdentityClone").vid, newsgroup, this._getRecipients(currentWindow));
     64          smartIdentity._smartIdentityCollection.Reply();
     65          autocreate = false;
     66          break;
     67        case msgComposeTypeReference.Draft:
     68        case msgComposeTypeReference.Template:
     69          Log.debug("Draft");
     70          msgHdr = smartIdentity.messenger.
     71          messageServiceFromURI(gMsgCompose.compFields.draftId).messageURIToMsgHdr(gMsgCompose.compFields.draftId);
     72          smartIdentity._smartIdentityCollection = new vI.smartIdentityCollection(msgHdr, getCurrentIdentity(), document.getElementById("virtualIdentityExtension_msgIdentityClone").vid, newsgroup, this._getRecipients(currentWindow));
     73          smartIdentity._smartIdentityCollection.Draft();
     74          autocreate = false;
     75          break;
     76        case msgComposeTypeReference.ForwardAsAttachment:
     77        case msgComposeTypeReference.ForwardInline:
     78        case msgComposeTypeReference.New:
     79        case msgComposeTypeReference.NewsPost:
     80        case msgComposeTypeReference.MailToUrl:
     81          Log.debug("New Mail");
     82          smartIdentity._smartIdentityCollection = new vI.smartIdentityCollection(null, getCurrentIdentity(), document.getElementById("virtualIdentityExtension_msgIdentityClone").vid, newsgroup, this._getRecipients(currentWindow));
     83          // to enable composing new email with new identity: identity is hidden in subject line
     84          // used for instance from conversation addon
     85          var subject = gMsgCompose.compFields.subject.split(/\n/);
     86          if (subject.length > 1 && subject[1] == "virtualIdentityExtension") {
     87            Log.debug("NewMail() found stored identity preset: " + subject[2]);
     88            smartIdentity._smartIdentityCollection.__parseHeadersWithArray(subject[2], smartIdentity._smartIdentityCollection._allIdentities);
     89            gMsgCompose.compFields.subject = subject[0];
     90            document.getElementById("msgSubject").value = subject[0];
     91          } else smartIdentity._smartIdentityCollection.NewMail();
     92          autocreate = true;
     93          break;
     94        }
     95        if (smartIdentity._smartIdentityCollection._allIdentities.number > 0) smartIdentity.__smartIdentitySelection(autocreate);
     96      },
     97
     98      _getRecipients: function (currentWindow) {
     99        var recipients = [];
     100        for (var row = 1; row <= top.MAX_RECIPIENTS; row++) {
     101          var recipientType = currentWindow.awGetPopupElement(row).selectedItem.getAttribute("value");
     102          if (recipientType == "addr_reply" || recipientType == "addr_followup" ||
     103            vI.storage.isDoBcc(row, currentWindow) || currentWindow.awGetInputElement(row).value.match(/^\s*$/)) continue;
     104          recipients.push({
     105            recipient: currentWindow.awGetInputElement(row).value,
     106            recipientType: recipientType
     107          });
     108        }
     109        return recipients;
     110      },
     111
     112      __smartIdentitySelection: function (autocreate) {
     113        Log.debug("__smartIdentitySelection autocreate=" + autocreate);
     114
     115        if (vI.vIprefs.get("idSelection_preferExisting")) {
     116          var existingIDIndex = smartIdentity._smartIdentityCollection._foundExistingIdentity();
     117          if (existingIDIndex) {
     118            Log.debug("found existing Identity, use without interaction.");
     119            // add all Indentities to Clone Menu before selecting and leaving the function
     120            document.getElementById("virtualIdentityExtension_msgIdentityClone").addIdentitiesToCloneMenu(smartIdentity._smartIdentityCollection._allIdentities);
     121            smartIdentity.changeIdentityToSmartIdentity(smartIdentity._smartIdentityCollection._allIdentities, existingIDIndex.key);
     122            return;
     123          }
     124        }
     125
     126        document.getElementById("virtualIdentityExtension_msgIdentityClone").addIdentitiesToCloneMenu(smartIdentity._smartIdentityCollection._allIdentities);
     127        Log.debug("__smartIdentitySelection _allIdentities.number=" +
     128          smartIdentity._smartIdentityCollection._allIdentities.number +
     129          " _ask_always=" + vI.vIprefs.get("idSelection_ask_always") +
     130          " _ask=" + vI.vIprefs.get("idSelection_ask"));
     131        if (!autocreate && vI.vIprefs.get("idSelection_ask") &&
     132          ((smartIdentity._smartIdentityCollection._allIdentities.number == 1 && vI.vIprefs.get("idSelection_ask_always")) || smartIdentity._smartIdentityCollection._allIdentities.number > 1)) {
     133          for (var index = 0; index < smartIdentity._smartIdentityCollection._allIdentities.number; index++) {
     134            Log.debug("smartIdentityReplyDialog index=" + index + ": '" + smartIdentity._smartIdentityCollection._allIdentities.identityDataCollection[index].combinedName + "' " + "(" + smartIdentity._smartIdentityCollection._allIdentities.identityDataCollection[index].id.value + "," + smartIdentity._smartIdentityCollection._allIdentities.identityDataCollection[index].smtp.value + ")");
     135          }
     136          window.openDialog("chrome://v_identity/content/vI_smartReplyDialog.xul", 0,
     137            "chrome, dialog, modal, alwaysRaised, resizable=yes",
     138            smartIdentity._smartIdentityCollection._allIdentities,
     139            /* callback: */
     140            smartIdentity.changeIdentityToSmartIdentity).focus();
     141        } else if (autocreate || vI.vIprefs.get("idSelection_autocreate")) {
     142          smartIdentity.changeIdentityToSmartIdentity(smartIdentity._smartIdentityCollection._allIdentities, 0);
     143        }
     144      },
     145
     146      changeIdentityToSmartIdentity: function (allIdentities, selectedValue) {
     147        Log.debug("changeIdentityToSmartIdentity selectedValue=" + selectedValue + " from " + allIdentities.number);
     148        Log.debug("changeIdentityToSmartIdentity selectedValue=" + selectedValue + ": '" + allIdentities.identityDataCollection[selectedValue].combinedName + "' " + "(" + allIdentities.identityDataCollection[selectedValue].id.value + "," + allIdentities.identityDataCollection[selectedValue].smtp.value + ")");
     149        document.getElementById("virtualIdentityExtension_msgIdentityClone").selectedMenuItem = allIdentities.menuItems[selectedValue];
     150        if (document.getElementById("virtualIdentityExtension_msgIdentityClone").vid) {
     151          var label = smartIdentity.stringBundle.GetStringFromName("vident.smartIdentity.vIUsage");
     152          if (allIdentities.number > 1) label += " " + smartIdentity.stringBundle.GetStringFromName("vident.smartIdentity.moreThanOne");
     153          vI.SmartReplyNotification.info(label + ".");
     154        }
     155        smartIdentity.__removeSmartIdentityFromRecipients(allIdentities, selectedValue);
     156      },
     157
     158      __removeSmartIdentityFromRecipients: function (allIdentities, index) {
     159        if (!vI.vIprefs.get("idSelection_removeSmartIdentityFromRecipients")) return;
     160
     161        // check if selected email is defined as doBcc address. If so, it should not be removed.
     162        var skip_bcc = false;
     163        if (getCurrentIdentity().doBcc) {
     164          var bcc_addresses = new vI.identityCollection();
     165          smartIdentity.__parseHeadersWithArray(getCurrentIdentity().doBccList, bcc_addresses);
     166
     167          for (var i = 0; i < bcc_addresses.number; i++) {
     168            if (allIdentities.identityDataCollection[index].email == bcc_addresses.identityDataCollection[i].email) {
     169              skip_bcc = true;
     170              break;
     171            }
     172          }
     173        }
     174
     175        // check if there is more than one recipient for this mail. If not, preserve the only one existing.
     176        var recipientCount = 0;
     177        for (var row = 1; row <= top.MAX_RECIPIENTS; row++) {
     178          var recipientType = awGetPopupElement(row).selectedItem.getAttribute("value");
     179          if (recipientType == "addr_to" || recipientType == "addr_cc") recipientCount++;
     180        }
     181        if (recipientCount < 2) return;
     182
     183
     184        for (var row = 1; row <= top.MAX_RECIPIENTS; row++) {
     185          var popup = awGetPopupElement(row);
     186          var input = awGetInputElement(row);
     187          var recipientType = popup.selectedItem.getAttribute("value");
     188          // if the entry is not a recipient, just continue
     189          if (recipientType == "addr_reply" || recipientType == "addr_followup") continue;
     190          // check if the entry is used as a BCC selected in account settings
     191          if (recipientType == "addr_bcc" && skip_bcc) continue;
     192          // check if entry is matching senders address, if so, remove it
     193          if (input.value == allIdentities.identityDataCollection[index].email ||
     194            input.value == allIdentities.identityDataCollection[index].combinedName) {
     195            awSetInputAndPopupValue(input, "", popup, "addr_to", -1);
     196            awCleanupRows()
     197            vI.SmartReplyNotification.info(" " + smartIdentity.stringBundle.GetStringFromName("vident.smartIdentity.remRecipient"));
     198            break;
     199          }
     200        }
     201      }
     202    }
     203    vI.smartIdentity = smartIdentity;
     204  }
     205});
  • content/vI_smartReplyDialog.js

    r3c9c29 r509348  
    2424
    2525Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
    26 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) {
    27 var smartReply_dialog = {
    28     Obj_radioGroup : null,
    29     all_addresses : null,
     26virtualIdentityExtension.ns(function () {
     27  with(virtualIdentityExtension.LIB) {
     28    var smartReply_dialog = {
     29      Obj_radioGroup: null,
     30      all_addresses: null,
    3031
    31     init : function() {
    32         smartReply_dialog.Obj_radioGroup = document.getElementById("replySelector.radiogroup");
    33         smartReply_dialog.all_addresses = window.arguments[0];
    34         for (var index = 0; index < smartReply_dialog.all_addresses.number; index++) {
    35             var menuentry = smartReply_dialog.all_addresses.identityDataCollection[index].combinedName;
     32      init: function () {
     33        smartReply_dialog.Obj_radioGroup = document.getElementById("replySelector.radiogroup");
     34        smartReply_dialog.all_addresses = window.arguments[0];
     35        for (var index = 0; index < smartReply_dialog.all_addresses.number; index++) {
     36          var menuentry = smartReply_dialog.all_addresses.identityDataCollection[index].combinedName;
    3637
    37             var id = null; var smtp = null;
     38          var id = null;
     39          var smtp = null;
    3840
    39             if (smartReply_dialog.all_addresses.identityDataCollection[index].id)
    40                 id = smartReply_dialog.all_addresses.identityDataCollection[index].id.value;
    41             if (smartReply_dialog.all_addresses.identityDataCollection[index].smtp)
    42                 smtp = smartReply_dialog.all_addresses.identityDataCollection[index].smtp.value;
    43            
    44             let defaultServerTag = Components.classes["@mozilla.org/intl/stringbundle;1"]
    45               .getService(Components.interfaces.nsIStringBundleService)
    46               .createBundle("chrome://messenger/locale/messenger.properties")
    47               .GetStringFromName("defaultServerTag")
    48            
    49             menuentry += (id?" (" + id + "," + (smtp?smtp:defaultServerTag) + ")":"")
    50             smartReply_dialog.add_row(menuentry);
    51         }
    52     },
     41          if (smartReply_dialog.all_addresses.identityDataCollection[index].id)
     42            id = smartReply_dialog.all_addresses.identityDataCollection[index].id.value;
     43          if (smartReply_dialog.all_addresses.identityDataCollection[index].smtp)
     44            smtp = smartReply_dialog.all_addresses.identityDataCollection[index].smtp.value;
    5345
    54     add_row : function(combinedName) {
    55         var radio = document.createElement("radio");
    56         radio.setAttribute("label",combinedName);
    57         smartReply_dialog.Obj_radioGroup.appendChild(radio);
    58     },
     46          let defaultServerTag = Components.classes["@mozilla.org/intl/stringbundle;1"]
     47            .getService(Components.interfaces.nsIStringBundleService)
     48            .createBundle("chrome://messenger/locale/messenger.properties")
     49            .GetStringFromName("defaultServerTag")
    5950
    60     accept : function() {
    61         /* window.argument[1] stores callback function */
    62         window.arguments[1](smartReply_dialog.all_addresses, smartReply_dialog.Obj_radioGroup.selectedIndex);
    63         document.documentElement.acceptDialog();
    64     }
    65 }
    66 window.addEventListener("load", smartReply_dialog.init, false);
    67 vI.smartReply_dialog = smartReply_dialog;
    68 }});
     51          menuentry += (id ? " (" + id + "," + (smtp ? smtp : defaultServerTag) + ")" : "")
     52          smartReply_dialog.add_row(menuentry);
     53        }
     54      },
     55
     56      add_row: function (combinedName) {
     57        var radio = document.createElement("radio");
     58        radio.setAttribute("label", combinedName);
     59        smartReply_dialog.Obj_radioGroup.appendChild(radio);
     60      },
     61
     62      accept: function () {
     63        /* window.argument[1] stores callback function */
     64        window.arguments[1](smartReply_dialog.all_addresses, smartReply_dialog.Obj_radioGroup.selectedIndex);
     65        document.documentElement.acceptDialog();
     66      }
     67    }
     68    window.addEventListener("load", smartReply_dialog.init, false);
     69    vI.smartReply_dialog = smartReply_dialog;
     70  }
     71});
  • content/vI_statusmenu.js

    r3c9c29 r509348  
    2424
    2525Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
    26 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) {
    27 
    28 let Log = vI.setupLogging("virtualIdentity.statusmenu");
    29 
    30 Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension);
    31 
    32 var statusmenu = {
    33     stringBundle : Components.classes["@mozilla.org/intl/stringbundle;1"]
     26virtualIdentityExtension.ns(function () {
     27  with(virtualIdentityExtension.LIB) {
     28
     29    let Log = vI.setupLogging("virtualIdentity.statusmenu");
     30
     31    Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension);
     32
     33    var statusmenu = {
     34      stringBundle: Components.classes["@mozilla.org/intl/stringbundle;1"]
    3435        .getService(Components.interfaces.nsIStringBundleService)
    3536        .createBundle("chrome://v_identity/locale/v_identity.properties"),
    3637
    37     objStatusMenu : null,
    38     objSaveBaseIDMenuItem : null,
    39     objStorageSaveMenuItem : null,
    40     objStatusMenuSeparator : null,
    41     objSaveSwitch : null,
    42     objSaveBaseIDSwitch : null,
    43     objSaveSMTPSwitch : null,
    44     objFccSwitch : null,
    45     objStatusText : null,
    46     objStatusLogo : null,
    47    
    48     observe: function(self, subject, topic, data) {
    49 //         Log.debug("statusmenu observe " + data);
    50         switch (data) {
    51             case "show_status":
    52                 statusmenu.objStatusMenu.setAttribute("hidden", !vI.vIprefs.get(data));
    53                 statusmenu.objStatusLogo.setAttribute("hidden", !vI.vIprefs.get(data));
    54                 // no break, continue like with doFcc           
    55             case "fcc_show_switch":
    56                 statusmenu.objFccSwitch.setAttribute("hidden", !vI.vIprefs.get(data));
    57                 // no break, continue like with doFcc           
    58             case "doFcc":
    59                 statusmenu.objFccSwitch.setAttribute("checked", vI.vIprefs.get(data));
    60                 break;
    61             case "storage_show_switch":
    62                 statusmenu.objSaveSwitch.setAttribute("hidden", !vI.vIprefs.get(data));
    63                 break;
    64             case "storage_show_baseID_switch":
    65                 statusmenu.objSaveBaseIDSwitch.setAttribute("hidden", !vI.vIprefs.get(data));
    66                 break;
    67             case "storage_show_SMTP_switch":
    68 //                 Log.debug("changed storage_show_SMTP_switch to " + statusmenu.objSaveSMTPMenuItem + "=" + vI.vIprefs.get(data));
    69                 statusmenu.objSaveSMTPSwitch.setAttribute("hidden", !vI.vIprefs.get(data));
    70                 break;
    71             case "storage_store":
    72                 statusmenu.objStorageSaveMenuItem.setAttribute("checked", vI.vIprefs.get(data));
    73                 break;
    74             case "storage_store_base_id":
    75                 statusmenu.objSaveBaseIDMenuItem.setAttribute("checked", vI.vIprefs.get(data));
    76                 break;
    77             case "storage_store_SMTP":
    78 //                 Log.debug("changed storage_store_SMTP to " + statusmenu.objSaveSMTPMenuItem + "=" + vI.vIprefs.get(data));
    79                 statusmenu.objSaveSMTPMenuItem.setAttribute("checked", vI.vIprefs.get(data));
    80 //                 Log.debug("changed storage_store_SMTP done");
    81                 break;
    82             case "storage_colorIndication":
    83                 document.getElementById("identityHbox").setAttribute("colorize", vI.vIprefs.get(data))
    84                 document.getElementById("baseIDHbox").setAttribute("colorize", vI.vIprefs.get(data))
    85                 document.getElementById("smtpServerHbox").setAttribute("colorize", vI.vIprefs.get(data))
    86                 break;
    87             case "storage":
    88                 if (vI.vIprefs.get(data)) {
    89                     statusmenu.objStorageSaveMenuItem.removeAttribute("hidden");
    90                     statusmenu.objSaveBaseIDMenuItem.removeAttribute("hidden");
    91                     statusmenu.objSaveSMTPMenuItem.removeAttribute("hidden");
    92                     statusmenu.objStatusMenuSeparator.removeAttribute("hidden");
    93                 }
    94                 else {
    95                     statusmenu.objStorageSaveMenuItem.setAttribute("hidden", "true");
    96                     statusmenu.objSaveBaseIDMenuItem.setAttribute("hidden", "true");
    97                     statusmenu.objSaveSMTPMenuItem.setAttribute("hidden", "true");
    98                     statusmenu.objStatusMenuSeparator.setAttribute("hidden", "true");
    99                 }
    100                 break;
    101         }
    102         statusmenu.menuConstraint(statusmenu.objStorageSaveMenuItem);
    103     },
    104    
    105     addObserver: function() {
    106         vI.vIprefs.addObserver("show_status", this.observe, this);
     38      objStatusMenu: null,
     39      objSaveBaseIDMenuItem: null,
     40      objStorageSaveMenuItem: null,
     41      objStatusMenuSeparator: null,
     42      objSaveSwitch: null,
     43      objSaveBaseIDSwitch: null,
     44      objSaveSMTPSwitch: null,
     45      objFccSwitch: null,
     46      objStatusText: null,
     47      objStatusLogo: null,
     48
     49      observe: function (self, subject, topic, data) {
     50        //         Log.debug("statusmenu observe " + data);
     51        switch (data) {
     52        case "show_status":
     53          statusmenu.objStatusMenu.setAttribute("hidden", !vI.vIprefs.get(data));
     54          statusmenu.objStatusLogo.setAttribute("hidden", !vI.vIprefs.get(data));
     55          // no break, continue like with doFcc           
     56        case "fcc_show_switch":
     57          statusmenu.objFccSwitch.setAttribute("hidden", !vI.vIprefs.get(data));
     58          // no break, continue like with doFcc         
     59        case "doFcc":
     60          statusmenu.objFccSwitch.setAttribute("checked", vI.vIprefs.get(data));
     61          break;
     62        case "storage_show_switch":
     63          statusmenu.objSaveSwitch.setAttribute("hidden", !vI.vIprefs.get(data));
     64          break;
     65        case "storage_show_baseID_switch":
     66          statusmenu.objSaveBaseIDSwitch.setAttribute("hidden", !vI.vIprefs.get(data));
     67          break;
     68        case "storage_show_SMTP_switch":
     69          //                 Log.debug("changed storage_show_SMTP_switch to " + statusmenu.objSaveSMTPMenuItem + "=" + vI.vIprefs.get(data));
     70          statusmenu.objSaveSMTPSwitch.setAttribute("hidden", !vI.vIprefs.get(data));
     71          break;
     72        case "storage_store":
     73          statusmenu.objStorageSaveMenuItem.setAttribute("checked", vI.vIprefs.get(data));
     74          break;
     75        case "storage_store_base_id":
     76          statusmenu.objSaveBaseIDMenuItem.setAttribute("checked", vI.vIprefs.get(data));
     77          break;
     78        case "storage_store_SMTP":
     79          //                 Log.debug("changed storage_store_SMTP to " + statusmenu.objSaveSMTPMenuItem + "=" + vI.vIprefs.get(data));
     80          statusmenu.objSaveSMTPMenuItem.setAttribute("checked", vI.vIprefs.get(data));
     81          //                 Log.debug("changed storage_store_SMTP done");
     82          break;
     83        case "storage_colorIndication":
     84          document.getElementById("identityHbox").setAttribute("colorize", vI.vIprefs.get(data))
     85          document.getElementById("baseIDHbox").setAttribute("colorize", vI.vIprefs.get(data))
     86          document.getElementById("smtpServerHbox").setAttribute("colorize", vI.vIprefs.get(data))
     87          break;
     88        case "storage":
     89          if (vI.vIprefs.get(data)) {
     90            statusmenu.objStorageSaveMenuItem.removeAttribute("hidden");
     91            statusmenu.objSaveBaseIDMenuItem.removeAttribute("hidden");
     92            statusmenu.objSaveSMTPMenuItem.removeAttribute("hidden");
     93            statusmenu.objStatusMenuSeparator.removeAttribute("hidden");
     94          } else {
     95            statusmenu.objStorageSaveMenuItem.setAttribute("hidden", "true");
     96            statusmenu.objSaveBaseIDMenuItem.setAttribute("hidden", "true");
     97            statusmenu.objSaveSMTPMenuItem.setAttribute("hidden", "true");
     98            statusmenu.objStatusMenuSeparator.setAttribute("hidden", "true");
     99          }
     100          break;
     101        }
     102        statusmenu.menuConstraint(statusmenu.objStorageSaveMenuItem);
     103      },
     104
     105      addObserver: function () {
     106        vI.vIprefs.addObserver("show_status", this.observe, this);
    107107        vI.vIprefs.addObserver("fcc_show_switch", this.observe, this);
    108         vI.vIprefs.addObserver("doFcc", this.observe, this);
    109         vI.vIprefs.addObserver("storage", this.observe, this);
    110         vI.vIprefs.addObserver("storage_show_switch", this.observe, this);
    111         vI.vIprefs.addObserver("storage_show_baseID_switch", this.observe, this);
    112         vI.vIprefs.addObserver("storage_show_SMTP_switch", this.observe, this);
    113         vI.vIprefs.addObserver("storage_colorIndication", this.observe, this);
    114         vI.vIprefs.addObserver("storage_store", this.observe, this);
    115         vI.vIprefs.addObserver("storage_store_base_id", this.observe, this);
    116         vI.vIprefs.addObserver("storage_store_SMTP", this.observe, this);
    117     },
    118    
    119     removeObserver: function() {
     108        vI.vIprefs.addObserver("doFcc", this.observe, this);
     109        vI.vIprefs.addObserver("storage", this.observe, this);
     110        vI.vIprefs.addObserver("storage_show_switch", this.observe, this);
     111        vI.vIprefs.addObserver("storage_show_baseID_switch", this.observe, this);
     112        vI.vIprefs.addObserver("storage_show_SMTP_switch", this.observe, this);
     113        vI.vIprefs.addObserver("storage_colorIndication", this.observe, this);
     114        vI.vIprefs.addObserver("storage_store", this.observe, this);
     115        vI.vIprefs.addObserver("storage_store_base_id", this.observe, this);
     116        vI.vIprefs.addObserver("storage_store_SMTP", this.observe, this);
     117      },
     118
     119      removeObserver: function () {
    120120        vI.vIprefs.removeObserver("show_status", this.observe);
    121         vI.vIprefs.removeObserver("fcc_show_switch", this.observe);
    122         vI.vIprefs.removeObserver("doFcc", this.observe);
    123         vI.vIprefs.removeObserver("storage", this.observe);
    124         vI.vIprefs.removeObserver("storage_show_switch", this.observe);
    125         vI.vIprefs.removeObserver("storage_show_baseID_switch", this.observe);
    126         vI.vIprefs.removeObserver("storage_show_SMTP_switch", this.observe);
    127         vI.vIprefs.removeObserver("storage_colorIndication", this.observe);
    128         vI.vIprefs.removeObserver("storage_store", this.observe);
    129         vI.vIprefs.removeObserver("storage_store_base_id", this.observe);
    130         vI.vIprefs.removeObserver("storage_store_SMTP", this.observe);
    131     },
    132    
    133     init : function () {
    134         statusmenu.objStatusMenu = document.getElementById("virtualIdentityExtension_vIStatusMenu");
     121        vI.vIprefs.removeObserver("fcc_show_switch", this.observe);
     122        vI.vIprefs.removeObserver("doFcc", this.observe);
     123        vI.vIprefs.removeObserver("storage", this.observe);
     124        vI.vIprefs.removeObserver("storage_show_switch", this.observe);
     125        vI.vIprefs.removeObserver("storage_show_baseID_switch", this.observe);
     126        vI.vIprefs.removeObserver("storage_show_SMTP_switch", this.observe);
     127        vI.vIprefs.removeObserver("storage_colorIndication", this.observe);
     128        vI.vIprefs.removeObserver("storage_store", this.observe);
     129        vI.vIprefs.removeObserver("storage_store_base_id", this.observe);
     130        vI.vIprefs.removeObserver("storage_store_SMTP", this.observe);
     131      },
     132
     133      init: function () {
     134        statusmenu.objStatusMenu = document.getElementById("virtualIdentityExtension_vIStatusMenu");
    135135        statusmenu.objStatusLogo = document.getElementById("virtualIdentityExtension_Logo");
    136         statusmenu.objSaveBaseIDMenuItem = document.getElementById("virtualIdentityExtension_statusMenu_storage_saveBaseID");
    137         statusmenu.objSaveSMTPMenuItem = document.getElementById("virtualIdentityExtension_statusMenu_storage_saveSMTP");
    138         statusmenu.objStorageSaveMenuItem = document.getElementById("virtualIdentityExtension_statusMenu_storage_save");
    139         statusmenu.objStatusMenuSeparator = document.getElementById("virtualIdentityExtension_statusMenu_separator");
    140         statusmenu.objSaveSwitch = document.getElementById("virtualIdentityExtension_saveSwitch");
    141         statusmenu.objSaveBaseIDSwitch = document.getElementById("virtualIdentityExtension_saveBaseIDSwitch");
    142         statusmenu.objSaveSMTPSwitch = document.getElementById("virtualIdentityExtension_SaveSmtpSwitch");
    143         statusmenu.objFccSwitch = document.getElementById("virtualIdentityExtension_fccSwitch");
    144         statusmenu.objStatusText = document.getElementById("statusText");
    145         statusmenu.objStatusTooltipLine1 = document.getElementById("virtualIdentityExtension_statusMenuTooltip_StatusValueLine1");
    146         statusmenu.objStatusTooltipLine2 = document.getElementById("virtualIdentityExtension_statusMenuTooltip_StatusValueLine2");
    147 
    148         statusmenu.addObserver();
     136        statusmenu.objSaveBaseIDMenuItem = document.getElementById("virtualIdentityExtension_statusMenu_storage_saveBaseID");
     137        statusmenu.objSaveSMTPMenuItem = document.getElementById("virtualIdentityExtension_statusMenu_storage_saveSMTP");
     138        statusmenu.objStorageSaveMenuItem = document.getElementById("virtualIdentityExtension_statusMenu_storage_save");
     139        statusmenu.objStatusMenuSeparator = document.getElementById("virtualIdentityExtension_statusMenu_separator");
     140        statusmenu.objSaveSwitch = document.getElementById("virtualIdentityExtension_saveSwitch");
     141        statusmenu.objSaveBaseIDSwitch = document.getElementById("virtualIdentityExtension_saveBaseIDSwitch");
     142        statusmenu.objSaveSMTPSwitch = document.getElementById("virtualIdentityExtension_SaveSmtpSwitch");
     143        statusmenu.objFccSwitch = document.getElementById("virtualIdentityExtension_fccSwitch");
     144        statusmenu.objStatusText = document.getElementById("statusText");
     145        statusmenu.objStatusTooltipLine1 = document.getElementById("virtualIdentityExtension_statusMenuTooltip_StatusValueLine1");
     146        statusmenu.objStatusTooltipLine2 = document.getElementById("virtualIdentityExtension_statusMenuTooltip_StatusValueLine2");
     147
     148        statusmenu.addObserver();
    149149        statusmenu.observe(this, null, null, "show_status");
    150         statusmenu.observe(this, null, null, "fcc_show_switch");
    151         statusmenu.observe(this, null, null, "storage_show_switch");
    152         statusmenu.observe(this, null, null, "storage_show_baseID_switch");
    153         statusmenu.observe(this, null, null, "storage_show_SMTP_switch");
    154         statusmenu.observe(this, null, null, "storage_colorIndication");
    155         statusmenu.observe(this, null, null, "storage_store_base_id");
    156         statusmenu.observe(this, null, null, "storage_store_SMTP");
    157         statusmenu.observe(this, null, null, "storage_store");
    158         statusmenu.observe(this, null, null, "storage");
    159     },
    160    
    161     __timeout : 5,  // timeout for status messages in seconds
    162     __addStatusMessage : function(save, smtp) {
     150        statusmenu.observe(this, null, null, "fcc_show_switch");
     151        statusmenu.observe(this, null, null, "storage_show_switch");
     152        statusmenu.observe(this, null, null, "storage_show_baseID_switch");
     153        statusmenu.observe(this, null, null, "storage_show_SMTP_switch");
     154        statusmenu.observe(this, null, null, "storage_colorIndication");
     155        statusmenu.observe(this, null, null, "storage_store_base_id");
     156        statusmenu.observe(this, null, null, "storage_store_SMTP");
     157        statusmenu.observe(this, null, null, "storage_store");
     158        statusmenu.observe(this, null, null, "storage");
     159      },
     160
     161      __timeout: 5, // timeout for status messages in seconds
     162      __addStatusMessage: function (save, smtp) {
    163163        if (vI.vIprefs.get("show_status")) {
    164             var sourceString = "vident.statusText.save." + save;
    165             if (smtp != "off") sourceString = sourceString + ".smtp"
    166             var messageLine1 = statusmenu.stringBundle.GetStringFromName(sourceString + ".line1");
    167             var messageLine2 = statusmenu.stringBundle.GetStringFromName(sourceString + ".line2");
    168             if (!messageLine2) {
    169                 statusmenu.objStatusText.setAttribute("label", messageLine1);
    170                 statusmenu.objStatusTooltipLine1.setAttribute("value", messageLine1);
    171                 statusmenu.objStatusTooltipLine2.setAttribute("hidden", "true");
    172             }   
    173             else {
    174                 statusmenu.objStatusText.setAttribute("label", messageLine1 + " " + messageLine2);
    175                 statusmenu.objStatusTooltipLine1.setAttribute("value", messageLine1);
    176                 statusmenu.objStatusTooltipLine2.setAttribute("value", messageLine2);
    177                 statusmenu.objStatusTooltipLine2.removeAttribute("hidden");
    178             }
    179             window.setTimeout(virtualIdentityExtension.statusmenu.__clearStatusMessage, statusmenu.__timeout * 1000);
     164          var sourceString = "vident.statusText.save." + save;
     165          if (smtp != "off") sourceString = sourceString + ".smtp"
     166          var messageLine1 = statusmenu.stringBundle.GetStringFromName(sourceString + ".line1");
     167          var messageLine2 = statusmenu.stringBundle.GetStringFromName(sourceString + ".line2");
     168          if (!messageLine2) {
     169            statusmenu.objStatusText.setAttribute("label", messageLine1);
     170            statusmenu.objStatusTooltipLine1.setAttribute("value", messageLine1);
     171            statusmenu.objStatusTooltipLine2.setAttribute("hidden", "true");
     172          } else {
     173            statusmenu.objStatusText.setAttribute("label", messageLine1 + " " + messageLine2);
     174            statusmenu.objStatusTooltipLine1.setAttribute("value", messageLine1);
     175            statusmenu.objStatusTooltipLine2.setAttribute("value", messageLine2);
     176            statusmenu.objStatusTooltipLine2.removeAttribute("hidden");
     177          }
     178          window.setTimeout(virtualIdentityExtension.statusmenu.__clearStatusMessage, statusmenu.__timeout * 1000);
    180179        }
    181     },
    182 
    183     __clearStatusMessage : function() {
    184         statusmenu.objStatusText.setAttribute("label", "");
    185     },
    186 
    187     changeSMTPStatus : function (elem) {
    188         statusmenu.objSaveSMTPMenuItem.setAttribute("checked", elem.getAttribute("checked"));
    189         statusmenu.menuConstraint();
    190     },
    191 
    192     changeBaseIDStatus : function (elem) {
    193         statusmenu.objSaveBaseIDMenuItem.setAttribute("checked", elem.getAttribute("checked"));
    194         statusmenu.menuConstraint();
    195     },
    196 
    197     changeSaveStatus : function (elem) {
    198         statusmenu.objStorageSaveMenuItem.setAttribute("checked", elem.getAttribute("checked"));
    199         statusmenu.menuConstraint();
    200     },
    201 
    202     menuConstraint : function () {
    203         var save = "off"; var smtp = "off";
    204         if (statusmenu.objStorageSaveMenuItem.getAttribute("checked") == "true") {
    205             statusmenu.objSaveSMTPMenuItem.removeAttribute("disabled");
    206             statusmenu.objSaveBaseIDMenuItem.removeAttribute("disabled");
    207             if (vI.vIprefs.get("storage")) {
    208                 if (statusmenu.objSaveBaseIDMenuItem.getAttribute("checked") == "true") save = "base";
    209                 else save = "ok";
    210                 if (statusmenu.objSaveSMTPMenuItem.getAttribute("checked") == "true") smtp = "save";
    211             }
    212         }
    213         else {
    214             statusmenu.objSaveSMTPMenuItem.setAttribute("disabled", "true");
    215             statusmenu.objSaveBaseIDMenuItem.setAttribute("disabled", "true");
    216         }
    217         statusmenu.objStatusMenu.setAttribute("save", save);
    218         statusmenu.objStatusMenu.setAttribute("smtp", smtp);
    219         statusmenu.__addStatusMessage(save, smtp);
    220     },
    221 
    222     clicked : function (button) {
    223         if (button != 0) return; // only react on left mouse button
    224         if (!vI.vIprefs.get("storage")) return;
    225 
    226         var curSaveStatus = vI.vIprefs.get("storage_store")
    227         var curSaveSMTPStatus = vI.vIprefs.get("storage_store_SMTP")
    228         var curSaveBaseIDStatus = vI.vIprefs.get("storage_store_base_id")
    229         var newSaveStatus = ((!curSaveStatus) || (curSaveStatus && !curSaveSMTPStatus) || (curSaveStatus && !curSaveBaseIDStatus))
    230         var newSaveSMTPStatus = ((!curSaveSMTPStatus && curSaveStatus) || (curSaveBaseIDStatus && !curSaveSMTPStatus))
    231         var newSaveBaseIDStatus = ((curSaveSMTPStatus && curSaveStatus && !curSaveBaseIDStatus) || (curSaveBaseIDStatus && !curSaveSMTPStatus))
    232        
    233         vI.vIprefs.set("storage_store", newSaveStatus)
     180      },
     181
     182      __clearStatusMessage: function () {
     183        statusmenu.objStatusText.setAttribute("label", "");
     184      },
     185
     186      changeSMTPStatus: function (elem) {
     187        statusmenu.objSaveSMTPMenuItem.setAttribute("checked", elem.getAttribute("checked"));
     188        statusmenu.menuConstraint();
     189      },
     190
     191      changeBaseIDStatus: function (elem) {
     192        statusmenu.objSaveBaseIDMenuItem.setAttribute("checked", elem.getAttribute("checked"));
     193        statusmenu.menuConstraint();
     194      },
     195
     196      changeSaveStatus: function (elem) {
     197        statusmenu.objStorageSaveMenuItem.setAttribute("checked", elem.getAttribute("checked"));
     198        statusmenu.menuConstraint();
     199      },
     200
     201      menuConstraint: function () {
     202        var save = "off";
     203        var smtp = "off";
     204        if (statusmenu.objStorageSaveMenuItem.getAttribute("checked") == "true") {
     205          statusmenu.objSaveSMTPMenuItem.removeAttribute("disabled");
     206          statusmenu.objSaveBaseIDMenuItem.removeAttribute("disabled");
     207          if (vI.vIprefs.get("storage")) {
     208            if (statusmenu.objSaveBaseIDMenuItem.getAttribute("checked") == "true") save = "base";
     209            else save = "ok";
     210            if (statusmenu.objSaveSMTPMenuItem.getAttribute("checked") == "true") smtp = "save";
     211          }
     212        } else {
     213          statusmenu.objSaveSMTPMenuItem.setAttribute("disabled", "true");
     214          statusmenu.objSaveBaseIDMenuItem.setAttribute("disabled", "true");
     215        }
     216        statusmenu.objStatusMenu.setAttribute("save", save);
     217        statusmenu.objStatusMenu.setAttribute("smtp", smtp);
     218        statusmenu.__addStatusMessage(save, smtp);
     219      },
     220
     221      clicked: function (button) {
     222        if (button != 0) return; // only react on left mouse button
     223        if (!vI.vIprefs.get("storage")) return;
     224
     225        var curSaveStatus = vI.vIprefs.get("storage_store")
     226        var curSaveSMTPStatus = vI.vIprefs.get("storage_store_SMTP")
     227        var curSaveBaseIDStatus = vI.vIprefs.get("storage_store_base_id")
     228        var newSaveStatus = ((!curSaveStatus) || (curSaveStatus && !curSaveSMTPStatus) || (curSaveStatus && !curSaveBaseIDStatus))
     229        var newSaveSMTPStatus = ((!curSaveSMTPStatus && curSaveStatus) || (curSaveBaseIDStatus && !curSaveSMTPStatus))
     230        var newSaveBaseIDStatus = ((curSaveSMTPStatus && curSaveStatus && !curSaveBaseIDStatus) || (curSaveBaseIDStatus && !curSaveSMTPStatus))
     231
     232        vI.vIprefs.set("storage_store", newSaveStatus)
    234233        vI.vIprefs.set("storage_store_SMTP", newSaveSMTPStatus)
    235234        vI.vIprefs.set("storage_store_base_id", newSaveBaseIDStatus)
    236        
    237         statusmenu.menuConstraint();
    238     }
    239 }
    240 vI.statusmenu = statusmenu;
    241 }});
     235
     236        statusmenu.menuConstraint();
     237      }
     238    }
     239    vI.statusmenu = statusmenu;
     240  }
     241});
  • content/vI_storage.js

    r3c9c29 r509348  
    2222    Contributor(s): Mike Krieger, Sebastian Apel
    2323 * ***** END LICENSE BLOCK ***** */
    24  
     24
    2525/**
    26 * some code copied and adapted from 'addressContext' and from 'Birthday Reminder'
    27 * thanks to Mike Krieger and Sebastian Apel
    28 */
     26 * some code copied and adapted from 'addressContext' and from 'Birthday Reminder'
     27 * thanks to Mike Krieger and Sebastian Apel
     28 */
    2929
    3030Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
    31 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) {
    32 
    33 Components.utils.import("resource://gre/modules/AddonManager.jsm");
    34 let Log = vI.setupLogging("virtualIdentity.storage");
    35 Components.utils.import("resource://v_identity/vI_rdfDatasource.js", virtualIdentityExtension);
    36 Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension);
    37 
    38 var storage = {
    39     focusedElement : null,
    40    
    41     lastCheckedEmail : {},  // array of last checked emails per row,
    42                 // to prevent ugly double dialogs and time-consuming double-checks
    43    
    44     _rdfDatasourceAccess : null,    // local storage
    45 
    46     stringBundle : Components.classes["@mozilla.org/intl/stringbundle;1"]
     31virtualIdentityExtension.ns(function () {
     32  with(virtualIdentityExtension.LIB) {
     33
     34    Components.utils.import("resource://gre/modules/AddonManager.jsm");
     35    let Log = vI.setupLogging("virtualIdentity.storage");
     36    Components.utils.import("resource://v_identity/vI_rdfDatasource.js", virtualIdentityExtension);
     37    Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension);
     38
     39    var storage = {
     40      focusedElement: null,
     41
     42      lastCheckedEmail: {}, // array of last checked emails per row,
     43      // to prevent ugly double dialogs and time-consuming double-checks
     44
     45      _rdfDatasourceAccess: null, // local storage
     46
     47      stringBundle: Components.classes["@mozilla.org/intl/stringbundle;1"]
    4748        .getService(Components.interfaces.nsIStringBundleService)
    4849        .createBundle("chrome://v_identity/locale/v_identity.properties"),
    4950
    50     clean: function() {
    51         Log.debug("clean.");
    52         storage.multipleRecipients = null;
    53         storage.lastCheckedEmail = {};
    54         storage.firstUsedInputElement = null;
    55         awSetInputAndPopupValue = storage.original_functions.awSetInputAndPopupValue;
     51      clean: function () {
     52        Log.debug("clean.");
     53        storage.multipleRecipients = null;
     54        storage.lastCheckedEmail = {};
     55        storage.firstUsedInputElement = null;
     56        awSetInputAndPopupValue = storage.original_functions.awSetInputAndPopupValue;
    5657        if (storage._rdfDatasourceAccess) storage._rdfDatasourceAccess.clean();
    57     },
    58    
    59     original_functions : {
    60         awSetInputAndPopupValue : null
    61     },
    62 
    63     replacement_functions : {
    64         awSetInputAndPopupValue : function (inputElem, inputValue, popupElem, popupValue, rowNumber) {
    65             Log.debug("awSetInputAndPopupValue '" + inputElem.id + "'");
    66             storage.original_functions.awSetInputAndPopupValue(inputElem, inputValue, popupElem, popupValue, rowNumber);
    67             storage.__updateVIdentityFromStorage(inputElem, storage.currentWindow);
    68         }
    69     },
    70        
    71     awOnBlur : function (element, currentWindow) {
    72         // only react on events triggered by addressCol2 - textinput Elements
    73         if (!element || ! element.id.match(/^addressCol2*/)) return;
    74         Log.debug("awOnBlur '" + element.id + "' '" + element.value + "'");
     58      },
     59
     60      original_functions: {
     61        awSetInputAndPopupValue: null
     62      },
     63
     64      replacement_functions: {
     65        awSetInputAndPopupValue: function (inputElem, inputValue, popupElem, popupValue, rowNumber) {
     66          Log.debug("awSetInputAndPopupValue '" + inputElem.id + "'");
     67          storage.original_functions.awSetInputAndPopupValue(inputElem, inputValue, popupElem, popupValue, rowNumber);
     68          storage.__updateVIdentityFromStorage(inputElem, storage.currentWindow);
     69        }
     70      },
     71
     72      awOnBlur: function (element, currentWindow) {
     73        // only react on events triggered by addressCol2 - textinput Elements
     74        if (!element || !element.id.match(/^addressCol2*/)) return;
     75        Log.debug("awOnBlur '" + element.id + "' '" + element.value + "'");
    7576        if (typeof element.value == 'undefined') {
    76             element.value = element.getAttribute("value");
    77             Log.debug("awOnBlur second try'" + element.id + "' '" + element.value + "'");
     77          element.value = element.getAttribute("value");
     78          Log.debug("awOnBlur second try'" + element.id + "' '" + element.value + "'");
    7879        }
    7980        if (element.value == "" || typeof element.value == 'undefined') return;
    8081        storage.__updateVIdentityFromStorage(element, currentWindow);
    81         storage.focusedElement = null;
    82     },
    83 
    84     awOnFocus : function (element, currentWindow) {
    85         if (!element || ! element.id.match(/^addressCol2*/)) return;
    86         storage.focusedElement = element;
    87     },
    88 
    89     awPopupOnCommand : function (element, currentWindow) {
    90         Log.debug("awPopupOnCommand '" + element.id + "' '" + element.value + "'");
    91         storage.__updateVIdentityFromStorage(currentWindow.document.getElementById(element.id.replace(/^addressCol1/,"addressCol2")), currentWindow);
    92         if (element.selectedItem.getAttribute("value") == "addr_reply") // if reply-to is manually entered disable AutoReplyToSelf
    93             currentWindow.document.getElementById("virtualIdentityExtension_autoReplyToSelfLabel").setAttribute("hidden", "true");
    94 
    95     },
    96    
    97   initialized : null,
    98   currentWindow: null,
    99     init: function() {
    100         if (!storage.initialized) {
    101             storage._rdfDatasourceAccess = new vI.rdfDatasourceAccess();
    102 
    103             // better approach would be to use te onchange event, but this one is not fired in any change case
    104             // see https://bugzilla.mozilla.org/show_bug.cgi?id=355367
    105             // same seems to happen with the ondragdrop event
    106             if (!top.MAX_RECIPIENTS || top.MAX_RECIPIENTS == 0) top.MAX_RECIPIENTS = 1;
    107             for (var row = 1; row <= top.MAX_RECIPIENTS ; row ++) {
    108                 var input = window.awGetInputElement(row);
    109                 if (input) {
    110                     var oldBlur = input.getAttribute("onblur")
    111                     input.setAttribute("onblur", (oldBlur?oldBlur+"; ":"") +
    112                         "window.setTimeout(virtualIdentityExtension.storage.awOnBlur, 250, this, window);")
    113                     var oldFocus = input.getAttribute("onfocus")
    114                     input.setAttribute("onfocus", (oldFocus?oldFocus+"; ":"") +
    115                         "window.setTimeout(virtualIdentityExtension.storage.awOnFocus, 250, this, window);")
    116                 }
    117                 var popup = window.awGetPopupElement(row);
    118                 if (popup) {
    119                     var oldCommand = popup.getAttribute("oncommand")
    120                     popup.setAttribute("oncommand", (oldCommand?oldCommand+"; ":"") +
    121                         "window.setTimeout(virtualIdentityExtension.storage.awPopupOnCommand, 250, this, window);")
    122                 }
    123             }
    124             storage.currentWindow = window;
    125             storage.initialized = true;
    126         }
     82        storage.focusedElement = null;
     83      },
     84
     85      awOnFocus: function (element, currentWindow) {
     86        if (!element || !element.id.match(/^addressCol2*/)) return;
     87        storage.focusedElement = element;
     88      },
     89
     90      awPopupOnCommand: function (element, currentWindow) {
     91        Log.debug("awPopupOnCommand '" + element.id + "' '" + element.value + "'");
     92        storage.__updateVIdentityFromStorage(currentWindow.document.getElementById(element.id.replace(/^addressCol1/, "addressCol2")), currentWindow);
     93        if (element.selectedItem.getAttribute("value") == "addr_reply") // if reply-to is manually entered disable AutoReplyToSelf
     94          currentWindow.document.getElementById("virtualIdentityExtension_autoReplyToSelfLabel").setAttribute("hidden", "true");
     95
     96      },
     97
     98      initialized: null,
     99      currentWindow: null,
     100      init: function () {
     101        if (!storage.initialized) {
     102          storage._rdfDatasourceAccess = new vI.rdfDatasourceAccess();
     103
     104          // better approach would be to use te onchange event, but this one is not fired in any change case
     105          // see https://bugzilla.mozilla.org/show_bug.cgi?id=355367
     106          // same seems to happen with the ondragdrop event
     107          if (!top.MAX_RECIPIENTS || top.MAX_RECIPIENTS == 0) top.MAX_RECIPIENTS = 1;
     108          for (var row = 1; row <= top.MAX_RECIPIENTS; row++) {
     109            var input = window.awGetInputElement(row);
     110            if (input) {
     111              var oldBlur = input.getAttribute("onblur")
     112              input.setAttribute("onblur", (oldBlur ? oldBlur + "; " : "") +
     113                "window.setTimeout(virtualIdentityExtension.storage.awOnBlur, 250, this, window);")
     114              var oldFocus = input.getAttribute("onfocus")
     115              input.setAttribute("onfocus", (oldFocus ? oldFocus + "; " : "") +
     116                "window.setTimeout(virtualIdentityExtension.storage.awOnFocus, 250, this, window);")
     117            }
     118            var popup = window.awGetPopupElement(row);
     119            if (popup) {
     120              var oldCommand = popup.getAttribute("oncommand")
     121              popup.setAttribute("oncommand", (oldCommand ? oldCommand + "; " : "") +
     122                "window.setTimeout(virtualIdentityExtension.storage.awPopupOnCommand, 250, this, window);")
     123            }
     124          }
     125          storage.currentWindow = window;
     126          storage.initialized = true;
     127        }
    127128
    128129        if (typeof awSetInputAndPopupValue == 'function' && storage.original_functions.awSetInputAndPopupValue == null) {
    129             storage.original_functions.awSetInputAndPopupValue = awSetInputAndPopupValue;
    130             awSetInputAndPopupValue = function (inputElem, inputValue, popupElem, popupValue, rowNumber) {
    131                 storage.replacement_functions.awSetInputAndPopupValue (inputElem, inputValue, popupElem, popupValue, rowNumber) }
    132         }
    133         // reset unavailable storageExtras preferences
    134         AddonManager.getAddonByID("{847b3a00-7ab1-11d4-8f02-006008948af5}", function(addon) {
     130          storage.original_functions.awSetInputAndPopupValue = awSetInputAndPopupValue;
     131          awSetInputAndPopupValue = function (inputElem, inputValue, popupElem, popupValue, rowNumber) {
     132            storage.replacement_functions.awSetInputAndPopupValue(inputElem, inputValue, popupElem, popupValue, rowNumber)
     133          }
     134        }
     135        // reset unavailable storageExtras preferences
     136        AddonManager.getAddonByID("{847b3a00-7ab1-11d4-8f02-006008948af5}", function (addon) {
    135137          if (addon && !addon.userDisabled && !addon.appDisable) {
    136138            vI.vIprefs.commit("storageExtras_openPGP_messageEncryption", false)
     
    138140            vI.vIprefs.commit("storageExtras_openPGP_PGPMIME", false)
    139141          }
    140         });
    141     },
    142    
    143     firstUsedInputElement : null,   // this stores the first Element for which a Lookup in the Storage was successfull
    144     __updateVIdentityFromStorage: function(inputElement, currentWindow) {
    145         if (!vI.vIprefs.get("storage"))
    146             { Log.debug("Storage deactivated"); return; }
    147         var currentDocument = currentWindow.document;
    148     var recipientType = currentDocument.getElementById(inputElement.id.replace(/^addressCol2/,"addressCol1"))
    149             .selectedItem.getAttribute("value");
    150 
    151     var row = inputElement.id.replace(/^addressCol2#/,"")
    152         if (recipientType == "addr_reply" || recipientType == "addr_followup" || storage.isDoBcc(row, currentWindow)) {
    153             // reset firstUsedInputElement if recipientType was changed (and don't care about doBcc fields)
    154             if (storage.firstUsedInputElement == inputElement)
    155                 storage.firstUsedInputElement = null;
    156             Log.debug("field is a 'reply-to' or 'followup-to' or preconfigured 'doBcc'. not searched.")
    157             return;
    158         }
    159        
    160         if (inputElement.value == "") {
    161             Log.debug("no recipient found, not checked."); return;
    162         }
    163        
    164         var row = inputElement.id.replace(/^addressCol2#/,"")
    165         if (storage.lastCheckedEmail[row] && storage.lastCheckedEmail[row] == inputElement.value) {
    166             Log.debug("same email than before, not checked again."); return;
    167         }
    168         storage.lastCheckedEmail[row] = inputElement.value;
    169        
    170         // firstUsedInputElement was set before and we are not editing the same
    171         var isNotFirstInputElement = (storage.firstUsedInputElement && storage.firstUsedInputElement != inputElement)
    172         var currentIdentity = currentDocument.getElementById("virtualIdentityExtension_msgIdentityClone").identityData
    173         var storageResult = storage._rdfDatasourceAccess.updateVIdentityFromStorage(inputElement.value, recipientType,
    174             currentIdentity, currentDocument.getElementById("virtualIdentityExtension_msgIdentityClone").vid, isNotFirstInputElement, window);
    175        
    176         if (storageResult.identityCollection.number == 0) return; // return if there was no match
    177         Log.debug("__updateVIdentityFromStorage result: " + storageResult.result);
    178         // found storageData, so store InputElement
    179         if (!storage.firstUsedInputElement) storage.firstUsedInputElement = inputElement;
    180        
    181         var newMenuItem = null;
    182         if (storageResult.result != "equal") {
    183             for (var j = 0; j < storageResult.identityCollection.number; j++) {
    184                 Log.debug("__updateVIdentityFromStorage adding: " + storageResult.identityCollection.identityDataCollection[j].combinedName);
    185                 let menuItem = currentDocument.getElementById("virtualIdentityExtension_msgIdentityClone")
    186                   .addIdentityToCloneMenu(storageResult.identityCollection.identityDataCollection[j])
    187                 if (!newMenuItem) newMenuItem = menuItem;
    188             }
    189         }
    190         if (storageResult.result == "accept") {
    191             Log.debug("__updateVIdentityFromStorage selecting: " + storageResult.identityCollection.identityDataCollection[0].combinedName);
    192             currentDocument.getElementById("virtualIdentityExtension_msgIdentityClone").selectedMenuItem = newMenuItem;
    193             if (currentDocument.getElementById("virtualIdentityExtension_msgIdentityClone").vid)
    194                 vI.StorageNotification.info(storage.stringBundle.GetStringFromName("vident.smartIdentity.vIStorageUsage") + ".");
    195         }
    196     },
    197    
    198     isDoBcc : function(row, currentWindow) {
    199         var recipientType = currentWindow.awGetPopupElement(row).selectedItem.getAttribute("value");
    200         if (recipientType != "addr_bcc" || !getCurrentIdentity().doBcc) return false
    201 
    202         var doBccArray = gMsgCompose.compFields.splitRecipients(getCurrentIdentity().doBccList, false, {});
     142        });
     143      },
     144
     145      firstUsedInputElement: null, // this stores the first Element for which a Lookup in the Storage was successfull
     146      __updateVIdentityFromStorage: function (inputElement, currentWindow) {
     147        if (!vI.vIprefs.get("storage")) {
     148          Log.debug("Storage deactivated");
     149          return;
     150        }
     151        var currentDocument = currentWindow.document;
     152        var recipientType = currentDocument.getElementById(inputElement.id.replace(/^addressCol2/, "addressCol1"))
     153          .selectedItem.getAttribute("value");
     154
     155        var row = inputElement.id.replace(/^addressCol2#/, "")
     156        if (recipientType == "addr_reply" || recipientType == "addr_followup" || storage.isDoBcc(row, currentWindow)) {
     157          // reset firstUsedInputElement if recipientType was changed (and don't care about doBcc fields)
     158          if (storage.firstUsedInputElement == inputElement)
     159            storage.firstUsedInputElement = null;
     160          Log.debug("field is a 'reply-to' or 'followup-to' or preconfigured 'doBcc'. not searched.")
     161          return;
     162        }
     163
     164        if (inputElement.value == "") {
     165          Log.debug("no recipient found, not checked.");
     166          return;
     167        }
     168
     169        var row = inputElement.id.replace(/^addressCol2#/, "")
     170        if (storage.lastCheckedEmail[row] && storage.lastCheckedEmail[row] == inputElement.value) {
     171          Log.debug("same email than before, not checked again.");
     172          return;
     173        }
     174        storage.lastCheckedEmail[row] = inputElement.value;
     175
     176        // firstUsedInputElement was set before and we are not editing the same
     177        var isNotFirstInputElement = (storage.firstUsedInputElement && storage.firstUsedInputElement != inputElement)
     178        var currentIdentity = currentDocument.getElementById("virtualIdentityExtension_msgIdentityClone").identityData
     179        var storageResult = storage._rdfDatasourceAccess.updateVIdentityFromStorage(inputElement.value, recipientType,
     180          currentIdentity, currentDocument.getElementById("virtualIdentityExtension_msgIdentityClone").vid, isNotFirstInputElement, window);
     181
     182        if (storageResult.identityCollection.number == 0) return; // return if there was no match
     183        Log.debug("__updateVIdentityFromStorage result: " + storageResult.result);
     184        // found storageData, so store InputElement
     185        if (!storage.firstUsedInputElement) storage.firstUsedInputElement = inputElement;
     186
     187        var newMenuItem = null;
     188        if (storageResult.result != "equal") {
     189          for (var j = 0; j < storageResult.identityCollection.number; j++) {
     190            Log.debug("__updateVIdentityFromStorage adding: " + storageResult.identityCollection.identityDataCollection[j].combinedName);
     191            let menuItem = currentDocument.getElementById("virtualIdentityExtension_msgIdentityClone")
     192              .addIdentityToCloneMenu(storageResult.identityCollection.identityDataCollection[j])
     193            if (!newMenuItem) newMenuItem = menuItem;
     194          }
     195        }
     196        if (storageResult.result == "accept") {
     197          Log.debug("__updateVIdentityFromStorage selecting: " + storageResult.identityCollection.identityDataCollection[0].combinedName);
     198          currentDocument.getElementById("virtualIdentityExtension_msgIdentityClone").selectedMenuItem = newMenuItem;
     199          if (currentDocument.getElementById("virtualIdentityExtension_msgIdentityClone").vid)
     200            vI.StorageNotification.info(storage.stringBundle.GetStringFromName("vident.smartIdentity.vIStorageUsage") + ".");
     201        }
     202      },
     203
     204      isDoBcc: function (row, currentWindow) {
     205        var recipientType = currentWindow.awGetPopupElement(row).selectedItem.getAttribute("value");
     206        if (recipientType != "addr_bcc" || !getCurrentIdentity().doBcc) return false
     207
     208        var doBccArray = gMsgCompose.compFields.splitRecipients(getCurrentIdentity().doBccList, false, {});
    203209        if (doBccArray && doBccArray.count) {
    204             for (var index = 0; index < doBccArray.count; index++ ) {
    205                 if (doBccArray.StringAt(index) == currentWindow.awGetInputElement(row).value) {
    206                     Log.debug("ignoring doBcc field '" +
    207                         doBccArray.StringAt(index));
    208                     return true;
    209                 }
     210          for (var index = 0; index < doBccArray.count; index++) {
     211            if (doBccArray.StringAt(index) == currentWindow.awGetInputElement(row).value) {
     212              Log.debug("ignoring doBcc field '" +
     213                doBccArray.StringAt(index));
     214              return true;
    210215            }
    211         }
    212         return false
    213     }
    214 }
    215 vI.storage = storage;
    216 }});
     216          }
     217        }
     218        return false
     219      }
     220    }
     221    vI.storage = storage;
     222  }
     223});
  • content/vI_upgrade.js

    r3c9c29 r509348  
    2424
    2525Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
    26 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) {
     26virtualIdentityExtension.ns(function () {
     27  with(virtualIdentityExtension.LIB) {
    2728
    28 let Log = vI.setupLogging("virtualIdentity.upgrade");
    29 Components.utils.import("resource://v_identity/vI_rdfDatasource.js", virtualIdentityExtension);
    30 Components.utils.import("resource://v_identity/vI_account.js", virtualIdentityExtension);
    31 Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension);
     29    let Log = vI.setupLogging("virtualIdentity.upgrade");
     30    Components.utils.import("resource://v_identity/vI_rdfDatasource.js", virtualIdentityExtension);
     31    Components.utils.import("resource://v_identity/vI_account.js", virtualIdentityExtension);
     32    Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension);
    3233
    33 var upgrade = {
    34     versionChecker : Components.classes["@mozilla.org/xpcom/version-comparator;1"]
    35       .getService(Components.interfaces.nsIVersionComparator),
    36                            
    37     rdfDatasource : null,
     34    var upgrade = {
     35      versionChecker: Components.classes["@mozilla.org/xpcom/version-comparator;1"]
     36        .getService(Components.interfaces.nsIVersionComparator),
    3837
    39     quickUpgrade : function(currentVersion) {
    40       upgrade.rdfDatasource = new vI.rdfDatasource("virtualIdentity.rdf", true);
    41       if (upgrade.rdfDatasource.extUpgradeRequired())
    42         upgrade.extUpgrade();
    43       upgrade.rdfDatasource.refreshAccountInfo();
    44       upgrade.rdfDatasource.clean();
    45       return true;
    46     },
     38      rdfDatasource: null,
    4739
    48     extUpgrade : function() {
    49         var currentVersion = upgrade.rdfDatasource.getCurrentExtFileVersion();
    50         Log.debug("checking for previous version, found " +
    51             currentVersion + "... extension-upgrade required.")
    52         switch (currentVersion) {
    53             case null:
    54                 // no break
    55             default:
    56                 upgrade.__transferMovedUserPrefs(currentVersion);
    57                 upgrade.__removeObsoleteUserPrefs(currentVersion);
    58                 upgrade.__removeExtraAddedHeaders(currentVersion);
    59                 upgrade.__cleanupSmartMailboxFolders(currentVersion);
    60         }
    61         upgrade.rdfDatasource.storeExtVersion();
    62         Log.debug("extension-upgrade to " + upgrade.rdfDatasource.getCurrentExtFileVersion() + " done.");
    63     },
    64    
    65     __cleanupSmartMailboxFolders : function(currentVersion) {
     40      quickUpgrade: function (currentVersion) {
     41        upgrade.rdfDatasource = new vI.rdfDatasource("virtualIdentity.rdf", true);
     42        if (upgrade.rdfDatasource.extUpgradeRequired())
     43          upgrade.extUpgrade();
     44        upgrade.rdfDatasource.refreshAccountInfo();
     45        upgrade.rdfDatasource.clean();
     46        return true;
     47      },
     48
     49      extUpgrade: function () {
     50        var currentVersion = upgrade.rdfDatasource.getCurrentExtFileVersion();
     51        Log.debug("checking for previous version, found " +
     52          currentVersion + "... extension-upgrade required.")
     53        switch (currentVersion) {
     54        case null:
     55          // no break
     56        default:
     57          upgrade.__transferMovedUserPrefs(currentVersion);
     58          upgrade.__removeObsoleteUserPrefs(currentVersion);
     59          upgrade.__removeExtraAddedHeaders(currentVersion);
     60          upgrade.__cleanupSmartMailboxFolders(currentVersion);
     61        }
     62        upgrade.rdfDatasource.storeExtVersion();
     63        Log.debug("extension-upgrade to " + upgrade.rdfDatasource.getCurrentExtFileVersion() + " done.");
     64      },
     65
     66      __cleanupSmartMailboxFolders: function (currentVersion) {
    6667        if ((!currentVersion || upgrade.versionChecker.compare(currentVersion, "0.9.26") < 0)) {
    67             Log.debug("cleaning leftover 'smart mailboxes' == 'unified folder mailboxes'");
    68             // remove obsolete 'smart mailboxes'=='unified folder' server entries
    69             // this is only required because of a virtualIdentity bug introduced in 0.9.22 and fixed in 0.9.26
     68          Log.debug("cleaning leftover 'smart mailboxes' == 'unified folder mailboxes'");
     69          // remove obsolete 'smart mailboxes'=='unified folder' server entries
     70          // this is only required because of a virtualIdentity bug introduced in 0.9.22 and fixed in 0.9.26
    7071
    71             //  compare against all accounts, getAccountsArray() does not include 'smart mailboxes' == 'unified folders'
    72             var all_accounts = vI.prefroot.getCharPref("mail.accountmanager.accounts").split(",");
     72          //  compare against all accounts, getAccountsArray() does not include 'smart mailboxes' == 'unified folders'
     73          var all_accounts = vI.prefroot.getCharPref("mail.accountmanager.accounts").split(",");
    7374
    74             for each (let pref in vI.prefroot.getChildList("mail.server")) {
    75                 if (pref.indexOf(".hostname") == pref.length - 9 && vI.prefroot.getCharPref(pref) == "smart mailboxes") {
    76                     // ok, smart mailbox server found, check if it still in use
    77                     let server = pref.replace(/^mail\.server\./,"").replace(/\.hostname$/,"");
    78                     let inUse = false;
    79                     for each (let account in all_accounts) {
    80                         if (vI.prefroot.getCharPref("mail.account." + account + ".server") == server)
    81                             inUse = true;
    82                     }
    83                     if (!inUse) {
    84                         Log.debug("cleaning leftover 'smart mailbox' for server " + server);
    85                         for each (let obsoletePref in vI.prefroot.getChildList("mail.server." + server)) {
    86                             if (obsoletePref.indexOf(".directory") == obsoletePref.length - 10) {
    87                                 // remove obsolete 'smart mailbox' directory
    88                                 try {
    89                                     let file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile);
    90                                     file.initWithPath(vI.prefroot.getCharPref(obsoletePref));
    91                                     Log.debug("removing obsolete storage Folder " + vI.prefroot.getCharPref(obsoletePref));
    92                                     file.remove(true);
    93                                 } catch (NS_ERROR_FILE_UNRECOGNIZED_PATH) { };
    94                             }
    95                             vI.prefroot.clearUserPref(obsoletePref);
    96                         }
    97                     }
     75          for each(let pref in vI.prefroot.getChildList("mail.server")) {
     76            if (pref.indexOf(".hostname") == pref.length - 9 && vI.prefroot.getCharPref(pref) == "smart mailboxes") {
     77              // ok, smart mailbox server found, check if it still in use
     78              let server = pref.replace(/^mail\.server\./, "").replace(/\.hostname$/, "");
     79              let inUse = false;
     80              for each(let account in all_accounts) {
     81                if (vI.prefroot.getCharPref("mail.account." + account + ".server") == server)
     82                  inUse = true;
     83              }
     84              if (!inUse) {
     85                Log.debug("cleaning leftover 'smart mailbox' for server " + server);
     86                for each(let obsoletePref in vI.prefroot.getChildList("mail.server." + server)) {
     87                  if (obsoletePref.indexOf(".directory") == obsoletePref.length - 10) {
     88                    // remove obsolete 'smart mailbox' directory
     89                    try {
     90                      let file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile);
     91                      file.initWithPath(vI.prefroot.getCharPref(obsoletePref));
     92                      Log.debug("removing obsolete storage Folder " + vI.prefroot.getCharPref(obsoletePref));
     93                      file.remove(true);
     94                    } catch (NS_ERROR_FILE_UNRECOGNIZED_PATH) {};
     95                  }
     96                  vI.prefroot.clearUserPref(obsoletePref);
    9897                }
     98              }
    9999            }
     100          }
    100101        }
    101     },
    102    
    103     __removeExtraAddedHeaders : function(currentVersion) {
    104         if ((!currentVersion || upgrade.versionChecker.compare(currentVersion, "0.6.9") < 0) && 
    105                 vI.prefroot.getCharPref("mailnews.headers.extraExpandedHeaders") != "") {
    106             // clean extraExpandedHeaders once, because the whole header-saving and restoring was broken too long
    107             Log.debug("cleaning extraExpandedHeaders");
    108             vI.prefroot.setCharPref("mailnews.headers.extraExpandedHeaders", "")
    109             Log.debug("cleaned extraExpandedHeaders");
     102      },
     103
     104      __removeExtraAddedHeaders: function (currentVersion) {
     105        if ((!currentVersion || upgrade.versionChecker.compare(currentVersion, "0.6.9") < 0) &&
     106          vI.prefroot.getCharPref("mailnews.headers.extraExpandedHeaders") != "") {
     107          // clean extraExpandedHeaders once, because the whole header-saving and restoring was broken too long
     108          Log.debug("cleaning extraExpandedHeaders");
     109          vI.prefroot.setCharPref("mailnews.headers.extraExpandedHeaders", "")
     110          Log.debug("cleaned extraExpandedHeaders");
    110111        }
    111     },
    112    
    113     __transferMovedUserPrefs : function(currentVersion) {
    114         // transfer renamed preferences
    115         var transferPrefs = [   { version : "0.5.3",
    116                     prefs : Array({ sourcePref : "smart_reply_ask", targetPref : "idSelection_ask" },
    117                         { sourcePref : "smart_reply_ask_always", targetPref : "idSelection_ask_always" },
    118                         { sourcePref : "smart_reply_autocreate", targetPref : "idSelection_autocreate" },
    119                         { sourcePref : "smart_timestamp", targetPref : "autoTimestamp" },
    120                         { sourcePref : "storage_prefer_smart_reply", targetPref : "idSelection_storage_prefer_smart_reply" },
    121                         { sourcePref : "storage_ignore_smart_reply", targetPref : "idSelection_storage_ignore_smart_reply" }) }];
    122         // remove obsolete preference-tree virtualIdentity
    123         for (var i = 0; i < transferPrefs.length; i++) {
    124             // if former version of extension was at least 0.5.0, start with WizardPage 0.5.2
    125             if (!currentVersion || (upgrade.versionChecker.compare(currentVersion, transferPrefs[i].version) < 0)) {
    126                 // remove any obsolete preferences under extensions.virtualIdentity
    127                 Log.debug("transfer changed preferences of pre-" + transferPrefs[i].version + " release...")
    128                 for each (let transferPref in transferPrefs[i].prefs) {
    129                     try {   vI.vIprefs.commit(transferPref.targetPref,
    130                             vI.vIprefs.get(transferPref.sourcePref));
    131                         vI.vIprefs.clearUserPref(transferPref.sourcePref);
    132                     }
    133                     catch (e) { };
    134                 }
    135                 Log.debug("done.")
    136             }
    137         }
    138     },
    139    
    140     __removeObsoleteUserPrefs : function(currentVersion) {
    141         var obsoletePrefs = [   { version : "0.5.0",
    142                     prefs : Array("aBook_use", "aBook_storedefault", "aBook_dont_update_multiple",
    143                     "aBook_show_switch", "aBook_warn_update", "aBook_use_for_smart_reply",
    144                     "aBook_prefer_smart_reply", "aBook_ignore_smart_reply", "aBook_warn_vI_replace",
    145                     "aBook_use_non_vI", "aBook_notification", "storeVIdentity", "experimental",
    146                     "storage_use_for_smart_reply") },
    147                     { version : "0.5.3", prefs : Array("storage_use_for_smart_reply") },
    148                     { version : "0.5.6", prefs : Array("copyEnigmailSettings") },
    149                     { version: "0.9", prefs : Array("extensions.virtualIdentity.{2ab1b709-ba03-4361-abf9-c50b964ff75d}",
    150                                                     "extensions.virtualIdentity.{847b3a00-7ab1-11d4-8f02-006008948af5}",
    151                                                     "extensions.virtualIdentity.smart_reply_added_extraHeaders",
    152                                                     "mailnews.headers.extraExpandedHeaders") }
    153                     ];
    154         // remove obsolete preference-tree virtualIdentity
    155         for (var i = 0; i < obsoletePrefs.length; i++) {
    156             // if former version of extension was at least 0.5.0, start with WizardPage 0.5.2
    157             if (!currentVersion || (upgrade.versionChecker.compare(currentVersion, obsoletePrefs[i].version) < 0)) {
    158                 // remove any obsolete preferences under extensions.virtualIdentity
    159                 Log.debug("removing obsolete preferences of pre-" + obsoletePrefs[i].version + " release...")
    160                 for each (let pref in obsoletePrefs[i].prefs) {
    161                     try { vI.vIprefs.clearUserPref(pref); Log.debug(".") }
    162                     catch (e) { };
    163                 }
    164                 Log.debug("done.")
    165             }
    166         }
    167     },
    168 }
    169 vI.upgrade = upgrade;
    170 }});
     112      },
     113
     114      __transferMovedUserPrefs: function (currentVersion) {
     115        // transfer renamed preferences
     116        var transferPrefs = [{
     117          version: "0.5.3",
     118          prefs: Array({
     119            sourcePref: "smart_reply_ask",
     120            targetPref: "idSelection_ask"
     121          }, {
     122            sourcePref: "smart_reply_ask_always",
     123            targetPref: "idSelection_ask_always"
     124          }, {
     125            sourcePref: "smart_reply_autocreate",
     126            targetPref: "idSelection_autocreate"
     127          }, {
     128            sourcePref: "smart_timestamp",
     129            targetPref: "autoTimestamp"
     130          }, {
     131            sourcePref: "storage_prefer_smart_reply",
     132            targetPref: "idSelection_storage_prefer_smart_reply"
     133          }, {
     134            sourcePref: "storage_ignore_smart_reply",
     135            targetPref: "idSelection_storage_ignore_smart_reply"
     136          })
     137        }];
     138        // remove obsolete preference-tree virtualIdentity
     139        for (var i = 0; i < transferPrefs.length; i++) {
     140          // if former version of extension was at least 0.5.0, start with WizardPage 0.5.2
     141          if (!currentVersion || (upgrade.versionChecker.compare(currentVersion, transferPrefs[i].version) < 0)) {
     142            // remove any obsolete preferences under extensions.virtualIdentity
     143            Log.debug("transfer changed preferences of pre-" + transferPrefs[i].version + " release...")
     144            for each(let transferPref in transferPrefs[i].prefs) {
     145              try {
     146                vI.vIprefs.commit(transferPref.targetPref,
     147                  vI.vIprefs.get(transferPref.sourcePref));
     148                vI.vIprefs.clearUserPref(transferPref.sourcePref);
     149              } catch (e) {};
     150            }
     151            Log.debug("done.")
     152          }
     153        }
     154      },
     155
     156      __removeObsoleteUserPrefs: function (currentVersion) {
     157        var obsoletePrefs = [{
     158          version: "0.5.0",
     159          prefs: Array("aBook_use", "aBook_storedefault", "aBook_dont_update_multiple",
     160            "aBook_show_switch", "aBook_warn_update", "aBook_use_for_smart_reply",
     161            "aBook_prefer_smart_reply", "aBook_ignore_smart_reply", "aBook_warn_vI_replace",
     162            "aBook_use_non_vI", "aBook_notification", "storeVIdentity", "experimental",
     163            "storage_use_for_smart_reply")
     164        }, {
     165          version: "0.5.3",
     166          prefs: Array("storage_use_for_smart_reply")
     167        }, {
     168          version: "0.5.6",
     169          prefs: Array("copyEnigmailSettings")
     170        }, {
     171          version: "0.9",
     172          prefs: Array("extensions.virtualIdentity.{2ab1b709-ba03-4361-abf9-c50b964ff75d}",
     173            "extensions.virtualIdentity.{847b3a00-7ab1-11d4-8f02-006008948af5}",
     174            "extensions.virtualIdentity.smart_reply_added_extraHeaders",
     175            "mailnews.headers.extraExpandedHeaders")
     176        }];
     177        // remove obsolete preference-tree virtualIdentity
     178        for (var i = 0; i < obsoletePrefs.length; i++) {
     179          // if former version of extension was at least 0.5.0, start with WizardPage 0.5.2
     180          if (!currentVersion || (upgrade.versionChecker.compare(currentVersion, obsoletePrefs[i].version) < 0)) {
     181            // remove any obsolete preferences under extensions.virtualIdentity
     182            Log.debug("removing obsolete preferences of pre-" + obsoletePrefs[i].version + " release...")
     183            for each(let pref in obsoletePrefs[i].prefs) {
     184              try {
     185                vI.vIprefs.clearUserPref(pref);
     186                Log.debug(".")
     187              } catch (e) {};
     188            }
     189            Log.debug("done.")
     190          }
     191        }
     192      },
     193    }
     194    vI.upgrade = upgrade;
     195  }
     196});
  • content/v_identity.js

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

    r3c9c29 r509348  
    3636function identityDataExtrasObject_PGPEncryption(currentWindow) {
    3737  this.currentWindow = currentWindow;
    38   this.field  = "PGPEnc";                        // description of the option
    39   this.option = "storageExtras_openPGP_messageEncryption";    // option string to get preference settings
     38  this.field = "PGPEnc"; // description of the option
     39  this.option = "storageExtras_openPGP_messageEncryption"; // option string to get preference settings
    4040  this.elementID_msgCompose = "enigmail_encrypted_send";
    41   this.updateFunction_msgCompose = function() {
    42     (typeof(this.currentWindow.Enigmail.msg.setMenuSettings)=='function')?this.currentWindow.Enigmail.msg.setMenuSettings(''):null };
     41  this.updateFunction_msgCompose = function () {
     42    (typeof (this.currentWindow.Enigmail.msg.setMenuSettings) == 'function') ? this.currentWindow.Enigmail.msg.setMenuSettings(''): null
     43  };
    4344}
    4445identityDataExtrasObject_PGPEncryption.prototype = {
    4546  __proto__: identityDataExtrasCheckboxObject.prototype,
    46  
    47   readIdentityValue : function(identity) {
    48     if (this.active) this.value = (identity.getIntAttribute('defaultEncryptionPolicy') > 0)?"true":"false";
     47
     48  readIdentityValue: function (identity) {
     49    if (this.active) this.value = (identity.getIntAttribute('defaultEncryptionPolicy') > 0) ? "true" : "false";
    4950  }
    5051}
  • modules/identityDataExtras/PGPMIME.js

    r3c9c29 r509348  
    3636function identityDataExtrasObject_PGPMIME(currentWindow) {
    3737  this.currentWindow = currentWindow;
    38   this.field  = "PGPMIME";                        // description of the option
    39   this.option = "storageExtras_openPGP_PGPMIME";    // option string to get preference settings
     38  this.field = "PGPMIME"; // description of the option
     39  this.option = "storageExtras_openPGP_PGPMIME"; // option string to get preference settings
    4040  this.elementID_msgCompose = "enigmail_sendPGPMime";
    41   this.updateFunction_msgCompose = function() {
    42     (typeof(this.currentWindow.Enigmail.msg.setMenuSettings)=='function')?this.currentWindow.Enigmail.msg.setMenuSettings(''):null };
     41  this.updateFunction_msgCompose = function () {
     42    (typeof (this.currentWindow.Enigmail.msg.setMenuSettings) == 'function') ? this.currentWindow.Enigmail.msg.setMenuSettings(''): null
     43  };
    4344}
    4445identityDataExtrasObject_PGPMIME.prototype = {
    4546  __proto__: identityDataExtrasCheckboxObject.prototype,
    46  
    47   readIdentityValue : function(identity) {
    48     if (this.active) this.value = (identity.getBoolAttribute('pgpMimeMode'))?"true":"false";
     47
     48  readIdentityValue: function (identity) {
     49    if (this.active) this.value = (identity.getBoolAttribute('pgpMimeMode')) ? "true" : "false";
    4950  }
    5051}
  • modules/identityDataExtras/PGPSignature.js

    r3c9c29 r509348  
    3636function identityDataExtrasObject_PGPSignature(currentWindow) {
    3737  this.currentWindow = currentWindow;
    38   this.field  = "PGPSig";                        // description of the option
    39   this.option = "storageExtras_openPGP_messageSignature";    // option string to get preference settings
     38  this.field = "PGPSig"; // description of the option
     39  this.option = "storageExtras_openPGP_messageSignature"; // option string to get preference settings
    4040  this.elementID_msgCompose = "enigmail_signed_send";
    41   this.updateFunction_msgCompose = function() {
    42     (typeof(this.currentWindow.Enigmail.msg.setMenuSettings)=='function')?this.currentWindow.Enigmail.msg.setMenuSettings(''):null };
     41  this.updateFunction_msgCompose = function () {
     42    (typeof (this.currentWindow.Enigmail.msg.setMenuSettings) == 'function') ? this.currentWindow.Enigmail.msg.setMenuSettings(''): null
     43  };
    4344}
    4445identityDataExtrasObject_PGPSignature.prototype = {
    4546  __proto__: identityDataExtrasCheckboxObject.prototype,
    46  
    47   readIdentityValue : function(identity) {
     47
     48  readIdentityValue: function (identity) {
    4849    if (this.active) {
    4950      if (identity.getIntAttribute('defaultEncryptionPolicy') > 0)
    50         this.value = (identity.getBoolAttribute('pgpSignEncrypted'))?"true":"false";
     51        this.value = (identity.getBoolAttribute('pgpSignEncrypted')) ? "true" : "false";
    5152      else
    52         this.value = (identity.getBoolAttribute('pgpSignPlain'))?"true":"false";
     53        this.value = (identity.getBoolAttribute('pgpSignPlain')) ? "true" : "false";
    5354    }
    5455  }
  • modules/identityDataExtras/characterEncoding.js

    r3c9c29 r509348  
    3434let legacy = false; // use pre TB-32 legacy code
    3535try {
    36     Cu.import("resource://gre/modules/CharsetMenu.jsm");
     36  Cu.import("resource://gre/modules/CharsetMenu.jsm");
    3737} catch (e) {
    38     legacy = true; // pre TB-32-version, might be removed in the future
     38  legacy = true; // pre TB-32-version, might be removed in the future
    3939}
    40    
     40
    4141
    4242let Log = setupLogging("virtualIdentity.identityDataExtras.characterEncoding");
     
    4444function identityDataExtrasObject_characterEncoding(currentWindow) {
    4545  this.currentWindow = currentWindow;
    46   this.field  = "charEnc";                        // description of the option
    47   this.option = "storageExtras_characterEncoding";    // option string to get preference settings
     46  this.field = "charEnc"; // description of the option
     47  this.option = "storageExtras_characterEncoding"; // option string to get preference settings
    4848}
    4949identityDataExtrasObject_characterEncoding.prototype = {
    5050  __proto__: identityDataExtrasObject.prototype,
    51  
    52   get valueHtml() { return this.valueNice; },
     51
     52  get valueHtml() {
     53    return this.valueNice;
     54  },
    5355  get valueNice() {
    54       return this.value?this.currentWindow.gCharsetConvertManager
    55                   .getCharsetTitle(this.currentWindow.gCharsetConvertManager.getCharsetAlias(this.value)):"";
     56    return this.value ? this.currentWindow.gCharsetConvertManager
     57      .getCharsetTitle(this.currentWindow.gCharsetConvertManager.getCharsetAlias(this.value)) : "";
    5658  },
    5759
    5860  // pre TB-32-version, might be removed in the future --------------------------------
    59   _setMenuMark: function() {
     61  _setMenuMark: function () {
    6062    var maileditCharsetMenu = this.currentWindow.document.getElementById("maileditCharsetMenu")
    6163    var value = maileditCharsetMenu.getAttribute("unmarkedValue")
    6264    if (value) {
    63         var menuitem = this.currentWindow.document.getElementById(value);
    64         if (menuitem)
    65           menuitem.setAttribute('checked', 'true');
    66         maileditCharsetMenu.removeAttribute("unmarkedValue")
     65      var menuitem = this.currentWindow.document.getElementById(value);
     66      if (menuitem)
     67        menuitem.setAttribute('checked', 'true');
     68      maileditCharsetMenu.removeAttribute("unmarkedValue")
    6769    }
    6870  },
    6971  // ----------------------------------------------------------------------------------
    70  
    71   setValueToEnvironment_msgCompose: function() {
     72
     73  setValueToEnvironment_msgCompose: function () {
    7274    if (!this.value)
    7375      return;
    7476    // pre TB-32-version, might be removed in the future --------------------------------
    7577    if (legacy) {
    76         // old style
    77         var menuitem = this.currentWindow.document.getElementById(this.value);
    78         if (menuitem)
     78      // old style
     79      var menuitem = this.currentWindow.document.getElementById(this.value);
     80      if (menuitem)
    7981        menuitem.setAttribute('checked', 'true');
    80         else { // set menumark later if menu is not ready yet
     82      else { // set menumark later if menu is not ready yet
    8183        var maileditCharsetMenu = this.currentWindow.document.getElementById("maileditCharsetMenu")
    8284        maileditCharsetMenu.setAttribute("unmarkedValue", this.value)
    8385        var onpopupshowing = maileditCharsetMenu.getAttribute("onpopupshowing")
    8486        this.currentWindow.document.getElementById("maileditCharsetMenu").setAttribute("onpopupshowing",
    85             onpopupshowing + ";this._setMenuMark();")
    86         }
     87          onpopupshowing + ";this._setMenuMark();")
     88      }
    8789    }
    8890    // ----------------------------------------------------------------------------------
     
    9092    this.currentWindow.SetDocumentCharacterSet(this.value);
    9193  },
    92  
    93   setValueToEnvironment_dataEditor: function() {
     94
     95  setValueToEnvironment_dataEditor: function () {
    9496    // pre TB-32-version, might be removed in the future --------------------------------
    9597    if (legacy) {
    9698      this.currentWindow.CreateMenu('mailedit'); // this is part of the magic included by the xul-binding
    97         if (this.value != null) {
    98             this.currentWindow.document.getElementById("maileditCharsetMenu").selectedItem = this.currentWindow.document.getElementById(this.value);
    99             this.currentWindow.document.getElementById("vI_" + this.option + "_store").setAttribute("checked", "true");
    100         }
     99      if (this.value != null) {
     100        this.currentWindow.document.getElementById("maileditCharsetMenu").selectedItem = this.currentWindow.document.getElementById(this.value);
     101        this.currentWindow.document.getElementById("vI_" + this.option + "_store").setAttribute("checked", "true");
     102      }
    101103    }
    102104    // ----------------------------------------------------------------------------------
    103105    else {
    104         CharsetMenu.build(this.currentWindow.document.getElementById("charsetPopup"), false, false)
    105         if (this.value != null) {
    106             CharsetMenu.update(this.currentWindow.document.getElementById("maileditCharsetMenu"), this.value);
    107             this.currentWindow.document.getElementById("maileditCharsetMenu").setAttribute("label",CharsetMenu._getCharsetLabel(this.value));
    108             this.currentWindow.document.getElementById("vI_" + this.option + "_store").setAttribute("checked", "true");
    109         }
     106      CharsetMenu.build(this.currentWindow.document.getElementById("charsetPopup"), false, false)
     107      if (this.value != null) {
     108        CharsetMenu.update(this.currentWindow.document.getElementById("maileditCharsetMenu"), this.value);
     109        this.currentWindow.document.getElementById("maileditCharsetMenu").setAttribute("label", CharsetMenu._getCharsetLabel(this.value));
     110        this.currentWindow.document.getElementById("vI_" + this.option + "_store").setAttribute("checked", "true");
     111      }
    110112    }
    111113    this.currentWindow.document.getElementById("vI_" + this.option + "_store").doCommand();
    112114  },
    113  
    114   getValueFromEnvironment_msgCompose: function() {
     115
     116  getValueFromEnvironment_msgCompose: function () {
    115117    // read the value from the internal vI object, global object might not be available any more
    116118    // happens especially while storing after sending the message
     
    119121      var charsetAlias = this.currentWindow.gCharsetConvertManager.getCharsetAlias(this.value);
    120122      if (charsetAlias == "us-ascii")
    121         this.value = "ISO-8859-1";   // no menu item for "us-ascii"
     123        this.value = "ISO-8859-1"; // no menu item for "us-ascii"
    122124    }
    123125  },
    124  
    125   getValueFromEnvironment_dataEditor: function() {
     126
     127  getValueFromEnvironment_dataEditor: function () {
    126128    if (this.currentWindow.document.getElementById("vI_" + this.option + "_store").getAttribute("checked") == "true")
    127       // check if element is selected (list might not contain relevant entry)
     129    // check if element is selected (list might not contain relevant entry)
    128130      if (this.currentWindow.document.getElementById("maileditCharsetMenu").selectedItem)
    129         // pre TB-32-version, might be removed in the future --------------------------------
     131      // pre TB-32-version, might be removed in the future --------------------------------
    130132        if (legacy) {
    131             this.value = this.currentWindow.document.getElementById("maileditCharsetMenu").selectedItem.id
     133          this.value = this.currentWindow.document.getElementById("maileditCharsetMenu").selectedItem.id
    132134        }
    133135        // ----------------------------------------------------------------------------------
    134136        else {
    135             this.value = this.currentWindow.document.getElementById("maileditCharsetMenu").selectedItem.getAttribute('charset');
    136         }
    137     else
     137          this.value = this.currentWindow.document.getElementById("maileditCharsetMenu").selectedItem.getAttribute('charset');
     138        } else
    138139      this.value = null;
    139140  }
  • modules/identityDataExtras/fccSwitch.js

    r3c9c29 r509348  
    3636function identityDataExtrasObject_fccSwitch(currentWindow) {
    3737  this.currentWindow = currentWindow;
    38   this.field  = "fcc";                        // description of the option
    39   this.option = "storageExtras_fcc";    // option string to get preference settings
     38  this.field = "fcc"; // description of the option
     39  this.option = "storageExtras_fcc"; // option string to get preference settings
    4040  this.elementID_msgCompose = "virtualIdentityExtension_fccSwitch";
    4141}
    4242identityDataExtrasObject_fccSwitch.prototype = {
    4343  __proto__: identityDataExtrasCheckboxObject.prototype,
    44  
    45   readIdentityValue : function(identity) {
    46     if (this.active) this.value = (identity.doFcc)?"true":"false";
     44
     45  readIdentityValue: function (identity) {
     46    if (this.active) this.value = (identity.doFcc) ? "true" : "false";
    4747  },
    4848
    49   setValueToEnvironment_msgCompose: function() {
     49  setValueToEnvironment_msgCompose: function () {
    5050    var element = this.currentWindow.document.getElementById(this.elementID_msgCompose);
    5151    if (!this.active || (this.value == null) || !element)
    5252      return;
    53    
     53
    5454    this.updateFunction_msgCompose();
    5555    if ((element.getAttribute("checked") == "true") != (this.value == "true")) {
    56       Log.debug("change "+ this.field + " to " + this.value + " directly");
     56      Log.debug("change " + this.field + " to " + this.value + " directly");
    5757      element.setAttribute("checked", (element.getAttribute("checked") != "true"));
    5858    }
  • modules/identityDataExtras/messageFormat.js

    r3c9c29 r509348  
    3636function identityDataExtrasObject_messageFormat(currentWindow) {
    3737  this.currentWindow = currentWindow;
    38   this.field  = "msgFormat";                        // description of the option
    39   this.option = "storageExtras_messageFormat";    // option string to get preference settings
     38  this.field = "msgFormat"; // description of the option
     39  this.option = "storageExtras_messageFormat"; // option string to get preference settings
    4040}
    4141identityDataExtrasObject_messageFormat.prototype = {
    4242  __proto__: identityDataExtrasObject.prototype,
    43  
     43
    4444  // functions to get nicely formatted output
    45   get valueHtml() { return this.valueNice; },
     45  get valueHtml() {
     46    return this.valueNice;
     47  },
    4648  get valueNice() {
    47     return this.value?this.currentWindow.document.getElementById(this.value).label:"";
     49    return this.value ? this.currentWindow.document.getElementById(this.value).label : "";
    4850  },
    4951
    50   setValueToEnvironment_msgCompose: function() {
     52  setValueToEnvironment_msgCompose: function () {
    5153    if (this.value == null)
    5254      return
    5355    this.currentWindow.document.getElementById("outputFormatMenu").removeAttribute("hidden");
    54     this.currentWindow.document.getElementById(this.value).setAttribute("checked","true");
     56    this.currentWindow.document.getElementById(this.value).setAttribute("checked", "true");
    5557    this.currentWindow.OutputFormatMenuSelect(this.currentWindow.document.getElementById(this.value))
    5658  },
    57  
    58   setValueToEnvironment_dataEditor: function() {
     59
     60  setValueToEnvironment_dataEditor: function () {
    5961    if (this.value != null) {
    6062      this.currentWindow.document.getElementById("outputFormatMenu").selectedItem = this.currentWindow.document.getElementById(this.value);
     
    6264    }
    6365    this.currentWindow.document.getElementById("vI_" + this.option + "_store").doCommand();
    64  },
    65  
    66   getValueFromEnvironment_msgCompose: function() {
     66  },
     67
     68  getValueFromEnvironment_msgCompose: function () {
    6769    const nsIMsgCompSendFormat = Components.interfaces.nsIMsgCompSendFormat;
    6870    switch (this.currentWindow.gSendFormat) {
    69       case nsIMsgCompSendFormat.AskUser: this.value = "format_auto"; break;
    70       case nsIMsgCompSendFormat.PlainText: this.value = "format_plain"; break;
    71       case nsIMsgCompSendFormat.HTML: this.value = "format_html"; break;
    72       case nsIMsgCompSendFormat.Both: this.value = "format_both"; break;
     71    case nsIMsgCompSendFormat.AskUser:
     72      this.value = "format_auto";
     73      break;
     74    case nsIMsgCompSendFormat.PlainText:
     75      this.value = "format_plain";
     76      break;
     77    case nsIMsgCompSendFormat.HTML:
     78      this.value = "format_html";
     79      break;
     80    case nsIMsgCompSendFormat.Both:
     81      this.value = "format_both";
     82      break;
    7383    }
    7484  },
    75  
    76   getValueFromEnvironment_dataEditor: function() {
     85
     86  getValueFromEnvironment_dataEditor: function () {
    7787    if (this.currentWindow.document.getElementById("vI_" + this.option + "_store").getAttribute("checked") == "true")
    7888      this.value = this.currentWindow.document.getElementById("outputFormatMenu").selectedItem.id
  • modules/identityDataExtras/returnReceipt.js

    r3c9c29 r509348  
    3636function identityDataExtrasObject_ReturnReceipt(currentWindow) {
    3737  this.currentWindow = currentWindow;
    38   this.field  = "receipt";                        // description of the option
    39   this.option = "storageExtras_returnReciept";    // option string to get preference settings
     38  this.field = "receipt"; // description of the option
     39  this.option = "storageExtras_returnReciept"; // option string to get preference settings
    4040  this.elementID_msgCompose = "returnReceiptMenu";
    4141}
    4242identityDataExtrasObject_ReturnReceipt.prototype = {
    4343  __proto__: identityDataExtrasCheckboxObject.prototype,
    44  
    45   readIdentityValue : function(identity) {
    46     if (this.active) this.value =  identity.requestReturnReceipt;
     44
     45  readIdentityValue: function (identity) {
     46    if (this.active) this.value = identity.requestReturnReceipt;
    4747  }
    4848}
  • modules/identityDataExtras/sMimeEncryption.js

    r3c9c29 r509348  
    3636function identityDataExtrasObject_sMimeEncryption(currentWindow) {
    3737  this.currentWindow = currentWindow;
    38   this.field  = "sMimeEnc";                        // description of the option
    39   this.option = "storageExtras_sMime_messageEncryption";    // option string to get preference settings
     38  this.field = "sMimeEnc"; // description of the option
     39  this.option = "storageExtras_sMime_messageEncryption"; // option string to get preference settings
    4040  this.elementID_msgCompose = "menu_securityEncryptRequire1";
    41   this.updateFunction_msgCompose = function() {
    42     (typeof(this.currentWindow.setSecuritySettings)=='function')?this.currentWindow.setSecuritySettings(1):null };
     41  this.updateFunction_msgCompose = function () {
     42    (typeof (this.currentWindow.setSecuritySettings) == 'function') ? this.currentWindow.setSecuritySettings(1): null
     43  };
    4344}
    4445identityDataExtrasObject_sMimeEncryption.prototype = {
    4546  __proto__: identityDataExtrasCheckboxObject.prototype,
    46  
    47   readIdentityValue : function(identity) {
    48     if (this.active) this.value = (identity.getIntAttribute('encryptionpolicy') == 2)?"true":"false";
     47
     48  readIdentityValue: function (identity) {
     49    if (this.active) this.value = (identity.getIntAttribute('encryptionpolicy') == 2) ? "true" : "false";
    4950  }
    5051}
  • modules/identityDataExtras/sMimeSignature.js

    r3c9c29 r509348  
    3636function identityDataExtrasObject_sMimeSignature(currentWindow) {
    3737  this.currentWindow = currentWindow;
    38   this.field  = "sMimeSig";                        // description of the option
    39   this.option = "storageExtras_sMime_messageSignature";    // option string to get preference settings
     38  this.field = "sMimeSig"; // description of the option
     39  this.option = "storageExtras_sMime_messageSignature"; // option string to get preference settings
    4040  this.elementID_msgCompose = "menu_securitySign1";
    41   this.updateFunction_msgCompose = function() {
    42     (typeof(this.currentWindow.setSecuritySettings)=='function')?this.currentWindow.setSecuritySettings(1):null };
     41  this.updateFunction_msgCompose = function () {
     42    (typeof (this.currentWindow.setSecuritySettings) == 'function') ? this.currentWindow.setSecuritySettings(1): null
     43  };
    4344}
    4445identityDataExtrasObject_sMimeSignature.prototype = {
    4546  __proto__: identityDataExtrasCheckboxObject.prototype,
    46  
    47   readIdentityValue : function(identity) {
    48     if (this.active) this.value = (identity.getBoolAttribute('sign_mail'))?"true":"false";
     47
     48  readIdentityValue: function (identity) {
     49    if (this.active) this.value = (identity.getBoolAttribute('sign_mail')) ? "true" : "false";
    4950  }
    5051}
  • modules/plugins/conversations.js

    r3c9c29 r509348  
    2222    Contributor(s):
    2323 * ***** END LICENSE BLOCK ***** */
    24  
     24
    2525var EXPORTED_SYMBOLS = [];
    2626
    27 const {classes: Cc, interfaces: Ci, utils: Cu, results : Cr} = Components;
     27const {
     28  classes: Cc,
     29  interfaces: Ci,
     30  utils: Cu,
     31  results: Cr
     32} = Components;
    2833
    2934Cu.import("resource://v_identity/vI_log.js");
     
    3843const AccountManager = Cc["@mozilla.org/messenger/account-manager;1"]
    3944  .getService(Components.interfaces.nsIMsgAccountManager);
    40  
     45
    4146const HeaderParser = Cc["@mozilla.org/messenger/headerparser;1"]
    4247  .getService(Ci.nsIMsgHeaderParser);
     
    4954let _rdfDatasourceAccess;
    5055
    51 let changeIdentityToSmartIdentity = function(allIdentities, index) {
     56let changeIdentityToSmartIdentity = function (allIdentities, index) {
    5257  _changeIdentityToSmartIdentity(allIdentities.identityDataCollection[index]);
    5358};
    5459
    55 let _changeIdentityToSmartIdentity = function(identityData) {
     60let _changeIdentityToSmartIdentity = function (identityData) {
    5661  Log.debug("changeIdentityToSmartIdentity");
    57  
    58   if ( identityData.id.key != null ) {
     62
     63  if (identityData.id.key != null) {
    5964    currentParams.identity = AccountManager.getIdentity(identityData.id.key);
    6065    Log.debug("changed base identity to ", identityData.id.key);
     
    7378  onComposeSessionChanged: function _virtualIdentityHook_onComposeSessionChanged(aComposeSession, aMessage, aAddress) {
    7479    let toAddrList = aAddress.to.concat(aAddress.cc);
    75    
    76     currentParams = aComposeSession.params; virtualSenderNameElem = aComposeSession.senderNameElem; // to enable access from out of this class.
     80
     81    currentParams = aComposeSession.params;
     82    virtualSenderNameElem = aComposeSession.senderNameElem; // to enable access from out of this class.
    7783    let identity = aComposeSession.params.identity;
    78    
    79     if (typeof(this._AccountManager.getServersForIdentity) == 'function') { // new style
    80         let server = this._AccountManager.getServersForIdentity(identity).queryElementAt(0, Components.interfaces.nsIMsgIncomingServer);
     84
     85    if (typeof (this._AccountManager.getServersForIdentity) == 'function') { // new style
     86      let server = this._AccountManager.getServersForIdentity(identity).queryElementAt(0, Components.interfaces.nsIMsgIncomingServer);
    8187    } else {
    82         let server = this._AccountManager.GetServersForIdentity(identity).QueryElementAt(0, Components.interfaces.nsIMsgIncomingServer);
     88      let server = this._AccountManager.GetServersForIdentity(identity).QueryElementAt(0, Components.interfaces.nsIMsgIncomingServer);
    8389    }
    8490
    8591    currentIdentityData = new identityData(identity.email, identity.fullName, identity.key,
    86                                                                     identity.smtpServerKey, null, server.prettyName, true)
     92      identity.smtpServerKey, null, server.prettyName, true)
    8793    currentIdSenderName = currentIdentityData.combinedName;
    8894    virtualIdInUse = false;
    89    
    90     let recipients = []; var combinedNames = {}; var number;
     95
     96    let recipients = [];
     97    var combinedNames = {};
     98    var number;
    9199    number = HeaderParser.parseHeadersWithArray(toAddrList.join(", "), {}, {}, combinedNames);
    92100    for (var index = 0; index < number; index++)
    93       recipients.push( { recipient: combinedNames.value[index], recipientType: "addr_to" } )
    94      
    95     var localSmartIdentityCollection = new smartIdentityCollection(aComposeSession.params.msgHdr, identity,
    96                                                                       false, false, recipients);
    97     localSmartIdentityCollection.Reply();   // we can always use the reply-case, msgHdr is set the right way
    98    
     101      recipients.push({
     102        recipient: combinedNames.value[index],
     103        recipientType: "addr_to"
     104      })
     105
     106    var localSmartIdentityCollection = new smartIdentityCollection(aComposeSession.params.msgHdr, identity,
     107      false, false, recipients);
     108    localSmartIdentityCollection.Reply(); // we can always use the reply-case, msgHdr is set the right way
     109
    99110    if (localSmartIdentityCollection._allIdentities.number == 0)
    100111      return;
    101  
     112
    102113    if (vIprefs.get("idSelection_preferExisting")) {
    103114      var existingIDIndex = localSmartIdentityCollection._foundExistingIdentity();
     
    109120    }
    110121
    111     if (vIprefs.get("idSelection_ask") &&
    112       ((localSmartIdentityCollection._allIdentities.number == 1 && vIprefs.get("idSelection_ask_always"))
    113       || localSmartIdentityCollection._allIdentities.number > 1)) {
    114         recentWindow = Cc["@mozilla.org/appshell/window-mediator;1"]
    115           .getService(Ci.nsIWindowMediator)
    116           .getMostRecentWindow("mail:3pane");
    117      
    118         recentWindow.openDialog("chrome://v_identity/content/vI_smartReplyDialog.xul",0,
    119           "chrome, dialog, modal, alwaysRaised, resizable=yes",
    120           localSmartIdentityCollection._allIdentities,
    121           /* callback: */ changeIdentityToSmartIdentity).focus();
    122       }
    123     else if (vIprefs.get("idSelection_autocreate"))
     122    if (vIprefs.get("idSelection_ask") &&
     123      ((localSmartIdentityCollection._allIdentities.number == 1 && vIprefs.get("idSelection_ask_always")) || localSmartIdentityCollection._allIdentities.number > 1)) {
     124      recentWindow = Cc["@mozilla.org/appshell/window-mediator;1"]
     125        .getService(Ci.nsIWindowMediator)
     126        .getMostRecentWindow("mail:3pane");
     127
     128      recentWindow.openDialog("chrome://v_identity/content/vI_smartReplyDialog.xul", 0,
     129        "chrome, dialog, modal, alwaysRaised, resizable=yes",
     130        localSmartIdentityCollection._allIdentities,
     131        /* callback: */
     132        changeIdentityToSmartIdentity).focus();
     133    } else if (vIprefs.get("idSelection_autocreate"))
    124134      changeIdentityToSmartIdentity(localSmartIdentityCollection._allIdentities, 0);
    125135  },
    126  
     136
    127137  onMessageBeforeSendOrPopout_canceled: function _enigmailHook_onMessageBeforeSendOrPopout_canceledy(aAddress, aEditor, aStatus, aPopout) {
    128138    Log.debug("onMessageBeforeSendOrPopout_canceled");
     
    141151    let toAddrList = aAddress.to.concat(aAddress.cc);
    142152    Log.debug("onMessageBeforeSendOrPopup_early");
    143    
     153
    144154    if (virtualIdInUse) {
    145155      if (!aPopout) {
    146         let recipients = []; var combinedNames = {}; var number;
     156        let recipients = [];
     157        var combinedNames = {};
     158        var number;
    147159        number = HeaderParser.parseHeadersWithArray(toAddrList.join(", "), {}, {}, combinedNames);
    148160        for (var index = 0; index < number; index++)
    149           recipients.push( { recipient: combinedNames.value[index], recipientType: "addr_to" } )
    150        
     161          recipients.push({
     162            recipient: combinedNames.value[index],
     163            recipientType: "addr_to"
     164          })
     165
    151166        let recentWindow = Cc["@mozilla.org/appshell/window-mediator;1"]
    152167          .getService(Ci.nsIWindowMediator)
    153168          .getMostRecentWindow("mail:3pane");
    154          
     169
    155170        returnValue = vIaccount_prepareSendMsg(virtualIdInUse, Ci.nsIMsgCompDeliverMode.Now,
    156171          currentIdentityData, aAddress.params.identity, recipients, recentWindow);
    157172        Log.debug("returnValue.update:", returnValue.update);
    158        
     173
    159174        if (returnValue.update == "abort") {
    160           aStatus.canceled = true; return aStatus;
     175          aStatus.canceled = true;
     176          return aStatus;
     177        } else if (returnValue.update == "takeover") {
     178          _changeIdentityToSmartIdentity(returnValue.storedIdentity);
     179          aStatus.canceled = true;
     180          return aStatus;
    161181        }
    162         else if (returnValue.update == "takeover") {
    163           _changeIdentityToSmartIdentity(returnValue.storedIdentity);
    164           aStatus.canceled = true; return aStatus;
    165         }
    166        
     182
    167183        aAddress.params.identity = get_vIaccount().defaultIdentity;
    168184        if (!vIaccount_finalCheck(currentIdentityData, aAddress.params.identity)) {
    169185          vIaccount_removeUsedVIAccount();
    170           aStatus.canceled = true; return aStatus;
     186          aStatus.canceled = true;
     187          return aStatus;
    171188        }
    172       }
    173       else {
     189      } else {
    174190        // code virtual Identity into subject - this will be decoded by smartIdentity - newMail
    175191        aAddress.params.subject = aAddress.params.subject + "\nvirtualIdentityExtension\n" + currentIdSenderName;
     
    180196    return aStatus;
    181197  },
    182  
     198
    183199  onStopSending: function _virtualIdentityHook_onStopSending(aMsgID, aStatus, aMsg, aReturnFile) {
    184200    vIaccount_removeUsedVIAccount();
     
    195211    var isNotFirstInputElement = !(aType == "to" && aCount == 0);
    196212    Log.debug("onRecipientAdded isNotFirstInputElement", isNotFirstInputElement);
    197    
     213
    198214    if (!_rdfDatasourceAccess) _rdfDatasourceAccess = new rdfDatasourceAccess();
    199215    else _rdfDatasourceAccess.clean();
    200216
    201217    let recentWindow = Cc["@mozilla.org/appshell/window-mediator;1"]
    202           .getService(Ci.nsIWindowMediator)
    203           .getMostRecentWindow("mail:3pane");
     218      .getService(Ci.nsIWindowMediator)
     219      .getMostRecentWindow("mail:3pane");
    204220
    205221    var storageResult = _rdfDatasourceAccess.updateVIdentityFromStorage(aData.data, "addr_to",
    206222      currentIdentityData, virtualIdInUse, isNotFirstInputElement, recentWindow);
    207    
     223
    208224    if (storageResult.identityCollection.number == 0) return; // return if there was no match
    209225    if (storageResult.result != "accept") return; // return if we don't like the resulting id
    210    
     226
    211227    changeIdentityToSmartIdentity(storageResult.identityCollection, 0);
    212228  }
     
    222238    registerHook(virtualIdentityHook);
    223239  }, false);
    224 }
    225 catch(e) {
     240} catch (e) {
    226241  Log.debug("virtualIdentity is ready for conversations, but you don't use it");
    227242}
  • modules/plugins/signatureSwitch.js

    r3c9c29 r509348  
    2525var EXPORTED_SYMBOLS = ["signatureSwitch"]
    2626
    27 const {classes: Cc, interfaces: Ci, utils: Cu, results : Cr} = Components;
     27const {
     28  classes: Cc,
     29  interfaces: Ci,
     30  utils: Cu,
     31  results: Cr
     32} = Components;
    2833Cu.import("resource://gre/modules/AddonManager.jsm");
    2934Cu.import("resource://v_identity/vI_prefs.js");
     
    3338function signatureSwitch(existingIdentity) {
    3439  // always try to initialize Security/Enigmail-Options
    35   try { setSecuritySettings(1); enigSetMenuSettings(''); } catch(vErr) { };
    36  
     40  try {
     41    setSecuritySettings(1);
     42    enigSetMenuSettings('');
     43  } catch (vErr) {};
     44
    3745  let signatureWindow = Cc["@mozilla.org/appshell/window-mediator;1"]
    38       .getService(Ci.nsIWindowMediator)
    39       .getMostRecentWindow(null);
     46    .getService(Ci.nsIWindowMediator)
     47    .getMostRecentWindow(null);
    4048
    4149  if (!existingIdentity) {
    4250    Log.debug("signatureSwitch hide/remove signatures");
    43    
     51
    4452    // code to hide the text signature
    4553    if (signatureSwitchInstalled && vIprefs.get("hide_signature") && signatureWindow.ss_signature && signatureWindow.ss_signature.length == 0) {
     
    4755      signatureWindow.ss_main.signatureSwitch()
    4856    }
    49    
     57
    5058    // code to hide the sMime signature
    5159    if (vIprefs.get("hide_sMime_messageSignature")) {
     
    7785      }
    7886    }
    79   }
    80   else if (signatureSwitchInstalled) {
     87  } else if (signatureSwitchInstalled) {
    8188    Log.debug("signatureSwitch restore signature");
    8289    // code to show the text signature
     
    9198let signatureSwitchInstalled = false;
    9299// check for signature_switch extension
    93 AddonManager.getAddonByID("{2ab1b709-ba03-4361-abf9-c50b964ff75d}", function(addon) {
     100AddonManager.getAddonByID("{2ab1b709-ba03-4361-abf9-c50b964ff75d}", function (addon) {
    94101  signatureSwitchInstalled = (addon && !addon.userDisabled && !addon.appDisable);
    95102  if (signatureSwitchInstalled)
     
    97104  else
    98105    Log.debug("virtualIdentity is ready for signatureSwitch, but you don't use it");
    99   });
     106});
  • modules/vI_account.js

    r3c9c29 r509348  
    2525var EXPORTED_SYMBOLS = ["vIaccount_cleanupSystem", "get_vIaccount",
    2626  "vIaccount_prepareSendMsg", "vIaccount_finalCheck",
    27   "vIaccount_createAccount", "vIaccount_removeUsedVIAccount" ]
    28 
    29 const {classes: Cc, interfaces: Ci, utils: Cu, results : Cr} = Components;
     27  "vIaccount_createAccount", "vIaccount_removeUsedVIAccount"
     28]
     29
     30const {
     31  classes: Cc,
     32  interfaces: Ci,
     33  utils: Cu,
     34  results: Cr
     35} = Components;
    3036
    3137Cu.import("resource://gre/modules/Services.jsm");
     
    3945
    4046function vIaccount_prepareSendMsg(vid, msgType, identityData, baseIdentity, recipients, currentWindow) {
    41     var stringBundle = Services.strings.createBundle("chrome://v_identity/locale/v_identity.properties");
    42    
    43     var promptService = Cc["@mozilla.org/embedcomp/prompt-service;1"]
    44         .getService(Ci.nsIPromptService);
    45    
    46     var AccountManager = Cc["@mozilla.org/messenger/account-manager;1"]
    47             .getService(Ci.nsIMsgAccountManager);
    48            
    49     Log.debug("prepareSendMsg " + msgType + " " + Ci.nsIMsgCompDeliverMode.Now);
    50    
    51     returnValue = {};
    52    
    53     if (msgType == Ci.nsIMsgCompDeliverMode.Now) {
    54         if ( (vid && vIprefs.get("warn_virtual") &&
    55             !(promptService.confirm(currentWindow,"Warning",
    56                 stringBundle.GetStringFromName("vident.sendVirtual.warning")))) ||
    57             (!vid && vIprefs.get("warn_nonvirtual") &&
    58             !(promptService.confirm(currentWindow,"Warning",
    59                 stringBundle.GetStringFromName("vident.sendNonvirtual.warning")))) ) {
    60             return { update : "abort", storedIdentity : null }; // completely abort sending
    61         }
    62         if (vIprefs.get("storage") && vIprefs.get("storage_store")) {
    63             var localeDatasourceAccess = new rdfDatasourceAccess();
    64             var returnValue = localeDatasourceAccess.storeVIdentityToAllRecipients(identityData, recipients, currentWindow)
    65             if ( returnValue.update == "abort" || returnValue.update == "takeover" ) {
    66                 Log.debug("prepareSendMsg: sending aborted");
    67                 return returnValue;
    68             }
    69         }
    70         else Log.debug("prepareSendMsg: storage deactivated");
    71     }
    72     if (vid) {
    73         account.removeUsedVIAccount();
    74         account.createAccount(identityData, baseIdentity);
    75     }
    76     return { update : "accept", storedIdentity : null };
     47  var stringBundle = Services.strings.createBundle("chrome://v_identity/locale/v_identity.properties");
     48
     49  var promptService = Cc["@mozilla.org/embedcomp/prompt-service;1"]
     50    .getService(Ci.nsIPromptService);
     51
     52  var AccountManager = Cc["@mozilla.org/messenger/account-manager;1"]
     53    .getService(Ci.nsIMsgAccountManager);
     54
     55  Log.debug("prepareSendMsg " + msgType + " " + Ci.nsIMsgCompDeliverMode.Now);
     56
     57  returnValue = {};
     58
     59  if (msgType == Ci.nsIMsgCompDeliverMode.Now) {
     60    if ((vid && vIprefs.get("warn_virtual") &&
     61        !(promptService.confirm(currentWindow, "Warning",
     62          stringBundle.GetStringFromName("vident.sendVirtual.warning")))) ||
     63      (!vid && vIprefs.get("warn_nonvirtual") &&
     64        !(promptService.confirm(currentWindow, "Warning",
     65          stringBundle.GetStringFromName("vident.sendNonvirtual.warning"))))) {
     66      return {
     67        update: "abort",
     68        storedIdentity: null
     69      }; // completely abort sending
     70    }
     71    if (vIprefs.get("storage") && vIprefs.get("storage_store")) {
     72      var localeDatasourceAccess = new rdfDatasourceAccess();
     73      var returnValue = localeDatasourceAccess.storeVIdentityToAllRecipients(identityData, recipients, currentWindow)
     74      if (returnValue.update == "abort" || returnValue.update == "takeover") {
     75        Log.debug("prepareSendMsg: sending aborted");
     76        return returnValue;
     77      }
     78    } else Log.debug("prepareSendMsg: storage deactivated");
     79  }
     80  if (vid) {
     81    account.removeUsedVIAccount();
     82    account.createAccount(identityData, baseIdentity);
     83  }
     84  return {
     85    update: "accept",
     86    storedIdentity: null
     87  };
    7788};
    7889
    7990function vIaccount_finalCheck(virtualIdentityData, currentIdentity) {
    80     var stringBundle = Services.strings.createBundle("chrome://v_identity/locale/v_identity.properties");
    81 
    82     // identityData(email, fullName, id, smtp, extras, sideDescription, existingID)
    83     var currentIdentityData = new identityData(currentIdentity.email, currentIdentity.fullName, null, currentIdentity.smtpServerKey, null, null, null);
    84    
    85     Log.debug("SendMessage Final Check");
    86     Log.debug("currentIdentity: fullName='" + currentIdentityData.fullName + "' email='" + currentIdentityData.email + "' smtp='" + currentIdentityData.smtp.key + "'");
    87     Log.debug("virtualIdentityData: fullName='" + virtualIdentityData.fullName + "' email='" + virtualIdentityData.email + "' smtp='" + virtualIdentityData.smtp.key + "'");
    88 
    89     if  (currentIdentityData.fullName.toLowerCase() == virtualIdentityData.fullName.toLowerCase()   &&
    90         currentIdentityData.email.toLowerCase() == virtualIdentityData.email.toLowerCase()      &&
    91         virtualIdentityData.smtp.equal(currentIdentityData.smtp)    ) {
    92             return true
    93     }
    94     else {
    95         if (!(currentIdentityData.fullName.toLowerCase() == virtualIdentityData.fullName.toLowerCase()))
    96           Log.error("failed check for fullName.");
    97         if (!(currentIdentityData.email.toLowerCase() == virtualIdentityData.email.toLowerCase()))
    98           Log.error("failed check for email.");
    99         if (!(virtualIdentityData.smtp.equal(currentIdentityData.smtp)))
    100           Log.error("failed check for SMTP.");
    101         alert(stringBundle.GetStringFromName("vident.genericSendMessage.error"));
    102         return false
    103     }   
     91  var stringBundle = Services.strings.createBundle("chrome://v_identity/locale/v_identity.properties");
     92
     93  // identityData(email, fullName, id, smtp, extras, sideDescription, existingID)
     94  var currentIdentityData = new identityData(currentIdentity.email, currentIdentity.fullName, null, currentIdentity.smtpServerKey, null, null, null);
     95
     96  Log.debug("SendMessage Final Check");
     97  Log.debug("currentIdentity: fullName='" + currentIdentityData.fullName + "' email='" + currentIdentityData.email + "' smtp='" + currentIdentityData.smtp.key + "'");
     98  Log.debug("virtualIdentityData: fullName='" + virtualIdentityData.fullName + "' email='" + virtualIdentityData.email + "' smtp='" + virtualIdentityData.smtp.key + "'");
     99
     100  if (currentIdentityData.fullName.toLowerCase() == virtualIdentityData.fullName.toLowerCase() &&
     101    currentIdentityData.email.toLowerCase() == virtualIdentityData.email.toLowerCase() &&
     102    virtualIdentityData.smtp.equal(currentIdentityData.smtp)) {
     103    return true
     104  } else {
     105    if (!(currentIdentityData.fullName.toLowerCase() == virtualIdentityData.fullName.toLowerCase()))
     106      Log.error("failed check for fullName.");
     107    if (!(currentIdentityData.email.toLowerCase() == virtualIdentityData.email.toLowerCase()))
     108      Log.error("failed check for email.");
     109    if (!(virtualIdentityData.smtp.equal(currentIdentityData.smtp)))
     110      Log.error("failed check for SMTP.");
     111    alert(stringBundle.GetStringFromName("vident.genericSendMessage.error"));
     112    return false
     113  }
    104114};
    105115
    106116var account = {
    107     _account : null,
    108    
    109     _baseIdentity : null,
    110 
    111     _AccountManager : Cc["@mozilla.org/messenger/account-manager;1"]
    112         .getService(Ci.nsIMsgAccountManager),
    113    
    114     _unicodeConverter : Cc["@mozilla.org/intl/scriptableunicodeconverter"]
    115             .createInstance(Ci.nsIScriptableUnicodeConverter),
    116    
    117     _copyBoolAttribute : function(name) {
    118         account._account.defaultIdentity.setBoolAttribute(name,
    119                 account._baseIdentity.getBoolAttribute(name));
    120     },
    121    
    122     _copyIntAttribute : function(name) {
    123         account._account.defaultIdentity.setIntAttribute(name,
    124                 account._baseIdentity.getIntAttribute(name));
    125     },
    126 
    127     _copyCharAttribute : function(name) {
    128         account._account.defaultIdentity.setCharAttribute(name,
    129                 account._baseIdentity.getCharAttribute(name));
    130     },
    131 
    132     _copyUnicharAttribute : function(name) {
    133         account._account.defaultIdentity.setUnicharAttribute(name,
    134                 account._baseIdentity.getUnicharAttribute(name));
    135     },
    136 
    137     _copyPreferences : function() {
    138         if (vIprefs.get("copySMIMESettings")) {
    139             // SMIME settings
    140             Log.debug("copy S/MIME settings")
    141             account._copyUnicharAttribute("signing_cert_name");
    142             account._copyUnicharAttribute("encryption_cert_name");
    143             account._copyIntAttribute("encryptionpolicy");
    144         }
    145 /*      seems not required, encryption happens before Virtual Identity account is created
    146         if (vIprefs.get("copyEnigmailSettings")) {
    147             // pgp/enigmail settings
    148             Log.debug("copy PGP settings")
    149             account._copyBoolAttribute("pgpSignEncrypted");
    150             account._copyBoolAttribute("pgpSignPlain");
    151             account._copyBoolAttribute("enablePgp");
    152             account._copyIntAttribute("pgpKeyMode");
    153             account._copyCharAttribute("pgpkeyId");
    154             account._copyIntAttribute("openPgpHeaderMode");
    155             account._copyCharAttribute("openPgpUrlName");
    156        
    157             account._copyIntAttribute("defaultEncryptionPolicy");
    158         }   */
    159         if (vIprefs.get("copyAttachVCardSettings")) {
    160             // attach vcard
    161             Log.debug("copy VCard settings")
    162             account._copyBoolAttribute("attachVCard");
    163             account._copyCharAttribute("escapedVCard");
    164         }
    165     },
    166    
    167     // checks if directory is empty, not really used
    168     // ignores files ending with *.msf, else reports if a non-zero file is found.
    169     __dirEmpty : function(directory) {
    170         var dirEnumerator = directory.directoryEntries;
    171         while (dirEnumerator.hasMoreElements()) {
    172             var maildir = dirEnumerator.getNext();
    173             maildir.QueryInterface(Ci.nsIFile);
    174             // recurse into all subdirectories
    175             if (maildir.isDirectory() &&
    176                 !account.__dirEmpty(maildir)) return false;
    177             // ignore files with ending "*.msf"
    178             if (!maildir.path.match(new RegExp(".*\.msf$","i")) &&
    179                 maildir.fileSize != 0) return false;
    180         }
    181         return true;
    182     },
    183 
    184     __cleanupDirectories : function() {
    185         Log.debug("checking for leftover VirtualIdentity directories ...")
    186 
    187         var file = Cc["@mozilla.org/file/directory_service;1"]
    188         .getService(Ci.nsIProperties)
    189             .get("ProfD", Ci.nsIFile);
    190        
    191         var fileEnumerator = file.directoryEntries
    192         while (fileEnumerator.hasMoreElements()) {
    193             var dir = fileEnumerator.getNext()
    194             dir.QueryInterface(Ci.nsIFile);
    195             if (dir.path.match(new RegExp("[/\\\\]Mail$","i"))) { // match Windows and Linux/Mac separators
    196                 var dirEnumerator = dir.directoryEntries
    197                 while (dirEnumerator.hasMoreElements()) {
    198                     var maildir = dirEnumerator.getNext()
    199                     maildir.QueryInterface(Ci.nsIFile);
    200                     // match Windows and Linux/Mac separators
    201                     if (maildir.path.match(new RegExp("[/\\\\]virtualIdentity.*$","i"))) {
    202                         // should be empty, VirtualIdentity never uses those directories
    203                         if (account.__dirEmpty(maildir)) {
    204                             try {maildir.remove(true)} catch(e) { }
    205                         }
    206                     }
    207                 }
    208             }
    209         }
    210         Log.debug("done.")
    211     },
    212    
    213     cleanupSystem : function() {
    214         Log.debug("checking for leftover VirtualIdentity accounts ...")
    215         var accounts = getAccountsArray();
    216 
    217         for (let acc = 0; acc < accounts.length; acc++) {
    218             let checkAccount = accounts[acc];
    219             if (account.__isVIdentityAccount(checkAccount)) {
    220                 account.__removeAccount(checkAccount);
     117  _account: null,
     118
     119  _baseIdentity: null,
     120
     121  _AccountManager: Cc["@mozilla.org/messenger/account-manager;1"]
     122    .getService(Ci.nsIMsgAccountManager),
     123
     124  _unicodeConverter: Cc["@mozilla.org/intl/scriptableunicodeconverter"]
     125    .createInstance(Ci.nsIScriptableUnicodeConverter),
     126
     127  _copyBoolAttribute: function (name) {
     128    account._account.defaultIdentity.setBoolAttribute(name,
     129      account._baseIdentity.getBoolAttribute(name));
     130  },
     131
     132  _copyIntAttribute: function (name) {
     133    account._account.defaultIdentity.setIntAttribute(name,
     134      account._baseIdentity.getIntAttribute(name));
     135  },
     136
     137  _copyCharAttribute: function (name) {
     138    account._account.defaultIdentity.setCharAttribute(name,
     139      account._baseIdentity.getCharAttribute(name));
     140  },
     141
     142  _copyUnicharAttribute: function (name) {
     143    account._account.defaultIdentity.setUnicharAttribute(name,
     144      account._baseIdentity.getUnicharAttribute(name));
     145  },
     146
     147  _copyPreferences: function () {
     148    if (vIprefs.get("copySMIMESettings")) {
     149      // SMIME settings
     150      Log.debug("copy S/MIME settings")
     151      account._copyUnicharAttribute("signing_cert_name");
     152      account._copyUnicharAttribute("encryption_cert_name");
     153      account._copyIntAttribute("encryptionpolicy");
     154    }
     155    /*      seems not required, encryption happens before Virtual Identity account is created
     156            if (vIprefs.get("copyEnigmailSettings")) {
     157                // pgp/enigmail settings
     158                Log.debug("copy PGP settings")
     159                account._copyBoolAttribute("pgpSignEncrypted");
     160                account._copyBoolAttribute("pgpSignPlain");
     161                account._copyBoolAttribute("enablePgp");
     162                account._copyIntAttribute("pgpKeyMode");
     163                account._copyCharAttribute("pgpkeyId");
     164                account._copyIntAttribute("openPgpHeaderMode");
     165                account._copyCharAttribute("openPgpUrlName");
     166           
     167                account._copyIntAttribute("defaultEncryptionPolicy");
     168            }   */
     169    if (vIprefs.get("copyAttachVCardSettings")) {
     170      // attach vcard
     171      Log.debug("copy VCard settings")
     172      account._copyBoolAttribute("attachVCard");
     173      account._copyCharAttribute("escapedVCard");
     174    }
     175  },
     176
     177  // checks if directory is empty, not really used
     178  // ignores files ending with *.msf, else reports if a non-zero file is found.
     179  __dirEmpty: function (directory) {
     180    var dirEnumerator = directory.directoryEntries;
     181    while (dirEnumerator.hasMoreElements()) {
     182      var maildir = dirEnumerator.getNext();
     183      maildir.QueryInterface(Ci.nsIFile);
     184      // recurse into all subdirectories
     185      if (maildir.isDirectory() &&
     186        !account.__dirEmpty(maildir)) return false;
     187      // ignore files with ending "*.msf"
     188      if (!maildir.path.match(new RegExp(".*\.msf$", "i")) &&
     189        maildir.fileSize != 0) return false;
     190    }
     191    return true;
     192  },
     193
     194  __cleanupDirectories: function () {
     195    Log.debug("checking for leftover VirtualIdentity directories ...")
     196
     197    var file = Cc["@mozilla.org/file/directory_service;1"]
     198      .getService(Ci.nsIProperties)
     199      .get("ProfD", Ci.nsIFile);
     200
     201    var fileEnumerator = file.directoryEntries
     202    while (fileEnumerator.hasMoreElements()) {
     203      var dir = fileEnumerator.getNext()
     204      dir.QueryInterface(Ci.nsIFile);
     205      if (dir.path.match(new RegExp("[/\\\\]Mail$", "i"))) { // match Windows and Linux/Mac separators
     206        var dirEnumerator = dir.directoryEntries
     207        while (dirEnumerator.hasMoreElements()) {
     208          var maildir = dirEnumerator.getNext()
     209          maildir.QueryInterface(Ci.nsIFile);
     210          // match Windows and Linux/Mac separators
     211          if (maildir.path.match(new RegExp("[/\\\\]virtualIdentity.*$", "i"))) {
     212            // should be empty, VirtualIdentity never uses those directories
     213            if (account.__dirEmpty(maildir)) {
     214              try {
     215                maildir.remove(true)
     216              } catch (e) {}
    221217            }
    222             // replace account with key, required for next check
    223             accounts[acc] = accounts[acc].key;
     218          }
    224219        }
    225 
    226         //      account-prefs are not removed, grrrr --> https://bugzilla.mozilla.org/show_bug.cgi?id=875675
    227         //  compare against all accounts, getAccountsArray() does not include 'smart mailboxes' == 'unified folders'
    228         var all_accounts = prefroot.getCharPref("mail.accountmanager.accounts").split(",");
    229         try {
    230             var lastAccountKey = prefroot.getIntPref("mail.account.lastKey");
    231             for (let key = 0; key <= lastAccountKey; key++) {
    232                 if (all_accounts.indexOf("account" + key) > -1) continue;
    233                 account.__removeAccountPrefs("account" + key);
    234             }
    235         }
    236         catch (e) {};
    237         Log.debug("done.")
    238         account.__cleanupDirectories();
    239     },
    240    
    241     __isVIdentityAccount : function(checkAccount) {
    242         // check for new (post0.5.0) accounts,
    243         try {   prefroot.getBoolPref("mail.account." + checkAccount.key + ".vIdentity");
    244             return true;
    245         } catch (e) { };
    246         // check for old (pre 0.5.0) accounts
    247         if (checkAccount.incomingServer && checkAccount.incomingServer.hostName == "virtualIdentity") return true;
    248         return false;
    249     },
    250    
    251     __removeAccountPrefs : function(key) {
    252         // remove the additional tagging-pref
    253         try {
    254             prefroot.clearUserPref("mail.account." + key + ".vIdentity");
    255         }
    256         catch (e) { };
    257         try {
    258             // account-prefs are not removed, grrrr --> https://bugzilla.mozilla.org/show_bug.cgi?id=875675
    259             prefroot.clearUserPref("mail.account." + key + ".server");
    260         }
    261         catch (e) { };
    262         try {
    263             // account-prefs are not removed, grrrr --> https://bugzilla.mozilla.org/show_bug.cgi?id=875675
    264             prefroot.clearUserPref("mail.account." + key + ".identities");
    265         }
    266         catch (e) { };
    267     },
    268 
    269     __removeAccount : function(checkAccount) {
    270         Log.debug("__removeAccount")
    271         // in new (post 0.5.0) Virtual Identity accounts the incomingServer of the account
    272         // points to an incoming server of a different account. Cause the internal
    273         // removeAccount function tries to removes the incomingServer ether, create
    274         // a real one before calling this function.
    275         if (!checkAccount.incomingServer || checkAccount.incomingServer.hostName != "virtualIdentity") {
    276             // if not some of the 'old' accounts
    277             checkAccount.incomingServer = account._AccountManager.
    278                 createIncomingServer("toRemove","virtualIdentity","pop3");
    279         }
    280 
    281         // remove the rootFolder of the account
    282         try { checkAccount.incomingServer.rootFolder.Delete(); }
    283         catch (e) { };
    284        
    285         var key = checkAccount.key;
    286         Log.debug("removing account " + key)
    287         // remove the account
    288         account._AccountManager.removeAccount(checkAccount);
    289 
    290         // prevent useless increasing of lastKey https://bugzilla.mozilla.org/show_bug.cgi?id=485839
    291         try {
    292             var lastAccountKey = prefroot.getIntPref("mail.account.lastKey");
    293             if ("account" + lastAccountKey == key)
    294                 prefroot.setIntPref("mail.account.lastKey", lastAccountKey - 1);
    295         }
    296         catch (e) { };
    297 
    298         account.__removeAccountPrefs(key);
    299     },
    300    
    301     removeUsedVIAccount : function() {
    302         var mailWindow = Cc["@mozilla.org/appshell/window-mediator;1"].getService()
    303             .QueryInterface(Ci.nsIWindowMediator)
    304             .getMostRecentWindow("mail:3pane");
    305         if (mailWindow) {               // it's not sure that we have an open 3-pane-window
    306             var selectedFolder = (mailWindow.gFolderTreeView)?mailWindow.gFolderTreeView.getSelectedFolders()[0]:null;
    307             var selectedMessages = (mailWindow.gFolderDisplay)?mailWindow.gFolderDisplay.selectedMessages:null;
    308         }
    309         if (account._account) {
    310             account.__removeAccount(account._account);
    311             account._account = null;
    312             try {
    313                 if (selectedFolder) mailWindow.gFolderTreeView.selectFolder(selectedFolder);
    314                 if (selectedMessages) mailWindow.gFolderDisplay.selectMessages(selectedMessages, false, false);
    315             } catch (e) { };
    316         }
    317     },
    318    
    319     createAccount : function(identityData, baseIdentity)
    320     {
    321         if (account._account) {  // if the Account is still created, then leave all like it is
    322             alert("account still created, shouldn't happen");
    323             return;
    324         }
    325         account._baseIdentity = baseIdentity;
    326         /*
     220      }
     221    }
     222    Log.debug("done.")
     223  },
     224
     225  cleanupSystem: function () {
     226    Log.debug("checking for leftover VirtualIdentity accounts ...")
     227    var accounts = getAccountsArray();
     228
     229    for (let acc = 0; acc < accounts.length; acc++) {
     230      let checkAccount = accounts[acc];
     231      if (account.__isVIdentityAccount(checkAccount)) {
     232        account.__removeAccount(checkAccount);
     233      }
     234      // replace account with key, required for next check
     235      accounts[acc] = accounts[acc].key;
     236    }
     237
     238    //      account-prefs are not removed, grrrr --> https://bugzilla.mozilla.org/show_bug.cgi?id=875675
     239    //  compare against all accounts, getAccountsArray() does not include 'smart mailboxes' == 'unified folders'
     240    var all_accounts = prefroot.getCharPref("mail.accountmanager.accounts").split(",");
     241    try {
     242      var lastAccountKey = prefroot.getIntPref("mail.account.lastKey");
     243      for (let key = 0; key <= lastAccountKey; key++) {
     244        if (all_accounts.indexOf("account" + key) > -1) continue;
     245        account.__removeAccountPrefs("account" + key);
     246      }
     247    } catch (e) {};
     248    Log.debug("done.")
     249    account.__cleanupDirectories();
     250  },
     251
     252  __isVIdentityAccount: function (checkAccount) {
     253    // check for new (post0.5.0) accounts,
     254    try {
     255      prefroot.getBoolPref("mail.account." + checkAccount.key + ".vIdentity");
     256      return true;
     257    } catch (e) {};
     258    // check for old (pre 0.5.0) accounts
     259    if (checkAccount.incomingServer && checkAccount.incomingServer.hostName == "virtualIdentity") return true;
     260    return false;
     261  },
     262
     263  __removeAccountPrefs: function (key) {
     264    // remove the additional tagging-pref
     265    try {
     266      prefroot.clearUserPref("mail.account." + key + ".vIdentity");
     267    } catch (e) {};
     268    try {
     269      // account-prefs are not removed, grrrr --> https://bugzilla.mozilla.org/show_bug.cgi?id=875675
     270      prefroot.clearUserPref("mail.account." + key + ".server");
     271    } catch (e) {};
     272    try {
     273      // account-prefs are not removed, grrrr --> https://bugzilla.mozilla.org/show_bug.cgi?id=875675
     274      prefroot.clearUserPref("mail.account." + key + ".identities");
     275    } catch (e) {};
     276  },
     277
     278  __removeAccount: function (checkAccount) {
     279    Log.debug("__removeAccount")
     280      // in new (post 0.5.0) Virtual Identity accounts the incomingServer of the account
     281      // points to an incoming server of a different account. Cause the internal
     282      // removeAccount function tries to removes the incomingServer ether, create
     283      // a real one before calling this function.
     284    if (!checkAccount.incomingServer || checkAccount.incomingServer.hostName != "virtualIdentity") {
     285      // if not some of the 'old' accounts
     286      checkAccount.incomingServer = account._AccountManager.
     287      createIncomingServer("toRemove", "virtualIdentity", "pop3");
     288    }
     289
     290    // remove the rootFolder of the account
     291    try {
     292      checkAccount.incomingServer.rootFolder.Delete();
     293    } catch (e) {};
     294
     295    var key = checkAccount.key;
     296    Log.debug("removing account " + key)
     297      // remove the account
     298    account._AccountManager.removeAccount(checkAccount);
     299
     300    // prevent useless increasing of lastKey https://bugzilla.mozilla.org/show_bug.cgi?id=485839
     301    try {
     302      var lastAccountKey = prefroot.getIntPref("mail.account.lastKey");
     303      if ("account" + lastAccountKey == key)
     304        prefroot.setIntPref("mail.account.lastKey", lastAccountKey - 1);
     305    } catch (e) {};
     306
     307    account.__removeAccountPrefs(key);
     308  },
     309
     310  removeUsedVIAccount: function () {
     311    var mailWindow = Cc["@mozilla.org/appshell/window-mediator;1"].getService()
     312      .QueryInterface(Ci.nsIWindowMediator)
     313      .getMostRecentWindow("mail:3pane");
     314    if (mailWindow) { // it's not sure that we have an open 3-pane-window
     315      var selectedFolder = (mailWindow.gFolderTreeView) ? mailWindow.gFolderTreeView.getSelectedFolders()[0] : null;
     316      var selectedMessages = (mailWindow.gFolderDisplay) ? mailWindow.gFolderDisplay.selectedMessages : null;
     317    }
     318    if (account._account) {
     319      account.__removeAccount(account._account);
     320      account._account = null;
     321      try {
     322        if (selectedFolder) mailWindow.gFolderTreeView.selectFolder(selectedFolder);
     323        if (selectedMessages) mailWindow.gFolderDisplay.selectMessages(selectedMessages, false, false);
     324      } catch (e) {};
     325    }
     326  },
     327
     328  createAccount: function (identityData, baseIdentity) {
     329    if (account._account) { // if the Account is still created, then leave all like it is
     330      alert("account still created, shouldn't happen");
     331      return;
     332    }
     333    account._baseIdentity = baseIdentity;
     334    /*
    327335        // the easiest way would be to get all requiered Attributes might be to duplicate the default account like this
    328336        var recentAccount = account._AccountManager.getAccount(vI.main.elements.Obj_MsgIdentity.selectedItem.getAttribute("accountkey"));
     
    332340        // so I have to do this by hand ;(
    333341        */
    334        
    335         account._account = account._AccountManager.createAccount();
    336         prefroot.setBoolPref("mail.account." + account._account.key + ".vIdentity", true)
    337         account._account.addIdentity(account._AccountManager.createIdentity());
    338        
    339         Log.debug("createAccount create Identity based on baseIdentity (" + baseIdentity.key + ") " + baseIdentity.fullName + " <" + baseIdentity.email + ">");
    340         // the new account uses the same incomingServer than the base one,
    341         // it's especially required for NNTP cause incomingServer is used for sending newsposts.
    342         // by pointing to the same incomingServer stored passwords can be reused
    343         // the incomingServer has to be replaced before the account is removed, else it get removed ether
    344         if (typeof(this._AccountManager.getServersForIdentity) == 'function') { // new style
    345             var servers = this._AccountManager.getServersForIdentity(baseIdentity);
    346         } else {
    347             var servers = this._AccountManager.GetServersForIdentity(baseIdentity);
    348         }
    349     try {
    350       if (typeof(this._AccountManager.getServersForIdentity) == 'function') { // new style
    351           var server = servers.queryElementAt(0, Ci.nsIMsgIncomingServer);
     342
     343    account._account = account._AccountManager.createAccount();
     344    prefroot.setBoolPref("mail.account." + account._account.key + ".vIdentity", true)
     345    account._account.addIdentity(account._AccountManager.createIdentity());
     346
     347    Log.debug("createAccount create Identity based on baseIdentity (" + baseIdentity.key + ") " + baseIdentity.fullName + " <" + baseIdentity.email + ">");
     348    // the new account uses the same incomingServer than the base one,
     349    // it's especially required for NNTP cause incomingServer is used for sending newsposts.
     350    // by pointing to the same incomingServer stored passwords can be reused
     351    // the incomingServer has to be replaced before the account is removed, else it get removed ether
     352    if (typeof (this._AccountManager.getServersForIdentity) == 'function') { // new style
     353      var servers = this._AccountManager.getServersForIdentity(baseIdentity);
     354    } else {
     355      var servers = this._AccountManager.GetServersForIdentity(baseIdentity);
     356    }
     357    try {
     358      if (typeof (this._AccountManager.getServersForIdentity) == 'function') { // new style
     359        var server = servers.queryElementAt(0, Ci.nsIMsgIncomingServer);
    352360      } else {
    353           var server = servers.QueryElementAt(0, Ci.nsIMsgIncomingServer);
     361        var server = servers.QueryElementAt(0, Ci.nsIMsgIncomingServer);
    354362      }
    355363    } catch (NS_ERROR_FAILURE) {
     
    357365      var server = account._AccountManager.defaultAccount.incomingServer;
    358366    }
    359         // we mark the server as invalid so that the account manager won't
    360         // tell RDF about the new server - we don't need this server for long
    361         // but we should restore it, because it's actually the same server as the one of the base identity
    362         server.valid = false;
    363         account._account.incomingServer = server;
    364         server.valid = true;
    365         account._copyIdentityData(identityData, baseIdentity);
    366         account._copyPreferences();
    367         account._unicodeConverter.charset = "UTF-8";
    368         account._setupFcc();
    369         account._setupDraft();
    370         account._setupTemplates();
    371     },
    372    
    373     _copyIdentityData : function(identityData, baseIdentity) {
    374         account._account.defaultIdentity.setCharAttribute("useremail", identityData.email);
    375         account._account.defaultIdentity.setUnicharAttribute("fullName", identityData.fullName);
    376        
    377         account._account.defaultIdentity.smtpServerKey = identityData.smtp.keyNice; // key with "" for vI.DEFAULT_SMTP_TAG
    378         if (account._account.defaultIdentity.smtpServerKey == NO_SMTP_TAG)
    379             account._account.defaultIdentity.smtpServerKey = baseIdentity.smtpServerKey;
    380 
    381         Log.debug("Stored virtualIdentity (name "
    382             + account._account.defaultIdentity.fullName + " email "
    383             + account._account.defaultIdentity.email + " smtp "
    384             + account._account.defaultIdentity.smtpServerKey +")");
    385     },
    386    
    387     _setupFcc : function()
    388     {
    389       if (vIprefs.get("doFcc")) {
    390           switch (vIprefs.get("fccFolderPickerMode"))
    391           {
    392               case "2"  :
    393               Log.debug ("preparing Fcc --- use Settings of Default Account");
    394               account._account.defaultIdentity.doFcc = account._AccountManager.defaultAccount.defaultIdentity.doFcc;
    395               account._account.defaultIdentity.fccFolder = account._AccountManager.defaultAccount.defaultIdentity.fccFolder;
    396               account._account.defaultIdentity.fccFolderPickerMode = account._AccountManager.defaultAccount.defaultIdentity.fccFolderPickerMode;
    397               account._account.defaultIdentity.fccReplyFollowsParent = account._AccountManager.defaultAccount.defaultIdentity.fccReplyFollowsParent;
    398               break;
    399               case "3"  :
    400               Log.debug ("preparing Fcc --- use Settings of Modified Account");
    401               account._account.defaultIdentity.doFcc = account._baseIdentity.doFcc;
    402               account._account.defaultIdentity.fccFolder = account._baseIdentity.fccFolder;
    403               account._account.defaultIdentity.fccFolderPickerMode = account._baseIdentity.fccFolderPickerMode;
    404               account._account.defaultIdentity.fccReplyFollowsParent = account._baseIdentity.fccReplyFollowsParent;
    405               break;
    406               default  :
    407               Log.debug ("preparing Fcc --- use Virtual Identity Settings");
    408               account._account.defaultIdentity.doFcc
    409                   = vIprefs.get("doFcc");
    410               account._account.defaultIdentity.fccFolder
    411                   = account._unicodeConverter.ConvertToUnicode(vIprefs.get("fccFolder"));
    412               account._account.defaultIdentity.fccFolderPickerMode
    413                   = vIprefs.get("fccFolderPickerMode");
    414               account._account.defaultIdentity.fccReplyFollowsParent = vIprefs.get("fccReplyFollowsParent");
    415 
    416               break;
    417           }
    418       }
    419       else {
    420           dump ("dont performing Fcc\n");
    421           account._account.defaultIdentity.doFcc = false;
    422       }
    423       Log.debug("Stored (doFcc " + account._account.defaultIdentity.doFcc + " fccFolder " +
    424           account._account.defaultIdentity.fccFolder + " fccFolderPickerMode " +
    425           account._account.defaultIdentity.fccFolderPickerMode + "(" +
    426           vIprefs.get("fccFolderPickerMode") + "))");
    427     },
    428    
    429     _setupDraft : function()    {
    430         switch (vIprefs.get("draftFolderPickerMode"))
    431         {
    432             case "2"  :
    433             Log.debug ("preparing Draft --- use Settings of Default Account");
    434             account._account.defaultIdentity.draftFolder = account._AccountManager.defaultAccount.defaultIdentity.draftFolder;
    435             account._account.defaultIdentity.draftsFolderPickerMode = account._AccountManager.defaultAccount.defaultIdentity.draftsFolderPickerMode;
    436             break;
    437             case "3"  :
    438             Log.debug ("preparing Draft --- use Settings of Modified Account");
    439             account._account.defaultIdentity.draftFolder = account._baseIdentity.draftFolder;
    440             account._account.defaultIdentity.draftsFolderPickerMode = account._baseIdentity.draftsFolderPickerMode;
    441             break;
    442             default  :
    443             Log.debug ("preparing Draft --- use Virtual Identity Settings");
    444             account._account.defaultIdentity.draftFolder
    445                 = account._unicodeConverter.ConvertToUnicode(vIprefs.get("draftFolder"));
    446             account._account.defaultIdentity.draftsFolderPickerMode
    447                 = vIprefs.get("draftFolderPickerMode");
    448             break;
    449         }
    450         Log.debug("Stored (draftFolder " +
    451             account._account.defaultIdentity.draftFolder + " draftsFolderPickerMode " +
    452             account._account.defaultIdentity.draftsFolderPickerMode + "(" +
    453             vIprefs.get("draftFolderPickerMode") + "))");
    454     },
    455    
    456     _setupTemplates : function()    {
    457         switch (vIprefs.get("stationeryFolderPickerMode"))
    458         {
    459             case "2"  :
    460             Log.debug ("preparing Templates --- use Settings of Default Account");
    461             account._account.defaultIdentity.stationeryFolder = account._AccountManager.defaultAccount.defaultIdentity.stationeryFolder;
    462             account._account.defaultIdentity.tmplFolderPickerMode = account._AccountManager.defaultAccount.defaultIdentity.tmplFolderPickerMode;
    463             break;
    464             case "3"  :
    465             Log.debug ("preparing Templates --- use Settings of Modified Account");
    466             account._account.defaultIdentity.stationeryFolder = account._baseIdentity.stationeryFolder;
    467             account._account.defaultIdentity.tmplFolderPickerMode = account._baseIdentity.tmplFolderPickerMode;
    468             break;
    469             default  :
    470             Log.debug ("preparing Templates --- use Virtual Identity Settings");
    471             account._account.defaultIdentity.stationeryFolder
    472                 = account._unicodeConverter.ConvertToUnicode(vIprefs.get("stationeryFolder"));
    473             account._account.defaultIdentity.tmplFolderPickerMode
    474                 = vIprefs.get("stationeryFolderPickerMode");
    475             break;
    476         }
    477         Log.debug("Stored (stationeryFolder " +
    478             account._account.defaultIdentity.stationeryFolder + " tmplFolderPickerMode " +
    479             account._account.defaultIdentity.tmplFolderPickerMode + "(" +
    480             vIprefs.get("stationeryFolderPickerMode") + "))");
    481     }
     367    // we mark the server as invalid so that the account manager won't
     368    // tell RDF about the new server - we don't need this server for long
     369    // but we should restore it, because it's actually the same server as the one of the base identity
     370    server.valid = false;
     371    account._account.incomingServer = server;
     372    server.valid = true;
     373    account._copyIdentityData(identityData, baseIdentity);
     374    account._copyPreferences();
     375    account._unicodeConverter.charset = "UTF-8";
     376    account._setupFcc();
     377    account._setupDraft();
     378    account._setupTemplates();
     379  },
     380
     381  _copyIdentityData: function (identityData, baseIdentity) {
     382    account._account.defaultIdentity.setCharAttribute("useremail", identityData.email);
     383    account._account.defaultIdentity.setUnicharAttribute("fullName", identityData.fullName);
     384
     385    account._account.defaultIdentity.smtpServerKey = identityData.smtp.keyNice; // key with "" for vI.DEFAULT_SMTP_TAG
     386    if (account._account.defaultIdentity.smtpServerKey == NO_SMTP_TAG)
     387      account._account.defaultIdentity.smtpServerKey = baseIdentity.smtpServerKey;
     388
     389    Log.debug("Stored virtualIdentity (name " + account._account.defaultIdentity.fullName + " email " + account._account.defaultIdentity.email + " smtp " + account._account.defaultIdentity.smtpServerKey + ")");
     390  },
     391
     392  _setupFcc: function () {
     393    if (vIprefs.get("doFcc")) {
     394      switch (vIprefs.get("fccFolderPickerMode")) {
     395      case "2":
     396        Log.debug("preparing Fcc --- use Settings of Default Account");
     397        account._account.defaultIdentity.doFcc = account._AccountManager.defaultAccount.defaultIdentity.doFcc;
     398        account._account.defaultIdentity.fccFolder = account._AccountManager.defaultAccount.defaultIdentity.fccFolder;
     399        account._account.defaultIdentity.fccFolderPickerMode = account._AccountManager.defaultAccount.defaultIdentity.fccFolderPickerMode;
     400        account._account.defaultIdentity.fccReplyFollowsParent = account._AccountManager.defaultAccount.defaultIdentity.fccReplyFollowsParent;
     401        break;
     402      case "3":
     403        Log.debug("preparing Fcc --- use Settings of Modified Account");
     404        account._account.defaultIdentity.doFcc = account._baseIdentity.doFcc;
     405        account._account.defaultIdentity.fccFolder = account._baseIdentity.fccFolder;
     406        account._account.defaultIdentity.fccFolderPickerMode = account._baseIdentity.fccFolderPickerMode;
     407        account._account.defaultIdentity.fccReplyFollowsParent = account._baseIdentity.fccReplyFollowsParent;
     408        break;
     409      default:
     410        Log.debug("preparing Fcc --- use Virtual Identity Settings");
     411        account._account.defaultIdentity.doFcc = vIprefs.get("doFcc");
     412        account._account.defaultIdentity.fccFolder = account._unicodeConverter.ConvertToUnicode(vIprefs.get("fccFolder"));
     413        account._account.defaultIdentity.fccFolderPickerMode = vIprefs.get("fccFolderPickerMode");
     414        account._account.defaultIdentity.fccReplyFollowsParent = vIprefs.get("fccReplyFollowsParent");
     415
     416        break;
     417      }
     418    } else {
     419      dump("dont performing Fcc\n");
     420      account._account.defaultIdentity.doFcc = false;
     421    }
     422    Log.debug("Stored (doFcc " + account._account.defaultIdentity.doFcc + " fccFolder " +
     423      account._account.defaultIdentity.fccFolder + " fccFolderPickerMode " +
     424      account._account.defaultIdentity.fccFolderPickerMode + "(" +
     425      vIprefs.get("fccFolderPickerMode") + "))");
     426  },
     427
     428  _setupDraft: function () {
     429    switch (vIprefs.get("draftFolderPickerMode")) {
     430    case "2":
     431      Log.debug("preparing Draft --- use Settings of Default Account");
     432      account._account.defaultIdentity.draftFolder = account._AccountManager.defaultAccount.defaultIdentity.draftFolder;
     433      account._account.defaultIdentity.draftsFolderPickerMode = account._AccountManager.defaultAccount.defaultIdentity.draftsFolderPickerMode;
     434      break;
     435    case "3":
     436      Log.debug("preparing Draft --- use Settings of Modified Account");
     437      account._account.defaultIdentity.draftFolder = account._baseIdentity.draftFolder;
     438      account._account.defaultIdentity.draftsFolderPickerMode = account._baseIdentity.draftsFolderPickerMode;
     439      break;
     440    default:
     441      Log.debug("preparing Draft --- use Virtual Identity Settings");
     442      account._account.defaultIdentity.draftFolder = account._unicodeConverter.ConvertToUnicode(vIprefs.get("draftFolder"));
     443      account._account.defaultIdentity.draftsFolderPickerMode = vIprefs.get("draftFolderPickerMode");
     444      break;
     445    }
     446    Log.debug("Stored (draftFolder " +
     447      account._account.defaultIdentity.draftFolder + " draftsFolderPickerMode " +
     448      account._account.defaultIdentity.draftsFolderPickerMode + "(" +
     449      vIprefs.get("draftFolderPickerMode") + "))");
     450  },
     451
     452  _setupTemplates: function () {
     453    switch (vIprefs.get("stationeryFolderPickerMode")) {
     454    case "2":
     455      Log.debug("preparing Templates --- use Settings of Default Account");
     456      account._account.defaultIdentity.stationeryFolder = account._AccountManager.defaultAccount.defaultIdentity.stationeryFolder;
     457      account._account.defaultIdentity.tmplFolderPickerMode = account._AccountManager.defaultAccount.defaultIdentity.tmplFolderPickerMode;
     458      break;
     459    case "3":
     460      Log.debug("preparing Templates --- use Settings of Modified Account");
     461      account._account.defaultIdentity.stationeryFolder = account._baseIdentity.stationeryFolder;
     462      account._account.defaultIdentity.tmplFolderPickerMode = account._baseIdentity.tmplFolderPickerMode;
     463      break;
     464    default:
     465      Log.debug("preparing Templates --- use Virtual Identity Settings");
     466      account._account.defaultIdentity.stationeryFolder = account._unicodeConverter.ConvertToUnicode(vIprefs.get("stationeryFolder"));
     467      account._account.defaultIdentity.tmplFolderPickerMode = vIprefs.get("stationeryFolderPickerMode");
     468      break;
     469    }
     470    Log.debug("Stored (stationeryFolder " +
     471      account._account.defaultIdentity.stationeryFolder + " tmplFolderPickerMode " +
     472      account._account.defaultIdentity.tmplFolderPickerMode + "(" +
     473      vIprefs.get("stationeryFolderPickerMode") + "))");
     474  }
    482475}
    483476
  • modules/vI_accountUtils.js

    r3c9c29 r509348  
    2525var EXPORTED_SYMBOLS = ["getAccountsArray", "getIdentitiesArray"]
    2626
    27 const {classes: Cc, interfaces: Ci, utils: Cu, results : Cr} = Components;
     27const {
     28  classes: Cc,
     29  interfaces: Ci,
     30  utils: Cu,
     31  results: Cr
     32} = Components;
    2833
    2934Cu.import("resource://v_identity/vI_log.js");
     
    3136
    3237let accountManager = Components.classes["@mozilla.org/messenger/account-manager;1"]
    33     .getService(Components.interfaces.nsIMsgAccountManager);
     38  .getService(Components.interfaces.nsIMsgAccountManager);
    3439
    3540// copy/pasted from MsgComposeCommands.js
    3641function queryISupportsArray(supportsArray, iid) {
    37     let count = supportsArray.Count();
    38     var result = new Array
    39     for (let i = 0; i < count; i++)
    40         result[i] = supportsArray.QueryElementAt(i, iid);       
    41     return result;
     42  let count = supportsArray.Count();
     43  var result = new Array
     44  for (let i = 0; i < count; i++)
     45    result[i] = supportsArray.QueryElementAt(i, iid);
     46  return result;
    4247};
    4348
    4449function getIdentitiesArray(account) {
    45     var identities;
    46     if (Components.utils.import("resource:///modules/folderUtils.jsm") && Components.utils.import("resource:///modules/iteratorUtils.jsm")
    47         && typeof(toArray)=='function' && typeof(fixIterator)=='function') {
    48         identities = toArray(fixIterator(account.identities,Components.interfaces.nsIMsgIdentity));
    49     } else {
    50         identities = queryISupportsArray(accounts[i].identities, Components.interfaces.nsIMsgIdentity);
    51     }
    52     return identities;
     50  var identities;
     51  if (Components.utils.import("resource:///modules/folderUtils.jsm") && Components.utils.import("resource:///modules/iteratorUtils.jsm") && typeof (toArray) == 'function' && typeof (fixIterator) == 'function') {
     52    identities = toArray(fixIterator(account.identities, Components.interfaces.nsIMsgIdentity));
     53  } else {
     54    identities = queryISupportsArray(accounts[i].identities, Components.interfaces.nsIMsgIdentity);
     55  }
     56  return identities;
    5357}
    5458
    5559function getAccountsArray() {
    56     var accounts;
    57     function sortAccounts(a, b) {
    58         if (a.key == accountManager.defaultAccount.key)
    59         return -1;
    60         if (b.key == accountManager.defaultAccount.key)
    61         return 1;
    62         var aIsNews = a.incomingServer.type == "nntp";
    63         var bIsNews = b.incomingServer.type == "nntp";
    64         if (aIsNews && !bIsNews)
    65         return 1;
    66         if (bIsNews && !aIsNews)
    67         return -1;
     60  var accounts;
    6861
    69         var aIsLocal = a.incomingServer.type == "none";
    70         var bIsLocal = b.incomingServer.type == "none";
    71         if (aIsLocal && !bIsLocal)
    72         return 1;
    73         if (bIsLocal && !aIsLocal)
    74         return -1;
    75         return 0;
    76     }
    77     if (Components.utils.import("resource:///modules/folderUtils.jsm") && Components.utils.import("resource:///modules/iteratorUtils.jsm")
    78         && typeof(allAccountsSorted)=='function') {
    79         // if this worked we are having at least seamonkey 1.17
    80 //        Log.debug("getAccounts - new schema");
    81         accounts = allAccountsSorted(true);
    82     } else {
    83         // still some older version
    84 //        Log.debug("getAccounts - old schema");
    85         var accounts = queryISupportsArray(accountManager.accounts,
    86                                         Components.interfaces.nsIMsgAccount);
     62  function sortAccounts(a, b) {
     63    if (a.key == accountManager.defaultAccount.key)
     64      return -1;
     65    if (b.key == accountManager.defaultAccount.key)
     66      return 1;
     67    var aIsNews = a.incomingServer.type == "nntp";
     68    var bIsNews = b.incomingServer.type == "nntp";
     69    if (aIsNews && !bIsNews)
     70      return 1;
     71    if (bIsNews && !aIsNews)
     72      return -1;
    8773
    88         // Ugly hack to work around bug 41133. :-(
    89         accounts = accounts.filter(function isNonSuckyAccount(a) { return !!a.incomingServer; });
    90         accounts.sort(sortAccounts);
    91     }
    92     return accounts
     74    var aIsLocal = a.incomingServer.type == "none";
     75    var bIsLocal = b.incomingServer.type == "none";
     76    if (aIsLocal && !bIsLocal)
     77      return 1;
     78    if (bIsLocal && !aIsLocal)
     79      return -1;
     80    return 0;
     81  }
     82  if (Components.utils.import("resource:///modules/folderUtils.jsm") && Components.utils.import("resource:///modules/iteratorUtils.jsm") && typeof (allAccountsSorted) == 'function') {
     83    // if this worked we are having at least seamonkey 1.17
     84    //        Log.debug("getAccounts - new schema");
     85    accounts = allAccountsSorted(true);
     86  } else {
     87    // still some older version
     88    //        Log.debug("getAccounts - old schema");
     89    var accounts = queryISupportsArray(accountManager.accounts,
     90      Components.interfaces.nsIMsgAccount);
     91
     92    // Ugly hack to work around bug 41133. :-(
     93    accounts = accounts.filter(function isNonSuckyAccount(a) {
     94      return !!a.incomingServer;
     95    });
     96    accounts.sort(sortAccounts);
     97  }
     98  return accounts
    9399};
  • modules/vI_identityData.js

    r3c9c29 r509348  
    4545
    4646function identityData(email, fullName, id, smtp, extras, sideDescription, existingID) {
    47     this._email = email?email:"";
    48     this._emailParsed = false;
    49     this._fullName = fullName?fullName:"";
    50     this.id = new idObj(id);
    51     this.smtp = new smtpObj(smtp);
    52     if (extras) this.extras = extras;
    53     else this.extras = new identityDataExtras();
    54     this.comp = {   // holds the results of the last comparison for later creation of a compareMatrix
    55         compareID : null,
    56         equals : { fullName : {}, email : {}, smtp : {}, id : {}, extras : {} }
    57     }
    58     if (sideDescription) this.sideDescription = sideDescription;
    59     if (existingID) this.existingID = existingID;
    60     else if (this.id.value) this.sideDescription = " - " + this.id.value;
    61     this.stringBundle = Components.classes["@mozilla.org/intl/stringbundle;1"]
    62                         .getService(Components.interfaces.nsIStringBundleService)
    63                         .createBundle("chrome://v_identity/locale/v_identity.properties");
     47  this._email = email ? email : "";
     48  this._emailParsed = false;
     49  this._fullName = fullName ? fullName : "";
     50  this.id = new idObj(id);
     51  this.smtp = new smtpObj(smtp);
     52  if (extras) this.extras = extras;
     53  else this.extras = new identityDataExtras();
     54  this.comp = { // holds the results of the last comparison for later creation of a compareMatrix
     55    compareID: null,
     56    equals: {
     57      fullName: {},
     58      email: {},
     59      smtp: {},
     60      id: {},
     61      extras: {}
     62    }
     63  }
     64  if (sideDescription) this.sideDescription = sideDescription;
     65  if (existingID) this.existingID = existingID;
     66  else if (this.id.value) this.sideDescription = " - " + this.id.value;
     67  this.stringBundle = Components.classes["@mozilla.org/intl/stringbundle;1"]
     68    .getService(Components.interfaces.nsIStringBundleService)
     69    .createBundle("chrome://v_identity/locale/v_identity.properties");
    6470}
    6571identityData.prototype = {
    66     _email : null,          // internal email-field might contain combinedName (until first queried via email)
    67     _fullName : null,
    68     _emailParsed : null,
    69     id : null,
    70     smtp : null,
    71     extras : null,
    72     sideDescription : null,
    73     existingID : null,      // indicates that this is a pre-defined Identity, which might handled slightly differently
    74    
    75     stringBundle : null,
    76     comp : null,   
    77 
    78     parseEmail : function() {
    79         if (this._emailParsed) return;
    80         // parse email and move any additional parts to fullName
    81         if (this._email.match(/<\s*[^>\s]*@[^>\s]*\s*>/) || this._email.match(/<?\s*[^>\s]*@[^>\s]*\s*>?/) || this._email.match(/$/)) {
    82             this._fullName += RegExp.leftContext + RegExp.rightContext;
    83             this._email = RegExp.lastMatch;
    84 //          Log.debug("parseEmail _fullName = '" + this._fullName + "'");
    85 //          Log.debug("parseEmail _email =    '" + this._email + "'");
    86         }
    87         this._emailParsed = true;
    88     },
    89     get email() {
    90         this.parseEmail();
    91         return (this._email?this._email.replace(/\s+|<|>/g,""):"");
    92     },
    93     set email(email) { this._email = email; this._emailParsed = false; },
    94 
    95     cleanName : function(fullName) {
    96 //      Log.debug("cleanName init '" + fullName + "'");
    97         var _fullName = fullName.replace(/^\s+|\s+$/g,"");
    98         if (_fullName.search(/^\".+\"$|^'.+'$/g) != -1) {
    99             _fullName = this.cleanName(_fullName.replace(/^\"(.+)\"$|^'(.+)'$/g,"$1$2"));
    100         }
    101 //      Log.debug("cleanName done '" + _fullName + "'");
    102         return _fullName;
    103     },
    104 
    105     get fullName() {
    106         this.parseEmail();
    107         return (this._fullName?this.cleanName(this._fullName):"")
    108     },
    109     set fullName(fullName) { this._fullName = fullName; },
    110 
    111     get combinedName() {
    112         var fullName = this.fullName; var email = this.email;
    113         return fullName?fullName+(email?" <"+email+">":""):email
    114     },
    115     set combinedName(combinedName) { this._email = combinedName; this._fullName = ""; this._emailParsed = false; },
    116 
    117     __makeHtml : function (string) { return string?string.replace(/>/g,"&gt;").replace(/</g,"&lt;"):"" },
    118     get idHtml() { return this.__makeHtml(this.id.value); },
    119     get smtpHtml() { return this.__makeHtml(this.smtp.value); },
    120     get fullNameHtml() { return this.__makeHtml(this.fullName); },
    121     get emailHtml() { return this.__makeHtml(this.email); },
    122     get combinedNameHtml() { return this.__makeHtml(this.combinedName); },
    123 
    124     get idLabel() { return this.stringBundle.GetStringFromName("vident.identityData.baseID") },
    125     get smtpLabel() { return this.stringBundle.GetStringFromName("vident.identityData.SMTP") },
    126     get fullNameLabel() { return this.stringBundle.GetStringFromName("vident.identityData.Name") },
    127     get emailLabel() { return this.stringBundle.GetStringFromName("vident.identityData.Address") },
    128 
    129     // creates an Duplicate of the current IdentityData, cause usually we are working with a pointer
    130     getDuplicate : function() {
    131         return new identityData(this.email, this.fullName, this.id.key, this.smtp.key, this.extras?this.extras.getDuplicate():null, this.sideDescription, this.existingID);
    132     },
    133 
    134     // copys all values of an identity. This way we can create a new object with a different document-context
    135     copy : function(identityData) {
    136         this.email = identityData.email;
    137         this.fullName = identityData.fullName;
    138         this.id.key = identityData.id.key;
    139         this.smtp.key = identityData.smtp.key;
    140         this.sideDescription = identityData.sideDescription;
    141         if (this.extras) this.extras.copy(identityData.extras);
    142     },
    143 
    144     // dependent on MsgComposeCommands, should/will only be called in ComposeDialog
    145     isExistingIdentity : function(ignoreFullNameWhileComparing) {
    146         Log.debug("isExistingIdentity: ignoreFullNameWhileComparing='" + ignoreFullNameWhileComparing + "'");
    147 //      Log.debug("base: fullName.toLowerCase()='" + this.fullName + "' email.toLowerCase()='" + this.email + "' smtp='" + this.smtp.key + "'");
    148 
    149         var ignoreFullNameMatchKey = null;
    150         var accounts = getAccountsArray();
    151         for (let acc = 0; acc < accounts.length; acc++) {
    152             let account = accounts[acc];
    153             try { prefroot.getBoolPref("mail.account."+account.key+".vIdentity"); continue; } catch (e) { };
    154             let identities = getIdentitiesArray(account);
    155             for (let i = 0; i < identities.length; i++) {
    156                 let identity = identities[i];
    157 //              Log.debug("comp: fullName.toLowerCase()='" + identity.fullName.toLowerCase() + "' email.toLowerCase()='" + identity.email.toLowerCase() + "' smtp='" + identity.smtpServerKey + "'");
    158                 var email = this.email?this.email:"";               // might be null if no identity is set
    159                 var idEmail = identity.email?identity.email:""; // might be null if no identity is set
    160                 if (    (email.toLowerCase() == idEmail.toLowerCase()) &&
    161                     this.smtp.equal(new smtpObj(identity.smtpServerKey))    ) {
    162                         // if fullName matches, than this is a final match
    163                         if ( this.fullName.toLowerCase() == identity.fullName.toLowerCase() ) {
    164                             Log.debug("isExistingIdentity: " + this.combinedName + " found, id='" + identity.key + "'");
    165                             return identity.key; // return key and stop searching
    166                         }
    167                         // if fullNames don't match, remember the key but continue to search for full match
    168                         else if (!ignoreFullNameMatchKey) ignoreFullNameMatchKey = identity.key;
    169                 }
    170             }
    171         }
    172 
    173         if ( ignoreFullNameWhileComparing && ignoreFullNameMatchKey ) {
    174             Log.debug("isExistingIdentity: " + this.combinedName + " found, id='" + ignoreFullNameMatchKey + "'");
    175             return  ignoreFullNameMatchKey;
    176         }
    177 
    178         Log.debug("isExistingIdentity: " + this.combinedName + " not found");
    179         return null;
    180     },
    181    
    182     // dependent on MsgComposeCommands, should/will only be called in ComposeDialog
    183     hasMatchingDomainIdentity : function() {
    184         Log.debug("hasMatchingDomainIdentity");
    185        
    186         var domainArray = this.email.match(/@[^@]+$/);
    187         if (!domainArray) {
    188             Log.debug("hasMatchingDomainIdentity found no domain for email " + this.email);
    189             return;
    190         }
    191         Log.debug("hasMatchingDomainIdentity searching for domain " + domainArray[0]);
    192        
    193         var accounts = getAccountsArray();
    194         for (let acc = 0; acc < accounts.length; acc++) {
    195             let account = accounts[acc];
    196             try { prefroot.getBoolPref("mail.account."+account.key+".vIdentity"); continue; } catch (e) { };
    197             let identities = getIdentitiesArray(account);
    198             for (let i = 0; i < identities.length; i++) {
    199                 let identity = identities[i];
    200                 var idDomainArray = identity.email.match(/@[^@]+$/);
    201                 if (!idDomainArray) continue;
    202 //                 Log.debug("comp: domain.toLowerCase()='" + domainArray[0].toLowerCase() + "' idDomain.toLowerCase()='" + idDomainArray[0].toLowerCase() + "'");
    203                 if (domainArray[0].toLowerCase() == idDomainArray[0].toLowerCase()) {
    204                         // if domain matches, everything is perfect!
    205                         Log.debug("hasMatchingDomainIdentity: found matching id for domain '" + domainArray[0] + "'");
    206                         return identity.key; // return key and stop searching
    207                 }
    208             }
    209         }
    210         Log.debug("hasMatchingDomainIdentity: '" + domainArray[0] + "' not found");
    211         return null;
    212     },
    213 
    214     equals : function(compareIdentityData) {
    215         this.comp.compareID = compareIdentityData;
    216 
    217         this.comp.equals.fullName = (((this.fullName)?this.fullName.toLowerCase():null) == ((compareIdentityData.fullName)?compareIdentityData.fullName.toLowerCase():null));
    218         if (!this.comp.equals.fullName) {
    219 //       Log.debug("fullName not equal ('" + ((this.fullName)?this.fullName.toLowerCase():null) + "' != '" + ((compareIdentityData.fullName)?compareIdentityData.fullName.toLowerCase():null) + "')");
    220     }
    221     this.comp.equals.email = (((this.email)?this.email.toLowerCase():null) == ((compareIdentityData.email)?compareIdentityData.email.toLowerCase():null));
     72  _email: null, // internal email-field might contain combinedName (until first queried via email)
     73  _fullName: null,
     74  _emailParsed: null,
     75  id: null,
     76  smtp: null,
     77  extras: null,
     78  sideDescription: null,
     79  existingID: null, // indicates that this is a pre-defined Identity, which might handled slightly differently
     80
     81  stringBundle: null,
     82  comp: null,
     83
     84  parseEmail: function () {
     85    if (this._emailParsed) return;
     86    // parse email and move any additional parts to fullName
     87    if (this._email.match(/<\s*[^>\s]*@[^>\s]*\s*>/) || this._email.match(/<?\s*[^>\s]*@[^>\s]*\s*>?/) || this._email.match(/$/)) {
     88      this._fullName += RegExp.leftContext + RegExp.rightContext;
     89      this._email = RegExp.lastMatch;
     90      //            Log.debug("parseEmail _fullName = '" + this._fullName + "'");
     91      //            Log.debug("parseEmail _email =    '" + this._email + "'");
     92    }
     93    this._emailParsed = true;
     94  },
     95  get email() {
     96    this.parseEmail();
     97    return (this._email ? this._email.replace(/\s+|<|>/g, "") : "");
     98  },
     99  set email(email) {
     100    this._email = email;
     101    this._emailParsed = false;
     102  },
     103
     104  cleanName: function (fullName) {
     105    //      Log.debug("cleanName init '" + fullName + "'");
     106    var _fullName = fullName.replace(/^\s+|\s+$/g, "");
     107    if (_fullName.search(/^\".+\"$|^'.+'$/g) != -1) {
     108      _fullName = this.cleanName(_fullName.replace(/^\"(.+)\"$|^'(.+)'$/g, "$1$2"));
     109    }
     110    //      Log.debug("cleanName done '" + _fullName + "'");
     111    return _fullName;
     112  },
     113
     114  get fullName() {
     115    this.parseEmail();
     116    return (this._fullName ? this.cleanName(this._fullName) : "")
     117  },
     118  set fullName(fullName) {
     119    this._fullName = fullName;
     120  },
     121
     122  get combinedName() {
     123    var fullName = this.fullName;
     124    var email = this.email;
     125    return fullName ? fullName + (email ? " <" + email + ">" : "") : email
     126  },
     127  set combinedName(combinedName) {
     128    this._email = combinedName;
     129    this._fullName = "";
     130    this._emailParsed = false;
     131  },
     132
     133  __makeHtml: function (string) {
     134    return string ? string.replace(/>/g, "&gt;").replace(/</g, "&lt;") : ""
     135  },
     136  get idHtml() {
     137    return this.__makeHtml(this.id.value);
     138  },
     139  get smtpHtml() {
     140    return this.__makeHtml(this.smtp.value);
     141  },
     142  get fullNameHtml() {
     143    return this.__makeHtml(this.fullName);
     144  },
     145  get emailHtml() {
     146    return this.__makeHtml(this.email);
     147  },
     148  get combinedNameHtml() {
     149    return this.__makeHtml(this.combinedName);
     150  },
     151
     152  get idLabel() {
     153    return this.stringBundle.GetStringFromName("vident.identityData.baseID")
     154  },
     155  get smtpLabel() {
     156    return this.stringBundle.GetStringFromName("vident.identityData.SMTP")
     157  },
     158  get fullNameLabel() {
     159    return this.stringBundle.GetStringFromName("vident.identityData.Name")
     160  },
     161  get emailLabel() {
     162    return this.stringBundle.GetStringFromName("vident.identityData.Address")
     163  },
     164
     165  // creates an Duplicate of the current IdentityData, cause usually we are working with a pointer
     166  getDuplicate: function () {
     167    return new identityData(this.email, this.fullName, this.id.key, this.smtp.key, this.extras ? this.extras.getDuplicate() : null, this.sideDescription, this.existingID);
     168  },
     169
     170  // copys all values of an identity. This way we can create a new object with a different document-context
     171  copy: function (identityData) {
     172    this.email = identityData.email;
     173    this.fullName = identityData.fullName;
     174    this.id.key = identityData.id.key;
     175    this.smtp.key = identityData.smtp.key;
     176    this.sideDescription = identityData.sideDescription;
     177    if (this.extras) this.extras.copy(identityData.extras);
     178  },
     179
     180  // dependent on MsgComposeCommands, should/will only be called in ComposeDialog
     181  isExistingIdentity: function (ignoreFullNameWhileComparing) {
     182    Log.debug("isExistingIdentity: ignoreFullNameWhileComparing='" + ignoreFullNameWhileComparing + "'");
     183    //      Log.debug("base: fullName.toLowerCase()='" + this.fullName + "' email.toLowerCase()='" + this.email + "' smtp='" + this.smtp.key + "'");
     184
     185    var ignoreFullNameMatchKey = null;
     186    var accounts = getAccountsArray();
     187    for (let acc = 0; acc < accounts.length; acc++) {
     188      let account = accounts[acc];
     189      try {
     190        prefroot.getBoolPref("mail.account." + account.key + ".vIdentity");
     191        continue;
     192      } catch (e) {};
     193      let identities = getIdentitiesArray(account);
     194      for (let i = 0; i < identities.length; i++) {
     195        let identity = identities[i];
     196        //              Log.debug("comp: fullName.toLowerCase()='" + identity.fullName.toLowerCase() + "' email.toLowerCase()='" + identity.email.toLowerCase() + "' smtp='" + identity.smtpServerKey + "'");
     197        var email = this.email ? this.email : ""; // might be null if no identity is set
     198        var idEmail = identity.email ? identity.email : ""; // might be null if no identity is set
     199        if ((email.toLowerCase() == idEmail.toLowerCase()) &&
     200          this.smtp.equal(new smtpObj(identity.smtpServerKey))) {
     201          // if fullName matches, than this is a final match
     202          if (this.fullName.toLowerCase() == identity.fullName.toLowerCase()) {
     203            Log.debug("isExistingIdentity: " + this.combinedName + " found, id='" + identity.key + "'");
     204            return identity.key; // return key and stop searching
     205          }
     206          // if fullNames don't match, remember the key but continue to search for full match
     207          else if (!ignoreFullNameMatchKey) ignoreFullNameMatchKey = identity.key;
     208        }
     209      }
     210    }
     211
     212    if (ignoreFullNameWhileComparing && ignoreFullNameMatchKey) {
     213      Log.debug("isExistingIdentity: " + this.combinedName + " found, id='" + ignoreFullNameMatchKey + "'");
     214      return ignoreFullNameMatchKey;
     215    }
     216
     217    Log.debug("isExistingIdentity: " + this.combinedName + " not found");
     218    return null;
     219  },
     220
     221  // dependent on MsgComposeCommands, should/will only be called in ComposeDialog
     222  hasMatchingDomainIdentity: function () {
     223    Log.debug("hasMatchingDomainIdentity");
     224
     225    var domainArray = this.email.match(/@[^@]+$/);
     226    if (!domainArray) {
     227      Log.debug("hasMatchingDomainIdentity found no domain for email " + this.email);
     228      return;
     229    }
     230    Log.debug("hasMatchingDomainIdentity searching for domain " + domainArray[0]);
     231
     232    var accounts = getAccountsArray();
     233    for (let acc = 0; acc < accounts.length; acc++) {
     234      let account = accounts[acc];
     235      try {
     236        prefroot.getBoolPref("mail.account." + account.key + ".vIdentity");
     237        continue;
     238      } catch (e) {};
     239      let identities = getIdentitiesArray(account);
     240      for (let i = 0; i < identities.length; i++) {
     241        let identity = identities[i];
     242        var idDomainArray = identity.email.match(/@[^@]+$/);
     243        if (!idDomainArray) continue;
     244        //                 Log.debug("comp: domain.toLowerCase()='" + domainArray[0].toLowerCase() + "' idDomain.toLowerCase()='" + idDomainArray[0].toLowerCase() + "'");
     245        if (domainArray[0].toLowerCase() == idDomainArray[0].toLowerCase()) {
     246          // if domain matches, everything is perfect!
     247          Log.debug("hasMatchingDomainIdentity: found matching id for domain '" + domainArray[0] + "'");
     248          return identity.key; // return key and stop searching
     249        }
     250      }
     251    }
     252    Log.debug("hasMatchingDomainIdentity: '" + domainArray[0] + "' not found");
     253    return null;
     254  },
     255
     256  equals: function (compareIdentityData) {
     257    this.comp.compareID = compareIdentityData;
     258
     259    this.comp.equals.fullName = (((this.fullName) ? this.fullName.toLowerCase() : null) == ((compareIdentityData.fullName) ? compareIdentityData.fullName.toLowerCase() : null));
     260    if (!this.comp.equals.fullName) {
     261      //       Log.debug("fullName not equal ('" + ((this.fullName)?this.fullName.toLowerCase():null) + "' != '" + ((compareIdentityData.fullName)?compareIdentityData.fullName.toLowerCase():null) + "')");
     262    }
     263    this.comp.equals.email = (((this.email) ? this.email.toLowerCase() : null) == ((compareIdentityData.email) ? compareIdentityData.email.toLowerCase() : null));
    222264    if (!this.comp.equals.email) {
    223 //       Log.debug("email not equal ('" + ((this.email)?this.email.toLowerCase():null) + "' != '" + ((compareIdentityData.email)?compareIdentityData.email.toLowerCase():null) + "')");
    224     }
    225 
    226         this.comp.equals.smtp = this.smtp.equal(compareIdentityData.smtp);
    227         this.comp.equals.id = this.id.equal(compareIdentityData.id);
    228         this.comp.equals.extras = this.extras?this.extras.equal(compareIdentityData.extras):true;
    229        
    230         return (this.comp.equals.fullName && this.comp.equals.email && this.comp.equals.smtp && this.comp.equals.id && this.comp.equals.extras);
    231     },
    232 
    233     equalsIdentity : function(compareIdentityData, getCompareMatrix) {
    234         var equal = this.equals(compareIdentityData);
    235         var compareMatrix = null;
    236         // generate CompareMatrix only if asked and non-equal
    237         if (getCompareMatrix && !equal) compareMatrix = this.getCompareMatrix();
    238         return { equal : equal, compareMatrix : compareMatrix };
    239     },
    240 
    241     getCompareMatrix : function() {
    242         const Items = Array("fullName", "email", "smtp", "id");
    243         var string = "";
    244         var saveBaseId = vIprefs.get("storage_store_base_id");
    245         var saveSMTP = vIprefs.get("storage_store_SMTP");
    246         for each (let item in Items) {
    247             var classEqual = (this.comp.equals[item])?"equal":"unequal";
    248             var classIgnore = (((!saveBaseId) && (item == "id")) || ((!saveSMTP) && (item == "smtp")))?" ignoreValues":""
    249             string += "<tr>" +
    250                 "<td class='col1 " + classEqual + "'>" + this[item+"Label"] + "</td>" +
    251                 "<td class='col2 " + classEqual + classIgnore + "'>" + this.comp.compareID[item+"Html"] + "</td>" +
    252                 "<td class='col3 " + classEqual + classIgnore + "'>" + this[item+"Html"] + "</td>" +
    253                 "</tr>"
    254         }
    255         string += this.extras?this.extras.getCompareMatrix():"";
    256         return string;
    257     },
    258 
    259     getMatrix : function() {
    260         const Items = Array("smtp", "id");
    261         var string = "";
    262         for each (var item in Items) if (this[item+"Html"])
    263             string += "<tr><td class='col1'>" + this[item+"Label"] + ":</td>" +
    264                 "<td class='col2'>" + this[item+"Html"] + "</td></tr>"
    265         string += this.extras?this.extras.getMatrix():"";
    266         return string;     
    267     }
     265      //       Log.debug("email not equal ('" + ((this.email)?this.email.toLowerCase():null) + "' != '" + ((compareIdentityData.email)?compareIdentityData.email.toLowerCase():null) + "')");
     266    }
     267
     268    this.comp.equals.smtp = this.smtp.equal(compareIdentityData.smtp);
     269    this.comp.equals.id = this.id.equal(compareIdentityData.id);
     270    this.comp.equals.extras = this.extras ? this.extras.equal(compareIdentityData.extras) : true;
     271
     272    return (this.comp.equals.fullName && this.comp.equals.email && this.comp.equals.smtp && this.comp.equals.id && this.comp.equals.extras);
     273  },
     274
     275  equalsIdentity: function (compareIdentityData, getCompareMatrix) {
     276    var equal = this.equals(compareIdentityData);
     277    var compareMatrix = null;
     278    // generate CompareMatrix only if asked and non-equal
     279    if (getCompareMatrix && !equal) compareMatrix = this.getCompareMatrix();
     280    return {
     281      equal: equal,
     282      compareMatrix: compareMatrix
     283    };
     284  },
     285
     286  getCompareMatrix: function () {
     287    const Items = Array("fullName", "email", "smtp", "id");
     288    var string = "";
     289    var saveBaseId = vIprefs.get("storage_store_base_id");
     290    var saveSMTP = vIprefs.get("storage_store_SMTP");
     291    for each(let item in Items) {
     292      var classEqual = (this.comp.equals[item]) ? "equal" : "unequal";
     293      var classIgnore = (((!saveBaseId) && (item == "id")) || ((!saveSMTP) && (item == "smtp"))) ? " ignoreValues" : ""
     294      string += "<tr>" +
     295        "<td class='col1 " + classEqual + "'>" + this[item + "Label"] + "</td>" +
     296        "<td class='col2 " + classEqual + classIgnore + "'>" + this.comp.compareID[item + "Html"] + "</td>" +
     297        "<td class='col3 " + classEqual + classIgnore + "'>" + this[item + "Html"] + "</td>" +
     298        "</tr>"
     299    }
     300    string += this.extras ? this.extras.getCompareMatrix() : "";
     301    return string;
     302  },
     303
     304  getMatrix: function () {
     305    const Items = Array("smtp", "id");
     306    var string = "";
     307    for each(var item in Items) if (this[item + "Html"])
     308        string += "<tr><td class='col1'>" + this[item + "Label"] + ":</td>" +
     309        "<td class='col2'>" + this[item + "Html"] + "</td></tr>"
     310    string += this.extras ? this.extras.getMatrix() : "";
     311    return string;
     312  }
    268313}
    269314
    270315function identityCollection() {
    271     this.number = 0;
    272     this.identityDataCollection = {};
    273     this.menuItems = {};
    274 }
    275 identityCollection.prototype =
    276 {
    277     number : null,
    278     identityDataCollection : null,
    279     menuItems : null,
    280    
    281     mergeWithoutDuplicates : function(addIdentityCollection) {
    282         for (var index = 0; index < addIdentityCollection.number; index++)
    283             this.addWithoutDuplicates(addIdentityCollection.identityDataCollection[index])
    284     },
    285 
    286     dropIdentity : function(index) {
    287         Log.debug("dropping address from inputList: " + this.identityDataCollection[index].combinedName);
    288         while (index < (this.number - 1)) { this.identityDataCollection[index] = this.identityDataCollection[++index]; };
    289         this.identityDataCollection[--this.number] = null;
    290     },
    291 
    292     addWithoutDuplicates : function(identityData) {
    293         if (!identityData) return;
    294         for (var index = 0; index < this.number; index++) {
    295             if (this.identityDataCollection[index].email == identityData.email &&
    296                 (!this.identityDataCollection[index].id.key || !identityData.id.key ||
    297                     (this.identityDataCollection[index].id.key == identityData.id.key &&
    298                     this.identityDataCollection[index].smtp.key == identityData.smtp.key))) {
    299                 // found, so check if we can use the Name of the new field
    300                 if (this.identityDataCollection[index].fullName == "" && identityData.fullName != "") {
    301                     this.identityDataCollection[index].fullName = identityData.fullName;
    302                     Log.debug("added fullName '" + identityData.fullName
    303                         + "' to stored email '" + this.identityDataCollection[index].email + "'")
    304                 }
    305                 // check if id_key, smtp_key or extras can be used
    306                 // only try this once, for the first Identity where id is set)
    307                 if (!this.identityDataCollection[index].id.key && identityData.id.key) {
    308                     this.identityDataCollection[index].id.key = identityData.id.key;
    309                     this.identityDataCollection[index].smtp.key = identityData.smtp.key;
    310                     this.identityDataCollection[index].extras = identityData.extras;
    311                     Log.debug("added id '" + identityData.id.value
    312                         + "' smtp '" + identityData.smtp.value + "' (+extras) to stored email '" + this.identityDataCollection[index].email + "'")
    313                 }
    314                 return;
    315             }
    316         }
    317         Log.debug("add new address to result: " + identityData.combinedName)
    318         this.identityDataCollection[index] = identityData;
    319         this.number = index + 1;
    320     },
    321    
    322     // this is used to completely use the conten of another identityCollection, but without changing all pointers
    323     // see for instance vI.smartIdentity.__filterAddresses
    324     takeOver : function(newIdentityCollection) {
    325         this.number = newIdentityCollection.number
    326         this.identityDataCollection = newIdentityCollection.identityDataCollection
    327     }
     316  this.number = 0;
     317  this.identityDataCollection = {};
     318  this.menuItems = {};
     319}
     320identityCollection.prototype = {
     321  number: null,
     322  identityDataCollection: null,
     323  menuItems: null,
     324
     325  mergeWithoutDuplicates: function (addIdentityCollection) {
     326    for (var index = 0; index < addIdentityCollection.number; index++)
     327      this.addWithoutDuplicates(addIdentityCollection.identityDataCollection[index])
     328  },
     329
     330  dropIdentity: function (index) {
     331    Log.debug("dropping address from inputList: " + this.identityDataCollection[index].combinedName);
     332    while (index < (this.number - 1)) {
     333      this.identityDataCollection[index] = this.identityDataCollection[++index];
     334    };
     335    this.identityDataCollection[--this.number] = null;
     336  },
     337
     338  addWithoutDuplicates: function (identityData) {
     339    if (!identityData) return;
     340    for (var index = 0; index < this.number; index++) {
     341      if (this.identityDataCollection[index].email == identityData.email &&
     342        (!this.identityDataCollection[index].id.key || !identityData.id.key ||
     343          (this.identityDataCollection[index].id.key == identityData.id.key &&
     344            this.identityDataCollection[index].smtp.key == identityData.smtp.key))) {
     345        // found, so check if we can use the Name of the new field
     346        if (this.identityDataCollection[index].fullName == "" && identityData.fullName != "") {
     347          this.identityDataCollection[index].fullName = identityData.fullName;
     348          Log.debug("added fullName '" + identityData.fullName + "' to stored email '" + this.identityDataCollection[index].email + "'")
     349        }
     350        // check if id_key, smtp_key or extras can be used
     351        // only try this once, for the first Identity where id is set)
     352        if (!this.identityDataCollection[index].id.key && identityData.id.key) {
     353          this.identityDataCollection[index].id.key = identityData.id.key;
     354          this.identityDataCollection[index].smtp.key = identityData.smtp.key;
     355          this.identityDataCollection[index].extras = identityData.extras;
     356          Log.debug("added id '" + identityData.id.value + "' smtp '" + identityData.smtp.value + "' (+extras) to stored email '" + this.identityDataCollection[index].email + "'")
     357        }
     358        return;
     359      }
     360    }
     361    Log.debug("add new address to result: " + identityData.combinedName)
     362    this.identityDataCollection[index] = identityData;
     363    this.number = index + 1;
     364  },
     365
     366  // this is used to completely use the conten of another identityCollection, but without changing all pointers
     367  // see for instance vI.smartIdentity.__filterAddresses
     368  takeOver: function (newIdentityCollection) {
     369    this.number = newIdentityCollection.number
     370    this.identityDataCollection = newIdentityCollection.identityDataCollection
     371  }
    328372};
    329373
    330374function smtpObj(key) {
    331     this._key = key;
    332     this.DEFAULT_TAG =  Components.classes["@mozilla.org/intl/stringbundle;1"]
    333                         .getService(Components.interfaces.nsIStringBundleService)
    334                         .createBundle("chrome://messenger/locale/messenger.properties").
    335                             GetStringFromName("defaultServerTag");
     375  this._key = key;
     376  this.DEFAULT_TAG = Components.classes["@mozilla.org/intl/stringbundle;1"]
     377    .getService(Components.interfaces.nsIStringBundleService)
     378    .createBundle("chrome://messenger/locale/messenger.properties").
     379  GetStringFromName("defaultServerTag");
    336380}
    337381smtpObj.prototype = {
    338     DEFAULT_TAG : null,
    339     _key : null,
    340     _value : null,
    341    
    342     set key(key) { this._key = key; this._value = null; },
    343     get key() {
    344         var dummy = this.value; // just to be sure key is adapted if SMTP is not available
    345         return this._key
    346     },
    347     get keyNice() { // the same as key but with "" for DEFAULT_SMTP_TAG
    348         if (this.key == DEFAULT_SMTP_TAG) return ""; // this is the key used for default server
    349         return this.key
    350     },
    351     get value() {
    352         if (this._value == null) {
    353             this._value = "";
    354             if (this._key == null || this._key == "") this._key = DEFAULT_SMTP_TAG;
    355             if (this._key == DEFAULT_SMTP_TAG) this._value = this.DEFAULT_TAG;
    356             else if (!this._key) this._value = null;
    357             else if (this._key) {
    358                 var servers, smtpService = Components.classes["@mozilla.org/messengercompose/smtp;1"]
    359                     .getService(Components.interfaces.nsISmtpService);
    360                 // check for new https://hg.mozilla.org/comm-central/rev/fab9e5145cd4 smtpService
    361                 if (typeof(smtpService.servers) == "object") servers = smtpService.servers;
    362                 else servers = smtpService.smtpServers;
    363 
    364                 while (servers && servers.hasMoreElements()) {
    365                     var server = servers.getNext();
    366                     if (server instanceof Components.interfaces.nsISmtpServer &&
    367                         !server.redirectorType && this._key == server.key) {
    368                         this._value = server.description?server.description:server.hostname;
    369                         break;
    370                     }
    371                 }
    372             }
    373         }
    374         if (!this._value) this._key = NO_SMTP_TAG; // if non-existant SMTP handle like non available
    375         return this._value;
    376     },
    377     equal : function(compareSmtpObj) {
    378         if (this.key == NO_SMTP_TAG || compareSmtpObj.key == NO_SMTP_TAG) return true;
     382  DEFAULT_TAG: null,
     383  _key: null,
     384  _value: null,
     385
     386  set key(key) {
     387    this._key = key;
     388    this._value = null;
     389  },
     390  get key() {
     391    var dummy = this.value; // just to be sure key is adapted if SMTP is not available
     392    return this._key
     393  },
     394  get keyNice() { // the same as key but with "" for DEFAULT_SMTP_TAG
     395    if (this.key == DEFAULT_SMTP_TAG) return ""; // this is the key used for default server
     396    return this.key
     397  },
     398  get value() {
     399    if (this._value == null) {
     400      this._value = "";
     401      if (this._key == null || this._key == "") this._key = DEFAULT_SMTP_TAG;
     402      if (this._key == DEFAULT_SMTP_TAG) this._value = this.DEFAULT_TAG;
     403      else if (!this._key) this._value = null;
     404      else if (this._key) {
     405        var servers, smtpService = Components.classes["@mozilla.org/messengercompose/smtp;1"]
     406          .getService(Components.interfaces.nsISmtpService);
     407        // check for new https://hg.mozilla.org/comm-central/rev/fab9e5145cd4 smtpService
     408        if (typeof (smtpService.servers) == "object") servers = smtpService.servers;
     409        else servers = smtpService.smtpServers;
     410
     411        while (servers && servers.hasMoreElements()) {
     412          var server = servers.getNext();
     413          if (server instanceof Components.interfaces.nsISmtpServer &&
     414            !server.redirectorType && this._key == server.key) {
     415            this._value = server.description ? server.description : server.hostname;
     416            break;
     417          }
     418        }
     419      }
     420    }
     421    if (!this._value) this._key = NO_SMTP_TAG; // if non-existant SMTP handle like non available
     422    return this._value;
     423  },
     424  equal: function (compareSmtpObj) {
     425    if (this.key == NO_SMTP_TAG || compareSmtpObj.key == NO_SMTP_TAG) return true;
    379426    if (this.keyNice != compareSmtpObj.keyNice) {
    380 //       Log.debug("smtp not equal ('" + this.keyNice + "' != '" + compareSmtpObj.keyNice + "')");
    381     }
    382         return (this.keyNice == compareSmtpObj.keyNice);
    383     },
    384     hasNoDefinedSMTP : function() {
    385         return (this.key == NO_SMTP_TAG);
    386     }
    387 }
    388 
    389 function idObj(key) { this._key = key; }
     427      //       Log.debug("smtp not equal ('" + this.keyNice + "' != '" + compareSmtpObj.keyNice + "')");
     428    }
     429    return (this.keyNice == compareSmtpObj.keyNice);
     430  },
     431  hasNoDefinedSMTP: function () {
     432    return (this.key == NO_SMTP_TAG);
     433  }
     434}
     435
     436function idObj(key) {
     437  this._key = key;
     438}
    390439idObj.prototype = {
    391     _key : null,
    392     _value : null,
    393 
    394     set key(key) { this._key = key; this._value = null; },
    395     get key() { if (this._value == null) var dummy = this.value; return this._key },
    396     get value() {
    397         if (this._value == null) {
    398             this._value = "";
    399             // if this worked we are having at least seamonkey 1.17
    400             let accounts = getAccountsArray();
    401             for (let acc = 0; acc < accounts.length; acc++) {
    402                 let account = accounts[acc];
    403                 let identities = getIdentitiesArray(account);
    404                 if (identities.length == 0)
    405                     continue;
    406                 for (let i = 0; i < identities.length; i++) {
    407                     let identity = identities[i];
    408                     if (this._key == identity.key) {
    409                         this._value = identity.identityName;
    410                         break;
    411                     }
    412                 }
    413             }
    414             if (!this._value) this._key = null;
    415         }
    416         return this._value;
    417     },
    418     equal : function(compareIdObj) {
    419         if (!this.key || !compareIdObj.key) return true;
     440  _key: null,
     441  _value: null,
     442
     443  set key(key) {
     444    this._key = key;
     445    this._value = null;
     446  },
     447  get key() {
     448    if (this._value == null) var dummy = this.value;
     449    return this._key
     450  },
     451  get value() {
     452    if (this._value == null) {
     453      this._value = "";
     454      // if this worked we are having at least seamonkey 1.17
     455      let accounts = getAccountsArray();
     456      for (let acc = 0; acc < accounts.length; acc++) {
     457        let account = accounts[acc];
     458        let identities = getIdentitiesArray(account);
     459        if (identities.length == 0)
     460          continue;
     461        for (let i = 0; i < identities.length; i++) {
     462          let identity = identities[i];
     463          if (this._key == identity.key) {
     464            this._value = identity.identityName;
     465            break;
     466          }
     467        }
     468      }
     469      if (!this._value) this._key = null;
     470    }
     471    return this._value;
     472  },
     473  equal: function (compareIdObj) {
     474    if (!this.key || !compareIdObj.key) return true;
    420475    if (this.key != compareIdObj.key) {
    421 //       Log.debug("id not equal ('" + this.key + "' != '" + compareIdObj.key + "')");
    422     }
    423         return (this.key == compareIdObj.key);
    424     }
    425 }
     476      //       Log.debug("id not equal ('" + this.key + "' != '" + compareIdObj.key + "')");
     477    }
     478    return (this.key == compareIdObj.key);
     479  }
     480}
  • modules/vI_identityDataExtras.js

    r3c9c29 r509348  
    2525var EXPORTED_SYMBOLS = ["identityDataExtras", "registerIdExtrasObject", "identityDataExtrasObject", "identityDataExtrasCheckboxObject"];
    2626
    27 const {classes: Cc, interfaces: Ci, utils: Cu, results : Cr} = Components;
     27const {
     28  classes: Cc,
     29  interfaces: Ci,
     30  utils: Cu,
     31  results: Cr
     32} = Components;
    2833
    2934Cu.import("resource://v_identity/vI_log.js");
     
    4752    .getService(Ci.nsIWindowMediator)
    4853    .getMostRecentWindow(null);
    49   for each (let [, identityDataExtrasObject] in Iterator(idExtrasObjects)) {
     54  for each(let [, identityDataExtrasObject] in Iterator(idExtrasObjects)) {
    5055    this.extras.push(new identityDataExtrasObject(currentWindow));
    5156  }
     
    5358    this.loopThroughExtras(
    5459      function (extra) {
    55         extra.value = rdfDatasource._getRDFValue(resource, extra.field);});
     60        extra.value = rdfDatasource._getRDFValue(resource, extra.field);
     61      });
    5662}
    5763identityDataExtras.prototype = {
    58   loopThroughExtras : function(k, returnVal) {
    59     for( var i = 0; i < this.extras.length; i++ ) {
     64  loopThroughExtras: function (k, returnVal) {
     65    for (var i = 0; i < this.extras.length; i++) {
    6066      try {
    6167        returnVal = k(this.extras[i], i, returnVal)
    62       }
    63       catch (e) {
     68      } catch (e) {
    6469        Log.warn("identityDataExtras '" + this.extras[i].field + "' returned an error:", e);
    6570        dumpCallStack(e);
     
    6873    return returnVal;
    6974  },
    70  
     75
    7176  // just give a duplicate of the current identityDataExtras, else we will work with pointers
    72   getDuplicate : function() {
     77  getDuplicate: function () {
    7378    var newExtras = new identityDataExtras();
    7479    this.loopThroughExtras(function (extra, i) {
     
    7782    return newExtras;
    7883  },
    79    
     84
    8085  // copys all values of an identity. This way we can create a new object with a different document-context
    81   copy : function(extras) {
     86  copy: function (extras) {
    8287    this.loopThroughExtras(function (extra, i) {
    8388      extra.value = extras.extras[i].value;
     
    8590  },
    8691
    87   equal : function(identityDataExtras) {
     92  equal: function (identityDataExtras) {
    8893    var returnVal = true;
    8994    return this.loopThroughExtras(function (extra, i, returnVal) {
    90       return extra.active?(extra.equal(identityDataExtras.extras[i]) && returnVal):returnVal;
     95      return extra.active ? (extra.equal(identityDataExtras.extras[i]) && returnVal) : returnVal;
    9196    }, returnVal);
    9297  },
    93  
    94   getMatrix : function() {
     98
     99  getMatrix: function () {
    95100    var returnVal = "";
    96101    return this.loopThroughExtras(function (extra, i, returnVal) {
    97102      if (extra.active && extra.valueHtml)
    98103        returnVal += "<tr>" +
    99           "<td class='col1 extras '>" + stringBundle.GetStringFromName("vident.identityData.extras." + extra.field) + "</td>" +
    100           "<td class='col2 extras '>" + extra.valueHtml + "</td>" +
    101           "</tr>"
     104        "<td class='col1 extras '>" + stringBundle.GetStringFromName("vident.identityData.extras." + extra.field) + "</td>" +
     105        "<td class='col2 extras '>" + extra.valueHtml + "</td>" +
     106        "</tr>"
    102107      return returnVal;
    103108    }, returnVal);
    104109  },
    105110
    106   getCompareMatrix : function() {
     111  getCompareMatrix: function () {
    107112    var returnVal = "";
    108113    return this.loopThroughExtras(function (extra, i, returnVal) {
    109114      if (extra.active) {
    110         var classEqual = (extra.lastCompareResult)?"equal":"unequal";
     115        var classEqual = (extra.lastCompareResult) ? "equal" : "unequal";
    111116        returnVal += "<tr>" +
    112         "<td class='col1 extras " + classEqual + "'>" + stringBundle.GetStringFromName("vident.identityData.extras." + extra.field) + "</td>" +
    113         "<td class='col2 extras " + classEqual + "'>" + extra.lastCompareValue + "</td>" +
    114         "<td class='col3 extras " + classEqual + "'>" + extra.valueHtml + "</td>" +
    115         "</tr>"
     117          "<td class='col1 extras " + classEqual + "'>" + stringBundle.GetStringFromName("vident.identityData.extras." + extra.field) + "</td>" +
     118          "<td class='col2 extras " + classEqual + "'>" + extra.lastCompareValue + "</td>" +
     119          "<td class='col3 extras " + classEqual + "'>" + extra.valueHtml + "</td>" +
     120          "</tr>"
    116121      }
    117122      return returnVal
     
    119124  },
    120125
    121   status : function() {
     126  status: function () {
    122127    var returnVal = "";
    123128    return this.loopThroughExtras(function (extra) {
    124       return returnVal += returnVal?" ":"" + extra.status;
     129      return returnVal += returnVal ? " " : "" + extra.status;
    125130    }, returnVal);
    126131  },
    127132
    128   readIdentityValues : function(identity) {
     133  readIdentityValues: function (identity) {
    129134    this.loopThroughExtras(function (extra) {
    130135      extra.readIdentityValue(identity)
     
    132137  },
    133138
    134   setValuesToEnvironment : function() {
     139  setValuesToEnvironment: function () {
    135140    this.loopThroughExtras(function (extra) {
    136141      extra.setValueToEnvironment()
    137142    });
    138143  },
    139  
    140   getValuesFromEnvironment : function() {
     144
     145  getValuesFromEnvironment: function () {
    141146    this.loopThroughExtras(function (extra) {
    142147      extra.getValueFromEnvironment()
    143148    });
    144149  },
    145  
     150
    146151  // add value's to the pref object, required for rdfDataTreeCollection
    147   addPrefs : function(pref) {
     152  addPrefs: function (pref) {
    148153    this.loopThroughExtras(function (extra) {
    149154      pref[extra.field + "Col"] = extra.valueNice;
     
    156161}
    157162identityDataExtrasObject.prototype = {
    158   value :   null,  // will contain the current value of the object and can be accessed from outside
    159   field :   null,  // short description of the field
    160   option :  null,  // option from preferences, boolean
    161   window :  null,  // the current Window the object was created for
    162  
    163   lastCompareValue : "",
    164   lastCompareResult : false,
     163  value: null, // will contain the current value of the object and can be accessed from outside
     164  field: null, // short description of the field
     165  option: null, // option from preferences, boolean
     166  window: null, // the current Window the object was created for
     167
     168  lastCompareValue: "",
     169  lastCompareResult: false,
    165170
    166171  get valueHtml() {
    167       if (!this.value)
    168         return "";
    169       return  "<div class='bool" + ((this.value=="true")?" checked":"") + "'>" +
    170               "<label class='screen'>&nbsp;</label>" +
    171               "<label class='braille'>" + this.valueNice + "</label>" +
    172           "</div>"
     172    if (!this.value)
     173      return "";
     174    return "<div class='bool" + ((this.value == "true") ? " checked" : "") + "'>" +
     175      "<label class='screen'>&nbsp;</label>" +
     176      "<label class='braille'>" + this.valueNice + "</label>" +
     177      "</div>"
    173178  },
    174179  get valueNice() {
    175       if (!this.value)
    176         return "";
    177       return (this.value=="true")?"yes":"no";
     180    if (!this.value)
     181      return "";
     182    return (this.value == "true") ? "yes" : "no";
    178183  },
    179184  get status() {
     
    182187    return "";
    183188  },
    184   get active() { return vIprefs.get("storage") && vIprefs.get(this.option) },
    185   equal : function(compareIdentityDataExtrasObject) {
     189  get active() {
     190    return vIprefs.get("storage") && vIprefs.get(this.option)
     191  },
     192  equal: function (compareIdentityDataExtrasObject) {
    186193    this.lastCompareValue = compareIdentityDataExtrasObject.valueHtml;
    187194    this.lastCompareResult = (!this.value || !compareIdentityDataExtrasObject.value || this.value == compareIdentityDataExtrasObject.value);
    188195    if (!this.lastCompareResult) {
    189       Log.debug("extras not equal "+ this.field + " ('" + this.value + "' != '" + compareIdentityDataExtrasObject.value + "')");
     196      Log.debug("extras not equal " + this.field + " ('" + this.value + "' != '" + compareIdentityDataExtrasObject.value + "')");
    190197    }
    191198    return this.lastCompareResult;
    192199  },
    193200  // function to read the value from a given identity (probably not part of identity)
    194   readIdentityValue : function(identity) { },
     201  readIdentityValue: function (identity) {},
    195202  // function to set or read the value from/to the environment
    196   setValueToEnvironment : function() {
     203  setValueToEnvironment: function () {
    197204    let id = this.currentWindow.document.documentElement.id;
    198     switch(id) {
    199       case "msgcomposeWindow":
    200         this.setValueToEnvironment_msgCompose();
    201         break;
    202       case "messengerWindow":
    203         this.setValueToEnvironment_messenger();
    204         break;
    205       case "vI_rdfDataTreeWindow":
    206       case "vI_rdfDataEditor":
    207         this.setValueToEnvironment_dataEditor();
    208         break;
    209       default:
    210         Log.error("getValueFromEnvironment unknown window: " + id)
    211     }
    212   },
    213   getValueFromEnvironment : function() {
     205    switch (id) {
     206    case "msgcomposeWindow":
     207      this.setValueToEnvironment_msgCompose();
     208      break;
     209    case "messengerWindow":
     210      this.setValueToEnvironment_messenger();
     211      break;
     212    case "vI_rdfDataTreeWindow":
     213    case "vI_rdfDataEditor":
     214      this.setValueToEnvironment_dataEditor();
     215      break;
     216    default:
     217      Log.error("getValueFromEnvironment unknown window: " + id)
     218    }
     219  },
     220  getValueFromEnvironment: function () {
    214221    let id = this.currentWindow.document.documentElement.id;
    215     switch(id) {
    216       case "msgcomposeWindow":
    217         this.getValueFromEnvironment_msgCompose();
    218         break;
    219       case "messengerWindow":
    220         this.getValueFromEnvironment_messenger();
    221         break;
    222       case "vI_rdfDataTreeWindow":
    223       case "vI_rdfDataEditor":
    224         this.getValueFromEnvironment_dataEditor();
    225         break;
    226       default:
    227         Log.error("getValueFromEnvironment unknown window: " + id)
    228     }
    229   },
    230   setValueToEnvironment_msgCompose : function() {
     222    switch (id) {
     223    case "msgcomposeWindow":
     224      this.getValueFromEnvironment_msgCompose();
     225      break;
     226    case "messengerWindow":
     227      this.getValueFromEnvironment_messenger();
     228      break;
     229    case "vI_rdfDataTreeWindow":
     230    case "vI_rdfDataEditor":
     231      this.getValueFromEnvironment_dataEditor();
     232      break;
     233    default:
     234      Log.error("getValueFromEnvironment unknown window: " + id)
     235    }
     236  },
     237  setValueToEnvironment_msgCompose: function () {
    231238    Log.error("setValueToEnvironment not implemented for msgCompose and " + this.field)
    232239  },
    233   setValueToEnvironment_messenger : function() {
     240  setValueToEnvironment_messenger: function () {
    234241    Log.error("setValueToEnvironment not implemented for Messenger and " + this.field)
    235242  },
    236   setValueToEnvironment_dataEditor : function() {
     243  setValueToEnvironment_dataEditor: function () {
    237244    Log.error("setValueToEnvironment not implemented for dataEditor and " + this.field)
    238245  },
    239   getValueFromEnvironment_msgCompose : function() {
     246  getValueFromEnvironment_msgCompose: function () {
    240247    Log.error("setValueToEnvironment not implemented for msgCompose and " + this.field)
    241248  },
    242   getValueFromEnvironment_messenger : function() {
     249  getValueFromEnvironment_messenger: function () {
    243250    Log.error("setValueToEnvironment not implemented for Messenger and " + this.field)
    244251  },
    245   getValueFromEnvironment_dataEditor : function() {
     252  getValueFromEnvironment_dataEditor: function () {
    246253    Log.error("setValueToEnvironment not implemented for dataEditor and " + this.field)
    247254  }
     
    254261identityDataExtrasCheckboxObject.prototype = {
    255262  __proto__: identityDataExtrasObject.prototype,
    256  
    257   updateFunction_msgCompose : function() {},
    258   elementID_msgCompose : null,
    259  
    260   readIdentityValue : function(identity) {
     263
     264  updateFunction_msgCompose: function () {},
     265  elementID_msgCompose: null,
     266
     267  readIdentityValue: function (identity) {
    261268    if (this.active)
    262       this.value = (this.func_valueFromIdentity(identity))?"true":"false";
    263   },
    264 
    265   setValueToEnvironment_msgCompose: function() {
     269      this.value = (this.func_valueFromIdentity(identity)) ? "true" : "false";
     270  },
     271
     272  setValueToEnvironment_msgCompose: function () {
    266273    var element = this.currentWindow.document.getElementById(this.elementID_msgCompose);
    267274    if (!this.active || (this.value == null) || !element)
    268275      return;
    269    
     276
    270277    this.updateFunction_msgCompose();
    271278    if ((element.getAttribute("checked") == "true") != (this.value == "true")) {
    272       Log.debug("change "+ this.field + " to " + this.value + " with doCommand");
     279      Log.debug("change " + this.field + " to " + this.value + " with doCommand");
    273280      element.doCommand();
    274281    }
    275282  },
    276  
    277   setValueToEnvironment_dataEditor: function() {
     283
     284  setValueToEnvironment_dataEditor: function () {
    278285    if (this.value != null) {
    279286      this.currentWindow.document.getElementById("vI_" + this.option).setAttribute("checked", this.value);
     
    282289    this.currentWindow.document.getElementById("vI_" + this.option + "_store").doCommand();
    283290  },
    284  
    285   getValueFromEnvironment_msgCompose: function() {
     291
     292  getValueFromEnvironment_msgCompose: function () {
    286293    var element = this.currentWindow.document.getElementById(this.elementID_msgCompose)
    287294    if (this.active && element) {
    288295      this.updateFunction_msgCompose();
    289       this.value = ((element.getAttribute("checked") == "true")?"true":"false");
    290     }
    291   },
    292  
    293   getValueFromEnvironment_dataEditor: function() {
     296      this.value = ((element.getAttribute("checked") == "true") ? "true" : "false");
     297    }
     298  },
     299
     300  getValueFromEnvironment_dataEditor: function () {
    294301    if (this.currentWindow.document.getElementById("vI_" + this.option + "_store").getAttribute("checked") == "true") {
    295302      var elementValue = this.currentWindow.document.getElementById("vI_" + this.option).getAttribute("checked");
    296       this.value = (elementValue == "true")?"true":"false"
    297     }
    298     else
     303      this.value = (elementValue == "true") ? "true" : "false"
     304    } else
    299305      this.value = null;
    300306  }
  • modules/vI_log.js

    r3c9c29 r509348  
    2525var EXPORTED_SYMBOLS = ["setupLogging", "dumpCallStack", "MyLog", "Colors",
    2626  "clearDebugOutput", "notificationOverflow",
    27   "SmartReplyNotification", "StorageNotification", "GetHeaderNotification" ]
    28 
    29 const {classes: Cc, interfaces: Ci, utils: Cu, results : Cr} = Components;
     27  "SmartReplyNotification", "StorageNotification", "GetHeaderNotification"
     28]
     29
     30const {
     31  classes: Cc,
     32  interfaces: Ci,
     33  utils: Cu,
     34  results: Cr
     35} = Components;
    3036Cu.import("resource:///modules/gloda/log4moz.js");
    3137Cu.import("resource://v_identity/vI_prefs.js");
     
    5258
    5359  shutdown: function () {
    54       try {
    55         Services.console.unregisterListener(this);
    56         Services.obs.removeObserver(this, "quit-application");
    57       } catch (e) { };
     60    try {
     61      Services.console.unregisterListener(this);
     62      Services.obs.removeObserver(this, "quit-application");
     63    } catch (e) {};
    5864  },
    5965
     
    6672    try {
    6773      if ((aMessage instanceof Components.interfaces.nsIScriptError) &&
    68         (aMessage.sourceName.contains("v_identity")) &&
    69         (!aMessage.errorMessage.contains("Error console says")))
    70         {
    71             MyLog.info("Error console says" + aMessage);
    72         }
    73     }
    74     catch (ex) {
     74        (aMessage.sourceName.contains("v_identity")) &&
     75        (!aMessage.errorMessage.contains("Error console says"))) {
     76        MyLog.info("Error console says" + aMessage);
     77      }
     78    } catch (ex) {
    7579      // This is to avoid pathological error loops.  we definitely do not
    7680      // want to propagate an error here.
     
    8993    //  undefined.
    9094    let messageString = [
    91       ("" + mo) for each
    92       ([,mo] in Iterator(message.messageObjects))].join(" ");
     95      ("" + mo) for each([, mo] in Iterator(message.messageObjects))
     96    ].join(" ");
    9397    return messageString;
    9498  }
     
    104108    //  undefined.
    105109    let messageString = [
    106       ("" + mo) for each
    107       ([,mo] in Iterator(message.messageObjects))].join(" ");
    108     return message.loggerName.replace("virtualIdentity.", "") + ":\t" + messageString  + "\n";
     110      ("" + mo) for each([, mo] in Iterator(message.messageObjects))
     111    ].join(" ");
     112    return message.loggerName.replace("virtualIdentity.", "") + ":\t" + messageString + "\n";
    109113  }
    110114};
     
    121125  __proto__: Log4Moz.Appender.prototype,
    122126
    123   currentWindow : null,
    124  
     127  currentWindow: null,
     128
    125129  doAppend: function DOApp_doAppend(message) {
    126130    if (!vIprefs.get("debug_notification")) return;
     
    144148NotificationOutputAppender.prototype = {
    145149  __proto__: Log4Moz.Appender.prototype,
    146  
    147   currentWindow : null,
     150
     151  currentWindow: null,
    148152
    149153  doAppend: function DOApp_doAppend(message) {
     
    154158      this.addNote(message);
    155159  },
    156  
    157   timer : null,
    158 
    159   clearNote: function(self) {
     160
     161  timer: null,
     162
     163  clearNote: function (self) {
    160164    if (self.timer)
    161165      self.currentWindow.clearTimeout(self.timer);
     
    166170  },
    167171
    168   addNote: function(note) {
     172  addNote: function (note) {
    169173    let obj_notificationBox = this.currentWindow.document.getElementById("virtualIdentityExtension_vINotification");
    170174    if (!obj_notificationBox)
    171175      return;
    172176    let oldNotification = obj_notificationBox.currentNotification
    173     let newLabel = (oldNotification)?oldNotification.label + note:note;
     177    let newLabel = (oldNotification) ? oldNotification.label + note : note;
    174178    this.clearNote(this);
    175179    obj_notificationBox.appendNotification(newLabel, "", "chrome://messenger/skin/icons/flag.png");
     
    177181    if (vIprefs.get("notification_timeout") != 0)
    178182      this.timer =
    179         this.currentWindow.setTimeout(this.clearNote,
    180                                       vIprefs.get("notification_timeout") * 1000, this);
     183      this.currentWindow.setTimeout(this.clearNote,
     184        vIprefs.get("notification_timeout") * 1000, this);
    181185  }
    182186}
     
    189193  // height will be cut off from messagepane (in 3pane window)
    190194  let objMessagepane = currentWindow.document.getElementById("messagepane");
    191   let maxHeight = (objMessagepane)?parseInt(objMessagepane.boxObject.height / 2)+1:null;
     195  let maxHeight = (objMessagepane) ? parseInt(objMessagepane.boxObject.height / 2) + 1 : null;
    192196  if (maxHeight < 60) maxHeight = 60; // set a minimum size, if to small scrollbars are hidden
    193     let tooBig = (maxHeight)?(elem.inputField.scrollHeight > maxHeight):false;
    194     let newHeight = (tooBig)?maxHeight:elem.inputField.scrollHeight;
    195     elem.height = newHeight;
     197  let tooBig = (maxHeight) ? (elem.inputField.scrollHeight > maxHeight) : false;
     198  let newHeight = (tooBig) ? maxHeight : elem.inputField.scrollHeight;
     199  elem.height = newHeight;
    196200  // give the box a frame if it is to big
    197201  if (tooBig)
    198202    var notificationBox = currentWindow.document.getElementById("virtualIdentityExtension_vINotificationTextbox");
    199     if (notificationBox) notificationBox.setAttribute("class", "plain border");
     203  if (notificationBox) notificationBox.setAttribute("class", "plain border");
    200204}
    201205
     
    265269
    266270function _startFileLogging() {
    267     var file = Components.classes["@mozilla.org/file/local;1"]
    268         .createInstance(Components.interfaces.nsIFile);
    269 
    270     var defaultPath = Components.classes["@mozilla.org/file/directory_service;1"]
    271                 .getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile).path;
    272 
     271  var file = Components.classes["@mozilla.org/file/local;1"]
     272    .createInstance(Components.interfaces.nsIFile);
     273
     274  var defaultPath = Components.classes["@mozilla.org/file/directory_service;1"]
     275    .getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile).path;
     276
     277  try {
     278    file.initWithPath(vIprefs.get("debug_to_file_path"));
     279  } catch (NS_ERROR_FILE_UNRECOGNIZED_PATH) {
    273280    try {
    274         file.initWithPath(vIprefs.get("debug_to_file_path"));
     281      // try linux delimiter
     282      file.initWithPath(defaultPath + "/" + vIprefs.get("debug_to_file_path"));
     283    } catch (NS_ERROR_FILE_UNRECOGNIZED_PATH) {
     284      try {
     285        // use windows delimiter
     286        file.initWithPath(defaultPath + "\\" + vIprefs.get("debug_to_file_path"));
     287      } catch (NS_ERROR_FILE_UNRECOGNIZED_PATH) {
     288        dump("FileAppender not available for logging: set logging file first\n");
     289      };
    275290    }
    276     catch(NS_ERROR_FILE_UNRECOGNIZED_PATH) {
    277         try {
    278             // try linux delimiter
    279             file.initWithPath(defaultPath + "/" + vIprefs.get("debug_to_file_path"));
    280         } catch (NS_ERROR_FILE_UNRECOGNIZED_PATH) {
    281             try {
    282                 // use windows delimiter
    283                 file.initWithPath(defaultPath + "\\" + vIprefs.get("debug_to_file_path"));
    284             } catch (NS_ERROR_FILE_UNRECOGNIZED_PATH) {
    285                 dump("FileAppender not available for logging: set logging file first\n");
    286             };
    287         }
    288     }
    289     // A dump appender outputs to File
    290     DebugFileAppender = new Log4Moz.FileAppender(file);
    291 
    292     if (DebugFileAppender.doAppend.toString().indexOf("this._fos().write") > -1) {
    293         dump("*** hot-fixing FileAppender Logging Bug (https://bugzilla.mozilla.org/show_bug.cgi?id=1082551)\n");
    294         // there is a bug in original implementation of doAppend, fix the issue
    295         DebugFileAppender.doAppend = function FApp_doAppend(message) {
    296             if (message === null || message.length <= 0)
    297                 return;
    298             try {
    299                 this._fos.write(message, message.length);
    300             } catch(e) {
    301                 dump("Error writing file:\n" + e);
    302             }
    303         };
    304     }
    305 
    306     DebugFileAppender.level = Log4Moz.Level["All"];
    307     Log4Moz.repository.rootLogger.addAppender(DebugFileAppender);
    308    
    309     _errorConsoleTunnel.initialize();
     291  }
     292  // A dump appender outputs to File
     293  DebugFileAppender = new Log4Moz.FileAppender(file);
     294
     295  if (DebugFileAppender.doAppend.toString().indexOf("this._fos().write") > -1) {
     296    dump("*** hot-fixing FileAppender Logging Bug (https://bugzilla.mozilla.org/show_bug.cgi?id=1082551)\n");
     297    // there is a bug in original implementation of doAppend, fix the issue
     298    DebugFileAppender.doAppend = function FApp_doAppend(message) {
     299      if (message === null || message.length <= 0)
     300        return;
     301      try {
     302        this._fos.write(message, message.length);
     303      } catch (e) {
     304        dump("Error writing file:\n" + e);
     305      }
     306    };
     307  }
     308
     309  DebugFileAppender.level = Log4Moz.Level["All"];
     310  Log4Moz.repository.rootLogger.addAppender(DebugFileAppender);
     311
     312  _errorConsoleTunnel.initialize();
    310313}
    311314
    312315function _stopFileLogging() {
    313     if (DebugFileAppender)
    314         Log4Moz.repository.rootLogger.removeAppender(DebugFileAppender);
    315     _errorConsoleTunnel.shutdown();
     316  if (DebugFileAppender)
     317    Log4Moz.repository.rootLogger.removeAppender(DebugFileAppender);
     318  _errorConsoleTunnel.shutdown();
    316319}
    317320
    318321function _dump_extension_list() {
    319     Components.utils.import("resource://gre/modules/AddonManager.jsm");
    320     AddonManager.getAllAddons(function(addons) {
    321         var strings = addons.map(function(addon) {
    322             return (addon.userDisabled || addon.appDisabled ? "" : "addon: " + addon.name + " " + addon.version + "\n");
    323         });
    324         MyLog.info("\n--------------------------------------------------------------------------------\n" +
    325             strings.join("") +
    326             "--------------------------------------------------------------------------------");
    327         });
     322  Components.utils.import("resource://gre/modules/AddonManager.jsm");
     323  AddonManager.getAllAddons(function (addons) {
     324    var strings = addons.map(function (addon) {
     325      return (addon.userDisabled || addon.appDisabled ? "" : "addon: " + addon.name + " " + addon.version + "\n");
     326    });
     327    MyLog.info("\n--------------------------------------------------------------------------------\n" +
     328      strings.join("") +
     329      "--------------------------------------------------------------------------------");
     330  });
    328331}
    329332
    330333function _dump_info_block() {
    331     // add some information about the mail-client and the extensions installed
    332     if ("@mozilla.org/xre/app-info;1" in Components.classes) {
    333         var appInfo = Components.classes["@mozilla.org/xre/app-info;1"]
    334             .getService(Components.interfaces.nsIXULAppInfo);
    335         var protohandler = Components.classes["@mozilla.org/network/protocol;1?name=http"]
    336             .getService(Components.interfaces.nsIHttpProtocolHandler);
    337         MyLog.info("start logging for new session\n--------------------------------------------------------------------------------\n" +
    338             appInfo.name + " " + appInfo.version + " (" + appInfo.appBuildID + "; " + protohandler.oscpu + ")\n" +
    339             "--------------------------------------------------------------------------------");
    340     }
    341     else
    342         MyLog.info("\n--------------------------------------------------------------------------------\n" +
    343             "mail-client seems not supported by Virtual Identity Extension\n" +
    344             "--------------------------------------------------------------------------------");
    345    
    346     _dump_extension_list();
     334  // add some information about the mail-client and the extensions installed
     335  if ("@mozilla.org/xre/app-info;1" in Components.classes) {
     336    var appInfo = Components.classes["@mozilla.org/xre/app-info;1"]
     337      .getService(Components.interfaces.nsIXULAppInfo);
     338    var protohandler = Components.classes["@mozilla.org/network/protocol;1?name=http"]
     339      .getService(Components.interfaces.nsIHttpProtocolHandler);
     340    MyLog.info("start logging for new session\n--------------------------------------------------------------------------------\n" +
     341      appInfo.name + " " + appInfo.version + " (" + appInfo.appBuildID + "; " + protohandler.oscpu + ")\n" +
     342      "--------------------------------------------------------------------------------");
     343  } else
     344    MyLog.info("\n--------------------------------------------------------------------------------\n" +
     345      "mail-client seems not supported by Virtual Identity Extension\n" +
     346      "--------------------------------------------------------------------------------");
     347
     348  _dump_extension_list();
    347349}
    348350
    349351function UpdateFileLoggerPath() {
    350     dump("UpdateFileLoggerPath\n");
    351     if (vIprefs.get("debug_to_file")) {
    352         _stopFileLogging();
    353         _startFileLogging();
    354         _dump_info_block();
    355     }
    356 }   
     352  dump("UpdateFileLoggerPath\n");
     353  if (vIprefs.get("debug_to_file")) {
     354    _stopFileLogging();
     355    _startFileLogging();
     356    _dump_info_block();
     357  }
     358}
    357359
    358360function UpdateFileLogger() {
    359     if (vIprefs.get("debug_to_file")) {
    360         _startFileLogging();
    361         _dump_info_block();
    362     }
    363     else {
    364         _stopFileLogging();
    365     }
     361  if (vIprefs.get("debug_to_file")) {
     362    _startFileLogging();
     363    _dump_info_block();
     364  } else {
     365    _stopFileLogging();
     366  }
    366367}
    367368
    368369function UpdateSmartReplyNotification() {
    369     if (vIprefs.get("smart_reply_notification")) {
    370         SmartReplyAppender = new NotificationOutputAppender(myNotificationFormatter);
    371         SmartReplyAppender.level = Log4Moz.Level["All"];
    372         SmartReplyNotification.addAppender(SmartReplyAppender);
    373     }
    374     else {
    375         SmartReplyNotification.removeAppender(SmartReplyAppender);
    376     }
     370  if (vIprefs.get("smart_reply_notification")) {
     371    SmartReplyAppender = new NotificationOutputAppender(myNotificationFormatter);
     372    SmartReplyAppender.level = Log4Moz.Level["All"];
     373    SmartReplyNotification.addAppender(SmartReplyAppender);
     374  } else {
     375    SmartReplyNotification.removeAppender(SmartReplyAppender);
     376  }
    377377}
    378378
    379379function UpdateStorageNotification() {
    380     if (vIprefs.get("storage_notification")) {
    381         StorageAppender = new NotificationOutputAppender(myNotificationFormatter);
    382         StorageAppender.level = Log4Moz.Level["All"];
    383         StorageNotification.addAppender(StorageAppender);
    384     }
    385     else {
    386         StorageNotification.removeAppender(StorageAppender);
    387     }
     380  if (vIprefs.get("storage_notification")) {
     381    StorageAppender = new NotificationOutputAppender(myNotificationFormatter);
     382    StorageAppender.level = Log4Moz.Level["All"];
     383    StorageNotification.addAppender(StorageAppender);
     384  } else {
     385    StorageNotification.removeAppender(StorageAppender);
     386  }
    388387}
    389388
    390389function UpdateGetHeaderNotification() {
    391     if (vIprefs.get("get_header_notification")) {
    392         GetHeaderAppender = new NotificationOutputAppender(myNotificationFormatter);
    393         GetHeaderAppender.level = Log4Moz.Level["All"];
    394         GetHeaderNotification.addAppender(GetHeaderAppender);
    395     }
    396     else {
    397         GetHeaderNotification.removeAppender(GetHeaderAppender);
    398     }
     390  if (vIprefs.get("get_header_notification")) {
     391    GetHeaderAppender = new NotificationOutputAppender(myNotificationFormatter);
     392    GetHeaderAppender.level = Log4Moz.Level["All"];
     393    GetHeaderNotification.addAppender(GetHeaderAppender);
     394  } else {
     395    GetHeaderNotification.removeAppender(GetHeaderAppender);
     396  }
    399397}
    400398
  • modules/vI_nameSpaceWrapper.js

    r3c9c29 r509348  
    1313virtualIdentityExtension.Log.debug("init vI_overlayNameSpaceWrapper " + virtualIdentityExtension.initTime);
    1414
    15 (function() { this.ns = function(fn) { fn.apply({}); };  }).apply(virtualIdentityExtension);
     15(function () {
     16  this.ns = function (fn) {
     17    fn.apply({});
     18  };
     19}).apply(virtualIdentityExtension);
    1620
    1721virtualIdentityExtension.LIB = {
    18     // Shared APIs
    19     getCurrentURI: function() {
    20       virtualIdentityExtension.Log.debug("getCurrentURI " + window.location.href);
    21       return window.location.href;
    22     },
     22  // Shared APIs
     23  getCurrentURI: function () {
     24    virtualIdentityExtension.Log.debug("getCurrentURI " + window.location.href);
     25    return window.location.href;
     26  },
    2327
    24     // Extension singleton shortcut
    25     vI: virtualIdentityExtension
     28  // Extension singleton shortcut
     29  vI: virtualIdentityExtension
    2630};
  • modules/vI_prefs.js

    r3c9c29 r509348  
    2525var EXPORTED_SYMBOLS = ["vIprefs", "prefroot"]
    2626
    27 const {classes: Cc, interfaces: Ci, utils: Cu, results : Cr} = Components;
     27const {
     28  classes: Cc,
     29  interfaces: Ci,
     30  utils: Cu,
     31  results: Cr
     32} = Components;
    2833
    2934Cu.import("resource://v_identity/vI_log.js");
     
    4449// even without influencing the global pref settings
    4550var vIprefs = {
    46     _localPrefs: [],        // array to store accessed prefs (and enable to change them)
    47     _localObservers: [],    // array of local observers { pref: aPrefName, observer: aFunction }
    48    
    49     _retrievePref: function(aPrefName) {
    50       switch (vIprefroot.getPrefType(aPrefName)) {
    51         case vIprefroot.PREF_STRING:
    52           this._localPrefs[aPrefName] = vIprefroot.getCharPref(aPrefName);
    53           break;
    54         case vIprefroot.PREF_INT:
    55           this._localPrefs[aPrefName] = vIprefroot.getIntPref(aPrefName);
    56           break;
    57         case vIprefroot.PREF_BOOL:
    58           this._localPrefs[aPrefName] = vIprefroot.getBoolPref(aPrefName);
    59           break;
    60         case vIprefroot.PREF_INVALID:
    61           Log.error("_retrievePref pref '" + aPrefName + "' not available");
    62           this._localPrefs[aPrefName] = null;
     51  _localPrefs: [], // array to store accessed prefs (and enable to change them)
     52  _localObservers: [], // array of local observers { pref: aPrefName, observer: aFunction }
     53
     54  _retrievePref: function (aPrefName) {
     55    switch (vIprefroot.getPrefType(aPrefName)) {
     56    case vIprefroot.PREF_STRING:
     57      this._localPrefs[aPrefName] = vIprefroot.getCharPref(aPrefName);
     58      break;
     59    case vIprefroot.PREF_INT:
     60      this._localPrefs[aPrefName] = vIprefroot.getIntPref(aPrefName);
     61      break;
     62    case vIprefroot.PREF_BOOL:
     63      this._localPrefs[aPrefName] = vIprefroot.getBoolPref(aPrefName);
     64      break;
     65    case vIprefroot.PREF_INVALID:
     66      Log.error("_retrievePref pref '" + aPrefName + "' not available");
     67      this._localPrefs[aPrefName] = null;
     68    }
     69  },
     70
     71  _storePref: function (aPrefName) {
     72    switch (vIprefroot.getPrefType(aPrefName)) {
     73    case vIprefroot.PREF_STRING:
     74      vIprefroot.setCharPref(aPrefName, this._localPrefs[aPrefName]);
     75      break;
     76    case vIprefroot.PREF_INT:
     77      vIprefroot.setIntPref(aPrefName, this._localPrefs[aPrefName]);
     78      break;
     79    case vIprefroot.PREF_BOOL:
     80      vIprefroot.setBoolPref(aPrefName, this._localPrefs[aPrefName]);
     81      break;
     82    case vIprefroot.PREF_INVALID:
     83      Log.error("_storePref pref '" + aPrefName + "' not available");
     84    }
     85  },
     86
     87  get: function (aPrefName) {
     88    if (!(aPrefName in this._localPrefs))
     89      this._retrievePref(aPrefName);
     90    return this._localPrefs[aPrefName];
     91  },
     92  set: function (aPrefName, aPrefValue) {
     93    if (!(aPrefName in this._localPrefs))
     94      this._retrievePref(aPrefName);
     95    this._localPrefs[aPrefName] = aPrefValue;
     96    //       Log.debug("changed pref " + aPrefName + " to " + aPrefValue)
     97    for each(let [, prefObserver] in Iterator(this._localObservers)) {
     98      //         Log.debug("check prefobserver " + prefObserver.pref + " against " + aPrefName)
     99      if (prefObserver.pref == aPrefName) {
     100        prefObserver.observe(prefObserver.context, aPrefValue, "nsPref:changed", aPrefName);
    63101      }
    64     },
    65 
    66     _storePref: function(aPrefName) {
    67       switch (vIprefroot.getPrefType(aPrefName)) {
    68         case vIprefroot.PREF_STRING:
    69           vIprefroot.setCharPref(aPrefName, this._localPrefs[aPrefName]);
    70           break;
    71         case vIprefroot.PREF_INT:
    72           vIprefroot.setIntPref(aPrefName, this._localPrefs[aPrefName]);
    73           break;
    74         case vIprefroot.PREF_BOOL:
    75           vIprefroot.setBoolPref(aPrefName, this._localPrefs[aPrefName]);
    76           break;
    77         case vIprefroot.PREF_INVALID:
    78           Log.error("_storePref pref '" + aPrefName + "' not available");
     102    }
     103  },
     104  commit: function (aPrefName, aPrefValue) {
     105    if (aPrefValue)
     106      this.set(aPrefName, aPrefValue);
     107    if (aPrefName in this._localPrefs)
     108      this._storePref(aPrefName);
     109  },
     110  clearUserPref: function (aPrefName) {
     111    Log.error(Colors.red, "XXXX not yet implemented clearUserPref!", Colors.default);
     112  },
     113  addObserver: function (aPrefName, aFunction, aSelf) {
     114    this._localObservers.push({
     115      pref: aPrefName,
     116      observe: aFunction,
     117      context: aSelf
     118    });
     119    //       Log.debug("added observer for " + aPrefName);
     120  },
     121  removeObserver: function (aPrefName, aFunction) {
     122    for each(let [i, prefObserver] in Iterator(this._localObservers)) {
     123      if (prefObserver.pref == aPrefName && prefObserver.observe == aFunction) {
     124        this._localObservers.splice(i, 1)
     125        break;
    79126      }
    80     },
    81 
    82     get: function(aPrefName) {
    83       if (!(aPrefName in this._localPrefs))
    84         this._retrievePref(aPrefName);
    85       return this._localPrefs[aPrefName];
    86     },
    87     set: function(aPrefName, aPrefValue) {
    88       if (!(aPrefName in this._localPrefs))
    89         this._retrievePref(aPrefName);
    90       this._localPrefs[aPrefName] = aPrefValue;
    91 //       Log.debug("changed pref " + aPrefName + " to " + aPrefValue)
    92       for each (let [, prefObserver] in Iterator(this._localObservers)) {
    93 //         Log.debug("check prefobserver " + prefObserver.pref + " against " + aPrefName)
    94         if (prefObserver.pref == aPrefName) {
    95           prefObserver.observe(prefObserver.context, aPrefValue, "nsPref:changed", aPrefName);
    96         }
     127    }
     128  },
     129  observe: function (subject, topic, aPrefName) {
     130    Log.debug("prefChange observed : " + aPrefName)
     131    this._retrievePref(aPrefName);
     132    for each(let [, prefObserver] in Iterator(this._localObservers)) {
     133      if (prefObserver.pref == aPrefName) {
     134        //           Log.debug("found observer, calling : " + prefObserver.observe)
     135        prefObserver.observe(prefObserver.context, subject, topic, aPrefName);
     136        //           Log.debug("found observer, calling : " + prefObserver.observe + " done")
    97137      }
    98     },
    99     commit: function(aPrefName, aPrefValue) {
    100       if (aPrefValue)
    101         this.set(aPrefName, aPrefValue);
    102       if (aPrefName in this._localPrefs)
    103         this._storePref(aPrefName);
    104     },
    105     clearUserPref: function(aPrefName) {
    106       Log.error(Colors.red, "XXXX not yet implemented clearUserPref!", Colors.default);
    107     },
    108     addObserver: function(aPrefName, aFunction, aSelf) {
    109       this._localObservers.push({ pref: aPrefName, observe: aFunction, context: aSelf });
    110 //       Log.debug("added observer for " + aPrefName);
    111     },
    112     removeObserver: function(aPrefName, aFunction) {
    113       for each (let [i, prefObserver] in Iterator(this._localObservers)) {
    114         if (prefObserver.pref == aPrefName && prefObserver.observe == aFunction) {
    115           this._localObservers.splice(i,1)
    116           break;
    117         }
    118       }
    119     },
    120     observe: function(subject, topic, aPrefName) {
    121       Log.debug("prefChange observed : " + aPrefName)
     138    }
     139  },
     140  dropLocalChanges: function () {
     141    for each(let [aPrefName, aPrefValue] in Iterator(this._localPrefs)) {
    122142      this._retrievePref(aPrefName);
    123       for each (let [, prefObserver] in Iterator(this._localObservers)) {
    124         if (prefObserver.pref == aPrefName) {
    125 //           Log.debug("found observer, calling : " + prefObserver.observe)
    126           prefObserver.observe(prefObserver.context, subject, topic, aPrefName);
    127 //           Log.debug("found observer, calling : " + prefObserver.observe + " done")
    128         }
    129       }
    130     },
    131     dropLocalChanges: function() {
    132       for each (let [aPrefName, aPrefValue] in Iterator(this._localPrefs)) {
    133         this._retrievePref(aPrefName);
    134         if (aPrefValue != this._localPrefs[aPrefName]) {
    135           for each (let [, prefObserver] in Iterator(this._localObservers)) {
    136             if (prefObserver.pref == aPrefName) {
    137               prefObserver.observe(prefObserver.context, aPrefValue, "nsPref:changed", aPrefName);
    138             }
     143      if (aPrefValue != this._localPrefs[aPrefName]) {
     144        for each(let [, prefObserver] in Iterator(this._localObservers)) {
     145          if (prefObserver.pref == aPrefName) {
     146            prefObserver.observe(prefObserver.context, aPrefValue, "nsPref:changed", aPrefName);
    139147          }
    140148        }
    141149      }
    142150    }
     151  }
    143152}
    144153
  • modules/vI_rdfDatasource.js

    r3c9c29 r509348  
    4343
    4444function rdfDatasource(rdfFileName, dontRegisterObserver) {
    45     this._rdfFileName = rdfFileName;
    46     if (this._rdfFileName) this.init();
    47     if (!dontRegisterObserver) this.AccountManagerObserver.register();
     45  this._rdfFileName = rdfFileName;
     46  if (this._rdfFileName) this.init();
     47  if (!dontRegisterObserver) this.AccountManagerObserver.register();
     48  try {
     49    this._extVersion = get3PaneWindow().virtualIdentityExtension.extensionVersion;
     50  } catch (e) {}
     51}
     52
     53function initWithFilePath_tryDelimiters(_nsILocalFile, path, filename) {
     54  try {
     55    Log.debug("Filename try linux delimiter: '" + path + "/" + filename + "'");
     56    _nsILocalFile.initWithPath(path + "/" + filename);
     57  } catch (NS_ERROR_FILE_UNRECOGNIZED_PATH) {
    4858    try {
    49       this._extVersion = get3PaneWindow().virtualIdentityExtension.extensionVersion;
    50     } catch (e) { }
     59      Log.debug("Filename try windows delimiter: '" + path + "\\" + filename + "'");
     60      _nsILocalFile.initWithPath(path + "\\" + filename);
     61    } catch (NS_ERROR_FILE_UNRECOGNIZED_PATH) {
     62      Log.debug("Filename not valid: '" + path + "[\\/]" + filename + "'");
     63      Log.debug("can't open rdfDatasource - storage won't work");
     64      var debugMsg = "Filename not valid: '" + path + "\\" + filename + "'\n" +
     65        "Filename not valid: '" + path + "/" + filename + "'\n" +
     66        "Virtual Identity Storage won't work.\n\n" +
     67        "Please report this issue with filename on https://www.absorb.it/virtual-id\n\n" +
     68        "You can just copy the lines below in your browser to create a ticket\n\n" +
     69        "https://www.absorb.it/virtual-id/newticket?summary=RDF Filename Error&description=Filename " + path + "[\\/]" + filename + " for rdf not valid"
     70      get3PaneWindow().alert(debugMsg);
     71      return;
     72    }
     73  }
     74};
     75
     76rdfDatasource.prototype = {
     77  _extVersion: null,
     78  _rdfVersion: "0.0.5",
     79  _rdfService: Components.classes["@mozilla.org/rdf/rdf-service;1"]
     80    .getService(Components.interfaces.nsIRDFService),
     81  _rdfDataSource: null,
     82  _rdfFileName: null,
     83  _rdfNS: "http://virtual-id.absorb.it/",
     84  _rdfNSStorage: "vIStorage",
     85  _rdfNSEmail: "vIStorage/email",
     86  _rdfNSMaillist: "vIStorage/maillist",
     87  _rdfNSNewsgroup: "vIStorage/newsgroup",
     88  _rdfNSFilter: "vIStorage/filter",
     89  _rdfNSAccounts: "vIAccounts",
     90  _rdfNSIdentities: "vIAccounts/id",
     91  _rdfNSSMTPservers: "vIAccounts/smtp",
     92
     93  _virtualIdentityID: "{dddd428e-5ac8-4a81-9f78-276c734f75b8}",
     94
     95  _emailContainer: Components.classes["@mozilla.org/rdf/container;1"]
     96    .createInstance(Components.interfaces.nsIRDFContainer),
     97
     98  _maillistContainer: Components.classes["@mozilla.org/rdf/container;1"]
     99    .createInstance(Components.interfaces.nsIRDFContainer),
     100
     101  _newsgroupContainer: Components.classes["@mozilla.org/rdf/container;1"]
     102    .createInstance(Components.interfaces.nsIRDFContainer),
     103
     104  _filterContainer: Components.classes["@mozilla.org/rdf/container;1"]
     105    .createInstance(Components.interfaces.nsIRDFContainer),
     106
     107  _identityContainer: Components.classes["@mozilla.org/rdf/container;1"]
     108    .createInstance(Components.interfaces.nsIRDFContainer),
     109
     110  _smtpContainer: Components.classes["@mozilla.org/rdf/container;1"]
     111    .createInstance(Components.interfaces.nsIRDFContainer),
     112
     113  getContainer: function (type) {
     114    switch (type) {
     115    case "email":
     116      return this._emailContainer;
     117    case "maillist":
     118      return this._maillistContainer;
     119    case "newsgroup":
     120      return this._newsgroupContainer;
     121    case "filter":
     122      return this._filterContainer;
     123    case "identity":
     124      return this._identityContainer;
     125    case "smtp":
     126      return this._smtpContainer;
     127    }
     128    return null;
     129  },
     130
     131  init: function () {
     132    //         Log.debug("init.");
     133
     134    this._openRdfDataSource();
     135    if (!this._rdfDataSource) return;
     136    this._initContainers();
     137    if (this.rdfUpgradeRequired()) this.rdfUpgrade();
     138
     139    // store version everytime to recognize downgrades later
     140    this.storeRDFVersion();
     141
     142    //         this.refreshAccountInfo();
     143    //         Log.debug("init done.");
     144  },
     145
     146  _openRdfDataSource: function () {
     147    //         if (!this._rdfFileName || this._rdfDataSource);
     148    var protoHandler = Components.classes["@mozilla.org/network/protocol;1?name=file"]
     149      .getService(Components.interfaces.nsIFileProtocolHandler)
     150    var newFile = Components.classes["@mozilla.org/file/local;1"]
     151      .createInstance(Components.interfaces.nsILocalFile);
     152
     153    var file = Components.classes["@mozilla.org/file/directory_service;1"]
     154      .getService(Components.interfaces.nsIProperties)
     155      .get("ProfD", Components.interfaces.nsIFile);
     156
     157    //         Log.debug("_openRdfDataSource");
     158    initWithFilePath_tryDelimiters(newFile, file.path, this._rdfFileName);
     159
     160    var fileURI = protoHandler.newFileURI(newFile);
     161
     162    Log.debug("init: read rdf from '" + fileURI.spec + "'");
     163
     164    this._rdfDataSource =
     165      this._rdfService.GetDataSourceBlocking(fileURI.spec);
     166
     167    //         Log.debug("read rdf from '" + fileURI.spec + "' done." + this._rdfService);
     168  },
     169
     170  _initContainers: function () {
     171    try { // will possibly fail before upgrade
     172      var storageRes = this._rdfService
     173        .GetResource(this._rdfNS + this._rdfNSEmail);
     174      this._emailContainer.Init(this._rdfDataSource, storageRes);
     175      storageRes = this._rdfService
     176        .GetResource(this._rdfNS + this._rdfNSMaillist);
     177      this._maillistContainer.Init(this._rdfDataSource, storageRes);
     178      storageRes = this._rdfService
     179        .GetResource(this._rdfNS + this._rdfNSNewsgroup);
     180      this._newsgroupContainer.Init(this._rdfDataSource, storageRes);
     181      storageRes = this._rdfService
     182        .GetResource(this._rdfNS + this._rdfNSFilter);
     183      this._filterContainer.Init(this._rdfDataSource, storageRes);
     184      storageRes = this._rdfService
     185        .GetResource(this._rdfNS + this._rdfNSIdentities);
     186      this._identityContainer.Init(this._rdfDataSource, storageRes);
     187      storageRes = this._rdfService
     188        .GetResource(this._rdfNS + this._rdfNSSMTPservers);
     189      this._smtpContainer.Init(this._rdfDataSource, storageRes);
     190    } catch (e) {};
     191  },
     192
     193  // ******************************************************************************************
     194  // **************    BEGIN RDF UPGRADE CODE    **********************************************
     195  rdfUpgradeRequired: function () {
     196    var oldRdfVersion = this.getCurrentRDFFileVersion();
     197    var versionChecker = Components.classes["@mozilla.org/xpcom/version-comparator;1"]
     198      .getService(Components.interfaces.nsIVersionComparator);
     199    return (!oldRdfVersion || versionChecker.compare(oldRdfVersion, this._rdfVersion) < 0)
     200  },
     201  // **************    RDF UPGRADE CODE    ****************************************************
     202  extUpgradeRequired: function () {
     203    if (!this._extVersion) return false;
     204    var oldExtVersion = this.getCurrentExtFileVersion()
     205    var versionChecker = Components.classes["@mozilla.org/xpcom/version-comparator;1"]
     206      .getService(Components.interfaces.nsIVersionComparator);
     207    return (!oldExtVersion || versionChecker.compare(oldExtVersion, this._extVersion) < 0)
     208  },
     209  // **************    RDF UPGRADE CODE    ****************************************************
     210  rdfUpgrade: function () {
     211    var currentVersion = this.getCurrentRDFFileVersion();
     212    Log.debug("checking for previous version of rdf, found " +
     213      currentVersion + " - rdf-upgrade required.")
     214    switch (currentVersion) {
     215    case null:
     216    case "0.0.1":
     217    case "0.0.2":
     218      this._createRDFContainers(); // no break
     219    case "0.0.3":
     220      this._tagDefaultSMTP();
     221    case "0.0.4":
     222    default:
     223      this._createAccountInfoContainers();
     224    }
     225    this.storeRDFVersion();
     226    Log.debug("rdf-upgrade to " + this.getCurrentRDFFileVersion() + " done.");
     227  },
     228  // **************    RDF UPGRADE CODE    ****************************************************
     229  // only used for upgrade to 0.0.3 - loop through all ressources.
     230  _transferAllResources: function () {
     231    Log.debug("upgrade: transferAllResources");
     232    var enumerator = this._rdfDataSource.GetAllResources();
     233    while (enumerator && enumerator.hasMoreElements()) {
     234      var resource = enumerator.getNext();
     235      resource.QueryInterface(Components.interfaces.nsIRDFResource);
     236
     237      var type;
     238      var name;
     239      if (resource.ValueUTF8.match(new RegExp(this._rdfNS + this._rdfNSEmail + "/", "i"))) {
     240        type = "email";
     241        name = RegExp.rightContext
     242      } else if (resource.ValueUTF8.match(new RegExp(this._rdfNS + this._rdfNSNewsgroup + "/", "i"))) {
     243        type = "newsgroup";
     244        name = RegExp.rightContext
     245      } else if (resource.ValueUTF8.match(new RegExp(this._rdfNS + this._rdfNSMaillist + "/", "i"))) {
     246        type = "maillist";
     247        name = RegExp.rightContext
     248      } else continue;
     249
     250      var container = this.getContainer(type);
     251      this._setRDFValue(resource, "name", name);
     252
     253      if (container.IndexOf(resource) == -1) container.AppendElement(resource);
     254    }
     255  },
     256  // **************    RDF UPGRADE CODE    ****************************************************
     257  _tagDefaultSMTP: function () {
     258    Log.debug("upgrade: tagDefaultSMTP");
     259    for each(let treeType in Array("email", "maillist", "newsgroup", "filter")) {
     260      var enumerator = this.getContainer(treeType).GetElements();
     261      while (enumerator && enumerator.hasMoreElements()) {
     262        var resource = enumerator.getNext();
     263        resource.QueryInterface(Components.interfaces.nsIRDFResource);
     264        var smtp = this._getRDFValue(resource, "smtp")
     265        if (!smtp || smtp == "") this._setRDFValue(resource, "smtp", DEFAULT_SMTP_TAG);
     266      }
     267    }
     268  },
     269  // **************    RDF UPGRADE CODE    ****************************************************
     270  _createAccountInfoContainers: function () {
     271    Log.debug("upgrade: createAccountInfoContainers");
     272    var rdfContainerUtils = Components.classes["@mozilla.org/rdf/container-utils;1"].
     273    getService(Components.interfaces.nsIRDFContainerUtils);
     274
     275    var accountRes = this._rdfService
     276      .GetResource(this._rdfNS + this._rdfNSAccounts);
     277    var identityRes = this._rdfService
     278      .GetResource(this._rdfNS + this._rdfNSIdentities);
     279    var smtpRes = this._rdfService
     280      .GetResource(this._rdfNS + this._rdfNSSMTPservers);
     281    this._setRDFValue(accountRes, "name", "Accounts");
     282    this._setRDFValue(identityRes, "name", "Identities");
     283    this._setRDFValue(smtpRes, "name", "SMTP-Server");
     284
     285    rdfContainerUtils.MakeBag(this._rdfDataSource, accountRes);
     286    rdfContainerUtils.MakeBag(this._rdfDataSource, identityRes);
     287    rdfContainerUtils.MakeBag(this._rdfDataSource, smtpRes);
     288
     289    var accountContainer = Components.classes["@mozilla.org/rdf/container;1"].
     290    createInstance(Components.interfaces.nsIRDFContainer);
     291
     292    // initialize container with accountRes
     293    accountContainer.Init(this._rdfDataSource, accountRes);
     294    // append all new containers to accountRes
     295    if (accountContainer.IndexOf(identityRes) == -1) accountContainer.AppendElement(identityRes);
     296    if (accountContainer.IndexOf(smtpRes) == -1) accountContainer.AppendElement(smtpRes);
     297
     298    this._initContainers();
     299    this.refreshAccountInfo();
     300  },
     301  // **************    RDF UPGRADE CODE    ****************************************************
     302  _createRDFContainers: function () {
     303    Log.debug("upgrade: createRDFContainers");
     304    var rdfContainerUtils = Components.classes["@mozilla.org/rdf/container-utils;1"].
     305    getService(Components.interfaces.nsIRDFContainerUtils);
     306
     307    var storageRes = this._rdfService
     308      .GetResource(this._rdfNS + this._rdfNSStorage);
     309    var emailRes = this._rdfService
     310      .GetResource(this._rdfNS + this._rdfNSEmail);
     311    var maillistRes = this._rdfService
     312      .GetResource(this._rdfNS + this._rdfNSMaillist);
     313    var newsgroupRes = this._rdfService
     314      .GetResource(this._rdfNS + this._rdfNSNewsgroup);
     315    var filterRes = this._rdfService
     316      .GetResource(this._rdfNS + this._rdfNSFilter);
     317    this._setRDFValue(emailRes, "name", "E-Mail");
     318    this._setRDFValue(maillistRes, "name", "Mailing-List");
     319    this._setRDFValue(newsgroupRes, "name", "Newsgroup");
     320    this._setRDFValue(filterRes, "name", "Filter");
     321
     322    rdfContainerUtils.MakeBag(this._rdfDataSource, storageRes);
     323    rdfContainerUtils.MakeBag(this._rdfDataSource, emailRes);
     324    rdfContainerUtils.MakeBag(this._rdfDataSource, maillistRes);
     325    rdfContainerUtils.MakeBag(this._rdfDataSource, newsgroupRes);
     326    // use a sequence for the filters, order does matter
     327    rdfContainerUtils.MakeSeq(this._rdfDataSource, filterRes);
     328
     329    var container = Components.classes["@mozilla.org/rdf/container;1"].
     330    createInstance(Components.interfaces.nsIRDFContainer);
     331
     332    // initialize container with storageRes
     333    container.Init(this._rdfDataSource, storageRes);
     334    // append all new containers to storageRes
     335    if (container.IndexOf(emailRes) == -1) container.AppendElement(emailRes);
     336    if (container.IndexOf(maillistRes) == -1) container.AppendElement(maillistRes);
     337    if (container.IndexOf(newsgroupRes) == -1) container.AppendElement(newsgroupRes);
     338    if (container.IndexOf(filterRes) == -1) container.AppendElement(filterRes);
     339
     340    this._initContainers();
     341
     342    this._transferAllResources();
     343  },
     344  // **************    END RDF UPGRADE CODE    ************************************************
     345  // ******************************************************************************************
     346
     347  getCurrentRDFFileVersion: function () {
     348    return this._getRDFValue(
     349      this._rdfService.GetResource(this._rdfNS + "virtualIdentity"), "rdfVersion");
     350  },
     351
     352  getCurrentExtFileVersion: function () {
     353    return this._getRDFValue(
     354      this._rdfService.GetResource(this._rdfNS + "virtualIdentity"), "version");
     355  },
     356
     357  storeRDFVersion: function () {
     358    this._setRDFValue(
     359      this._rdfService.GetResource(this._rdfNS + "virtualIdentity"), "rdfVersion",
     360      this._rdfVersion);
     361    this._flush();
     362  },
     363
     364  storeExtVersion: function () {
     365    this._setRDFValue(
     366      this._rdfService.GetResource(this._rdfNS + "virtualIdentity"), "version", this._extVersion)
     367    this._flush();
     368  },
     369
     370  clean: function () {
     371    this.AccountManagerObserver.unregister();
     372    this._flush();
     373  },
     374
     375  _flush: function () {
     376    this._rdfDataSource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
     377    this._rdfDataSource.Flush();
     378  },
     379
     380  refreshAccountInfo: function () {
     381    try { // will possibly fail before upgrade
     382      this.cleanAccountInfo();
     383      this.storeAccountInfo();
     384    } catch (e) {};
     385  },
     386
     387  cleanAccountInfo: function () {
     388    Log.debug("cleanAccountInfo");
     389
     390    var enumerator = this._identityContainer.GetElements();
     391    while (enumerator && enumerator.hasMoreElements()) {
     392      var resource = enumerator.getNext();
     393      resource.QueryInterface(Components.interfaces.nsIRDFResource);
     394      this._unsetRDFValue(resource, "identityName", this._getRDFValue(resource, "identityName"))
     395      this._unsetRDFValue(resource, "fullName", this._getRDFValue(resource, "fullName"))
     396      this._unsetRDFValue(resource, "email", this._getRDFValue(resource, "email"))
     397      this._identityContainer.RemoveElement(resource, false);
     398    }
     399
     400    enumerator = this._smtpContainer.GetElements();
     401    while (enumerator && enumerator.hasMoreElements()) {
     402      var resource = enumerator.getNext();
     403      resource.QueryInterface(Components.interfaces.nsIRDFResource);
     404      this._unsetRDFValue(resource, "label", this._getRDFValue(resource, "label"))
     405      this._unsetRDFValue(resource, "hostname", this._getRDFValue(resource, "hostname"))
     406      this._unsetRDFValue(resource, "username", this._getRDFValue(resource, "username"))
     407      this._smtpContainer.RemoveElement(resource, false);
     408    }
     409  },
     410
     411  getRelevantIDs: function () {
     412    var relevantIDs = new Object();
     413    // search relevant Identities
     414    for each(let treeType in Array("email", "maillist", "newsgroup", "filter")) {
     415      var enumerator = this.getContainer(treeType).GetElements();
     416      while (enumerator && enumerator.hasMoreElements()) {
     417        var resource = enumerator.getNext();
     418        resource.QueryInterface(Components.interfaces.nsIRDFResource);
     419        var id = this._getRDFValue(resource, "id")
     420        if (id) {
     421          if (!relevantIDs[id]) relevantIDs[id] = 1;
     422          else relevantIDs[id] += 1;
     423        }
     424      }
     425    }
     426    return relevantIDs;
     427  },
     428
     429  searchIdentityMismatch: function () {
     430    Log.debug("searchIdentityMismatch");
     431
     432    var relevantIDs = this.getRelevantIDs();
     433    var mismatchIDs = [];
     434
     435    for (var id in relevantIDs) {
     436      var found = false;
     437      var accounts = getAccountsArray();
     438      var identity = null;
     439      for (let acc = 0; acc < accounts.length; acc++) {
     440        let account = accounts[acc];
     441        let identities = getIdentitiesArray(account);
     442        for (let i = 0; i < identities.length; i++) {
     443          identity = identities[i];
     444          if (id == identity.key) {
     445            found = true;
     446            break;
     447          }
     448        }
     449        if (found) break;
     450      }
     451      var resource = this._rdfService.GetResource(this._rdfNS + this._rdfNSIdentities + "/" + id);
     452      var rdfIdentityName = this._getRDFValue(resource, "identityName");
     453      var rdfEmail = this._getRDFValue(resource, "email");
     454      var rdfFullName = this._getRDFValue(resource, "fullName")
     455
     456      if (!found || rdfIdentityName != identity.identityName && rdfEmail != identity.email)
     457        mismatchIDs.push({
     458          oldkey: id,
     459          label: rdfIdentityName,
     460          ext1: rdfEmail,
     461          ext2: rdfFullName,
     462          count: relevantIDs[id],
     463          key: ""
     464        })
     465    }
     466    if (mismatchIDs.length > 0) {
     467      Log.debug(" found mismatches on id(s).");
     468      get3PaneWindow().openDialog("chrome://v_identity/content/vI_rdfAccountMismatchDialog.xul", 0,
     469        "chrome, dialog, modal, alwaysRaised, resizable=yes", "identity", mismatchIDs,
     470        /* callback chance: */
     471        this).focus();
     472      return true;
     473    } else {
     474      Log.debug(" found no mismatch");
     475      return false;
     476    }
     477  },
     478
     479  repairAccountMismatch: function (type, mismatchItems) {
     480    var keyField = (type == "identity") ? "id" : "smtp" // field to change is 'id' or 'smtp' dependent on type
     481    for (var i = 0; i < mismatchItems.length; i++) {
     482      Log.debug("repairAccountMismatch change " + mismatchItems[i].oldkey + " into " + mismatchItems[i].key);
     483      // search relevant Identities
     484      for each(let treeType in Array("email", "maillist", "newsgroup", "filter")) {
     485        var enumerator = this.getContainer(treeType).GetElements();
     486        while (enumerator && enumerator.hasMoreElements()) {
     487          var resource = enumerator.getNext();
     488          resource.QueryInterface(Components.interfaces.nsIRDFResource);
     489          if (this._getRDFValue(resource, keyField) == mismatchItems[i].oldkey) {
     490            if (mismatchItems[i].key == "") this._unsetRDFValue(resource, keyField, mismatchItems[i].oldkey)
     491            else this._setRDFValue(resource, keyField, mismatchItems[i].key)
     492          }
     493        }
     494      }
     495    }
     496  },
     497
     498  getRelevantSMTPs: function () {
     499    var relevantSMTPs = new Object();
     500    // search relevant SMTPs
     501    for each(let treeType in Array("email", "maillist", "newsgroup", "filter")) {
     502      var enumerator = this.getContainer(treeType).GetElements();
     503      while (enumerator && enumerator.hasMoreElements()) {
     504        var resource = enumerator.getNext();
     505        resource.QueryInterface(Components.interfaces.nsIRDFResource);
     506        var smtp = this._getRDFValue(resource, "smtp")
     507        if (smtp && smtp != DEFAULT_SMTP_TAG) {
     508          if (!relevantSMTPs[smtp]) relevantSMTPs[smtp] = 1;
     509          else relevantSMTPs[smtp] += 1;
     510        }
     511      }
     512    }
     513    return relevantSMTPs;
     514  },
     515
     516  searchSmtpMismatch: function () {
     517    Log.debug("searchSmtpMismatch");
     518
     519    var relevantSMTPs = this.getRelevantSMTPs();
     520    var mismatchSMTPs = [];
     521
     522    for (var smtp in relevantSMTPs) {
     523      var servers, smtpService = Components.classes["@mozilla.org/messengercompose/smtp;1"]
     524        .getService(Components.interfaces.nsISmtpService);
     525      // check for new https://hg.mozilla.org/comm-central/rev/fab9e5145cd4 smtpService
     526      if (typeof (smtpService.servers) == "object") servers = smtpService.servers;
     527      else servers = smtpService.smtpServers;
     528
     529      var found = false;
     530      while (servers && servers.hasMoreElements()) {
     531        var server = servers.getNext();
     532        if (server instanceof Components.interfaces.nsISmtpServer &&
     533          !server.redirectorType && smtp == server.key) {
     534          found = true;
     535          break;
     536        }
     537      }
     538      var resource = this._rdfService.GetResource(this._rdfNS + this._rdfNSSMTPservers + "/" + smtp);
     539      var rdfSMTPlabel = this._getRDFValue(resource, "label");
     540      var rdfHostname = this._getRDFValue(resource, "hostname");
     541      var rdfUsername = this._getRDFValue(resource, "username")
     542      if (!found || rdfSMTPlabel != (server.description ? server.description : server.hostname) && rdfHostname != server.hostname)
     543        mismatchSMTPs.push({
     544          oldkey: smtp,
     545          label: rdfSMTPlabel,
     546          ext1: rdfHostname,
     547          ext2: rdfUsername,
     548          count: relevantSMTPs[smtp],
     549          key: ""
     550        })
     551    }
     552    if (mismatchSMTPs.length > 0) {
     553      Log.debug(" found mismatches on smtp(s).");
     554      get3PaneWindow().openDialog("chrome://v_identity/content/vI_rdfAccountMismatchDialog.xul", 0,
     555        "chrome, dialog, modal, alwaysRaised, resizable=yes", "smtp", mismatchSMTPs,
     556        /* callback: */
     557        this).focus();
     558      return true;
     559    } else {
     560      Log.debug(" found no mismatch");
     561      return false;
     562    }
     563  },
     564
     565  storeAccountInfo: function () {
     566    Log.debug("storeAccounts");
     567    var accounts = getAccountsArray();
     568    for (let acc = 0; acc < accounts.length; acc++) {
     569      let account = accounts[acc];
     570      let identities = getIdentitiesArray(account);
     571      for (let i = 0; i < identities.length; i++) {
     572        let identity = identities[i];
     573        //                 Log.debug("storeAccounts identity store id " + identity.key);
     574
     575        var resource = this._rdfService.GetResource(this._rdfNS + this._rdfNSIdentities + "/" + identity.key);
     576        this._setRDFValue(resource, "identityName", identity.identityName);
     577        this._setRDFValue(resource, "fullName", identity.fullName);
     578        this._setRDFValue(resource, "email", identity.email);
     579
     580        var position = this._identityContainer.IndexOf(resource); // check for index in new recType
     581        if (position != -1) this._identityContainer.InsertElementAt(resource, position, false);
     582        else this._identityContainer.AppendElement(resource);
     583      }
     584    }
     585
     586    function storeSmtp(server, parent) {
     587      //             Log.debug("storeAccounts smtp store id " + server.key);
     588      var resource = parent._rdfService.GetResource(parent._rdfNS + parent._rdfNSSMTPservers + "/" + server.key);
     589      parent._setRDFValue(resource, "label", (server.description ? server.description : server.hostname));
     590      parent._setRDFValue(resource, "hostname", server.hostname);
     591      parent._setRDFValue(resource, "username", server.username);
     592      var position = parent._smtpContainer.IndexOf(resource); // check for index in new recType
     593      if (position != -1) parent._smtpContainer.InsertElementAt(resource, position, false);
     594      else parent._smtpContainer.AppendElement(resource);
     595    }
     596
     597    var servers, smtpService = Components.classes["@mozilla.org/messengercompose/smtp;1"]
     598      .getService(Components.interfaces.nsISmtpService);
     599    // check for new https://hg.mozilla.org/comm-central/rev/fab9e5145cd4 smtpService
     600    if (typeof (smtpService.servers) == "object") servers = smtpService.servers;
     601    else servers = smtpService.smtpServers;
     602
     603    while (servers && servers.hasMoreElements()) {
     604      var server = servers.getNext();
     605      if (server instanceof Components.interfaces.nsISmtpServer && !server.redirectorType) storeSmtp(server, this);
     606    }
     607
     608    //         Log.debug("storeAccounts done");
     609  },
     610
     611  export: function (rdfFileName) {
     612    Log.debug("vI_rdfDatasource export: " + rdfFileName + "\n");
     613    var filePicker = Components.classes["@mozilla.org/filepicker;1"]
     614      .createInstance(Components.interfaces.nsIFilePicker);
     615    filePicker.init(get3PaneWindow(), "", Components.interfaces.nsIFilePicker.modeSave);
     616    filePicker.appendFilters(Components.interfaces.nsIFilePicker.filterAll | Components.interfaces.nsIFilePicker.filterText);
     617    filePicker.appendFilter("RDF Files", "*.rdf");
     618
     619    if (filePicker.show() != Components.interfaces.nsIFilePicker.returnCancel) {
     620      var rdfDataFile = Components.classes["@mozilla.org/file/local;1"]
     621        .createInstance(Components.interfaces.nsILocalFile);
     622      var file = Components.classes["@mozilla.org/file/directory_service;1"]
     623        .getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile);
     624
     625      initWithFilePath_tryDelimiters(rdfDataFile, file.path, rdfFileName);
     626      rdfDataFile.copyTo(filePicker.file.parent, filePicker.file.leafName);
     627    }
     628  },
     629
     630  _getRDFResourceForVIdentity: function (recDescription, recType) {
     631    if (!this._rdfDataSource) return null;
     632    if (!recDescription) {
     633      Log.debug("_getRDFResourceForVIdentity: no Recipient given.");
     634      return null;
     635    }
     636    var _rdfNSRecType = null
     637    switch (recType) {
     638    case "email":
     639      _rdfNSRecType = this._rdfNSEmail;
     640      break;
     641    case "newsgroup":
     642      _rdfNSRecType = this._rdfNSNewsgroup;
     643      break;
     644    case "maillist":
     645      _rdfNSRecType = this._rdfNSMaillist;
     646      break;
     647    case "filter":
     648      _rdfNSRecType = this._rdfNSFilter;
     649      break;
     650    }
     651    return this._rdfService.GetResource(this._rdfNS + _rdfNSRecType + "/" + recDescription);
     652
     653
     654  },
     655
     656  removeVIdentityFromRDF: function (resource, recType) {
     657    //      Log.debug("removeVIdentityFromRDF " + resource.ValueUTF8);
     658    this._unsetRDFValue(resource, "email", this._getRDFValue(resource, "email"))
     659    this._unsetRDFValue(resource, "fullName", this._getRDFValue(resource, "fullName"))
     660    this._unsetRDFValue(resource, "id", this._getRDFValue(resource, "id"))
     661    this._unsetRDFValue(resource, "smtp", this._getRDFValue(resource, "smtp"))
     662    this._unsetRDFValue(resource, "name", this._getRDFValue(resource, "name"))
     663
     664    let self = this;
     665    var extras = new identityDataExtras(self, resource)
     666    extras.loopThroughExtras(
     667      function (extra) {
     668        extra.value = self._unsetRDFValue(resource, extra.field, extra.value)
     669      });
     670
     671    this.getContainer(recType).RemoveElement(resource, true);
     672  },
     673
     674  _unsetRDFValue: function (resource, field, value) {
     675    //      Log.debug("_unsetRDFValue " + this._rdfService  + " " + this._rdfDataSource);
     676    var predicate = this._rdfService.GetResource(this._rdfNS + "rdf#" + field);
     677    var name = this._rdfService.GetLiteral(value ? value : "");
     678    var target = this._rdfDataSource.GetTarget(resource, predicate, true);
     679    if (target instanceof Components.interfaces.nsIRDFLiteral) {
     680      this._rdfDataSource.Unassert(resource, predicate, name, true);
     681      return null;
     682    } else return value;
     683  },
     684
     685  // this will be used from rdfDataTree to get all RDF values, callFunction is vI.rdfDataTreeCollection.__addNewDatum
     686  readAllEntriesFromRDF: function (addNewDatum, treeType, idData) {
     687    //      Log.debug("readAllEntriesFromRDF " + this._rdfService  + " " + this._rdfDataSource + " " + this);
     688    var enumerator = this.getContainer(treeType).GetElements();
     689    while (enumerator && enumerator.hasMoreElements()) {
     690      var resource = enumerator.getNext();
     691      resource.QueryInterface(Components.interfaces.nsIRDFResource);
     692      var name = this._getRDFValue(resource, "name")
     693      var email = this._getRDFValue(resource, "email")
     694      var fullName = this._getRDFValue(resource, "fullName")
     695      var id = this._getRDFValue(resource, "id")
     696      var smtp = this._getRDFValue(resource, "smtp")
     697      var used = this._getRDFValue(resource, "timeUsed")
     698      var changed = this._getRDFValue(resource, "timeChanged")
     699      if (!smtp) smtp = NO_SMTP_TAG;
     700      let self = this;
     701      var localIdentityData = new identityData(email, fullName, id, smtp, new identityDataExtras(self, resource))
     702      addNewDatum(resource, name, localIdentityData, idData, used, changed)
     703    }
     704  },
     705
     706  __getDescriptionAndType: function (recipient, recipientType) {
     707    if (recipientType == "addr_newsgroups") return {
     708      recDesc: recipient,
     709      recType: "newsgroup"
     710    } else if (this.__isMailingList(recipient)) {
     711      Log.debug("__getDescriptionAndType: '" + recipient + "' is MailList");
     712      return {
     713        recDesc: this.__getMailListName(recipient),
     714        recType: "maillist"
     715      }
     716    } else {
     717      Log.debug("__getDescriptionAndType: '" + recipient + "' is no MailList");
     718      var localIdentityData = new identityData(recipient, null, null, null, null, null, null);
     719      return {
     720        recDesc: localIdentityData.combinedName,
     721        recType: "email"
     722      }
     723    }
     724  },
     725
     726  // --------------------------------------------------------------------
     727  // check if recipient is a mailing list.
     728  // Similiar to Thunderbird, if there are muliple cards with the same displayName the mailinglist is preferred
     729  // see also https://bugzilla.mozilla.org/show_bug.cgi?id=408575
     730  __isMailingList: function (recipient) {
     731    let abManager = Components.classes["@mozilla.org/abmanager;1"]
     732      .getService(Components.interfaces.nsIAbManager);
     733    let allAddressBooks = abManager.directories;
     734    while (allAddressBooks.hasMoreElements()) {
     735      let ab = allAddressBooks.getNext();
     736      if (ab instanceof Components.interfaces.nsIAbDirectory && !ab.isRemote) {
     737        let abdirectory = abManager.getDirectory(ab.URI +
     738          "?(and(DisplayName,=," + encodeURIComponent(this.__getMailListName(recipient)) + ")(IsMailList,=,TRUE))");
     739        if (abdirectory) {
     740          try { // just try, sometimes there are no childCards at all...
     741            let cards = abdirectory.childCards;
     742            if (cards.hasMoreElements()) return true; // only interested if there is at least one element...
     743          } catch (e) {}
     744        }
     745      }
     746    }
     747    return false;
     748  },
     749
     750  // --------------------------------------------------------------------
     751
     752  __getMailListName: function (recipient) {
     753    if (recipient.match(/<[^>]*>/) || recipient.match(/$/)) {
     754      var mailListName = RegExp.leftContext + RegExp.rightContext
     755      mailListName = mailListName.replace(/^\s+|\s+$/g, "")
     756    }
     757    return mailListName;
     758  },
     759
     760  findMatchingFilter: function (recipient, recipientType) {
     761    var recDescription = this.__getDescriptionAndType(recipient, recipientType).recDesc;
     762    Log.debug("findMatchingFilter for " + recDescription);
     763    var enumerator = this._filterContainer.GetElements();
     764    while (enumerator && enumerator.hasMoreElements()) {
     765      var resource = enumerator.getNext();
     766      resource.QueryInterface(Components.interfaces.nsIRDFResource);
     767      var filter = this._getRDFValue(resource, "name");
     768
     769      const filterType = {
     770        None: 0,
     771        RegExp: 1,
     772        StrCmp: 2
     773      }
     774      var recentfilterType;
     775
     776      if (filter == "") continue;
     777      if (/^\/(.*)\/$/.exec(filter)) {
     778        Log.debug("findMatchingFilter with RegExp '" + filter.replace(/\\/g, "\\\\") + "'");
     779        recentfilterType = filterType.RegExp;
     780      } else {
     781        Log.debug("findMatchingFilter, compare with '" + filter + "'");
     782        recentfilterType = filterType.StrCmp;
     783      }
     784
     785      switch (recentfilterType) {
     786      case filterType.RegExp:
     787        try {
     788          /^\/(.*)\/$/.exec(filter);
     789          if (recDescription.match(new RegExp(RegExp.$1, "i"))) {
     790            Log.debug("findMatchingFilter found stored data.");
     791            return this._readVIdentityFromRDF(resource);
     792          }
     793        } catch (vErr) {};
     794        break;
     795      case filterType.StrCmp:
     796        if (recDescription.toLowerCase().indexOf(filter.toLowerCase()) != -1) {
     797          Log.debug("findMatchingFilter found stored data.");
     798          return this._readVIdentityFromRDF(resource);
     799        }
     800        break;
     801      }
     802    }
     803    Log.debug("findMatchingFilter no match found.");
     804    return null;
     805  },
     806
     807  readVIdentityFromRDF: function (recipient, recipientType) {
     808    var storedRecipient = this.__getDescriptionAndType(recipient, recipientType);
     809    var email = this._rdfService.GetResource(this._rdfNS + "rdf#email");
     810    var resource = this._getRDFResourceForVIdentity(storedRecipient.recDesc, storedRecipient.recType);
     811    if (!resource) return null;
     812    if (!this._rdfDataSource.hasArcOut(resource, email)) {
     813      // no data available --> give up.
     814      Log.debug("readVIdentityFromRDF no data found.");
     815      return null;
     816    }
     817    Log.debug("readVIdentityFromRDF found stored data.");
     818
     819    return this._readVIdentityFromRDF(resource);
     820  },
     821
     822  _readVIdentityFromRDF: function (resource) {
     823    var email = this._getRDFValue(resource, "email")
     824    var fullName = this._getRDFValue(resource, "fullName")
     825    var id = this._getRDFValue(resource, "id")
     826    var smtp = this._getRDFValue(resource, "smtp")
     827    if (!smtp) smtp = NO_SMTP_TAG;
     828
     829    let _date = new Date();
     830    this._setRDFValue(resource, "timeUsed", _date.getTime());
     831
     832    Log.debug("email='" + email +
     833      "' fullName='" + fullName + "' id='" + id + "' smtp='" + smtp + "'");
     834
     835    let self = this;
     836    var localIdentityData = new identityData(email, fullName, id, smtp, new identityDataExtras(self, resource))
     837    return localIdentityData;
     838  },
     839
     840  _getRDFValue: function (resource, field) {
     841    //         Log.debug("_getRDFValue " + this._rdfService  + " " + this._rdfDataSource + " " + this);
     842    var predicate = this._rdfService.GetResource(this._rdfNS + "rdf#" + field);
     843    var target = this._rdfDataSource.GetTarget(resource, predicate, true);
     844    if (target instanceof Components.interfaces.nsIRDFLiteral) return target.Value
     845    else return null;
     846  },
     847
     848  updateRDFFromVIdentity: function (identityData, recipientName, recipientType) {
     849    var recipient = this.__getDescriptionAndType(recipientName, recipientType)
     850    this.updateRDF(recipient.recDesc, recipient.recType, identityData,
     851      vIprefs.get("storage_store_base_id"),
     852      vIprefs.get("storage_store_SMTP"),
     853      null, null, false);
     854  },
     855
     856  removeRDF: function (recDescription, recType) {
     857    var resource = this._getRDFResourceForVIdentity(recDescription, recType);
     858    if (!resource) return null;
     859    this.removeVIdentityFromRDF(resource, recType);
     860    return resource;
     861  },
     862
     863  updateRDF: function (recDescription, recType, localIdentityData, storeBaseID, storeSMTP, prevRecDescription, prevRecType, updateAllExtras) {
     864    //         Log.debug("(" + this._rdfNS + "): updateRDF recDescription=" + recDescription + " localIdentityData.email=" + localIdentityData.email);
     865
     866    //      if (!localIdentityData.email) {
     867    //          Log.debug("updateRDF: no Sender-email for Recipient, aborting.");
     868    //          return;
     869    //      }
     870    if (!recDescription || recDescription.length == 0) return;
     871
     872    if (!prevRecDescription) prevRecDescription = recDescription;
     873    if (!prevRecType) prevRecType = recType;
     874
     875    var resource = this._getRDFResourceForVIdentity(prevRecDescription, prevRecType);
     876    if (!resource) return;
     877    //      Log.debug("updateRDF " + resource.ValueUTF8);
     878
     879    var position = this.getContainer(recType).IndexOf(resource); // check for index in new recType
     880    this.removeVIdentityFromRDF(resource, prevRecType);
     881
     882    resource = this._getRDFResourceForVIdentity(recDescription, recType);
     883
     884    this._setRDFValue(resource, "email", localIdentityData.email);
     885    this._setRDFValue(resource, "fullName", localIdentityData.fullName);
     886    if (storeBaseID)
     887      this._setRDFValue(resource, "id", localIdentityData.id.key);
     888    else this._unsetRDFValue(resource, "id", this._getRDFValue(resource, "id"))
     889    if (storeSMTP && localIdentityData.smtp.key != NO_SMTP_TAG)
     890      this._setRDFValue(resource, "smtp", localIdentityData.smtp.key);
     891    else this._unsetRDFValue(resource, "smtp", this._getRDFValue(resource, "smtp"))
     892    this._setRDFValue(resource, "name", recDescription);
     893
     894    if (localIdentityData.extras) {
     895      let self = this;
     896      localIdentityData.extras.loopThroughExtras(
     897        function (extra) {
     898          if (updateAllExtras || extra.active)
     899            extra.value = self._setRDFValue(resource, extra.field, extra.value)
     900        });
     901      //           Log.debug("extras: " + localIdentityData.extras.status());
     902    }
     903
     904    let _date = new Date();
     905    this._setRDFValue(resource, "timeChanged", _date.getTime());
     906
     907    //      Log.debug("updateRDF add " + resource.ValueUTF8 + " at position " + position);
     908    if (position != -1) this.getContainer(recType).InsertElementAt(resource, position, true);
     909    else this.getContainer(recType).AppendElement(resource);
     910  },
     911
     912  _setRDFValue: function (resource, field, value) {
     913    //      Log.debug("_setRDFValue " + resource.ValueUTF8 + " " + field + " " + value);
     914    if (!value) return value; // return if some value was not set.
     915    //      Log.debug("_setRDFValue " + this._rdfService + " " + this._rdfDataSource);
     916    var predicate = this._rdfService.GetResource(this._rdfNS + "rdf#" + field);
     917    var name = this._rdfService.GetLiteral(value);
     918    var target = this._rdfDataSource.GetTarget(resource, predicate, true);
     919
     920    if (target instanceof Components.interfaces.nsIRDFLiteral)
     921      this._rdfDataSource.Change(resource, predicate, target, name);
     922    else this._rdfDataSource.Assert(resource, predicate, name, true);
     923    return value;
     924  },
     925
     926  //  code adapted from http://xulsolutions.blogspot.com/2006/07/creating-uninstall-script-for.html
     927  AccountManagerObserver: {
     928    _uninstall: false,
     929    observe: function (subject, topic, data) {
     930      if (topic == "am-smtpChanges" || topic == "am-acceptChanges") {
     931        Log.debug("account/smtp changes observed");
     932        this.searchIdentityMismatch();
     933        this.searchSmtpMismatch();
     934        this.refreshAccountInfo();
     935      }
     936    },
     937    register: function () {
     938      Log.debug("register AccountManagerObserver");
     939      var obsService = Components.classes["@mozilla.org/observer-service;1"].
     940      getService(Components.interfaces.nsIObserverService)
     941      obsService.addObserver(this, "am-smtpChanges", false);
     942      obsService.addObserver(this, "am-acceptChanges", false);
     943    },
     944    unregister: function () {
     945      var obsService = Components.classes["@mozilla.org/observer-service;1"].
     946      getService(Components.interfaces.nsIObserverService)
     947      try {
     948        obsService.removeObserver(this, "am-smtpChanges");
     949        obsService.removeObserver(this, "am-acceptChanges");
     950      } catch (e) {};
     951    }
     952  }
    51953}
    52954
    53 function initWithFilePath_tryDelimiters(_nsILocalFile, path, filename) {
    54     try {
    55         Log.debug("Filename try linux delimiter: '" + path + "/" + filename + "'");
    56         _nsILocalFile.initWithPath(path + "/" + filename);
    57     } catch (NS_ERROR_FILE_UNRECOGNIZED_PATH) {
    58         try {
    59             Log.debug("Filename try windows delimiter: '" + path + "\\" + filename + "'");
    60             _nsILocalFile.initWithPath(path + "\\" + filename);
     955
     956function rdfDatasourceAccess() {
     957  this._rdfDataSource = new rdfDatasource("virtualIdentity.rdf", false);
     958  this.stringBundle = Services.strings.createBundle("chrome://v_identity/locale/v_identity.properties");
     959}
     960
     961rdfDatasourceAccess.prototype = {
     962  _rdfDataSource: null,
     963  stringBundle: null,
     964
     965  clean: function () {
     966    this._rdfDataSource.clean();
     967  },
     968
     969  updateVIdentityFromStorage: function (recipientName, recipientType, currentIdentity, currentIdentityIsVid, isNotFirstInputElement, currentWindow) {
     970    var localIdentities = new identityCollection();
     971    localIdentities.addWithoutDuplicates(this._rdfDataSource.readVIdentityFromRDF(recipientName, recipientType));
     972    if (localIdentities.number == 1) Log.debug("using data from direct match");
     973    localIdentities.addWithoutDuplicates(this._rdfDataSource.findMatchingFilter(recipientName, recipientType));
     974
     975    var returnValue = {};
     976    returnValue.identityCollection = localIdentities;
     977    returnValue.result = "drop";
     978    if (localIdentities.number == 0) {
     979      Log.debug("updateVIdentityFromStorage no usable Storage-Data found.");
     980    } else {
     981      Log.debug("compare with current Identity");
     982      if (vIprefs.get("storage_getOneOnly") && // if requested to retrieve only storageID for first recipient entered
     983        isNotFirstInputElement && // and it is now not the first recipient entered
     984        !localIdentities.identityDataCollection[0].equalsIdentity(currentIdentity, false).equal) { // and this id is different than the current used one
     985        StorageNotification.info(this.stringBundle.GetStringFromName("vident.smartIdentity.vIStorageCollidingIdentity"));
     986        //                  returnValue.result = "drop";    // this is the default value
     987      }
     988      // only update fields if new Identity is different than old one.
     989      else {
     990        Log.debug("updateVIdentityFromStorage check if storage-data matches current Identity.");
     991        var compResult = localIdentities.identityDataCollection[0].equalsIdentity(currentIdentity, true);
     992        if (!compResult.equal) {
     993          var warning = this.__getWarning("replaceVIdentity", recipientName, compResult.compareMatrix);
     994          if (!currentIdentityIsVid ||
     995            !vIprefs.get("storage_warn_vI_replace") ||
     996            (this.__askWarning(warning, currentWindow) == "accept")) {
     997            returnValue.result = "accept";
     998          }
     999        } else {
     1000          returnValue.result = "equal";
    611001        }
    62         catch (NS_ERROR_FILE_UNRECOGNIZED_PATH) {
    63             Log.debug("Filename not valid: '" + path + "[\\/]" + filename + "'");
    64             Log.debug("can't open rdfDatasource - storage won't work");
    65             var debugMsg = "Filename not valid: '" + path + "\\" + filename + "'\n" +
    66                 "Filename not valid: '" + path + "/" + filename + "'\n" +
    67                 "Virtual Identity Storage won't work.\n\n" +
    68                 "Please report this issue with filename on https://www.absorb.it/virtual-id\n\n" +
    69                 "You can just copy the lines below in your browser to create a ticket\n\n" +
    70                 "https://www.absorb.it/virtual-id/newticket?summary=RDF Filename Error&description=Filename " + path + "[\\/]" + filename + " for rdf not valid"
    71             get3PaneWindow().alert(debugMsg);
    72             return;
    73         }
    74     }
    75 };
    76 
    77 rdfDatasource.prototype = {
    78     _extVersion :       null,
    79     _rdfVersion :       "0.0.5",
    80     _rdfService :       Components.classes["@mozilla.org/rdf/rdf-service;1"]
    81                             .getService(Components.interfaces.nsIRDFService),
    82     _rdfDataSource :    null,
    83     _rdfFileName :      null,
    84     _rdfNS :            "http://virtual-id.absorb.it/",
    85     _rdfNSStorage :     "vIStorage",
    86     _rdfNSEmail :       "vIStorage/email",
    87     _rdfNSMaillist :    "vIStorage/maillist",
    88     _rdfNSNewsgroup :   "vIStorage/newsgroup",
    89     _rdfNSFilter :      "vIStorage/filter",
    90     _rdfNSAccounts :    "vIAccounts",
    91     _rdfNSIdentities :  "vIAccounts/id",
    92     _rdfNSSMTPservers : "vIAccounts/smtp",
    93    
    94     _virtualIdentityID : "{dddd428e-5ac8-4a81-9f78-276c734f75b8}",
    95    
    96     _emailContainer : Components.classes["@mozilla.org/rdf/container;1"]
    97             .createInstance(Components.interfaces.nsIRDFContainer),
    98 
    99     _maillistContainer : Components.classes["@mozilla.org/rdf/container;1"]
    100             .createInstance(Components.interfaces.nsIRDFContainer),
    101 
    102     _newsgroupContainer : Components.classes["@mozilla.org/rdf/container;1"]
    103             .createInstance(Components.interfaces.nsIRDFContainer),
    104 
    105     _filterContainer : Components.classes["@mozilla.org/rdf/container;1"]
    106             .createInstance(Components.interfaces.nsIRDFContainer),
    107 
    108     _identityContainer : Components.classes["@mozilla.org/rdf/container;1"]
    109             .createInstance(Components.interfaces.nsIRDFContainer),
    110 
    111     _smtpContainer : Components.classes["@mozilla.org/rdf/container;1"]
    112             .createInstance(Components.interfaces.nsIRDFContainer),
    113    
    114     getContainer : function (type) {
    115         switch (type) {
    116             case "email": return this._emailContainer;
    117             case "maillist": return this._maillistContainer;
    118             case "newsgroup": return this._newsgroupContainer;
    119             case "filter": return this._filterContainer;
    120             case "identity": return this._identityContainer;
    121             case "smtp": return this._smtpContainer;
    122         }
    123         return null;
    124     },
    125 
    126     init: function() {
    127 //         Log.debug("init.");
    128 
    129         this._openRdfDataSource();
    130         if (!this._rdfDataSource) return;
    131         this._initContainers();
    132         if (this.rdfUpgradeRequired()) this.rdfUpgrade();
    133        
    134         // store version everytime to recognize downgrades later
    135         this.storeRDFVersion();
    136            
    137 //         this.refreshAccountInfo();
    138 //         Log.debug("init done.");
    139     },
    140    
    141     _openRdfDataSource: function() {
    142 //         if (!this._rdfFileName || this._rdfDataSource);
    143         var protoHandler = Components.classes["@mozilla.org/network/protocol;1?name=file"]
    144             .getService(Components.interfaces.nsIFileProtocolHandler)
    145         var newFile = Components.classes["@mozilla.org/file/local;1"]
    146                     .createInstance(Components.interfaces.nsILocalFile);
    147        
    148         var file = Components.classes["@mozilla.org/file/directory_service;1"]
    149             .getService(Components.interfaces.nsIProperties)
    150             .get("ProfD", Components.interfaces.nsIFile);
    151        
    152 //         Log.debug("_openRdfDataSource");
    153         initWithFilePath_tryDelimiters(newFile, file.path, this._rdfFileName);
    154        
    155         var fileURI = protoHandler.newFileURI(newFile);
    156 
    157         Log.debug("init: read rdf from '" + fileURI.spec + "'");
    158 
    159         this._rdfDataSource =
    160             this._rdfService.GetDataSourceBlocking(fileURI.spec);
    161            
    162 //         Log.debug("read rdf from '" + fileURI.spec + "' done." + this._rdfService);
    163     },
    164    
    165     _initContainers: function() {
    166         try {   // will possibly fail before upgrade
    167             var storageRes = this._rdfService
    168                 .GetResource(this._rdfNS + this._rdfNSEmail);
    169             this._emailContainer.Init(this._rdfDataSource, storageRes);
    170             storageRes = this._rdfService
    171                 .GetResource(this._rdfNS + this._rdfNSMaillist);
    172             this._maillistContainer.Init(this._rdfDataSource, storageRes);
    173             storageRes = this._rdfService
    174                 .GetResource(this._rdfNS + this._rdfNSNewsgroup);
    175             this._newsgroupContainer.Init(this._rdfDataSource, storageRes);
    176             storageRes = this._rdfService
    177                 .GetResource(this._rdfNS + this._rdfNSFilter);
    178             this._filterContainer.Init(this._rdfDataSource, storageRes);
    179             storageRes = this._rdfService
    180                 .GetResource(this._rdfNS + this._rdfNSIdentities);
    181             this._identityContainer.Init(this._rdfDataSource, storageRes);
    182             storageRes = this._rdfService
    183                 .GetResource(this._rdfNS + this._rdfNSSMTPservers);
    184             this._smtpContainer.Init(this._rdfDataSource, storageRes);
    185         } catch (e) { };
    186     },
    187 
    188     // ******************************************************************************************
    189     // **************    BEGIN RDF UPGRADE CODE    **********************************************
    190     rdfUpgradeRequired: function() {
    191         var oldRdfVersion = this.getCurrentRDFFileVersion();
    192         var versionChecker = Components.classes["@mozilla.org/xpcom/version-comparator;1"]
    193             .getService(Components.interfaces.nsIVersionComparator);
    194         return (!oldRdfVersion || versionChecker.compare(oldRdfVersion, this._rdfVersion) < 0)
    195     },
    196     // **************    RDF UPGRADE CODE    ****************************************************
    197     extUpgradeRequired: function() {
    198         if (!this._extVersion) return false;
    199         var oldExtVersion = this.getCurrentExtFileVersion()
    200         var versionChecker = Components.classes["@mozilla.org/xpcom/version-comparator;1"]
    201             .getService(Components.interfaces.nsIVersionComparator);
    202         return (!oldExtVersion || versionChecker.compare(oldExtVersion, this._extVersion) < 0) 
    203     },
    204     // **************    RDF UPGRADE CODE    ****************************************************
    205     rdfUpgrade : function() {
    206         var currentVersion = this.getCurrentRDFFileVersion();
    207         Log.debug("checking for previous version of rdf, found " +
    208             currentVersion + " - rdf-upgrade required.")
    209         switch (currentVersion) {
    210             case null:
    211             case "0.0.1":
    212             case "0.0.2":
    213                 this._createRDFContainers(); // no break
    214             case "0.0.3":
    215                 this._tagDefaultSMTP();
    216             case "0.0.4":
    217             default:
    218                 this._createAccountInfoContainers();
    219         }
    220         this.storeRDFVersion();
    221         Log.debug("rdf-upgrade to " + this.getCurrentRDFFileVersion() + " done.");
    222     },
    223     // **************    RDF UPGRADE CODE    ****************************************************
    224     // only used for upgrade to 0.0.3 - loop through all ressources.
    225     _transferAllResources : function () {
    226         Log.debug("upgrade: transferAllResources");
    227         var enumerator = this._rdfDataSource.GetAllResources();
    228         while (enumerator && enumerator.hasMoreElements()) {
    229             var resource = enumerator.getNext();
    230             resource.QueryInterface(Components.interfaces.nsIRDFResource);
    231            
    232             var type; var name;
    233             if (resource.ValueUTF8.match(new RegExp(this._rdfNS + this._rdfNSEmail + "/", "i")))
    234                 { type = "email"; name = RegExp.rightContext }
    235             else if (resource.ValueUTF8.match(new RegExp(this._rdfNS + this._rdfNSNewsgroup + "/", "i")))
    236                 { type = "newsgroup"; name = RegExp.rightContext }
    237             else if (resource.ValueUTF8.match(new RegExp(this._rdfNS + this._rdfNSMaillist + "/", "i")))
    238                 { type = "maillist"; name = RegExp.rightContext }
    239             else continue;
    240            
    241             var container = this.getContainer(type);
    242             this._setRDFValue(resource, "name", name);
    243            
    244             if (container.IndexOf(resource) == -1) container.AppendElement(resource);
    245         }
    246     },
    247     // **************    RDF UPGRADE CODE    ****************************************************
    248     _tagDefaultSMTP: function() {
    249         Log.debug("upgrade: tagDefaultSMTP");
    250         for each (let treeType in Array("email", "maillist", "newsgroup", "filter")) {
    251             var enumerator = this.getContainer(treeType).GetElements();
    252             while (enumerator && enumerator.hasMoreElements()) {
    253                 var resource = enumerator.getNext();
    254                 resource.QueryInterface(Components.interfaces.nsIRDFResource);
    255                 var smtp = this._getRDFValue(resource, "smtp")
    256                 if (!smtp || smtp == "") this._setRDFValue(resource, "smtp", DEFAULT_SMTP_TAG);
    257             }
    258         }
    259     },
    260     // **************    RDF UPGRADE CODE    ****************************************************
    261     _createAccountInfoContainers: function() {
    262         Log.debug("upgrade: createAccountInfoContainers");
    263         var rdfContainerUtils = Components.classes["@mozilla.org/rdf/container-utils;1"].
    264             getService(Components.interfaces.nsIRDFContainerUtils);
    265        
    266         var accountRes = this._rdfService
    267             .GetResource(this._rdfNS + this._rdfNSAccounts);
    268         var identityRes = this._rdfService
    269             .GetResource(this._rdfNS + this._rdfNSIdentities);
    270         var smtpRes = this._rdfService
    271             .GetResource(this._rdfNS + this._rdfNSSMTPservers);
    272         this._setRDFValue(accountRes, "name", "Accounts");
    273         this._setRDFValue(identityRes, "name", "Identities");
    274         this._setRDFValue(smtpRes, "name", "SMTP-Server");
    275        
    276         rdfContainerUtils.MakeBag(this._rdfDataSource, accountRes);
    277         rdfContainerUtils.MakeBag(this._rdfDataSource, identityRes);
    278         rdfContainerUtils.MakeBag(this._rdfDataSource, smtpRes);
    279 
    280         var accountContainer = Components.classes["@mozilla.org/rdf/container;1"].
    281             createInstance(Components.interfaces.nsIRDFContainer);
    282        
    283         // initialize container with accountRes
    284         accountContainer.Init(this._rdfDataSource, accountRes);
    285         // append all new containers to accountRes
    286         if (accountContainer.IndexOf(identityRes) == -1) accountContainer.AppendElement(identityRes);
    287         if (accountContainer.IndexOf(smtpRes) == -1) accountContainer.AppendElement(smtpRes);
    288        
    289         this._initContainers();
    290         this.refreshAccountInfo();
    291     },
    292     // **************    RDF UPGRADE CODE    ****************************************************
    293     _createRDFContainers: function() {
    294         Log.debug("upgrade: createRDFContainers");
    295         var rdfContainerUtils = Components.classes["@mozilla.org/rdf/container-utils;1"].
    296             getService(Components.interfaces.nsIRDFContainerUtils);
    297 
    298         var storageRes = this._rdfService
    299             .GetResource(this._rdfNS + this._rdfNSStorage);
    300         var emailRes = this._rdfService
    301             .GetResource(this._rdfNS + this._rdfNSEmail);
    302         var maillistRes = this._rdfService
    303             .GetResource(this._rdfNS + this._rdfNSMaillist);
    304         var newsgroupRes = this._rdfService
    305             .GetResource(this._rdfNS + this._rdfNSNewsgroup);
    306         var filterRes = this._rdfService
    307             .GetResource(this._rdfNS + this._rdfNSFilter);
    308         this._setRDFValue(emailRes, "name", "E-Mail");
    309         this._setRDFValue(maillistRes, "name", "Mailing-List");
    310         this._setRDFValue(newsgroupRes, "name", "Newsgroup");
    311         this._setRDFValue(filterRes, "name", "Filter");
    312 
    313         rdfContainerUtils.MakeBag(this._rdfDataSource, storageRes);
    314         rdfContainerUtils.MakeBag(this._rdfDataSource, emailRes);
    315         rdfContainerUtils.MakeBag(this._rdfDataSource, maillistRes);
    316         rdfContainerUtils.MakeBag(this._rdfDataSource, newsgroupRes);
    317         // use a sequence for the filters, order does matter
    318         rdfContainerUtils.MakeSeq(this._rdfDataSource, filterRes);
    319        
    320         var container = Components.classes["@mozilla.org/rdf/container;1"].
    321             createInstance(Components.interfaces.nsIRDFContainer);
    322        
    323         // initialize container with storageRes
    324         container.Init(this._rdfDataSource, storageRes);
    325         // append all new containers to storageRes
    326         if (container.IndexOf(emailRes) == -1) container.AppendElement(emailRes);
    327         if (container.IndexOf(maillistRes) == -1) container.AppendElement(maillistRes);
    328         if (container.IndexOf(newsgroupRes) == -1) container.AppendElement(newsgroupRes);
    329         if (container.IndexOf(filterRes) == -1) container.AppendElement(filterRes);
    330        
    331         this._initContainers();
    332        
    333         this._transferAllResources();
    334     },
    335     // **************    END RDF UPGRADE CODE    ************************************************
    336     // ******************************************************************************************
    337        
    338     getCurrentRDFFileVersion: function() {
    339         return this._getRDFValue(
    340             this._rdfService.GetResource(this._rdfNS + "virtualIdentity"), "rdfVersion");
    341     },
    342    
    343     getCurrentExtFileVersion: function() {
    344         return this._getRDFValue(
    345             this._rdfService.GetResource(this._rdfNS + "virtualIdentity"), "version");
    346     },
    347    
    348     storeRDFVersion: function() {
    349         this._setRDFValue(
    350             this._rdfService.GetResource(this._rdfNS + "virtualIdentity"), "rdfVersion",
    351             this._rdfVersion);
    352         this._flush();
    353     },
    354    
    355     storeExtVersion: function() {
    356         this._setRDFValue(
    357             this._rdfService.GetResource(this._rdfNS + "virtualIdentity"), "version", this._extVersion)
    358         this._flush();
    359     },
    360 
    361     clean : function() {
    362         this.AccountManagerObserver.unregister();
    363         this._flush();
    364     },
    365 
    366     _flush : function() {
    367         this._rdfDataSource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
    368         this._rdfDataSource.Flush();
    369     },
    370    
    371     refreshAccountInfo : function() {
    372         try {   // will possibly fail before upgrade
    373             this.cleanAccountInfo(); this.storeAccountInfo();
    374         } catch (e) {};
    375     },
    376    
    377     cleanAccountInfo : function() {
    378         Log.debug("cleanAccountInfo");
    379        
    380         var enumerator = this._identityContainer.GetElements();
    381         while (enumerator && enumerator.hasMoreElements()) {
    382             var resource = enumerator.getNext();
    383             resource.QueryInterface(Components.interfaces.nsIRDFResource);
    384             this._unsetRDFValue(resource, "identityName", this._getRDFValue(resource, "identityName"))
    385             this._unsetRDFValue(resource, "fullName", this._getRDFValue(resource, "fullName"))
    386             this._unsetRDFValue(resource, "email", this._getRDFValue(resource, "email"))
    387             this._identityContainer.RemoveElement(resource, false);
    388         }
    389 
    390         enumerator = this._smtpContainer.GetElements();
    391         while (enumerator && enumerator.hasMoreElements()) {
    392             var resource = enumerator.getNext();
    393             resource.QueryInterface(Components.interfaces.nsIRDFResource);
    394             this._unsetRDFValue(resource, "label", this._getRDFValue(resource, "label"))
    395             this._unsetRDFValue(resource, "hostname", this._getRDFValue(resource, "hostname"))
    396             this._unsetRDFValue(resource, "username", this._getRDFValue(resource, "username"))
    397             this._smtpContainer.RemoveElement(resource, false);
    398         }   
    399     },
    400    
    401     getRelevantIDs : function() {
    402         var relevantIDs = new Object();
    403         // search relevant Identities
    404         for each (let treeType in Array("email", "maillist", "newsgroup", "filter")) {
    405             var enumerator = this.getContainer(treeType).GetElements();
    406             while (enumerator && enumerator.hasMoreElements()) {
    407                 var resource = enumerator.getNext();
    408                 resource.QueryInterface(Components.interfaces.nsIRDFResource);
    409                 var id = this._getRDFValue(resource, "id")
    410                 if (id) {
    411                     if (!relevantIDs[id]) relevantIDs[id] = 1; else relevantIDs[id] += 1;
    412                 }
    413             }
    414         }
    415         return relevantIDs;
    416     },
    417    
    418     searchIdentityMismatch : function() {
    419         Log.debug("searchIdentityMismatch");
    420 
    421         var relevantIDs = this.getRelevantIDs();
    422         var mismatchIDs = [];
    423        
    424         for (var id in relevantIDs) {
    425             var found = false;
    426             var accounts = getAccountsArray();
    427             var identity = null;
    428             for (let acc = 0; acc < accounts.length; acc++) {
    429                 let account = accounts[acc];
    430                 let identities = getIdentitiesArray(account);
    431                 for (let i = 0; i < identities.length; i++) {
    432                     identity = identities[i];
    433                     if (id == identity.key) { found = true; break; }
    434                 }
    435                 if (found) break;
    436             }
    437             var resource = this._rdfService.GetResource(this._rdfNS + this._rdfNSIdentities + "/" + id);
    438             var rdfIdentityName = this._getRDFValue(resource, "identityName");
    439             var rdfEmail = this._getRDFValue(resource, "email");
    440             var rdfFullName = this._getRDFValue(resource, "fullName")
    441            
    442             if ( !found || rdfIdentityName != identity.identityName && rdfEmail != identity.email)
    443             mismatchIDs.push( { oldkey: id, label : rdfIdentityName, ext1: rdfEmail, ext2: rdfFullName, count: relevantIDs[id], key: "" } )
    444         }
    445         if (mismatchIDs.length > 0) {
    446             Log.debug(" found mismatches on id(s).");
    447             get3PaneWindow().openDialog("chrome://v_identity/content/vI_rdfAccountMismatchDialog.xul",0,
    448                     "chrome, dialog, modal, alwaysRaised, resizable=yes", "identity", mismatchIDs,
    449                     /* callback chance: */ this).focus();
    450             return true;
    451         }
    452         else {
    453             Log.debug(" found no mismatch");
    454             return false;
    455         }
    456     },
    457    
    458     repairAccountMismatch : function(type, mismatchItems) {
    459         var keyField = (type == "identity")?"id":"smtp" // field to change is 'id' or 'smtp' dependent on type
    460         for (var i = 0; i < mismatchItems.length; i++) {
    461             Log.debug("repairAccountMismatch change " + mismatchItems[i].oldkey + " into " + mismatchItems[i].key);
    462             // search relevant Identities
    463             for each (let treeType in Array("email", "maillist", "newsgroup", "filter")) {
    464                 var enumerator = this.getContainer(treeType).GetElements();
    465                 while (enumerator && enumerator.hasMoreElements()) {
    466                     var resource = enumerator.getNext();
    467                     resource.QueryInterface(Components.interfaces.nsIRDFResource);
    468                     if (this._getRDFValue(resource, keyField) == mismatchItems[i].oldkey) {
    469                         if (mismatchItems[i].key == "") this._unsetRDFValue(resource, keyField, mismatchItems[i].oldkey)
    470                         else this._setRDFValue(resource, keyField, mismatchItems[i].key)
    471                     }
    472                 }
    473             }
    474         }
    475     },
    476    
    477     getRelevantSMTPs : function() {
    478         var relevantSMTPs = new Object();
    479         // search relevant SMTPs
    480         for each (let treeType in Array("email", "maillist", "newsgroup", "filter")) {
    481             var enumerator = this.getContainer(treeType).GetElements();
    482             while (enumerator && enumerator.hasMoreElements()) {
    483                 var resource = enumerator.getNext();
    484                 resource.QueryInterface(Components.interfaces.nsIRDFResource);
    485                 var smtp = this._getRDFValue(resource, "smtp")
    486                 if (smtp && smtp != DEFAULT_SMTP_TAG) {
    487                     if (!relevantSMTPs[smtp]) relevantSMTPs[smtp] = 1; else relevantSMTPs[smtp] += 1;
    488                 }
    489             }
    490         }
    491         return relevantSMTPs;
    492     },
    493    
    494     searchSmtpMismatch : function() {
    495         Log.debug("searchSmtpMismatch");
    496 
    497         var relevantSMTPs = this.getRelevantSMTPs();
    498         var mismatchSMTPs = [];
    499        
    500         for (var smtp in relevantSMTPs) {
    501             var servers, smtpService = Components.classes["@mozilla.org/messengercompose/smtp;1"]
    502                 .getService(Components.interfaces.nsISmtpService);
    503             // check for new https://hg.mozilla.org/comm-central/rev/fab9e5145cd4 smtpService
    504             if (typeof(smtpService.servers) == "object") servers = smtpService.servers;
    505             else servers = smtpService.smtpServers;
    506 
    507             var found = false;
    508             while (servers && servers.hasMoreElements()) {
    509                 var server = servers.getNext();
    510                 if (server instanceof Components.interfaces.nsISmtpServer &&
    511                     !server.redirectorType && smtp == server.key) {
    512                     found = true; break;
    513                 }
    514             }
    515             var resource = this._rdfService.GetResource(this._rdfNS + this._rdfNSSMTPservers + "/" + smtp);
    516             var rdfSMTPlabel = this._getRDFValue(resource, "label");
    517             var rdfHostname = this._getRDFValue(resource, "hostname");
    518             var rdfUsername = this._getRDFValue(resource, "username")
    519             if (!found || rdfSMTPlabel != (server.description?server.description:server.hostname) && rdfHostname != server.hostname)
    520                     mismatchSMTPs.push( { oldkey: smtp, label : rdfSMTPlabel, ext1: rdfHostname, ext2: rdfUsername, count: relevantSMTPs[smtp], key: "" } )
    521         }
    522         if (mismatchSMTPs.length > 0) {
    523             Log.debug(" found mismatches on smtp(s).");
    524             get3PaneWindow().openDialog("chrome://v_identity/content/vI_rdfAccountMismatchDialog.xul",0,
    525                     "chrome, dialog, modal, alwaysRaised, resizable=yes", "smtp", mismatchSMTPs,
    526                     /* callback: */ this).focus();
    527             return true;
    528         }
    529         else {
    530             Log.debug(" found no mismatch");
    531             return false;
    532         }
    533     },
    534 
    535     storeAccountInfo : function() {
    536         Log.debug("storeAccounts");
    537         var accounts = getAccountsArray();
    538         for (let acc = 0; acc < accounts.length; acc++) {
    539             let account = accounts[acc];
    540             let identities = getIdentitiesArray(account);
    541             for (let i = 0; i < identities.length; i++) {
    542                 let identity = identities[i];
    543 //                 Log.debug("storeAccounts identity store id " + identity.key);
    544 
    545                 var resource = this._rdfService.GetResource(this._rdfNS + this._rdfNSIdentities + "/" + identity.key);
    546                 this._setRDFValue(resource, "identityName", identity.identityName);
    547                 this._setRDFValue(resource, "fullName", identity.fullName);
    548                 this._setRDFValue(resource, "email", identity.email);
    549                
    550                 var position = this._identityContainer.IndexOf(resource); // check for index in new recType
    551                 if (position != -1) this._identityContainer.InsertElementAt(resource, position, false);
    552                 else this._identityContainer.AppendElement(resource);
    553             }
    554         }
    555        
    556         function storeSmtp(server, parent) {
    557 //             Log.debug("storeAccounts smtp store id " + server.key);
    558             var resource = parent._rdfService.GetResource(parent._rdfNS + parent._rdfNSSMTPservers + "/" + server.key);
    559             parent._setRDFValue(resource, "label", (server.description?server.description:server.hostname));
    560             parent._setRDFValue(resource, "hostname", server.hostname);
    561             parent._setRDFValue(resource, "username", server.username);
    562             var position = parent._smtpContainer.IndexOf(resource); // check for index in new recType
    563             if (position != -1) parent._smtpContainer.InsertElementAt(resource, position, false);
    564             else parent._smtpContainer.AppendElement(resource);
    565         }
    566        
    567         var servers, smtpService = Components.classes["@mozilla.org/messengercompose/smtp;1"]
    568             .getService(Components.interfaces.nsISmtpService);
    569         // check for new https://hg.mozilla.org/comm-central/rev/fab9e5145cd4 smtpService
    570         if (typeof(smtpService.servers) == "object") servers = smtpService.servers;
    571         else servers = smtpService.smtpServers;
    572 
    573         while (servers && servers.hasMoreElements()) {
    574             var server = servers.getNext();
    575             if (server instanceof Components.interfaces.nsISmtpServer && !server.redirectorType) storeSmtp(server, this);
    576         }
    577 
    578 //         Log.debug("storeAccounts done");
    579     },
    580 
    581     export : function(rdfFileName) {
    582         Log.debug("vI_rdfDatasource export: " + rdfFileName + "\n");
    583         var filePicker = Components.classes["@mozilla.org/filepicker;1"]
    584             .createInstance(Components.interfaces.nsIFilePicker);
    585         filePicker.init(get3PaneWindow(), "", Components.interfaces.nsIFilePicker.modeSave);
    586         filePicker.appendFilters(Components.interfaces.nsIFilePicker.filterAll | Components.interfaces.nsIFilePicker.filterText );
    587         filePicker.appendFilter("RDF Files","*.rdf");
    588        
    589         if (filePicker.show() != Components.interfaces.nsIFilePicker.returnCancel) {
    590             var rdfDataFile = Components.classes["@mozilla.org/file/local;1"]
    591                 .createInstance(Components.interfaces.nsILocalFile);
    592             var file = Components.classes["@mozilla.org/file/directory_service;1"]
    593                 .getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile);
    594                
    595             initWithFilePath_tryDelimiters(rdfDataFile, file.path, rdfFileName);
    596             rdfDataFile.copyTo(filePicker.file.parent,filePicker.file.leafName);
    597         }
    598     },
    599    
    600     _getRDFResourceForVIdentity : function (recDescription, recType) {
    601         if (!this._rdfDataSource) return null;
    602         if (!recDescription) {
    603             Log.debug("_getRDFResourceForVIdentity: no Recipient given.");
    604             return null;
    605         }
    606         var _rdfNSRecType = null
    607         switch (recType) {
    608             case "email": _rdfNSRecType = this._rdfNSEmail; break;
    609             case "newsgroup" : _rdfNSRecType = this._rdfNSNewsgroup; break;
    610             case "maillist" : _rdfNSRecType = this._rdfNSMaillist; break;
    611             case "filter" : _rdfNSRecType = this._rdfNSFilter; break;
    612         }
    613         return this._rdfService.GetResource(this._rdfNS + _rdfNSRecType + "/" + recDescription);
    614        
    615        
    616     },
    617    
    618     removeVIdentityFromRDF : function (resource, recType) {
    619 //      Log.debug("removeVIdentityFromRDF " + resource.ValueUTF8);
    620         this._unsetRDFValue(resource, "email", this._getRDFValue(resource, "email"))
    621         this._unsetRDFValue(resource, "fullName", this._getRDFValue(resource, "fullName"))
    622         this._unsetRDFValue(resource, "id", this._getRDFValue(resource, "id"))
    623         this._unsetRDFValue(resource, "smtp", this._getRDFValue(resource, "smtp"))
    624         this._unsetRDFValue(resource, "name", this._getRDFValue(resource, "name"))
    625        
    626         let self = this;
    627         var extras = new identityDataExtras(self, resource)
    628         extras.loopThroughExtras(
    629           function (extra) {
    630             extra.value = self._unsetRDFValue(resource, extra.field, extra.value) });
    631        
    632         this.getContainer(recType).RemoveElement(resource, true);
    633     },
    634    
    635     _unsetRDFValue : function (resource, field, value) {
    636 //      Log.debug("_unsetRDFValue " + this._rdfService  + " " + this._rdfDataSource);
    637         var predicate = this._rdfService.GetResource(this._rdfNS + "rdf#" + field);
    638         var name = this._rdfService.GetLiteral(value?value:"");
    639         var target = this._rdfDataSource.GetTarget(resource, predicate, true);
    640         if (target instanceof Components.interfaces.nsIRDFLiteral) {
    641             this._rdfDataSource.Unassert(resource, predicate, name, true);
    642             return null;
    643         }
    644         else return value;
    645     },
    646    
    647     // this will be used from rdfDataTree to get all RDF values, callFunction is vI.rdfDataTreeCollection.__addNewDatum
    648     readAllEntriesFromRDF : function (addNewDatum, treeType, idData) {
    649 //      Log.debug("readAllEntriesFromRDF " + this._rdfService  + " " + this._rdfDataSource + " " + this);
    650         var enumerator = this.getContainer(treeType).GetElements();
    651         while (enumerator && enumerator.hasMoreElements()) {
    652             var resource = enumerator.getNext();
    653             resource.QueryInterface(Components.interfaces.nsIRDFResource);
    654             var name = this._getRDFValue(resource, "name")
    655             var email = this._getRDFValue(resource, "email")
    656             var fullName = this._getRDFValue(resource, "fullName")
    657             var id = this._getRDFValue(resource, "id")
    658             var smtp = this._getRDFValue(resource, "smtp")
    659             var used = this._getRDFValue(resource, "timeUsed")
    660             var changed = this._getRDFValue(resource, "timeChanged")
    661             if (!smtp) smtp = NO_SMTP_TAG;
    662             let self = this;
    663             var localIdentityData = new identityData(email, fullName, id, smtp, new identityDataExtras(self, resource))
    664             addNewDatum (resource, name, localIdentityData, idData, used, changed)
    665         }
    666     },
    667    
    668     __getDescriptionAndType : function (recipient, recipientType) {
    669         if (recipientType == "addr_newsgroups") return { recDesc : recipient, recType : "newsgroup" }
    670         else if (this.__isMailingList(recipient)) {
    671             Log.debug("__getDescriptionAndType: '" + recipient + "' is MailList");
    672             return { recDesc : this.__getMailListName(recipient), recType : "maillist" }
    673         }
    674         else {
    675             Log.debug("__getDescriptionAndType: '" + recipient + "' is no MailList");
    676             var localIdentityData = new identityData(recipient, null, null, null, null, null, null);
    677             return { recDesc : localIdentityData.combinedName, recType : "email" }
    678         }
    679     },
    680    
    681     // --------------------------------------------------------------------
    682     // check if recipient is a mailing list.
    683     // Similiar to Thunderbird, if there are muliple cards with the same displayName the mailinglist is preferred
    684     // see also https://bugzilla.mozilla.org/show_bug.cgi?id=408575
    685     __isMailingList: function(recipient) {
    686         let abManager = Components.classes["@mozilla.org/abmanager;1"]
    687             .getService(Components.interfaces.nsIAbManager);
    688         let allAddressBooks = abManager.directories;
    689         while (allAddressBooks.hasMoreElements()) {
    690             let ab = allAddressBooks.getNext();
    691             if (ab instanceof Components.interfaces.nsIAbDirectory && !ab.isRemote) {
    692                 let abdirectory = abManager.getDirectory(ab.URI +
    693                     "?(and(DisplayName,=," + encodeURIComponent(this.__getMailListName(recipient)) + ")(IsMailList,=,TRUE))");
    694                 if (abdirectory) {
    695                     try {   // just try, sometimes there are no childCards at all...
    696                         let cards = abdirectory.childCards;
    697                         if (cards.hasMoreElements()) return true;   // only interested if there is at least one element...
    698                     } catch(e) { }
    699                 }
    700             }
    701         }
    702         return false;
    703     }, 
    704    
    705     // --------------------------------------------------------------------
    706    
    707     __getMailListName : function(recipient) {
    708         if (recipient.match(/<[^>]*>/) || recipient.match(/$/)) {
    709             var mailListName = RegExp.leftContext + RegExp.rightContext
    710             mailListName = mailListName.replace(/^\s+|\s+$/g,"")
    711         }
    712         return mailListName;
    713     },
    714 
    715     findMatchingFilter : function (recipient, recipientType) {
    716         var recDescription = this.__getDescriptionAndType(recipient, recipientType).recDesc;
    717         Log.debug("findMatchingFilter for " + recDescription);
    718         var enumerator = this._filterContainer.GetElements();
    719         while (enumerator && enumerator.hasMoreElements()) {
    720             var resource = enumerator.getNext();
    721             resource.QueryInterface(Components.interfaces.nsIRDFResource);
    722             var filter = this._getRDFValue(resource, "name");
    723            
    724             const filterType = { None : 0, RegExp : 1, StrCmp : 2 }
    725             var recentfilterType;
    726 
    727             if (filter == "") continue;
    728             if (/^\/(.*)\/$/.exec(filter)) {
    729               Log.debug("findMatchingFilter with RegExp '" + filter.replace(/\\/g,"\\\\") + "'");
    730               recentfilterType = filterType.RegExp;
    731             }
    732             else {
    733               Log.debug("findMatchingFilter, compare with '" + filter + "'");
    734               recentfilterType = filterType.StrCmp;
    735             }
    736            
    737             switch (recentfilterType) {
    738                 case filterType.RegExp:
    739                     try {   /^\/(.*)\/$/.exec(filter);
    740                         if (recDescription.match(new RegExp(RegExp.$1,"i"))) {
    741                             Log.debug("findMatchingFilter found stored data.");
    742                             return this._readVIdentityFromRDF(resource);
    743                         }
    744                     }
    745                     catch(vErr) { }; break;
    746                 case filterType.StrCmp:
    747                     if (recDescription.toLowerCase().indexOf(filter.toLowerCase()) != -1) {
    748                         Log.debug("findMatchingFilter found stored data.");
    749                         return this._readVIdentityFromRDF(resource);
    750                     }
    751                     break;
    752             }
    753         }
    754         Log.debug("findMatchingFilter no match found.");
    755         return null;
    756     },
    757    
    758     readVIdentityFromRDF : function (recipient, recipientType) {
    759         var storedRecipient = this.__getDescriptionAndType(recipient, recipientType);
    760         var email = this._rdfService.GetResource(this._rdfNS + "rdf#email");
    761         var resource = this._getRDFResourceForVIdentity(storedRecipient.recDesc, storedRecipient.recType);
    762         if (!resource) return null;
    763         if (!this._rdfDataSource.hasArcOut(resource, email)) {
    764             // no data available --> give up.
    765             Log.debug("readVIdentityFromRDF no data found.");
    766             return null;
    767         }
    768         Log.debug("readVIdentityFromRDF found stored data.");
    769        
    770         return this._readVIdentityFromRDF(resource);
    771     },
    772    
    773     _readVIdentityFromRDF : function (resource) {
    774         var email = this._getRDFValue(resource, "email")
    775         var fullName = this._getRDFValue(resource, "fullName")
    776         var id = this._getRDFValue(resource, "id")
    777         var smtp = this._getRDFValue(resource, "smtp")
    778         if (!smtp) smtp = NO_SMTP_TAG;
    779        
    780         let _date = new Date();
    781         this._setRDFValue(resource, "timeUsed", _date.getTime());
    782        
    783         Log.debug("email='" + email +
    784             "' fullName='" + fullName + "' id='" + id + "' smtp='" + smtp + "'");
    785        
    786         let self = this;
    787         var localIdentityData = new identityData(email, fullName, id, smtp, new identityDataExtras(self, resource))
    788         return localIdentityData;
    789     },
    790 
    791     _getRDFValue : function (resource, field) {
    792 //         Log.debug("_getRDFValue " + this._rdfService  + " " + this._rdfDataSource + " " + this);
    793         var predicate = this._rdfService.GetResource(this._rdfNS + "rdf#" + field);
    794         var target = this._rdfDataSource.GetTarget(resource, predicate, true);
    795         if (target instanceof Components.interfaces.nsIRDFLiteral) return target.Value
    796         else return null;
    797     },
    798    
    799     updateRDFFromVIdentity : function(identityData, recipientName, recipientType) {
    800         var recipient = this.__getDescriptionAndType(recipientName, recipientType)
    801         this.updateRDF(recipient.recDesc, recipient.recType, identityData,
    802             vIprefs.get("storage_store_base_id"),
    803             vIprefs.get("storage_store_SMTP"),
    804             null, null, false);
    805     },
    806    
    807     removeRDF : function (recDescription, recType) {
    808         var resource = this._getRDFResourceForVIdentity(recDescription, recType);
    809         if (!resource) return null;
    810         this.removeVIdentityFromRDF(resource, recType);
    811         return resource;
    812     },
    813 
    814     updateRDF : function (recDescription, recType, localIdentityData, storeBaseID, storeSMTP, prevRecDescription, prevRecType, updateAllExtras) {
    815 //         Log.debug("(" + this._rdfNS + "): updateRDF recDescription=" + recDescription + " localIdentityData.email=" + localIdentityData.email);
    816        
    817 //      if (!localIdentityData.email) {
    818 //          Log.debug("updateRDF: no Sender-email for Recipient, aborting.");
    819 //          return;
    820 //      }
    821         if (!recDescription || recDescription.length == 0) return;
    822 
    823         if (!prevRecDescription) prevRecDescription = recDescription;
    824         if (!prevRecType) prevRecType = recType;
    825 
    826         var resource = this._getRDFResourceForVIdentity(prevRecDescription, prevRecType);
    827         if (!resource) return;
    828 //      Log.debug("updateRDF " + resource.ValueUTF8);
    829        
    830         var position = this.getContainer(recType).IndexOf(resource); // check for index in new recType
    831         this.removeVIdentityFromRDF(resource, prevRecType);
    832        
    833         resource = this._getRDFResourceForVIdentity(recDescription, recType);
    834 
    835         this._setRDFValue(resource, "email", localIdentityData.email);
    836         this._setRDFValue(resource, "fullName", localIdentityData.fullName);
    837         if (storeBaseID)
    838             this._setRDFValue(resource, "id", localIdentityData.id.key);
    839         else    this._unsetRDFValue(resource, "id", this._getRDFValue(resource, "id"))
    840         if (storeSMTP && localIdentityData.smtp.key != NO_SMTP_TAG)
    841             this._setRDFValue(resource, "smtp", localIdentityData.smtp.key);
    842         else    this._unsetRDFValue(resource, "smtp", this._getRDFValue(resource, "smtp"))
    843         this._setRDFValue(resource, "name", recDescription);
    844  
    845         if (localIdentityData.extras) {
    846           let self = this;
    847           localIdentityData.extras.loopThroughExtras(
    848             function (extra) {
    849               if (updateAllExtras || extra.active)
    850                 extra.value = self._setRDFValue(resource, extra.field, extra.value) });
    851 //           Log.debug("extras: " + localIdentityData.extras.status());
    852         }
    853        
    854         let _date = new Date();
    855         this._setRDFValue(resource, "timeChanged", _date.getTime());
    856        
    857 //      Log.debug("updateRDF add " + resource.ValueUTF8 + " at position " + position);
    858         if (position != -1) this.getContainer(recType).InsertElementAt(resource, position, true);
    859         else this.getContainer(recType).AppendElement(resource);
    860     },
    861 
    862     _setRDFValue : function (resource, field, value) {
    863 //      Log.debug("_setRDFValue " + resource.ValueUTF8 + " " + field + " " + value);
    864         if (!value) return value; // return if some value was not set.
    865 //      Log.debug("_setRDFValue " + this._rdfService + " " + this._rdfDataSource);
    866         var predicate = this._rdfService.GetResource(this._rdfNS + "rdf#" + field);
    867         var name = this._rdfService.GetLiteral(value);
    868         var target = this._rdfDataSource.GetTarget(resource, predicate, true);
    869        
    870         if (target instanceof Components.interfaces.nsIRDFLiteral)
    871             this._rdfDataSource.Change(resource, predicate, target, name);
    872         else    this._rdfDataSource.Assert(resource, predicate, name, true);
    873         return value;
    874     },
    875 
    876     //  code adapted from http://xulsolutions.blogspot.com/2006/07/creating-uninstall-script-for.html
    877     AccountManagerObserver : {
    878         _uninstall : false,
    879         observe : function(subject, topic, data) {
    880             if (topic == "am-smtpChanges" || topic == "am-acceptChanges") {
    881                 Log.debug("account/smtp changes observed");
    882                 this.searchIdentityMismatch();
    883                 this.searchSmtpMismatch();
    884                 this.refreshAccountInfo();
    885             }
    886         },
    887         register : function() {
    888             Log.debug("register AccountManagerObserver");
    889             var obsService = Components.classes["@mozilla.org/observer-service;1"].
    890                 getService(Components.interfaces.nsIObserverService)
    891             obsService.addObserver(this, "am-smtpChanges", false);
    892             obsService.addObserver(this, "am-acceptChanges", false);
    893         },
    894         unregister : function() {
    895             var obsService = Components.classes["@mozilla.org/observer-service;1"].
    896                 getService(Components.interfaces.nsIObserverService)
    897             try {
    898                 obsService.removeObserver(this, "am-smtpChanges");
    899                 obsService.removeObserver(this, "am-acceptChanges");
    900             } catch(e) { };
    901         }
    902     }
    903 }
    904 
    905 
    906 function rdfDatasourceAccess() {
    907     this._rdfDataSource = new rdfDatasource("virtualIdentity.rdf", false);
    908     this.stringBundle = Services.strings.createBundle("chrome://v_identity/locale/v_identity.properties");
    909 }
    910 
    911 rdfDatasourceAccess.prototype = {
    912     _rdfDataSource : null,
    913     stringBundle : null,
    914    
    915     clean : function() {
    916         this._rdfDataSource.clean();
    917     },
    918    
    919     updateVIdentityFromStorage : function(recipientName, recipientType, currentIdentity, currentIdentityIsVid, isNotFirstInputElement, currentWindow) {
    920         var localIdentities = new identityCollection();
    921         localIdentities.addWithoutDuplicates(this._rdfDataSource.readVIdentityFromRDF(recipientName, recipientType));
    922         if (localIdentities.number == 1) Log.debug("using data from direct match");
    923         localIdentities.addWithoutDuplicates(this._rdfDataSource.findMatchingFilter(recipientName, recipientType));
    924        
    925         var returnValue = {}; returnValue.identityCollection = localIdentities; returnValue.result = "drop";
    926         if (localIdentities.number == 0) {
    927             Log.debug("updateVIdentityFromStorage no usable Storage-Data found.");
    928         }
    929         else {
    930             Log.debug("compare with current Identity");
    931             if (vIprefs.get("storage_getOneOnly") &&        // if requested to retrieve only storageID for first recipient entered
    932                 isNotFirstInputElement &&                           // and it is now not the first recipient entered
    933                 !localIdentities.identityDataCollection[0].equalsIdentity(currentIdentity, false).equal) {      // and this id is different than the current used one
    934                     StorageNotification.info(this.stringBundle.GetStringFromName("vident.smartIdentity.vIStorageCollidingIdentity"));
    935 //                  returnValue.result = "drop";    // this is the default value
    936             }
    937             // only update fields if new Identity is different than old one.
    938             else {
    939                 Log.debug("updateVIdentityFromStorage check if storage-data matches current Identity.");
    940                 var compResult = localIdentities.identityDataCollection[0].equalsIdentity(currentIdentity, true);
    941                 if (!compResult.equal) {
    942                     var warning = this.__getWarning("replaceVIdentity", recipientName, compResult.compareMatrix);
    943                     if (    !currentIdentityIsVid ||
    944                         !vIprefs.get("storage_warn_vI_replace") ||
    945                         (this.__askWarning(warning, currentWindow) == "accept")) {
    946                             returnValue.result = "accept";
    947                     }
    948                 }
    949                 else {
    950                     returnValue.result = "equal";
    951                 }
    952             }
    953         }
    954         return returnValue;
    955     },
    956    
    957     storeVIdentityToAllRecipients : function(identityData, recipients, currentWindow) {
    958         var multipleRecipients = (recipients.length > 1);
    959         var dontUpdateMultipleNoEqual = (vIprefs.get("storage_dont_update_multiple") && multipleRecipients)
    960         Log.debug("storeVIdentityToAllRecipients dontUpdateMultipleNoEqual='" + dontUpdateMultipleNoEqual + "'")
    961        
    962         let returnValue = { update : "cancel" };
    963         for (var j = 0; j < recipients.length; j++) {
    964             returnValue = this.__updateStorageFromVIdentity(identityData, recipients[j].recipient, recipients[j].recipientType, dontUpdateMultipleNoEqual, currentWindow);
    965             if (returnValue.update != "accept")  break;
    966         }
    967         return returnValue;
    968     },
    969 
    970     getVIdentityFromAllRecipients : function(allIdentities, recipients) {
    971         if (!vIprefs.get("storage"))
    972             { Log.debug("Storage deactivated"); return; }
    973         var initnumber = allIdentities.number;
    974         for (var j = 0; j < recipients.length; j++) {
    975             allIdentities.addWithoutDuplicates(this._rdfDataSource.readVIdentityFromRDF(recipients[j].recipient, recipients[j].recipientType));
    976             allIdentities.addWithoutDuplicates(this._rdfDataSource.findMatchingFilter(recipients[j].recipient, recipients[j].recipientType));
    977         }
    978         Log.debug("found " + (allIdentities.number-initnumber) + " address(es)")
    979     },
    980 
    981     __updateStorageFromVIdentity : function(identityData, recipient, recipientType, dontUpdateMultipleNoEqual, currentWindow) {
    982         Log.debug("__updateStorageFromVIdentity.")
    983         var storageDataByType = this._rdfDataSource.readVIdentityFromRDF(recipient, recipientType);
    984         var storageDataByFilter = this._rdfDataSource.findMatchingFilter(recipient, recipientType);
    985        
    986         // update (storing) of data by type is required if there is
    987         // no data stored by type (or different data stored) and no equal filter found
    988         var storageDataByTypeCompResult = storageDataByType?storageDataByType.equalsIdentity(identityData, true):null;
    989         var storageDataByTypeEqual = (storageDataByType && storageDataByTypeCompResult.equal);
    990         var storageDataByFilterEqual = (storageDataByFilter && storageDataByFilter.equalsIdentity(identityData, false).equal);
    991        
    992         var doUpdate = "accept";
    993         if (    (!storageDataByType && !storageDataByFilterEqual) ||
    994             (!storageDataByTypeEqual && !storageDataByFilterEqual && !dontUpdateMultipleNoEqual) ) {
    995             Log.debug("__updateStorageFromVIdentity updating")
    996             if (storageDataByType && !storageDataByTypeEqual && vIprefs.get("storage_warn_update")) {
    997                 Log.debug("__updateStorageFromVIdentity overwrite warning");
    998                 doUpdate = this.__askWarning(this.__getWarning("updateStorage", recipient, storageDataByTypeCompResult.compareMatrix), currentWindow);
    999             }
    1000         }
    1001         if (doUpdate == "accept") this._rdfDataSource.updateRDFFromVIdentity(identityData, recipient, recipientType);
    1002         return { update : doUpdate, storedIdentity : storageDataByType };
    1003     },
    1004    
    1005     __getWarning : function(warningCase, recipient, compareMatrix) {
    1006         var warning = { title: null, recLabel : null, recipient : null, warning : null, css: null, query : null, class : null };
    1007         warning.title = this.stringBundle.GetStringFromName("vident." + warningCase + ".title")
    1008         warning.recLabel = this.stringBundle.GetStringFromName("vident." + warningCase + ".recipient") + ":";
    1009         warning.recipient = recipient;
    1010         warning.warning =
    1011             "<table class='" + warningCase + "'><thead><tr><th class='col1'/>" +
    1012                 "<th class='col2'>" + this.stringBundle.GetStringFromName("vident." + warningCase + ".currentIdentity") + "</th>" +
    1013                 "<th class='col3'>" + this.stringBundle.GetStringFromName("vident." + warningCase + ".storedIdentity") + "</th>" +
    1014             "</tr></thead>" +
    1015             "<tbody>" + compareMatrix + "</tbody>" +
    1016             "</table>"
    1017         warning.css = "vI.DialogBrowser.css";
    1018         warning.query = this.stringBundle.GetStringFromName("vident." + warningCase + ".query");
    1019         warning.class = warningCase;
    1020         return warning;
    1021     },
    1022 
    1023     __askWarning : function(warning, currentWindow) {
    1024         var retVar = { returnValue: null };
    1025         var answer = currentWindow.openDialog("chrome://v_identity/content/vI_Dialog.xul","",
    1026                     "chrome, dialog, modal, alwaysRaised, resizable=yes",
    1027                      warning, retVar)
    1028         Log.debug("retVar.returnValue=" + retVar.returnValue)
    1029         return retVar.returnValue;
    1030     },
     1002      }
     1003    }
     1004    return returnValue;
     1005  },
     1006
     1007  storeVIdentityToAllRecipients: function (identityData, recipients, currentWindow) {
     1008    var multipleRecipients = (recipients.length > 1);
     1009    var dontUpdateMultipleNoEqual = (vIprefs.get("storage_dont_update_multiple") && multipleRecipients)
     1010    Log.debug("storeVIdentityToAllRecipients dontUpdateMultipleNoEqual='" + dontUpdateMultipleNoEqual + "'")
     1011
     1012    let returnValue = {
     1013      update: "cancel"
     1014    };
     1015    for (var j = 0; j < recipients.length; j++) {
     1016      returnValue = this.__updateStorageFromVIdentity(identityData, recipients[j].recipient, recipients[j].recipientType, dontUpdateMultipleNoEqual, currentWindow);
     1017      if (returnValue.update != "accept") break;
     1018    }
     1019    return returnValue;
     1020  },
     1021
     1022  getVIdentityFromAllRecipients: function (allIdentities, recipients) {
     1023    if (!vIprefs.get("storage")) {
     1024      Log.debug("Storage deactivated");
     1025      return;
     1026    }
     1027    var initnumber = allIdentities.number;
     1028    for (var j = 0; j < recipients.length; j++) {
     1029      allIdentities.addWithoutDuplicates(this._rdfDataSource.readVIdentityFromRDF(recipients[j].recipient, recipients[j].recipientType));
     1030      allIdentities.addWithoutDuplicates(this._rdfDataSource.findMatchingFilter(recipients[j].recipient, recipients[j].recipientType));
     1031    }
     1032    Log.debug("found " + (allIdentities.number - initnumber) + " address(es)")
     1033  },
     1034
     1035  __updateStorageFromVIdentity: function (identityData, recipient, recipientType, dontUpdateMultipleNoEqual, currentWindow) {
     1036    Log.debug("__updateStorageFromVIdentity.")
     1037    var storageDataByType = this._rdfDataSource.readVIdentityFromRDF(recipient, recipientType);
     1038    var storageDataByFilter = this._rdfDataSource.findMatchingFilter(recipient, recipientType);
     1039
     1040    // update (storing) of data by type is required if there is
     1041    // no data stored by type (or different data stored) and no equal filter found
     1042    var storageDataByTypeCompResult = storageDataByType ? storageDataByType.equalsIdentity(identityData, true) : null;
     1043    var storageDataByTypeEqual = (storageDataByType && storageDataByTypeCompResult.equal);
     1044    var storageDataByFilterEqual = (storageDataByFilter && storageDataByFilter.equalsIdentity(identityData, false).equal);
     1045
     1046    var doUpdate = "accept";
     1047    if ((!storageDataByType && !storageDataByFilterEqual) ||
     1048      (!storageDataByTypeEqual && !storageDataByFilterEqual && !dontUpdateMultipleNoEqual)) {
     1049      Log.debug("__updateStorageFromVIdentity updating")
     1050      if (storageDataByType && !storageDataByTypeEqual && vIprefs.get("storage_warn_update")) {
     1051        Log.debug("__updateStorageFromVIdentity overwrite warning");
     1052        doUpdate = this.__askWarning(this.__getWarning("updateStorage", recipient, storageDataByTypeCompResult.compareMatrix), currentWindow);
     1053      }
     1054    }
     1055    if (doUpdate == "accept") this._rdfDataSource.updateRDFFromVIdentity(identityData, recipient, recipientType);
     1056    return {
     1057      update: doUpdate,
     1058      storedIdentity: storageDataByType
     1059    };
     1060  },
     1061
     1062  __getWarning: function (warningCase, recipient, compareMatrix) {
     1063    var warning = {
     1064      title: null,
     1065      recLabel: null,
     1066      recipient: null,
     1067      warning: null,
     1068      css: null,
     1069      query: null,
     1070      class: null
     1071    };
     1072    warning.title = this.stringBundle.GetStringFromName("vident." + warningCase + ".title")
     1073    warning.recLabel = this.stringBundle.GetStringFromName("vident." + warningCase + ".recipient") + ":";
     1074    warning.recipient = recipient;
     1075    warning.warning =
     1076      "<table class='" + warningCase + "'><thead><tr><th class='col1'/>" +
     1077      "<th class='col2'>" + this.stringBundle.GetStringFromName("vident." + warningCase + ".currentIdentity") + "</th>" +
     1078      "<th class='col3'>" + this.stringBundle.GetStringFromName("vident." + warningCase + ".storedIdentity") + "</th>" +
     1079      "</tr></thead>" +
     1080      "<tbody>" + compareMatrix + "</tbody>" +
     1081      "</table>"
     1082    warning.css = "vI.DialogBrowser.css";
     1083    warning.query = this.stringBundle.GetStringFromName("vident." + warningCase + ".query");
     1084    warning.class = warningCase;
     1085    return warning;
     1086  },
     1087
     1088  __askWarning: function (warning, currentWindow) {
     1089    var retVar = {
     1090      returnValue: null
     1091    };
     1092    var answer = currentWindow.openDialog("chrome://v_identity/content/vI_Dialog.xul", "",
     1093      "chrome, dialog, modal, alwaysRaised, resizable=yes",
     1094      warning, retVar)
     1095    Log.debug("retVar.returnValue=" + retVar.returnValue)
     1096    return retVar.returnValue;
     1097  },
    10311098}
    10321099
     
    10341101// create with name of the file to import into
    10351102function rdfDatasourceImporter(rdfFileName) {
    1036     this._rdfFileName = rdfFileName;
    1037     if (this._rdfFileName) this.import();
     1103  this._rdfFileName = rdfFileName;
     1104  if (this._rdfFileName) this.import();
    10381105}
    10391106
    10401107rdfDatasourceImporter.prototype = {
    1041     _rdfService :       Components.classes["@mozilla.org/rdf/rdf-service;1"]
    1042                             .getService(Components.interfaces.nsIRDFService),
    1043     _rdfDataSource :    null,
    1044     _rdfFileName :      null,
    1045     _rdfImportDataSource :    null,
    1046 
    1047     _getMatchingIdentity : function(name, email, fullName) {
    1048         var accounts = getAccountsArray();
    1049         for (let acc = 0; acc < accounts.length; acc++) {
    1050             let account = accounts[acc];
    1051             let identities = getIdentitiesArray(account);
    1052             for (let i = 0; i < identities.length; i++) {
    1053                 let identity = identities[i];
    1054                 if (name == identity.identityName || (fullName == identity.fullName && email == identity.email)) return identity.key;
    1055             }
     1108  _rdfService: Components.classes["@mozilla.org/rdf/rdf-service;1"]
     1109    .getService(Components.interfaces.nsIRDFService),
     1110  _rdfDataSource: null,
     1111  _rdfFileName: null,
     1112  _rdfImportDataSource: null,
     1113
     1114  _getMatchingIdentity: function (name, email, fullName) {
     1115    var accounts = getAccountsArray();
     1116    for (let acc = 0; acc < accounts.length; acc++) {
     1117      let account = accounts[acc];
     1118      let identities = getIdentitiesArray(account);
     1119      for (let i = 0; i < identities.length; i++) {
     1120        let identity = identities[i];
     1121        if (name == identity.identityName || (fullName == identity.fullName && email == identity.email)) return identity.key;
     1122      }
     1123    }
     1124    return null;
     1125  },
     1126
     1127  _getMatchingSMTP: function (label, hostname, username) {
     1128    var servers, smtpService = Components.classes["@mozilla.org/messengercompose/smtp;1"]
     1129      .getService(Components.interfaces.nsISmtpService);
     1130    // check for new https://hg.mozilla.org/comm-central/rev/fab9e5145cd4 smtpService
     1131    if (typeof (smtpService.servers) == "object") servers = smtpService.servers;
     1132    else servers = smtpService.smtpServers;
     1133
     1134    while (servers && servers.hasMoreElements()) {
     1135      var server = servers.getNext();
     1136      if (server instanceof Components.interfaces.nsISmtpServer && !server.redirectorType)
     1137        if (label == (server.description ? server.description : server.hostname) || (hostname == server.hostname && username == server.username))
     1138          return server.key;
     1139    }
     1140    return null;
     1141  },
     1142
     1143  _translateRelevantIDs: function () {
     1144    var relevantIDs = this._rdfImportDataSource.getRelevantIDs();
     1145    for (var id in relevantIDs) {
     1146      var resource = this._rdfService.GetResource(this._rdfImportDataSource._rdfNS + this._rdfImportDataSource._rdfNSIdentities + "/" + id);
     1147      var values = {
     1148        id: null,
     1149        identityName: null,
     1150        email: null,
     1151        fullName: null
     1152      }
     1153      values.identityName = this._rdfImportDataSource._getRDFValue(resource, "identityName");
     1154      values.email = this._rdfImportDataSource._getRDFValue(resource, "email");
     1155      values.fullName = this._rdfImportDataSource._getRDFValue(resource, "fullName");
     1156      values.id = this._getMatchingIdentity(values.identityName, values.email, values.fullName);
     1157      values.id = values.id ? values.id : "import_" + id
     1158      relevantIDs[id] = values;
     1159      Log.debug("import: translate relevant ID from previous '" + id + "' to current '" + relevantIDs[id].id + "'");
     1160    }
     1161    return relevantIDs;
     1162  },
     1163
     1164  _storeMappedIDs: function (relevantIDs) {
     1165    for (var id in relevantIDs) {
     1166      if (relevantIDs[id].id == "import_" + id) {
     1167        var resource = this._rdfService
     1168          .GetResource(this._rdfDataSource._rdfNS + this._rdfDataSource._rdfNSIdentities + "/" + relevantIDs[id].id);
     1169        this._rdfDataSource._setRDFValue(resource, "identityName", relevantIDs[id].identityName);
     1170        this._rdfDataSource._setRDFValue(resource, "fullName", relevantIDs[id].fullName);
     1171        this._rdfDataSource._setRDFValue(resource, "email", relevantIDs[id].email);
     1172
     1173        var position = this._rdfDataSource._identityContainer.IndexOf(resource); // check for index in new recType
     1174        if (position != -1) this._rdfDataSource._identityContainer.InsertElementAt(resource, position, false);
     1175        else this._rdfDataSource._identityContainer.AppendElement(resource);
     1176      }
     1177    }
     1178  },
     1179
     1180  _translateRelevantSMTPs: function () {
     1181    var relevantSMTPs = this._rdfImportDataSource.getRelevantSMTPs();
     1182    for (var smtp in relevantSMTPs) {
     1183      var resource = this._rdfService.GetResource(this._rdfImportDataSource._rdfNS + this._rdfImportDataSource._rdfNSSMTPservers + "/" + smtp);
     1184      var values = {
     1185        smtp: null,
     1186        label: null,
     1187        hostname: null,
     1188        username: null
     1189      }
     1190      values.label = this._rdfImportDataSource._getRDFValue(resource, "label");
     1191      values.hostname = this._rdfImportDataSource._getRDFValue(resource, "hostname");
     1192      values.username = this._rdfImportDataSource._getRDFValue(resource, "username");
     1193      values.smtp = this._getMatchingSMTP(values.label, values.hostname, values.username);
     1194      values.smtp = values.smtp ? values.smtp : "import_" + smtp;
     1195      relevantSMTPs[smtp] = values;
     1196      Log.debug("import: translate relevant SMTP from previous '" + smtp + "' to current '" + relevantSMTPs[smtp].smtp + "'");
     1197    }
     1198    return relevantSMTPs;
     1199  },
     1200
     1201  _storeMappedSMTPs: function (relevantSMTPs) {
     1202    for (var smtp in relevantSMTPs) {
     1203      if (relevantSMTPs[smtp].smtp == "import_" + smtp) {
     1204        var resource = this._rdfService
     1205          .GetResource(this._rdfDataSource._rdfNS + this._rdfDataSource._rdfNSSMTPservers + "/" + relevantSMTPs[smtp].smtp);
     1206        this._rdfDataSource._setRDFValue(resource, "label", relevantSMTPs[smtp].label);
     1207        this._rdfDataSource._setRDFValue(resource, "hostname", relevantSMTPs[smtp].hostname);
     1208        this._rdfDataSource._setRDFValue(resource, "username", relevantSMTPs[smtp].username);
     1209
     1210        var position = this._rdfDataSource._smtpContainer.IndexOf(resource); // check for index in new recType
     1211        if (position != -1) this._rdfDataSource._smtpContainer.InsertElementAt(resource, position, false);
     1212        else this._rdfDataSource._smtpContainer.AppendElement(resource);
     1213      }
     1214    }
     1215  },
     1216
     1217  import: function () {
     1218    var filePicker = Components.classes["@mozilla.org/filepicker;1"]
     1219      .createInstance(Components.interfaces.nsIFilePicker);
     1220
     1221    filePicker.init(get3PaneWindow(), "", Components.interfaces.nsIFilePicker.modeOpen);
     1222    filePicker.appendFilter("RDF Files", "*.rdf");
     1223    filePicker.appendFilters(Components.interfaces.nsIFilePicker.filterText | Components.interfaces.nsIFilePicker.filterAll);
     1224
     1225    if (filePicker.show() == Components.interfaces.nsIFilePicker.returnOK) {
     1226      Log.debug("import: preparation:");
     1227
     1228      var importRdfDataFile = Components.classes["@mozilla.org/file/local;1"]
     1229        .createInstance(Components.interfaces.nsILocalFile);
     1230      var file = Components.classes["@mozilla.org/file/directory_service;1"]
     1231        .getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile);
     1232
     1233      initWithFilePath_tryDelimiters(importRdfDataFile, file.path, this._rdfFileName + "_import");
     1234      filePicker.file.copyTo(importRdfDataFile.parent, importRdfDataFile.leafName);
     1235
     1236      Log.debug("import: copied file from " + filePicker.file.path + " to " + importRdfDataFile.path + "'");
     1237
     1238      // init Datasources
     1239      this._rdfImportDataSource = new rdfDatasource(importRdfDataFile.leafName, true);
     1240
     1241      // search matching IDs and SMTPs for anyones used in import-file
     1242      var relevantIDs = this._translateRelevantIDs();
     1243      var relevantSMTPs = this._translateRelevantSMTPs();
     1244
     1245      Log.debug("import: preparation done.");
     1246
     1247      for each(let treeType in Array("email", "maillist", "newsgroup", "filter")) {
     1248        // re-initialize importDataSource to point rdfService to the right Resources
     1249        this._rdfImportDataSource = new rdfDatasource(importRdfDataFile.leafName, true);
     1250        var container = this._rdfImportDataSource.getContainer(treeType)
     1251        if (container.GetCount() == 0) continue;
     1252        Log.debug("importing " + treeType + ": " + container.GetCount() + " datasets from " + this._rdfImportDataSource._rdfDataSource.URI);
     1253        var enumerator = container.GetElements();
     1254        // re-initialize dataSource to point rdfService to the right Resources
     1255        this._rdfDataSource = new rdfDatasource(this._rdfFileName, true);
     1256        var count = 0;
     1257        while (enumerator.hasMoreElements()) {
     1258          var resource = enumerator.getNext();
     1259          count += 1;
     1260          resource.QueryInterface(Components.interfaces.nsIRDFResource);
     1261          //                     Log.debug(" " + count + " ");
     1262          var name = this._rdfImportDataSource._getRDFValue(resource, "name")
     1263          var email = this._rdfImportDataSource._getRDFValue(resource, "email")
     1264          var fullName = this._rdfImportDataSource._getRDFValue(resource, "fullName")
     1265          var id = this._rdfImportDataSource._getRDFValue(resource, "id")
     1266          id = id ? relevantIDs[id].id : null
     1267          var smtp = this._rdfImportDataSource._getRDFValue(resource, "smtp")
     1268          smtp = (smtp && smtp != DEFAULT_SMTP_TAG) ? relevantSMTPs[smtp].smtp : smtp
     1269          var localIdentityData = new identityData(email, fullName, id, smtp, new identityDataExtras(this._rdfImportDataSource, resource))
     1270
     1271          this._rdfDataSource.updateRDF(name, treeType, localIdentityData, false, false, null, null, true)
     1272          var resource = this._rdfDataSource._getRDFResourceForVIdentity(name, treeType);
     1273          if (id) this._rdfDataSource._setRDFValue(resource, "id", id); // localIdentityData can only store valid id's, this one might be a temporary invalid id
     1274          if (smtp) this._rdfDataSource._setRDFValue(resource, "smtp", smtp); // localIdentityData can only store valid smtp's, this one might be a temporary invalid smtp
    10561275        }
    1057         return null;
    1058     },
    1059    
    1060     _getMatchingSMTP : function(label, hostname, username) {
    1061         var servers, smtpService = Components.classes["@mozilla.org/messengercompose/smtp;1"]
    1062             .getService(Components.interfaces.nsISmtpService);
    1063         // check for new https://hg.mozilla.org/comm-central/rev/fab9e5145cd4 smtpService
    1064         if (typeof(smtpService.servers) == "object") servers = smtpService.servers;
    1065         else servers = smtpService.smtpServers;
    1066 
    1067         while (servers && servers.hasMoreElements()) {
    1068             var server = servers.getNext();
    1069             if (server instanceof Components.interfaces.nsISmtpServer && !server.redirectorType)
    1070                 if (label == (server.description?server.description:server.hostname) || (hostname == server.hostname && username == server.username))
    1071                     return server.key;
    1072         }
    1073         return null;
    1074     },
    1075    
    1076     _translateRelevantIDs : function() {
    1077         var relevantIDs = this._rdfImportDataSource.getRelevantIDs();
    1078         for (var id in relevantIDs) {
    1079             var resource = this._rdfService.GetResource(this._rdfImportDataSource._rdfNS + this._rdfImportDataSource._rdfNSIdentities + "/" + id);
    1080             var values = { id : null, identityName : null, email : null, fullName : null }
    1081             values.identityName = this._rdfImportDataSource._getRDFValue(resource, "identityName");
    1082             values.email = this._rdfImportDataSource._getRDFValue(resource, "email");
    1083             values.fullName = this._rdfImportDataSource._getRDFValue(resource, "fullName");
    1084             values.id = this._getMatchingIdentity(values.identityName, values.email, values.fullName);
    1085             values.id = values.id?values.id:"import_" + id
    1086             relevantIDs[id] = values;
    1087             Log.debug("import: translate relevant ID from previous '" + id + "' to current '" + relevantIDs[id].id + "'");
    1088         }
    1089         return relevantIDs;
    1090     },
    1091    
    1092     _storeMappedIDs : function(relevantIDs) {
    1093         for (var id in relevantIDs) {
    1094             if (relevantIDs[id].id == "import_" + id) {
    1095                 var resource = this._rdfService
    1096                     .GetResource(this._rdfDataSource._rdfNS + this._rdfDataSource._rdfNSIdentities + "/" + relevantIDs[id].id);
    1097                 this._rdfDataSource._setRDFValue(resource, "identityName", relevantIDs[id].identityName);
    1098                 this._rdfDataSource._setRDFValue(resource, "fullName", relevantIDs[id].fullName);
    1099                 this._rdfDataSource._setRDFValue(resource, "email", relevantIDs[id].email);
    1100                
    1101                 var position = this._rdfDataSource._identityContainer.IndexOf(resource); // check for index in new recType
    1102                 if (position != -1) this._rdfDataSource._identityContainer.InsertElementAt(resource, position, false);
    1103                 else this._rdfDataSource._identityContainer.AppendElement(resource);
    1104             }
    1105         }
    1106     },
    1107    
    1108     _translateRelevantSMTPs : function() {
    1109         var relevantSMTPs = this._rdfImportDataSource.getRelevantSMTPs();
    1110         for (var smtp in relevantSMTPs) {
    1111             var resource = this._rdfService.GetResource(this._rdfImportDataSource._rdfNS + this._rdfImportDataSource._rdfNSSMTPservers + "/" + smtp);
    1112             var values = { smtp : null, label : null, hostname : null, username : null }
    1113             values.label = this._rdfImportDataSource._getRDFValue(resource, "label");
    1114             values.hostname = this._rdfImportDataSource._getRDFValue(resource, "hostname");
    1115             values.username = this._rdfImportDataSource._getRDFValue(resource, "username");
    1116             values.smtp =  this._getMatchingSMTP(values.label, values.hostname, values.username);
    1117             values.smtp = values.smtp?values.smtp:"import_" + smtp;
    1118             relevantSMTPs[smtp] = values;
    1119             Log.debug("import: translate relevant SMTP from previous '" + smtp + "' to current '" + relevantSMTPs[smtp].smtp + "'");
    1120         }
    1121         return relevantSMTPs;
    1122     },
    1123    
    1124     _storeMappedSMTPs : function(relevantSMTPs) {
    1125         for (var smtp in relevantSMTPs) {
    1126             if (relevantSMTPs[smtp].smtp == "import_" + smtp) {
    1127                 var resource = this._rdfService
    1128                     .GetResource(this._rdfDataSource._rdfNS + this._rdfDataSource._rdfNSSMTPservers + "/" + relevantSMTPs[smtp].smtp);
    1129                 this._rdfDataSource._setRDFValue(resource, "label", relevantSMTPs[smtp].label);
    1130                 this._rdfDataSource._setRDFValue(resource, "hostname", relevantSMTPs[smtp].hostname);
    1131                 this._rdfDataSource._setRDFValue(resource, "username", relevantSMTPs[smtp].username);
    1132                
    1133                 var position = this._rdfDataSource._smtpContainer.IndexOf(resource); // check for index in new recType
    1134                 if (position != -1) this._rdfDataSource._smtpContainer.InsertElementAt(resource, position, false);
    1135                 else this._rdfDataSource._smtpContainer.AppendElement(resource);
    1136             }
    1137         }
    1138     },
    1139    
    1140     import : function() {
    1141         var filePicker = Components.classes["@mozilla.org/filepicker;1"]
    1142             .createInstance(Components.interfaces.nsIFilePicker);
    1143 
    1144         filePicker.init(get3PaneWindow(), "", Components.interfaces.nsIFilePicker.modeOpen);
    1145         filePicker.appendFilter("RDF Files","*.rdf");
    1146         filePicker.appendFilters(Components.interfaces.nsIFilePicker.filterText | Components.interfaces.nsIFilePicker.filterAll );
    1147        
    1148         if (filePicker.show() == Components.interfaces.nsIFilePicker.returnOK) {
    1149             Log.debug("import: preparation:");
    1150            
    1151             var importRdfDataFile = Components.classes["@mozilla.org/file/local;1"]
    1152                 .createInstance(Components.interfaces.nsILocalFile);
    1153             var file = Components.classes["@mozilla.org/file/directory_service;1"]
    1154                 .getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile);
    1155                
    1156             initWithFilePath_tryDelimiters(importRdfDataFile, file.path, this._rdfFileName + "_import");
    1157             filePicker.file.copyTo(importRdfDataFile.parent,importRdfDataFile.leafName);
    1158 
    1159             Log.debug("import: copied file from " + filePicker.file.path + " to " + importRdfDataFile.path + "'");
    1160            
    1161             // init Datasources
    1162             this._rdfImportDataSource = new rdfDatasource(importRdfDataFile.leafName, true);
    1163            
    1164             // search matching IDs and SMTPs for anyones used in import-file
    1165             var relevantIDs = this._translateRelevantIDs();
    1166             var relevantSMTPs = this._translateRelevantSMTPs();
    1167            
    1168             Log.debug("import: preparation done.");
    1169            
    1170             for each (let treeType in Array("email", "maillist", "newsgroup", "filter")) {
    1171                 // re-initialize importDataSource to point rdfService to the right Resources
    1172                 this._rdfImportDataSource = new rdfDatasource(importRdfDataFile.leafName, true);
    1173                 var container = this._rdfImportDataSource.getContainer(treeType)
    1174                 if (container.GetCount() == 0) continue;
    1175                 Log.debug("importing " + treeType + ": " + container.GetCount()+ " datasets from " + this._rdfImportDataSource._rdfDataSource.URI);
    1176                 var enumerator = container.GetElements();
    1177                 // re-initialize dataSource to point rdfService to the right Resources
    1178                 this._rdfDataSource = new rdfDatasource(this._rdfFileName, true);
    1179                 var count = 0;
    1180                 while (enumerator.hasMoreElements()) {
    1181                     var resource = enumerator.getNext(); count += 1;
    1182                     resource.QueryInterface(Components.interfaces.nsIRDFResource);
    1183 //                     Log.debug(" " + count + " ");
    1184                     var name = this._rdfImportDataSource._getRDFValue(resource, "name")
    1185                     var email = this._rdfImportDataSource._getRDFValue(resource, "email")
    1186                     var fullName = this._rdfImportDataSource._getRDFValue(resource, "fullName")
    1187                     var id = this._rdfImportDataSource._getRDFValue(resource, "id")
    1188                     id = id?relevantIDs[id].id:null
    1189                     var smtp = this._rdfImportDataSource._getRDFValue(resource, "smtp")
    1190                     smtp = (smtp && smtp != DEFAULT_SMTP_TAG)?relevantSMTPs[smtp].smtp:smtp
    1191                     var localIdentityData = new identityData(email, fullName, id, smtp, new identityDataExtras(this._rdfImportDataSource, resource))
    1192                    
    1193                     this._rdfDataSource.updateRDF(name, treeType, localIdentityData, false, false, null, null, true)
    1194                     var resource = this._rdfDataSource._getRDFResourceForVIdentity(name, treeType);
    1195                     if (id) this._rdfDataSource._setRDFValue(resource, "id", id);       // localIdentityData can only store valid id's, this one might be a temporary invalid id
    1196                     if (smtp) this._rdfDataSource._setRDFValue(resource, "smtp", smtp); // localIdentityData can only store valid smtp's, this one might be a temporary invalid smtp
    1197                 }
    1198             }
    1199            
    1200             Log.debug("import: removing temporary file " + importRdfDataFile.path);
    1201             this._rdfImportDataSource = null; importRdfDataFile.remove(false);
    1202             Log.debug("import: import done.");
    1203            
    1204             Log.debug("import: cleaning ID/SMTP storages:");
    1205             this._rdfDataSource = new rdfDatasource(this._rdfFileName, true);
    1206            
    1207             this._storeMappedIDs(relevantIDs);
    1208             this._rdfDataSource.searchIdentityMismatch();
    1209             this._storeMappedSMTPs(relevantSMTPs);
    1210             this._rdfDataSource.searchSmtpMismatch();
    1211            
    1212             this._rdfDataSource.refreshAccountInfo();
    1213             this._rdfDataSource.clean();
    1214             this._rdfDataSource = null;
    1215             Log.debug("import: cleaning ID/SMTP storages done.");
    1216             Log.debug("IMPORT DONE.");
    1217         }
    1218     }
     1276      }
     1277
     1278      Log.debug("import: removing temporary file " + importRdfDataFile.path);
     1279      this._rdfImportDataSource = null;
     1280      importRdfDataFile.remove(false);
     1281      Log.debug("import: import done.");
     1282
     1283      Log.debug("import: cleaning ID/SMTP storages:");
     1284      this._rdfDataSource = new rdfDatasource(this._rdfFileName, true);
     1285
     1286      this._storeMappedIDs(relevantIDs);
     1287      this._rdfDataSource.searchIdentityMismatch();
     1288      this._storeMappedSMTPs(relevantSMTPs);
     1289      this._rdfDataSource.searchSmtpMismatch();
     1290
     1291      this._rdfDataSource.refreshAccountInfo();
     1292      this._rdfDataSource.clean();
     1293      this._rdfDataSource = null;
     1294      Log.debug("import: cleaning ID/SMTP storages done.");
     1295      Log.debug("IMPORT DONE.");
     1296    }
     1297  }
    12191298}
  • modules/vI_replyToSelf.js

    r3c9c29 r509348  
    2525var EXPORTED_SYMBOLS = ["initReplyTo", "addReplyToSelf"]
    2626
    27 const {classes: Cc, interfaces: Ci, utils: Cu, results : Cr} = Components;
     27const {
     28  classes: Cc,
     29  interfaces: Ci,
     30  utils: Cu,
     31  results: Cr
     32} = Components;
    2833Cu.import("resource://v_identity/vI_prefs.js");
    2934Cu.import("resource://v_identity/vI_log.js");
     
    3540    replyToSelfObj.removeAttribute("hidden");
    3641    removeAllReplyTos(vIcomposeWindow, replyToSelfObj);
    37   }
    38   else
     42  } else
    3943    replyToSelfObj.setAttribute("hidden", "true");
    4044};
     
    4246function removeAllReplyTos(vIcomposeWindow, replyToSelfObj) {
    4347  if (!replyToSelfObj.hasAttribute("hidden")) {
    44     for (var row = 1; row <= vIcomposeWindow.top.MAX_RECIPIENTS; row ++) {
     48    for (var row = 1; row <= vIcomposeWindow.top.MAX_RECIPIENTS; row++) {
    4549      var awType = vIcomposeWindow.awGetPopupElement(row).selectedItem.getAttribute("value");
    4650      if (awType == "addr_reply") {
     
    5559  let replyToSelfObj = vIcomposeWindow.document.getElementById("virtualIdentityExtension_autoReplyToSelfLabel");
    5660  if (!replyToSelfObj.hasAttribute("hidden")) {
    57     vIcomposeWindow.awAddRecipient("addr_reply",vIcomposeWindow.document.getElementById("virtualIdentityExtension_msgIdentityClone").label);
     61    vIcomposeWindow.awAddRecipient("addr_reply", vIcomposeWindow.document.getElementById("virtualIdentityExtension_msgIdentityClone").label);
    5862    Log.debug("added ReplyToSelf");
    59     replyToSelfObj.setAttribute("hidden","true");
     63    replyToSelfObj.setAttribute("hidden", "true");
    6064  }
    6165};
  • modules/vI_smartIdentityCollection.js

    r3c9c29 r509348  
    3333
    3434function smartIdentityCollection(msgHdr, preseletedID, currentIDisVID, newsgroup, recipients) {
    35     this._IDisVID = currentIDisVID;
    36     this._preselectedID = preseletedID;
    37     this._msgHdr = msgHdr;
    38     this._newsgroup = newsgroup;
    39     this._unicodeConverter.charset = "UTF-8";
    40     this._recipients = recipients;
    41     this._rdfDatasourceAccess = new rdfDatasourceAccess();
    42     this._allIdentities = new identityCollection();
     35  this._IDisVID = currentIDisVID;
     36  this._preselectedID = preseletedID;
     37  this._msgHdr = msgHdr;
     38  this._newsgroup = newsgroup;
     39  this._unicodeConverter.charset = "UTF-8";
     40  this._recipients = recipients;
     41  this._rdfDatasourceAccess = new rdfDatasourceAccess();
     42  this._allIdentities = new identityCollection();
    4343};
    4444
    4545smartIdentityCollection.prototype = {
    46     messenger : Components.classes["@mozilla.org/messenger;1"].createInstance()
    47         .QueryInterface(Components.interfaces.nsIMessenger),
    48     _unicodeConverter : Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
    49             .createInstance(Components.interfaces.nsIScriptableUnicodeConverter),
    50     _headerParser : Components.classes["@mozilla.org/messenger/headerparser;1"]
    51             .getService(Components.interfaces.nsIMsgHeaderParser),
    52 
    53     _msgComposeTypeReference : Components.interfaces.nsIMsgCompType,
    54    
    55     _IDisVID : false,
    56     _preselectedID : null,
    57     _allIdentities : null,
    58     _selectedValue : null,
    59     _newsgroup : null,
    60     _rdfDatasourceAccess : null,
    61 
    62     // this function adds a timestamp to the current sender
    63     __autoTimestamp : function() {
    64         Log.debug("__autoTimestamp()");
    65         if (this._IDisVID) {
    66             Log.debug("Virtual Identity in use, aborting");
    67             return;
    68         }
    69 
    70         var current_email = this._preselectedID.email.split("@");
    71         var localpart = current_email[0];
    72         var domain = current_email[1];
    73        
    74         Log.debug("current email: " + current_email[0] + "@" + current_email[1]);
    75        
    76         var autoString = vIprefs.get("autoString");
    77         var formatString = vIprefs.get("autoTimeFormat");
    78        
    79         var dateObj = new Date(); var dateString = "";
    80         if (formatString == "") dateString = parseInt(dateObj.getTime()/1000);
    81         else try {  //  you never know what the formatString will be...
    82             dateString = dateObj.toLocaleFormat(formatString).replace(/\s+|[\x00-\x2a]|\x2c|\x2f|[\x3a-\x40]|[\x5b-\x5d]|\x60|\x7c|[\x7f-\xff]/g,"_");
    83         } catch(e) { };
    84        
    85         var new_email = autoString.replace(/%l/g, localpart).replace(/%d/g, domain).replace(/%t/g,dateString);
    86         Log.debug("new email: " + new_email);
    87 
    88         var newIdentity = new identityData(new_email,
    89             this._preselectedID.fullName, this._preselectedID.key, this._preselectedID.smtpServerKey, null, null)
    90 
    91         this._allIdentities.addWithoutDuplicates(newIdentity);
    92         this._selectedValue = 0;
    93     },
    94    
    95     __ignoreID : function() {
    96         Log.debug("checking " + vIprefs.get("idSelection_ignoreIDs") + " against " + this._preselectedID.key )
    97         // check if usage if virtual Identities should be used at all for the currently selected ID
    98         if (vIprefs.get("idSelection_ignoreIDs").indexOf(":" + this._preselectedID.key + ":") != -1) {
    99             Log.debug("not using virtual Identites for ID " + this._preselectedID.key);
    100             return true;
    101         }
    102         return false
    103     },
    104    
    105     NewMail : function() {
    106         Log.debug("NewMail()");
    107         if (this.__ignoreID()) return;
    108         this._rdfDatasourceAccess.getVIdentityFromAllRecipients(this._allIdentities, this._recipients);
    109         if (this._allIdentities.number == 0 && vIprefs.get("autoTimestamp")) this.__autoTimestamp();
    110     },
    111    
    112     _foundExistingIdentity : function() {
    113         /* compare with existing Identities                                     */
    114         for (var index = 0; index < this._allIdentities.number; index++) {
    115             var existingID = this._allIdentities.identityDataCollection[index].isExistingIdentity(false);
    116             if (existingID) {
    117                 this._allIdentities.identityDataCollection[index].id.key = existingID;  // set found identity
    118                 // reorder list of Identities to prefer it on autoselect
    119                 // has to be done before Identities are added to the Menu
    120                 Log.debug("found existing Identity, reorder to prefer this one.");
    121                 var firstIdentity = this._allIdentities.identityDataCollection[index];
    122                 for (var i = index; index > 0; index--) {
    123                     this._allIdentities.identityDataCollection[index] = this._allIdentities.identityDataCollection[index-1];
    124                 }
    125                 this._allIdentities.identityDataCollection[0] = firstIdentity;
    126                 return { key: index };
    127             }
    128         }
    129         return null;
    130     },
    131    
    132     ReplyOnSent : function() {
    133         Log.debug("ReplyOnSent() (rules like SmartDraft)");
    134         this.__SmartDraftOrReplyOnSent();
    135         this._rdfDatasourceAccess.getVIdentityFromAllRecipients(this._allIdentities, this._recipients);
    136     },
    137 
    138     Draft : function() {
    139         Log.debug("Draft()");
    140        
    141         this.__SmartDraftOrReplyOnSent();
    142         this._rdfDatasourceAccess.getVIdentityFromAllRecipients(this._allIdentities, this._recipients);
    143     },
    144    
    145     __parseHeadersWithArray: function(header, identityCollection) {
    146         var emails = {}; var fullNames = {}; var combinedNames = {};
    147         var number = this._headerParser.parseHeadersWithArray(header, emails, fullNames, combinedNames);
    148         for (var index = 0; index < number; index++) {
    149             var newIdentity = new identityData(emails.value[index], fullNames.value[index],
    150                 null, NO_SMTP_TAG, null, null);
    151             identityCollection.addWithoutDuplicates(newIdentity);
    152         }
    153     },
    154 
    155     // this function checks if we have a draft-case and Smart-Draft should replace the Identity
    156     __SmartDraftOrReplyOnSent : function() {
    157         if (!vIprefs.get("smart_draft"))
    158             { Log.debug("SmartDraft deactivated"); return; }
    159 
    160         Log.debug("__SmartDraftOrReplyOnSent()");
    161 
    162         if (this._msgHdr) {
    163             this.__parseHeadersWithArray(this._msgHdr.author, this._allIdentities)
    164             Log.debug("sender '" + this._allIdentities.identityDataCollection[0].combinedName + "'");
    165         }
    166         else Log.debug("__SmartDraftOrReplyOnSent: No Header found, shouldn't happen");
    167     },
    168    
    169     __filterAddresses : function() {
    170         var returnIdentities = new identityCollection();
    171        
    172         var filterList  =
    173             this._unicodeConverter.ConvertToUnicode(vIprefs.get("smart_reply_filter")).split(/\n/)
    174         if (filterList.length == 0) filterList[0] == ""
    175        
    176         for (var i = 0; i < filterList.length; i++) {
    177             const filterType = { None : 0, RegExp : 1, StrCmp : 2 }
    178             var recentfilterType; var skipRegExp = false;
    179             if (filterList.length <= 1 && filterList[0] == "") {
    180               Log.debug("no filters configured");
    181               recentfilterType = filterType.None;
    182             }
    183             else if (/^[+-]?\/(.*)\/$/.exec(filterList[i])) {
    184               Log.debug("filter emails with RegExp '" + filterList[i].replace(/\\/g,"\\\\") + "'");
    185               recentfilterType = filterType.RegExp;
    186             }
    187             else {
    188               Log.debug("filter emails, compare with '" + filterList[i] + "'");
    189               recentfilterType = filterType.StrCmp;
    190             }
    191             for (var j = 0; j < this._allIdentities.number; j++) { // check if recent email-address (pre-choosen identity) is found in
    192             // copied and adapted from correctIdentity, thank you for the RegExp-idea!
    193                 var add_addr = false;
    194                 switch (recentfilterType) {
    195                     case filterType.None:
    196                         add_addr = true; break;
    197                     case filterType.RegExp:
    198                         if (skipRegExp) break;
    199                         try {   /^[+-]?\/(.*)\/$/.exec(filterList[i]);
    200                             if ( filterList[i][0] == "-" ) {
    201                                 if (this._allIdentities.identityDataCollection[j].email.match(new RegExp(RegExp.$1,"i")))
    202                                     this._allIdentities.dropIdentity(j--);
    203                             } else
    204                                 add_addr = (this._allIdentities.identityDataCollection[j].email.match(new RegExp(RegExp.$1,"i")));
    205                         }
    206                         catch(vErr) {
    207                           this.stringBundle = Components.classes["@mozilla.org/intl/stringbundle;1"]
    208                             .getService(Components.interfaces.nsIStringBundleService)
    209                             .createBundle("chrome://v_identity/locale/v_identity.properties");
    210                           SmartReplyNotification.info(
    211                                 this.stringBundle.GetStringFromName("vident.smartIdentity.ignoreRegExp") +
    212                                 +filterList[i].replace(/\\/g,"\\\\") + " .");
    213                                 skipRegExp = true; }
    214                         break;
    215                     case filterType.StrCmp:
    216                         add_addr = ( this._allIdentities.identityDataCollection[j].email.toLowerCase().indexOf(filterList[i].toLowerCase()) != -1)
    217                         break;
    218                 }
    219                 if (add_addr)   returnIdentities.addWithoutDuplicates(this._allIdentities.identityDataCollection[j])
    220             }
    221         }
    222         this._allIdentities.takeOver(returnIdentities);
    223     },
    224    
    225     __smartReplyCollectAddresses : function() {
    226         // add emails from selected headers (stored by vI_getHeader.xul/js)
    227         var reply_headers = this._unicodeConverter.ConvertToUnicode(vIprefs.get("smart_reply_headers")).split(/\n/)
    228                    
    229         for (var index = 0; index < reply_headers.length; index++) {
    230             // ------------- prepare fields to read the stored header ----------------
    231             var replyHeader_splitted = reply_headers[index].split(/:/)
    232             // use first part (all before ':') as the header name
    233             var replyHeaderName = replyHeader_splitted[0].toLowerCase()
    234             // check second or third part for any number
    235             var replyHeaderNumber = null;
    236             if (replyHeader_splitted.length > 1) parseInt(replyHeader_splitted[1]);
    237             if ((!replyHeaderNumber || isNaN(replyHeaderNumber)) && replyHeader_splitted.length > 2) replyHeaderNumber = parseInt(replyHeader_splitted[2]);
    238             // check if Fullnames should be erased
    239             var replyHeaderEmptyFullNames = ((replyHeader_splitted[1] && replyHeader_splitted[1].match(/@/)) ||
    240                             (replyHeader_splitted[2] && replyHeader_splitted[2].match(/@/)));
    241            
    242             // create header name to find the value
    243             var replyHeaderNameToRead = replyHeaderName
    244             if (replyHeaderNumber && !isNaN(replyHeaderNumber)) replyHeaderNameToRead += ":" + replyHeaderNumber
    245            
    246             // if mailing-list ignore to-header (usually the mailing list address)
    247             if (replyHeaderNameToRead == "to" && this._msgHdr.getStringProperty("vI_list-id")) {
    248                 Log.debug("header 'list-id' found (mailinglist), skipping header 'to'");
    249                 continue;
    250             }
    251            
    252             // ------------- read the stored header -------------------------------
    253             var value = this._unicodeConverter.ConvertToUnicode(this._msgHdr.getStringProperty("vI_" + replyHeaderNameToRead))
    254 /*          let window3pane =  Components.classes['@mozilla.org/appshell/window-mediator;1']
    255                  .getService(Components.interfaces.nsIWindowMediator)
    256                  .getMostRecentWindow("mail:3pane");
    257            
    258             Log.debug("found stored header '" +
    259                 replyHeaderNameToRead + "': '" + window3pane.virtualIdentityExtension.storedHeaders["vI_" + replyHeaderNameToRead] + "'");*/
    260            
    261             Log.debug("reading header '" +
    262                 replyHeaderNameToRead + "': '" + value + "'");
    263            
    264             // ------------- parse address-string to get a field of single email-addresses
    265             var splitted = new identityCollection();
    266             this.__parseHeadersWithArray(value, splitted);
    267            
    268             // move found addresses step by step to this._allIdentities, and change values if requested
    269             for (var i = 0; i < splitted.number; i++) {
    270                 // if there is no email than it makes no sense to use it as a sender
    271                 if (!splitted.identityDataCollection[i].email.match(/^.*@.*$/)) {
    272                     Log.debug("  skipping '" +
    273                     splitted.identityDataCollection[i].email + "', no email")
    274                     continue;
    275                 }
    276 
    277                 if (replyHeaderEmptyFullNames) splitted.identityDataCollection[i].fullName = ""
    278 
    279                 this._allIdentities.addWithoutDuplicates(splitted.identityDataCollection[i]);
    280 
    281                 Log.debug("  found '" +
    282                     splitted.identityDataCollection[i].combinedName + "'")
    283             }
    284         }
    285     },
    286    
    287     Reply : function() {
    288         Log.debug("Reply()");
    289 
    290         if (this._msgHdr && !this._newsgroup && !this._msgHdr.getStringProperty("vI_content_base")) {
    291         //  RFC 2821 (http://www.ietf.org/rfc/rfc2821.txt) says:
    292         //  "4.4 Trace Information
    293         //  When an SMTP server receives a message for delivery or further
    294         //  processing, it MUST insert trace ("time stamp" or "Received")
    295         //  information at the beginning of the message content, as discussed in
    296         //  section 4.1.1.4."
    297         //  so it should be always possible to decide if Reply or Draft based on received headers
    298         //  hidden option smart_detectByReceivedHeader will act as a switch for not RFC-compliant servers
    299             // RFC-compliant
    300             if (vIprefs.get("smart_detectByReceivedHeader")) {
    301                 if (!this._msgHdr.getStringProperty("vI_received")) { // mail was not received
    302                     Log.debug("reply on non-received (sent?) mail. Using SmartDraft.");
    303                     this.ReplyOnSent();
    304                     return;
    305                 }
    306             }
    307             // not RFC-compliant
    308             else {
    309                 const MSG_FOLDER_FLAG_INBOX = 0x1000
    310                 const MSG_FOLDER_FLAG_SENTMAIL = 0x0200;
    311 
    312                 if (this._msgHdr && (this._msgHdr.folder.flags & MSG_FOLDER_FLAG_SENTMAIL)) {
    313                     if (this._msgHdr.folder.flags & MSG_FOLDER_FLAG_INBOX)
    314                         Log.debug("reply from Sent folder. Folder is INBOX, assuming Reply-Case.");
    315                     else {
    316                         Log.debug("reply from Sent folder. Using SmartDraft.");
    317                         this.ReplyOnSent();
    318                         return;
    319                     }
    320                 }
    321             }
    322         }
    323        
    324         if (this.__ignoreID()) return;
    325        
    326         var storageIdentities = new identityCollection();
    327         this._rdfDatasourceAccess.getVIdentityFromAllRecipients(storageIdentities, this._recipients);
    328        
    329         if (storageIdentities.number == 0 || !vIprefs.get("idSelection_storage_ignore_smart_reply"))
    330             this.__SmartReply();
    331         else Log.debug("SmartReply skipped, Identities in Storage found.");
    332 
    333         // merge SmartReply-Identities and Storage-Identites
    334         if (vIprefs.get("idSelection_storage_prefer_smart_reply"))
    335             { this._allIdentities.mergeWithoutDuplicates(storageIdentities); }
    336         else {
    337             var smartIdentities = this._allIdentities;
    338             this._allIdentities = storageIdentities;       
    339             this._allIdentities.mergeWithoutDuplicates(smartIdentities);
    340         }
    341        
    342         Log.debug("merged SmartReply & Storage, " + this._allIdentities.number + " address(es) left")
    343     },
    344    
    345     // this function checks if we have a reply-case and Smart-Reply should replace the Identity
    346     __SmartReply : function() {
    347         if (!vIprefs.get("smart_reply"))
    348             { Log.debug("SmartReply deactivated"); return; }
    349         if (this._newsgroup && !vIprefs.get("smart_reply_for_newsgroups")) {
    350             Log.debug("SmartReply, answering to a newsgroup, aborting");
    351             return;
    352         }
    353 
    354         Log.debug("__SmartReply()");
    355         Log.debug("----------------------------------------------------------")
    356         if (this._msgHdr) {
    357             /* first step: collect addresses */
    358             this.__smartReplyCollectAddresses();
    359             Log.debug("" + this._allIdentities.number + " address(es) after parsing, before filtering")
    360            
    361             /* second step: filter (and sort) addresses */
    362             this.__filterAddresses();
    363            
    364             Log.debug("filtering done, " + this._allIdentities.number + " address(es) left")
    365            
    366             /* set default FullName */
    367             var smart_reply_defaultFullName = this._unicodeConverter.ConvertToUnicode(vIprefs.get("smart_reply_defaultFullName"))
    368             if (smart_reply_defaultFullName != "") {
    369                 for (var index = 0; index < this._allIdentities.number; index++) {
    370                     if (this._allIdentities.identityDataCollection[index].fullName == "") {
    371                         this._allIdentities.identityDataCollection[index].fullName = smart_reply_defaultFullName
    372                         Log.debug("added default FullName '" +
    373                             smart_reply_defaultFullName + "' to '" + this._allIdentities.identityDataCollection[index].email + "'")
    374                     }
    375                 }
    376             }   
    377 
    378             /* smart_reply_ignoreFullName: compare email with other Identities          */
    379             /* if match replace FullName with existing one, keep identity in list by now        */
    380             /* will not be added to the menu but probably choosen with __smartIdentitySelection     */
    381             if (vIprefs.get("smart_reply_ignoreFullName")) {
    382                 Log.debug("compare with existing Identities (ignoring FullNames).")
    383            
    384                 for (var index = 0; index < this._allIdentities.number; index++) {
    385                     var idKey = this._allIdentities.identityDataCollection[index].isExistingIdentity(true);
    386                     if (idKey) {
    387                         var AccountManager = Components.classes["@mozilla.org/messenger/account-manager;1"]
    388                           .getService(Components.interfaces.nsIMsgAccountManager);
    389                         var newFullName = AccountManager.getIdentity(idKey).fullName;
    390                         this._allIdentities.identityDataCollection[index].fullName = newFullName;
    391                         Log.debug("replaced Fullname of '" + this._allIdentities.identityDataCollection[index].email + "' with '" + newFullName + "'");
    392                     }
    393                 }
    394             }
    395            
    396             /* smart_reply_searchBaseIdentity: compare email with other Identities          */
    397             /* to find matching domain. Use first found as base identity (smtp etc) */
    398             if (vIprefs.get("smart_reply_searchBaseIdentity")) {
    399                 Log.debug("compare domain name with existing accounts.")
    400            
    401                 for (var index = 0; index < this._allIdentities.number; index++) {
    402                     var idKey = this._allIdentities.identityDataCollection[index].hasMatchingDomainIdentity();
    403                     if (idKey) {
    404                         Log.debug("use id with matching domain as base ID");
    405                         this._allIdentities.identityDataCollection[index].id.key = idKey;
    406                     }
    407                 }               
    408             }
    409            
    410         }
    411         else Log.debug("SmartReply skipped. No Header-information found.");
    412        
    413         Log.debug("----------------------------------------------------------")
    414     },
    415    
     46  messenger: Components.classes["@mozilla.org/messenger;1"].createInstance()
     47    .QueryInterface(Components.interfaces.nsIMessenger),
     48  _unicodeConverter: Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
     49    .createInstance(Components.interfaces.nsIScriptableUnicodeConverter),
     50  _headerParser: Components.classes["@mozilla.org/messenger/headerparser;1"]
     51    .getService(Components.interfaces.nsIMsgHeaderParser),
     52
     53  _msgComposeTypeReference: Components.interfaces.nsIMsgCompType,
     54
     55  _IDisVID: false,
     56  _preselectedID: null,
     57  _allIdentities: null,
     58  _selectedValue: null,
     59  _newsgroup: null,
     60  _rdfDatasourceAccess: null,
     61
     62  // this function adds a timestamp to the current sender
     63  __autoTimestamp: function () {
     64    Log.debug("__autoTimestamp()");
     65    if (this._IDisVID) {
     66      Log.debug("Virtual Identity in use, aborting");
     67      return;
     68    }
     69
     70    var current_email = this._preselectedID.email.split("@");
     71    var localpart = current_email[0];
     72    var domain = current_email[1];
     73
     74    Log.debug("current email: " + current_email[0] + "@" + current_email[1]);
     75
     76    var autoString = vIprefs.get("autoString");
     77    var formatString = vIprefs.get("autoTimeFormat");
     78
     79    var dateObj = new Date();
     80    var dateString = "";
     81    if (formatString == "") dateString = parseInt(dateObj.getTime() / 1000);
     82    else try { //   you never know what the formatString will be...
     83      dateString = dateObj.toLocaleFormat(formatString).replace(/\s+|[\x00-\x2a]|\x2c|\x2f|[\x3a-\x40]|[\x5b-\x5d]|\x60|\x7c|[\x7f-\xff]/g, "_");
     84    } catch (e) {};
     85
     86    var new_email = autoString.replace(/%l/g, localpart).replace(/%d/g, domain).replace(/%t/g, dateString);
     87    Log.debug("new email: " + new_email);
     88
     89    var newIdentity = new identityData(new_email,
     90      this._preselectedID.fullName, this._preselectedID.key, this._preselectedID.smtpServerKey, null, null)
     91
     92    this._allIdentities.addWithoutDuplicates(newIdentity);
     93    this._selectedValue = 0;
     94  },
     95
     96  __ignoreID: function () {
     97    Log.debug("checking " + vIprefs.get("idSelection_ignoreIDs") + " against " + this._preselectedID.key)
     98      // check if usage if virtual Identities should be used at all for the currently selected ID
     99    if (vIprefs.get("idSelection_ignoreIDs").indexOf(":" + this._preselectedID.key + ":") != -1) {
     100      Log.debug("not using virtual Identites for ID " + this._preselectedID.key);
     101      return true;
     102    }
     103    return false
     104  },
     105
     106  NewMail: function () {
     107    Log.debug("NewMail()");
     108    if (this.__ignoreID()) return;
     109    this._rdfDatasourceAccess.getVIdentityFromAllRecipients(this._allIdentities, this._recipients);
     110    if (this._allIdentities.number == 0 && vIprefs.get("autoTimestamp")) this.__autoTimestamp();
     111  },
     112
     113  _foundExistingIdentity: function () {
     114    /* compare with existing Identities                                     */
     115    for (var index = 0; index < this._allIdentities.number; index++) {
     116      var existingID = this._allIdentities.identityDataCollection[index].isExistingIdentity(false);
     117      if (existingID) {
     118        this._allIdentities.identityDataCollection[index].id.key = existingID; // set found identity
     119        // reorder list of Identities to prefer it on autoselect
     120        // has to be done before Identities are added to the Menu
     121        Log.debug("found existing Identity, reorder to prefer this one.");
     122        var firstIdentity = this._allIdentities.identityDataCollection[index];
     123        for (var i = index; index > 0; index--) {
     124          this._allIdentities.identityDataCollection[index] = this._allIdentities.identityDataCollection[index - 1];
     125        }
     126        this._allIdentities.identityDataCollection[0] = firstIdentity;
     127        return {
     128          key: index
     129        };
     130      }
     131    }
     132    return null;
     133  },
     134
     135  ReplyOnSent: function () {
     136    Log.debug("ReplyOnSent() (rules like SmartDraft)");
     137    this.__SmartDraftOrReplyOnSent();
     138    this._rdfDatasourceAccess.getVIdentityFromAllRecipients(this._allIdentities, this._recipients);
     139  },
     140
     141  Draft: function () {
     142    Log.debug("Draft()");
     143
     144    this.__SmartDraftOrReplyOnSent();
     145    this._rdfDatasourceAccess.getVIdentityFromAllRecipients(this._allIdentities, this._recipients);
     146  },
     147
     148  __parseHeadersWithArray: function (header, identityCollection) {
     149    var emails = {};
     150    var fullNames = {};
     151    var combinedNames = {};
     152    var number = this._headerParser.parseHeadersWithArray(header, emails, fullNames, combinedNames);
     153    for (var index = 0; index < number; index++) {
     154      var newIdentity = new identityData(emails.value[index], fullNames.value[index],
     155        null, NO_SMTP_TAG, null, null);
     156      identityCollection.addWithoutDuplicates(newIdentity);
     157    }
     158  },
     159
     160  // this function checks if we have a draft-case and Smart-Draft should replace the Identity
     161  __SmartDraftOrReplyOnSent: function () {
     162    if (!vIprefs.get("smart_draft")) {
     163      Log.debug("SmartDraft deactivated");
     164      return;
     165    }
     166
     167    Log.debug("__SmartDraftOrReplyOnSent()");
     168
     169    if (this._msgHdr) {
     170      this.__parseHeadersWithArray(this._msgHdr.author, this._allIdentities)
     171      Log.debug("sender '" + this._allIdentities.identityDataCollection[0].combinedName + "'");
     172    } else Log.debug("__SmartDraftOrReplyOnSent: No Header found, shouldn't happen");
     173  },
     174
     175  __filterAddresses: function () {
     176    var returnIdentities = new identityCollection();
     177
     178    var filterList =
     179      this._unicodeConverter.ConvertToUnicode(vIprefs.get("smart_reply_filter")).split(/\n/)
     180    if (filterList.length == 0) filterList[0] == ""
     181
     182    for (var i = 0; i < filterList.length; i++) {
     183      const filterType = {
     184        None: 0,
     185        RegExp: 1,
     186        StrCmp: 2
     187      }
     188      var recentfilterType;
     189      var skipRegExp = false;
     190      if (filterList.length <= 1 && filterList[0] == "") {
     191        Log.debug("no filters configured");
     192        recentfilterType = filterType.None;
     193      } else if (/^[+-]?\/(.*)\/$/.exec(filterList[i])) {
     194        Log.debug("filter emails with RegExp '" + filterList[i].replace(/\\/g, "\\\\") + "'");
     195        recentfilterType = filterType.RegExp;
     196      } else {
     197        Log.debug("filter emails, compare with '" + filterList[i] + "'");
     198        recentfilterType = filterType.StrCmp;
     199      }
     200      for (var j = 0; j < this._allIdentities.number; j++) { // check if recent email-address (pre-choosen identity) is found in
     201        // copied and adapted from correctIdentity, thank you for the RegExp-idea!
     202        var add_addr = false;
     203        switch (recentfilterType) {
     204        case filterType.None:
     205          add_addr = true;
     206          break;
     207        case filterType.RegExp:
     208          if (skipRegExp) break;
     209          try {
     210            /^[+-]?\/(.*)\/$/.exec(filterList[i]);
     211            if (filterList[i][0] == "-") {
     212              if (this._allIdentities.identityDataCollection[j].email.match(new RegExp(RegExp.$1, "i")))
     213                this._allIdentities.dropIdentity(j--);
     214            } else
     215              add_addr = (this._allIdentities.identityDataCollection[j].email.match(new RegExp(RegExp.$1, "i")));
     216          } catch (vErr) {
     217            this.stringBundle = Components.classes["@mozilla.org/intl/stringbundle;1"]
     218              .getService(Components.interfaces.nsIStringBundleService)
     219              .createBundle("chrome://v_identity/locale/v_identity.properties");
     220            SmartReplyNotification.info(
     221              this.stringBundle.GetStringFromName("vident.smartIdentity.ignoreRegExp") +
     222              +filterList[i].replace(/\\/g, "\\\\") + " .");
     223            skipRegExp = true;
     224          }
     225          break;
     226        case filterType.StrCmp:
     227          add_addr = (this._allIdentities.identityDataCollection[j].email.toLowerCase().indexOf(filterList[i].toLowerCase()) != -1)
     228          break;
     229        }
     230        if (add_addr) returnIdentities.addWithoutDuplicates(this._allIdentities.identityDataCollection[j])
     231      }
     232    }
     233    this._allIdentities.takeOver(returnIdentities);
     234  },
     235
     236  __smartReplyCollectAddresses: function () {
     237    // add emails from selected headers (stored by vI_getHeader.xul/js)
     238    var reply_headers = this._unicodeConverter.ConvertToUnicode(vIprefs.get("smart_reply_headers")).split(/\n/)
     239
     240    for (var index = 0; index < reply_headers.length; index++) {
     241      // ------------- prepare fields to read the stored header ----------------
     242      var replyHeader_splitted = reply_headers[index].split(/:/)
     243        // use first part (all before ':') as the header name
     244      var replyHeaderName = replyHeader_splitted[0].toLowerCase()
     245        // check second or third part for any number
     246      var replyHeaderNumber = null;
     247      if (replyHeader_splitted.length > 1) parseInt(replyHeader_splitted[1]);
     248      if ((!replyHeaderNumber || isNaN(replyHeaderNumber)) && replyHeader_splitted.length > 2) replyHeaderNumber = parseInt(replyHeader_splitted[2]);
     249      // check if Fullnames should be erased
     250      var replyHeaderEmptyFullNames = ((replyHeader_splitted[1] && replyHeader_splitted[1].match(/@/)) ||
     251        (replyHeader_splitted[2] && replyHeader_splitted[2].match(/@/)));
     252
     253      // create header name to find the value
     254      var replyHeaderNameToRead = replyHeaderName
     255      if (replyHeaderNumber && !isNaN(replyHeaderNumber)) replyHeaderNameToRead += ":" + replyHeaderNumber
     256
     257      // if mailing-list ignore to-header (usually the mailing list address)
     258      if (replyHeaderNameToRead == "to" && this._msgHdr.getStringProperty("vI_list-id")) {
     259        Log.debug("header 'list-id' found (mailinglist), skipping header 'to'");
     260        continue;
     261      }
     262
     263      // ------------- read the stored header -------------------------------
     264      var value = this._unicodeConverter.ConvertToUnicode(this._msgHdr.getStringProperty("vI_" + replyHeaderNameToRead))
     265        /*          let window3pane =  Components.classes['@mozilla.org/appshell/window-mediator;1']
     266                         .getService(Components.interfaces.nsIWindowMediator)
     267                         .getMostRecentWindow("mail:3pane");
     268                   
     269                    Log.debug("found stored header '" +
     270                        replyHeaderNameToRead + "': '" + window3pane.virtualIdentityExtension.storedHeaders["vI_" + replyHeaderNameToRead] + "'");*/
     271
     272      Log.debug("reading header '" +
     273        replyHeaderNameToRead + "': '" + value + "'");
     274
     275      // ------------- parse address-string to get a field of single email-addresses
     276      var splitted = new identityCollection();
     277      this.__parseHeadersWithArray(value, splitted);
     278
     279      // move found addresses step by step to this._allIdentities, and change values if requested
     280      for (var i = 0; i < splitted.number; i++) {
     281        // if there is no email than it makes no sense to use it as a sender
     282        if (!splitted.identityDataCollection[i].email.match(/^.*@.*$/)) {
     283          Log.debug("  skipping '" +
     284            splitted.identityDataCollection[i].email + "', no email")
     285          continue;
     286        }
     287
     288        if (replyHeaderEmptyFullNames) splitted.identityDataCollection[i].fullName = ""
     289
     290        this._allIdentities.addWithoutDuplicates(splitted.identityDataCollection[i]);
     291
     292        Log.debug("  found '" +
     293          splitted.identityDataCollection[i].combinedName + "'")
     294      }
     295    }
     296  },
     297
     298  Reply: function () {
     299    Log.debug("Reply()");
     300
     301    if (this._msgHdr && !this._newsgroup && !this._msgHdr.getStringProperty("vI_content_base")) {
     302      //    RFC 2821 (http://www.ietf.org/rfc/rfc2821.txt) says:
     303      //    "4.4 Trace Information
     304      //    When an SMTP server receives a message for delivery or further
     305      //    processing, it MUST insert trace ("time stamp" or "Received")
     306      //    information at the beginning of the message content, as discussed in
     307      //    section 4.1.1.4."
     308      //    so it should be always possible to decide if Reply or Draft based on received headers
     309      //    hidden option smart_detectByReceivedHeader will act as a switch for not RFC-compliant servers
     310      // RFC-compliant
     311      if (vIprefs.get("smart_detectByReceivedHeader")) {
     312        if (!this._msgHdr.getStringProperty("vI_received")) { // mail was not received
     313          Log.debug("reply on non-received (sent?) mail. Using SmartDraft.");
     314          this.ReplyOnSent();
     315          return;
     316        }
     317      }
     318      // not RFC-compliant
     319      else {
     320        const MSG_FOLDER_FLAG_INBOX = 0x1000
     321        const MSG_FOLDER_FLAG_SENTMAIL = 0x0200;
     322
     323        if (this._msgHdr && (this._msgHdr.folder.flags & MSG_FOLDER_FLAG_SENTMAIL)) {
     324          if (this._msgHdr.folder.flags & MSG_FOLDER_FLAG_INBOX)
     325            Log.debug("reply from Sent folder. Folder is INBOX, assuming Reply-Case.");
     326          else {
     327            Log.debug("reply from Sent folder. Using SmartDraft.");
     328            this.ReplyOnSent();
     329            return;
     330          }
     331        }
     332      }
     333    }
     334
     335    if (this.__ignoreID()) return;
     336
     337    var storageIdentities = new identityCollection();
     338    this._rdfDatasourceAccess.getVIdentityFromAllRecipients(storageIdentities, this._recipients);
     339
     340    if (storageIdentities.number == 0 || !vIprefs.get("idSelection_storage_ignore_smart_reply"))
     341      this.__SmartReply();
     342    else Log.debug("SmartReply skipped, Identities in Storage found.");
     343
     344    // merge SmartReply-Identities and Storage-Identites
     345    if (vIprefs.get("idSelection_storage_prefer_smart_reply")) {
     346      this._allIdentities.mergeWithoutDuplicates(storageIdentities);
     347    } else {
     348      var smartIdentities = this._allIdentities;
     349      this._allIdentities = storageIdentities;
     350      this._allIdentities.mergeWithoutDuplicates(smartIdentities);
     351    }
     352
     353    Log.debug("merged SmartReply & Storage, " + this._allIdentities.number + " address(es) left")
     354  },
     355
     356  // this function checks if we have a reply-case and Smart-Reply should replace the Identity
     357  __SmartReply: function () {
     358    if (!vIprefs.get("smart_reply")) {
     359      Log.debug("SmartReply deactivated");
     360      return;
     361    }
     362    if (this._newsgroup && !vIprefs.get("smart_reply_for_newsgroups")) {
     363      Log.debug("SmartReply, answering to a newsgroup, aborting");
     364      return;
     365    }
     366
     367    Log.debug("__SmartReply()");
     368    Log.debug("----------------------------------------------------------")
     369    if (this._msgHdr) {
     370      /* first step: collect addresses */
     371      this.__smartReplyCollectAddresses();
     372      Log.debug("" + this._allIdentities.number + " address(es) after parsing, before filtering")
     373
     374      /* second step: filter (and sort) addresses */
     375      this.__filterAddresses();
     376
     377      Log.debug("filtering done, " + this._allIdentities.number + " address(es) left")
     378
     379      /* set default FullName */
     380      var smart_reply_defaultFullName = this._unicodeConverter.ConvertToUnicode(vIprefs.get("smart_reply_defaultFullName"))
     381      if (smart_reply_defaultFullName != "") {
     382        for (var index = 0; index < this._allIdentities.number; index++) {
     383          if (this._allIdentities.identityDataCollection[index].fullName == "") {
     384            this._allIdentities.identityDataCollection[index].fullName = smart_reply_defaultFullName
     385            Log.debug("added default FullName '" +
     386              smart_reply_defaultFullName + "' to '" + this._allIdentities.identityDataCollection[index].email + "'")
     387          }
     388        }
     389      }
     390
     391      /* smart_reply_ignoreFullName: compare email with other Identities            */
     392      /* if match replace FullName with existing one, keep identity in list by now      */
     393      /* will not be added to the menu but probably choosen with __smartIdentitySelection   */
     394      if (vIprefs.get("smart_reply_ignoreFullName")) {
     395        Log.debug("compare with existing Identities (ignoring FullNames).")
     396
     397        for (var index = 0; index < this._allIdentities.number; index++) {
     398          var idKey = this._allIdentities.identityDataCollection[index].isExistingIdentity(true);
     399          if (idKey) {
     400            var AccountManager = Components.classes["@mozilla.org/messenger/account-manager;1"]
     401              .getService(Components.interfaces.nsIMsgAccountManager);
     402            var newFullName = AccountManager.getIdentity(idKey).fullName;
     403            this._allIdentities.identityDataCollection[index].fullName = newFullName;
     404            Log.debug("replaced Fullname of '" + this._allIdentities.identityDataCollection[index].email + "' with '" + newFullName + "'");
     405          }
     406        }
     407      }
     408
     409      /* smart_reply_searchBaseIdentity: compare email with other Identities          */
     410      /* to find matching domain. Use first found as base identity (smtp etc) */
     411      if (vIprefs.get("smart_reply_searchBaseIdentity")) {
     412        Log.debug("compare domain name with existing accounts.")
     413
     414        for (var index = 0; index < this._allIdentities.number; index++) {
     415          var idKey = this._allIdentities.identityDataCollection[index].hasMatchingDomainIdentity();
     416          if (idKey) {
     417            Log.debug("use id with matching domain as base ID");
     418            this._allIdentities.identityDataCollection[index].id.key = idKey;
     419          }
     420        }
     421      }
     422
     423    } else Log.debug("SmartReply skipped. No Header-information found.");
     424
     425    Log.debug("----------------------------------------------------------")
     426  },
     427
    416428
    417429};
Note: See TracChangeset for help on using the changeset viewer.