Changeset 509348
- Timestamp:
- Nov 3, 2014, 12:35:40 PM (8 years ago)
- Branches:
- ng_0.9
- Children:
- 7204cb
- Parents:
- 3c9c29
- Files:
-
- 38 edited
Legend:
- Unmodified
- Added
- Removed
-
content/accountManagerOverlays/vI_am-Overlay.js
r3c9c29 r509348 24 24 25 25 Components.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) { 26 virtualIdentityExtension.ns(function () { 27 with(virtualIdentityExtension.LIB) { 28 function orig_onAccept() {}; 29 var am_Overlay = { 30 onAccept: function (aServerKeyToSelect, aFocusList) { 30 31 orig_onAccept(); 31 32 var gObserver = Components.classes["@mozilla.org/observer-service;1"]. 32 33 getService(Components.interfaces.nsIObserverService); 33 34 gObserver.notifyObservers(null, "am-acceptChanges", "other"); 34 },35 36 init : function() {35 }, 36 37 init: function () { 37 38 orig_onAccept = onAccept; 38 39 onAccept = am_Overlay.onAccept; 40 } 39 41 } 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 24 24 25 25 Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js"); 26 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) { 27 var am_smtpOverlay = { 28 refreshServerList : function(aServerKeyToSelect, aFocusList) { 26 virtualIdentityExtension.ns(function () { 27 with(virtualIdentityExtension.LIB) { 28 var am_smtpOverlay = { 29 refreshServerList: function (aServerKeyToSelect, aFocusList) { 29 30 gSmtpServerListWindow.orig_refreshServerList(aServerKeyToSelect, aFocusList); 30 31 var gObserver = Components.classes["@mozilla.org/observer-service;1"]. 31 32 getService(Components.interfaces.nsIObserverService); 32 33 gObserver.notifyObservers(null, "am-smtpChanges", "other"); 33 },34 35 init : function() {34 }, 35 36 init: function () { 36 37 gSmtpServerListWindow.orig_refreshServerList = gSmtpServerListWindow.refreshServerList; 37 38 gSmtpServerListWindow.refreshServerList = am_smtpOverlay.refreshServerList; 39 } 38 40 } 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 24 24 25 25 Components.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) { 26 virtualIdentityExtension.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) { 63 64 dump("selectFile\n"); 64 65 var filePicker = Components.classes["@mozilla.org/filepicker;1"] 65 66 .createInstance(Components.interfaces.nsIFilePicker); 66 67 var file = Components.classes["@mozilla.org/file/local;1"] 67 68 .createInstance(Components.interfaces.nsIFile); 68 69 var defaultPath = Components.classes["@mozilla.org/file/directory_service;1"] 69 70 .getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile).path; 70 71 71 72 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); 73 80 filePicker.displayDirectory = file.parent; 74 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) {}; 89 } 75 90 } 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"); 89 293 } 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; 90 354 } 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() 362 361 363 362 // check for enigmail extension 364 AddonManager.getAddonByID("{847b3a00-7ab1-11d4-8f02-006008948af5}", function (addon) {363 AddonManager.getAddonByID("{847b3a00-7ab1-11d4-8f02-006008948af5}", function (addon) { 365 364 if (addon && !addon.userDisabled && !addon.appDisable) { 366 365 document.getElementById("openPGPencryption").removeAttribute("hidden"); 367 366 document.getElementById("VIdent_identity.hide_openPGP_messageSignature").removeAttribute("hidden"); 368 367 } 369 }); 370 371 372 373 374 375 376 377 378 379 380 381 savePrefs : function() {382 383 384 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) { 388 387 var uri = Components.classes["@mozilla.org/network/standard-url;1"].createInstance(Components.interfaces.nsIURI); 389 388 var protocolSvc = Components.classes["@mozilla.org/uriloader/external-protocol-service;1"].getService(Components.interfaces.nsIExternalProtocolService); … … 391 390 uri.spec = aURL; 392 391 protocolSvc.loadUrl(uri); 392 } 393 393 } 394 } 395 vI.prefDialog = prefDialog; 396 } });394 vI.prefDialog = prefDialog; 395 } 396 }); -
content/prefDialog/vI_prefDialog_FolderPicker.js
r3c9c29 r509348 1 2 1 /** 3 * some code copied and adapted from Thunderbird Sources4 * thanks to all Thunderbird Developers5 */2 * some code copied and adapted from Thunderbird Sources 3 * thanks to all Thunderbird Developers 4 */ 6 5 7 6 /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- … … 44 43 45 44 Components.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; 45 virtualIdentityExtension.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 } 74 74 } 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) 165 159 pickerMode = gDefaultPickerMode; 166 160 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) { 268 258 broadcaster.removeAttribute("disabled"); 269 259 SetupFccPickerState(gFccRadioElemChoice, 270 fccAccountPickerId, 271 fccFolderPickerId); 272 } 273 else 260 fccAccountPickerId, 261 fccFolderPickerId); 262 } else 274 263 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 2 1 /** 3 * some code copied and adapted from Thunderbird Sources4 * thanks to all Thunderbird Developers5 */2 * some code copied and adapted from Thunderbird Sources 3 * thanks to all Thunderbird Developers 4 */ 6 5 7 6 /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- … … 44 43 45 44 Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js"); 46 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) { 45 virtualIdentityExtension.ns(function () { 46 with(virtualIdentityExtension.LIB) { 47 47 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 } 54 54 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; 61 63 } 62 folderPicker.folder = folder;63 }64 64 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; 84 77 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); 89 90 } 90 picker.folder = folder;91 picker.setAttribute("label", folder.prettyName);92 }93 91 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 = ""; 105 102 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; 115 111 116 case "1" :117 118 112 case "1": 113 uri = document.getElementById(folderPickerId).folder.URI; 114 break; 119 115 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); 122 123 } 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 24 24 25 25 Components.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 }, 26 virtualIdentityExtension.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 }, 32 33 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 27 27 28 28 Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js"); 29 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) { 29 virtualIdentityExtension.ns(function () { 30 with(virtualIdentityExtension.LIB) { 30 31 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"); 34 35 35 // var storedHeaders = { };36 var getHeader = {37 unicodeConverter: Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]38 36 // var storedHeaders = { }; 37 var getHeader = { 38 unicodeConverter: Components.classes["@mozilla.org/intl/scriptableunicodeconverter"] 39 .createInstance(Components.interfaces.nsIScriptableUnicodeConverter), 39 40 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, 65 42 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 }); 75 67 } 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 + 102 109 " - stored as '" + storedConvValue + "'"); 103 label += (label)?"\n":"" 104 label += headerNameToStore + ":\t" + storedConvValue 110 label += (label) ? "\n" : "" 111 label += headerNameToStore + ":\t" + storedConvValue 112 } 105 113 } 106 114 } 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 115 122 // read headers later if msg is loaded completely - this ensures compatibility to Thunderbird Conversation 116 123 getHeader.orig_OnMsgLoaded = OnMsgLoaded; 117 124 OnMsgLoaded = getHeader.OnMsgLoaded; 118 125 119 120 121 OnMsgLoaded: function(url) {122 123 124 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 125 132 let ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); 126 133 var neckoURL = ioService.newURI(null, null, url.baseURI); 127 128 129 130 134 neckoURL.QueryInterface(Ci.nsIMsgMessageUrl); 135 136 getHeader.hdr = neckoURL.messageHeader; 137 if (getHeader.hdr) getHeader.getHeader(); 131 138 getHeader.orig_OnMsgLoaded(url); 132 133 }139 } 140 } 134 141 135 142 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), 158 146 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 1 1 /* ***** BEGIN LICENSE BLOCK ***** 2 This program is free software; you can redistribute it and/or modify3 it under the terms of the GNU General Public License as published by4 the Free Software Foundation; either version 2 of the License, or5 (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. 6 6 7 This program is distributed in the hope that it will be useful,8 but WITHOUT ANY WARRANTY; without even the implied warranty of9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the10 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. 11 11 12 You should have received a copy of the GNU General Public License13 along with this program; if not, write to the Free Software14 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA12 You should have received a copy of the GNU General Public License 13 along with this program; if not, write to the Free Software 14 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 15 15 16 The Original Code is the Virtual Identity Extension.16 The Original Code is the Virtual Identity Extension. 17 17 18 The Initial Developer of the Original Code is Rene Ejury.19 Portions created by the Initial Developer are Copyright (C) 201120 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. 21 21 22 Contributor(s):23 * ***** END LICENSE BLOCK ***** */22 Contributor(s): 23 * ***** END LICENSE BLOCK ***** */ 24 24 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) { 29 28 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"); 33 30 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); 35 34 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 }); 41 42 42 43 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 57 48 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 } 65 66 66 67 67 }}); 68 } 69 }); -
content/vI_rdfAccountMismatchDialog.js
r3c9c29 r509348 24 24 25 25 Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js"); 26 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) { 27 let Log = vI.setupLogging("virtualIdentity.rdfAccountMismatchDialog"); 26 virtualIdentityExtension.ns(function () { 27 with(virtualIdentityExtension.LIB) { 28 let Log = vI.setupLogging("virtualIdentity.rdfAccountMismatchDialog"); 28 29 29 var rdfAccountMismatchDialog = {30 mismatchItems: null,31 type: null,30 var rdfAccountMismatchDialog = { 31 mismatchItems: null, 32 type: null, 32 33 33 init : function() { 34 34 init: function () { 35 rdfAccountMismatchDialog.type = window.arguments[0]; 35 36 rdfAccountMismatchDialog.mismatchItems = window.arguments[1]; 36 37 … … 38 39 document.getElementById("virtualIdentityExtension_rdfAccountMismatchDialog_vbox_" + rdfAccountMismatchDialog.type).removeAttribute("hidden"); 39 40 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 },55 41 56 accept : function() {57 42 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) 59 54 } 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 */ 61 62 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 24 24 25 25 Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js"); 26 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) { 26 virtualIdentityExtension.ns(function () { 27 with(virtualIdentityExtension.LIB) { 27 28 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); 31 32 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, 46 39 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); 49 47 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 }, 59 50 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); 80 59 81 // set Identity82 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 60 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 97 97 rdfDataEditor.__identityData.extras.setValuesToEnvironment(); 98 98 this.hideUnusedEditorFields(); 99 99 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 }, 116 101 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"); 133 133 var localIdentityData = new vI.identityData(document.getElementById("sender").value, null, 134 135 134 document.getElementById("virtualIdentityExtension_IdentityList").selectedItem.getAttribute("value"), 135 document.getElementById("virtualIdentityExtension_SmtpServerList").selectedItem.getAttribute("key")); 136 136 localIdentityData.extras.getValuesFromEnvironment(); 137 137 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 30 30 31 31 Components.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") { 32 virtualIdentityExtension.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") { 43 44 field = "changed" 44 }45 if (field == "usedCol") {45 } 46 if (field == "usedCol") { 46 47 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) 78 85 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 = ""; 116 124 var format = vI.prefroot.getCharPref("extensions.virtualIdentity.storage_timeFormat") 117 125 if (format != "") { 118 119 126 if (used) usedDate = new Date(parseFloat(used)).toLocaleFormat(format); 127 if (changed) changedDate = new Date(parseFloat(changed)).toLocaleFormat(format); 120 128 } 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) { 150 160 try { 151 if (prepareForComparison(a, columnName) > 152 153 if (prepareForComparison(a, columnName) < 154 155 } catch (e) {};156 157 158 159 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) 160 170 columnName = this.treeElem.getAttribute("sortResource") 161 171 162 172 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,">").replace(/</g,"<") + 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, ">").replace(/</g, "<") + 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"] 231 243 .getService(Components.interfaces.nsIStringBundleService) 232 244 .createBundle("chrome://v_identity/locale/vI_rdfDataEditor.properties"); 233 245 234 235 236 for each(var treeType in rdfDataTreeCollection.treeTypes)237 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 () { 241 253 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 } 301 331 } 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) { 317 348 var value = ""; 318 349 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 24 24 25 25 Components.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"] 26 virtualIdentityExtension.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"] 39 40 .getService(Components.interfaces.nsIStringBundleService) 40 41 .createBundle("chrome://v_identity/locale/v_identity.properties"), 41 42 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 24 24 25 25 Components.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, 26 virtualIdentityExtension.ns(function () { 27 with(virtualIdentityExtension.LIB) { 28 var smartReply_dialog = { 29 Obj_radioGroup: null, 30 all_addresses: null, 30 31 31 init : function() { 32 33 34 35 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; 36 37 37 var id = null; var smtp = null; 38 var id = null; 39 var smtp = null; 38 40 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; 53 45 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") 59 50 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 24 24 25 25 Components.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"] 26 virtualIdentityExtension.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"] 34 35 .getService(Components.interfaces.nsIStringBundleService) 35 36 .createBundle("chrome://v_identity/locale/v_identity.properties"), 36 37 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); 107 107 vI.vIprefs.addObserver("fcc_show_switch", this.observe, this); 108 109 110 111 112 113 114 115 116 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 () { 120 120 vI.vIprefs.removeObserver("show_status", this.observe); 121 122 123 124 125 126 127 128 129 130 131 132 133 init: function () {134 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"); 135 135 statusmenu.objStatusLogo = document.getElementById("virtualIdentityExtension_Logo"); 136 137 138 139 140 141 142 143 144 145 146 147 148 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(); 149 149 statusmenu.observe(this, null, null, "show_status"); 150 151 152 153 154 155 156 157 158 159 160 161 __timeout : 5,// timeout for status messages in seconds162 __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) { 163 163 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); 180 179 } 181 182 183 __clearStatusMessage : function() {184 185 186 187 changeSMTPStatus: function (elem) {188 189 190 191 192 changeBaseIDStatus: function (elem) {193 194 195 196 197 changeSaveStatus: function (elem) {198 199 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 214 215 216 217 218 219 220 221 222 clicked: function (button) {223 224 225 226 227 228 229 230 231 232 233 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) 234 233 vI.vIprefs.set("storage_store_SMTP", newSaveSMTPStatus) 235 234 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 22 22 Contributor(s): Mike Krieger, Sebastian Apel 23 23 * ***** END LICENSE BLOCK ***** */ 24 24 25 25 /** 26 * some code copied and adapted from 'addressContext' and from 'Birthday Reminder'27 * thanks to Mike Krieger and Sebastian Apel28 */26 * some code copied and adapted from 'addressContext' and from 'Birthday Reminder' 27 * thanks to Mike Krieger and Sebastian Apel 28 */ 29 29 30 30 Components.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"] 31 virtualIdentityExtension.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"] 47 48 .getService(Components.interfaces.nsIStringBundleService) 48 49 .createBundle("chrome://v_identity/locale/v_identity.properties"), 49 50 50 clean: function() {51 52 53 54 55 51 clean: function () { 52 Log.debug("clean."); 53 storage.multipleRecipients = null; 54 storage.lastCheckedEmail = {}; 55 storage.firstUsedInputElement = null; 56 awSetInputAndPopupValue = storage.original_functions.awSetInputAndPopupValue; 56 57 if (storage._rdfDatasourceAccess) storage._rdfDatasourceAccess.clean(); 57 58 59 original_functions: {60 awSetInputAndPopupValue: null61 62 63 replacement_functions: {64 awSetInputAndPopupValue: function (inputElem, inputValue, popupElem, popupValue, rowNumber) {65 66 67 68 69 70 71 awOnBlur: function (element, currentWindow) {72 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 + "'"); 75 76 if (typeof element.value == 'undefined') { 76 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 + "'"); 78 79 } 79 80 if (element.value == "" || typeof element.value == 'undefined') return; 80 81 storage.__updateVIdentityFromStorage(element, currentWindow); 81 82 83 84 awOnFocus: function (element, currentWindow) {85 if (!element || !element.id.match(/^addressCol2*/)) return;86 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 93 94 95 96 97 initialized: null,98 currentWindow: null,99 init: function() {100 101 102 103 104 105 106 107 for (var row = 1; row <= top.MAX_RECIPIENTS ; row++) {108 109 110 111 input.setAttribute("onblur", (oldBlur?oldBlur+"; ":"") +112 113 114 input.setAttribute("onfocus", (oldFocus?oldFocus+"; ":"") +115 116 117 118 119 120 popup.setAttribute("oncommand", (oldCommand?oldCommand+"; ":"") +121 122 123 124 125 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 } 127 128 128 129 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) { 135 137 if (addon && !addon.userDisabled && !addon.appDisable) { 136 138 vI.vIprefs.commit("storageExtras_openPGP_messageEncryption", false) … … 138 140 vI.vIprefs.commit("storageExtras_openPGP_PGPMIME", false) 139 141 } 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, {}); 203 209 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; 210 215 } 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 24 24 25 25 Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js"); 26 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) { 26 virtualIdentityExtension.ns(function () { 27 with(virtualIdentityExtension.LIB) { 27 28 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); 32 33 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), 38 37 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, 47 39 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) { 66 67 if ((!currentVersion || upgrade.versionChecker.compare(currentVersion, "0.9.26") < 0)) { 67 68 69 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 70 71 71 72 72 // compare against all accounts, getAccountsArray() does not include 'smart mailboxes' == 'unified folders' 73 var all_accounts = vI.prefroot.getCharPref("mail.accountmanager.accounts").split(","); 73 74 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); 98 97 } 98 } 99 99 } 100 } 100 101 } 101 },102 103 __removeExtraAddedHeaders : function(currentVersion) {104 if ((!currentVersion || upgrade.versionChecker.compare(currentVersion, "0.6.9") < 0) && 105 106 107 108 109 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"); 110 111 } 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 24 24 25 25 Components.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 } 26 virtualIdentityExtension.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 } 116 119 } 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)); 225 233 226 234 main.AccountManagerObserver.register(); 227 228 229 230 231 232 initSystemStage1 : function() {233 234 235 236 237 238 239 240 initSystemStage2 : function() {241 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.") 242 250 vI.initReplyTo(window); 243 244 245 246 247 248 close : function() {249 250 251 252 253 adapt_interface : function() {254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 var access_label = parent_hbox.getElementsByAttribute( "control", "msgIdentity")[0];273 274 275 276 main.elements.init_rest(); 277 278 279 adapt_genericSendMessage : function() {280 281 282 283 284 285 286 287 reopen: function() {288 289 290 291 292 293 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 295 303 // register StateListener 296 304 gMsgCompose.RegisterStateListener(main.ComposeStateListener); 297 298 299 300 305 306 // now (re)init the elements 307 main.initSystemStage1(); 308 301 309 vI.vIprefs.dropLocalChanges(); 302 310 … … 306 314 var msgComposeType = Components.interfaces.nsIMsgCompType; 307 315 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 } 404 414 } 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 36 36 function identityDataExtrasObject_PGPEncryption(currentWindow) { 37 37 this.currentWindow = currentWindow; 38 this.field = "PGPEnc";// description of the option39 this.option = "storageExtras_openPGP_messageEncryption"; 38 this.field = "PGPEnc"; // description of the option 39 this.option = "storageExtras_openPGP_messageEncryption"; // option string to get preference settings 40 40 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 }; 43 44 } 44 45 identityDataExtrasObject_PGPEncryption.prototype = { 45 46 __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"; 49 50 } 50 51 } -
modules/identityDataExtras/PGPMIME.js
r3c9c29 r509348 36 36 function identityDataExtrasObject_PGPMIME(currentWindow) { 37 37 this.currentWindow = currentWindow; 38 this.field = "PGPMIME";// description of the option39 this.option = "storageExtras_openPGP_PGPMIME"; 38 this.field = "PGPMIME"; // description of the option 39 this.option = "storageExtras_openPGP_PGPMIME"; // option string to get preference settings 40 40 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 }; 43 44 } 44 45 identityDataExtrasObject_PGPMIME.prototype = { 45 46 __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"; 49 50 } 50 51 } -
modules/identityDataExtras/PGPSignature.js
r3c9c29 r509348 36 36 function identityDataExtrasObject_PGPSignature(currentWindow) { 37 37 this.currentWindow = currentWindow; 38 this.field = "PGPSig";// description of the option39 this.option = "storageExtras_openPGP_messageSignature"; 38 this.field = "PGPSig"; // description of the option 39 this.option = "storageExtras_openPGP_messageSignature"; // option string to get preference settings 40 40 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 }; 43 44 } 44 45 identityDataExtrasObject_PGPSignature.prototype = { 45 46 __proto__: identityDataExtrasCheckboxObject.prototype, 46 47 readIdentityValue : function(identity) {47 48 readIdentityValue: function (identity) { 48 49 if (this.active) { 49 50 if (identity.getIntAttribute('defaultEncryptionPolicy') > 0) 50 this.value = (identity.getBoolAttribute('pgpSignEncrypted')) ?"true":"false";51 this.value = (identity.getBoolAttribute('pgpSignEncrypted')) ? "true" : "false"; 51 52 else 52 this.value = (identity.getBoolAttribute('pgpSignPlain')) ?"true":"false";53 this.value = (identity.getBoolAttribute('pgpSignPlain')) ? "true" : "false"; 53 54 } 54 55 } -
modules/identityDataExtras/characterEncoding.js
r3c9c29 r509348 34 34 let legacy = false; // use pre TB-32 legacy code 35 35 try { 36 36 Cu.import("resource://gre/modules/CharsetMenu.jsm"); 37 37 } catch (e) { 38 38 legacy = true; // pre TB-32-version, might be removed in the future 39 39 } 40 40 41 41 42 42 let Log = setupLogging("virtualIdentity.identityDataExtras.characterEncoding"); … … 44 44 function identityDataExtrasObject_characterEncoding(currentWindow) { 45 45 this.currentWindow = currentWindow; 46 this.field = "charEnc";// description of the option47 this.option = "storageExtras_characterEncoding"; 46 this.field = "charEnc"; // description of the option 47 this.option = "storageExtras_characterEncoding"; // option string to get preference settings 48 48 } 49 49 identityDataExtrasObject_characterEncoding.prototype = { 50 50 __proto__: identityDataExtrasObject.prototype, 51 52 get valueHtml() { return this.valueNice; }, 51 52 get valueHtml() { 53 return this.valueNice; 54 }, 53 55 get valueNice() { 54 return this.value?this.currentWindow.gCharsetConvertManager55 .getCharsetTitle(this.currentWindow.gCharsetConvertManager.getCharsetAlias(this.value)):"";56 return this.value ? this.currentWindow.gCharsetConvertManager 57 .getCharsetTitle(this.currentWindow.gCharsetConvertManager.getCharsetAlias(this.value)) : ""; 56 58 }, 57 59 58 60 // pre TB-32-version, might be removed in the future -------------------------------- 59 _setMenuMark: function () {61 _setMenuMark: function () { 60 62 var maileditCharsetMenu = this.currentWindow.document.getElementById("maileditCharsetMenu") 61 63 var value = maileditCharsetMenu.getAttribute("unmarkedValue") 62 64 if (value) { 63 64 65 66 65 var menuitem = this.currentWindow.document.getElementById(value); 66 if (menuitem) 67 menuitem.setAttribute('checked', 'true'); 68 maileditCharsetMenu.removeAttribute("unmarkedValue") 67 69 } 68 70 }, 69 71 // ---------------------------------------------------------------------------------- 70 71 setValueToEnvironment_msgCompose: function () {72 73 setValueToEnvironment_msgCompose: function () { 72 74 if (!this.value) 73 75 return; 74 76 // pre TB-32-version, might be removed in the future -------------------------------- 75 77 if (legacy) { 76 77 78 78 // old style 79 var menuitem = this.currentWindow.document.getElementById(this.value); 80 if (menuitem) 79 81 menuitem.setAttribute('checked', 'true'); 80 else {// set menumark later if menu is not ready yet82 else { // set menumark later if menu is not ready yet 81 83 var maileditCharsetMenu = this.currentWindow.document.getElementById("maileditCharsetMenu") 82 84 maileditCharsetMenu.setAttribute("unmarkedValue", this.value) 83 85 var onpopupshowing = maileditCharsetMenu.getAttribute("onpopupshowing") 84 86 this.currentWindow.document.getElementById("maileditCharsetMenu").setAttribute("onpopupshowing", 85 86 87 onpopupshowing + ";this._setMenuMark();") 88 } 87 89 } 88 90 // ---------------------------------------------------------------------------------- … … 90 92 this.currentWindow.SetDocumentCharacterSet(this.value); 91 93 }, 92 93 setValueToEnvironment_dataEditor: function () {94 95 setValueToEnvironment_dataEditor: function () { 94 96 // pre TB-32-version, might be removed in the future -------------------------------- 95 97 if (legacy) { 96 98 this.currentWindow.CreateMenu('mailedit'); // this is part of the magic included by the xul-binding 97 98 99 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 } 101 103 } 102 104 // ---------------------------------------------------------------------------------- 103 105 else { 104 105 106 107 this.currentWindow.document.getElementById("maileditCharsetMenu").setAttribute("label",CharsetMenu._getCharsetLabel(this.value));108 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 } 110 112 } 111 113 this.currentWindow.document.getElementById("vI_" + this.option + "_store").doCommand(); 112 114 }, 113 114 getValueFromEnvironment_msgCompose: function () {115 116 getValueFromEnvironment_msgCompose: function () { 115 117 // read the value from the internal vI object, global object might not be available any more 116 118 // happens especially while storing after sending the message … … 119 121 var charsetAlias = this.currentWindow.gCharsetConvertManager.getCharsetAlias(this.value); 120 122 if (charsetAlias == "us-ascii") 121 this.value = "ISO-8859-1"; 123 this.value = "ISO-8859-1"; // no menu item for "us-ascii" 122 124 } 123 125 }, 124 125 getValueFromEnvironment_dataEditor: function () {126 127 getValueFromEnvironment_dataEditor: function () { 126 128 if (this.currentWindow.document.getElementById("vI_" + this.option + "_store").getAttribute("checked") == "true") 127 129 // check if element is selected (list might not contain relevant entry) 128 130 if (this.currentWindow.document.getElementById("maileditCharsetMenu").selectedItem) 129 131 // pre TB-32-version, might be removed in the future -------------------------------- 130 132 if (legacy) { 131 133 this.value = this.currentWindow.document.getElementById("maileditCharsetMenu").selectedItem.id 132 134 } 133 135 // ---------------------------------------------------------------------------------- 134 136 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 138 139 this.value = null; 139 140 } -
modules/identityDataExtras/fccSwitch.js
r3c9c29 r509348 36 36 function identityDataExtrasObject_fccSwitch(currentWindow) { 37 37 this.currentWindow = currentWindow; 38 this.field = "fcc";// description of the option39 this.option = "storageExtras_fcc"; 38 this.field = "fcc"; // description of the option 39 this.option = "storageExtras_fcc"; // option string to get preference settings 40 40 this.elementID_msgCompose = "virtualIdentityExtension_fccSwitch"; 41 41 } 42 42 identityDataExtrasObject_fccSwitch.prototype = { 43 43 __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"; 47 47 }, 48 48 49 setValueToEnvironment_msgCompose: function () {49 setValueToEnvironment_msgCompose: function () { 50 50 var element = this.currentWindow.document.getElementById(this.elementID_msgCompose); 51 51 if (!this.active || (this.value == null) || !element) 52 52 return; 53 53 54 54 this.updateFunction_msgCompose(); 55 55 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"); 57 57 element.setAttribute("checked", (element.getAttribute("checked") != "true")); 58 58 } -
modules/identityDataExtras/messageFormat.js
r3c9c29 r509348 36 36 function identityDataExtrasObject_messageFormat(currentWindow) { 37 37 this.currentWindow = currentWindow; 38 this.field = "msgFormat";// description of the option39 this.option = "storageExtras_messageFormat"; 38 this.field = "msgFormat"; // description of the option 39 this.option = "storageExtras_messageFormat"; // option string to get preference settings 40 40 } 41 41 identityDataExtrasObject_messageFormat.prototype = { 42 42 __proto__: identityDataExtrasObject.prototype, 43 43 44 44 // functions to get nicely formatted output 45 get valueHtml() { return this.valueNice; }, 45 get valueHtml() { 46 return this.valueNice; 47 }, 46 48 get valueNice() { 47 return this.value ?this.currentWindow.document.getElementById(this.value).label:"";49 return this.value ? this.currentWindow.document.getElementById(this.value).label : ""; 48 50 }, 49 51 50 setValueToEnvironment_msgCompose: function () {52 setValueToEnvironment_msgCompose: function () { 51 53 if (this.value == null) 52 54 return 53 55 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"); 55 57 this.currentWindow.OutputFormatMenuSelect(this.currentWindow.document.getElementById(this.value)) 56 58 }, 57 58 setValueToEnvironment_dataEditor: function () {59 60 setValueToEnvironment_dataEditor: function () { 59 61 if (this.value != null) { 60 62 this.currentWindow.document.getElementById("outputFormatMenu").selectedItem = this.currentWindow.document.getElementById(this.value); … … 62 64 } 63 65 this.currentWindow.document.getElementById("vI_" + this.option + "_store").doCommand(); 64 },65 66 getValueFromEnvironment_msgCompose: function () {66 }, 67 68 getValueFromEnvironment_msgCompose: function () { 67 69 const nsIMsgCompSendFormat = Components.interfaces.nsIMsgCompSendFormat; 68 70 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; 73 83 } 74 84 }, 75 76 getValueFromEnvironment_dataEditor: function () {85 86 getValueFromEnvironment_dataEditor: function () { 77 87 if (this.currentWindow.document.getElementById("vI_" + this.option + "_store").getAttribute("checked") == "true") 78 88 this.value = this.currentWindow.document.getElementById("outputFormatMenu").selectedItem.id -
modules/identityDataExtras/returnReceipt.js
r3c9c29 r509348 36 36 function identityDataExtrasObject_ReturnReceipt(currentWindow) { 37 37 this.currentWindow = currentWindow; 38 this.field = "receipt";// description of the option39 this.option = "storageExtras_returnReciept"; 38 this.field = "receipt"; // description of the option 39 this.option = "storageExtras_returnReciept"; // option string to get preference settings 40 40 this.elementID_msgCompose = "returnReceiptMenu"; 41 41 } 42 42 identityDataExtrasObject_ReturnReceipt.prototype = { 43 43 __proto__: identityDataExtrasCheckboxObject.prototype, 44 45 readIdentityValue : function(identity) {46 if (this.active) this.value = 44 45 readIdentityValue: function (identity) { 46 if (this.active) this.value = identity.requestReturnReceipt; 47 47 } 48 48 } -
modules/identityDataExtras/sMimeEncryption.js
r3c9c29 r509348 36 36 function identityDataExtrasObject_sMimeEncryption(currentWindow) { 37 37 this.currentWindow = currentWindow; 38 this.field = "sMimeEnc";// description of the option39 this.option = "storageExtras_sMime_messageEncryption"; 38 this.field = "sMimeEnc"; // description of the option 39 this.option = "storageExtras_sMime_messageEncryption"; // option string to get preference settings 40 40 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 }; 43 44 } 44 45 identityDataExtrasObject_sMimeEncryption.prototype = { 45 46 __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"; 49 50 } 50 51 } -
modules/identityDataExtras/sMimeSignature.js
r3c9c29 r509348 36 36 function identityDataExtrasObject_sMimeSignature(currentWindow) { 37 37 this.currentWindow = currentWindow; 38 this.field = "sMimeSig";// description of the option39 this.option = "storageExtras_sMime_messageSignature"; 38 this.field = "sMimeSig"; // description of the option 39 this.option = "storageExtras_sMime_messageSignature"; // option string to get preference settings 40 40 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 }; 43 44 } 44 45 identityDataExtrasObject_sMimeSignature.prototype = { 45 46 __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"; 49 50 } 50 51 } -
modules/plugins/conversations.js
r3c9c29 r509348 22 22 Contributor(s): 23 23 * ***** END LICENSE BLOCK ***** */ 24 24 25 25 var EXPORTED_SYMBOLS = []; 26 26 27 const {classes: Cc, interfaces: Ci, utils: Cu, results : Cr} = Components; 27 const { 28 classes: Cc, 29 interfaces: Ci, 30 utils: Cu, 31 results: Cr 32 } = Components; 28 33 29 34 Cu.import("resource://v_identity/vI_log.js"); … … 38 43 const AccountManager = Cc["@mozilla.org/messenger/account-manager;1"] 39 44 .getService(Components.interfaces.nsIMsgAccountManager); 40 45 41 46 const HeaderParser = Cc["@mozilla.org/messenger/headerparser;1"] 42 47 .getService(Ci.nsIMsgHeaderParser); … … 49 54 let _rdfDatasourceAccess; 50 55 51 let changeIdentityToSmartIdentity = function (allIdentities, index) {56 let changeIdentityToSmartIdentity = function (allIdentities, index) { 52 57 _changeIdentityToSmartIdentity(allIdentities.identityDataCollection[index]); 53 58 }; 54 59 55 let _changeIdentityToSmartIdentity = function (identityData) {60 let _changeIdentityToSmartIdentity = function (identityData) { 56 61 Log.debug("changeIdentityToSmartIdentity"); 57 58 if ( identityData.id.key != null) {62 63 if (identityData.id.key != null) { 59 64 currentParams.identity = AccountManager.getIdentity(identityData.id.key); 60 65 Log.debug("changed base identity to ", identityData.id.key); … … 73 78 onComposeSessionChanged: function _virtualIdentityHook_onComposeSessionChanged(aComposeSession, aMessage, aAddress) { 74 79 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. 77 83 let identity = aComposeSession.params.identity; 78 79 if (typeof (this._AccountManager.getServersForIdentity) == 'function') { // new style80 84 85 if (typeof (this._AccountManager.getServersForIdentity) == 'function') { // new style 86 let server = this._AccountManager.getServersForIdentity(identity).queryElementAt(0, Components.interfaces.nsIMsgIncomingServer); 81 87 } else { 82 88 let server = this._AccountManager.GetServersForIdentity(identity).QueryElementAt(0, Components.interfaces.nsIMsgIncomingServer); 83 89 } 84 90 85 91 currentIdentityData = new identityData(identity.email, identity.fullName, identity.key, 86 92 identity.smtpServerKey, null, server.prettyName, true) 87 93 currentIdSenderName = currentIdentityData.combinedName; 88 94 virtualIdInUse = false; 89 90 let recipients = []; var combinedNames = {}; var number; 95 96 let recipients = []; 97 var combinedNames = {}; 98 var number; 91 99 number = HeaderParser.parseHeadersWithArray(toAddrList.join(", "), {}, {}, combinedNames); 92 100 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 99 110 if (localSmartIdentityCollection._allIdentities.number == 0) 100 111 return; 101 112 102 113 if (vIprefs.get("idSelection_preferExisting")) { 103 114 var existingIDIndex = localSmartIdentityCollection._foundExistingIdentity(); … … 109 120 } 110 121 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")) 124 134 changeIdentityToSmartIdentity(localSmartIdentityCollection._allIdentities, 0); 125 135 }, 126 136 127 137 onMessageBeforeSendOrPopout_canceled: function _enigmailHook_onMessageBeforeSendOrPopout_canceledy(aAddress, aEditor, aStatus, aPopout) { 128 138 Log.debug("onMessageBeforeSendOrPopout_canceled"); … … 141 151 let toAddrList = aAddress.to.concat(aAddress.cc); 142 152 Log.debug("onMessageBeforeSendOrPopup_early"); 143 153 144 154 if (virtualIdInUse) { 145 155 if (!aPopout) { 146 let recipients = []; var combinedNames = {}; var number; 156 let recipients = []; 157 var combinedNames = {}; 158 var number; 147 159 number = HeaderParser.parseHeadersWithArray(toAddrList.join(", "), {}, {}, combinedNames); 148 160 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 151 166 let recentWindow = Cc["@mozilla.org/appshell/window-mediator;1"] 152 167 .getService(Ci.nsIWindowMediator) 153 168 .getMostRecentWindow("mail:3pane"); 154 169 155 170 returnValue = vIaccount_prepareSendMsg(virtualIdInUse, Ci.nsIMsgCompDeliverMode.Now, 156 171 currentIdentityData, aAddress.params.identity, recipients, recentWindow); 157 172 Log.debug("returnValue.update:", returnValue.update); 158 173 159 174 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; 161 181 } 162 else if (returnValue.update == "takeover") { 163 _changeIdentityToSmartIdentity(returnValue.storedIdentity); 164 aStatus.canceled = true; return aStatus; 165 } 166 182 167 183 aAddress.params.identity = get_vIaccount().defaultIdentity; 168 184 if (!vIaccount_finalCheck(currentIdentityData, aAddress.params.identity)) { 169 185 vIaccount_removeUsedVIAccount(); 170 aStatus.canceled = true; return aStatus; 186 aStatus.canceled = true; 187 return aStatus; 171 188 } 172 } 173 else { 189 } else { 174 190 // code virtual Identity into subject - this will be decoded by smartIdentity - newMail 175 191 aAddress.params.subject = aAddress.params.subject + "\nvirtualIdentityExtension\n" + currentIdSenderName; … … 180 196 return aStatus; 181 197 }, 182 198 183 199 onStopSending: function _virtualIdentityHook_onStopSending(aMsgID, aStatus, aMsg, aReturnFile) { 184 200 vIaccount_removeUsedVIAccount(); … … 195 211 var isNotFirstInputElement = !(aType == "to" && aCount == 0); 196 212 Log.debug("onRecipientAdded isNotFirstInputElement", isNotFirstInputElement); 197 213 198 214 if (!_rdfDatasourceAccess) _rdfDatasourceAccess = new rdfDatasourceAccess(); 199 215 else _rdfDatasourceAccess.clean(); 200 216 201 217 let recentWindow = Cc["@mozilla.org/appshell/window-mediator;1"] 202 203 218 .getService(Ci.nsIWindowMediator) 219 .getMostRecentWindow("mail:3pane"); 204 220 205 221 var storageResult = _rdfDatasourceAccess.updateVIdentityFromStorage(aData.data, "addr_to", 206 222 currentIdentityData, virtualIdInUse, isNotFirstInputElement, recentWindow); 207 223 208 224 if (storageResult.identityCollection.number == 0) return; // return if there was no match 209 225 if (storageResult.result != "accept") return; // return if we don't like the resulting id 210 226 211 227 changeIdentityToSmartIdentity(storageResult.identityCollection, 0); 212 228 } … … 222 238 registerHook(virtualIdentityHook); 223 239 }, false); 224 } 225 catch(e) { 240 } catch (e) { 226 241 Log.debug("virtualIdentity is ready for conversations, but you don't use it"); 227 242 } -
modules/plugins/signatureSwitch.js
r3c9c29 r509348 25 25 var EXPORTED_SYMBOLS = ["signatureSwitch"] 26 26 27 const {classes: Cc, interfaces: Ci, utils: Cu, results : Cr} = Components; 27 const { 28 classes: Cc, 29 interfaces: Ci, 30 utils: Cu, 31 results: Cr 32 } = Components; 28 33 Cu.import("resource://gre/modules/AddonManager.jsm"); 29 34 Cu.import("resource://v_identity/vI_prefs.js"); … … 33 38 function signatureSwitch(existingIdentity) { 34 39 // 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 37 45 let signatureWindow = Cc["@mozilla.org/appshell/window-mediator;1"] 38 39 46 .getService(Ci.nsIWindowMediator) 47 .getMostRecentWindow(null); 40 48 41 49 if (!existingIdentity) { 42 50 Log.debug("signatureSwitch hide/remove signatures"); 43 51 44 52 // code to hide the text signature 45 53 if (signatureSwitchInstalled && vIprefs.get("hide_signature") && signatureWindow.ss_signature && signatureWindow.ss_signature.length == 0) { … … 47 55 signatureWindow.ss_main.signatureSwitch() 48 56 } 49 57 50 58 // code to hide the sMime signature 51 59 if (vIprefs.get("hide_sMime_messageSignature")) { … … 77 85 } 78 86 } 79 } 80 else if (signatureSwitchInstalled) { 87 } else if (signatureSwitchInstalled) { 81 88 Log.debug("signatureSwitch restore signature"); 82 89 // code to show the text signature … … 91 98 let signatureSwitchInstalled = false; 92 99 // check for signature_switch extension 93 AddonManager.getAddonByID("{2ab1b709-ba03-4361-abf9-c50b964ff75d}", function (addon) {100 AddonManager.getAddonByID("{2ab1b709-ba03-4361-abf9-c50b964ff75d}", function (addon) { 94 101 signatureSwitchInstalled = (addon && !addon.userDisabled && !addon.appDisable); 95 102 if (signatureSwitchInstalled) … … 97 104 else 98 105 Log.debug("virtualIdentity is ready for signatureSwitch, but you don't use it"); 99 106 }); -
modules/vI_account.js
r3c9c29 r509348 25 25 var EXPORTED_SYMBOLS = ["vIaccount_cleanupSystem", "get_vIaccount", 26 26 "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 30 const { 31 classes: Cc, 32 interfaces: Ci, 33 utils: Cu, 34 results: Cr 35 } = Components; 30 36 31 37 Cu.import("resource://gre/modules/Services.jsm"); … … 39 45 40 46 function 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 }; 77 88 }; 78 89 79 90 function 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 } 104 114 }; 105 115 106 116 var 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) {} 221 217 } 222 // replace account with key, required for next check 223 accounts[acc] = accounts[acc].key; 218 } 224 219 } 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 /* 327 335 // the easiest way would be to get all requiered Attributes might be to duplicate the default account like this 328 336 var recentAccount = account._AccountManager.getAccount(vI.main.elements.Obj_MsgIdentity.selectedItem.getAttribute("accountkey")); … … 332 340 // so I have to do this by hand ;( 333 341 */ 334 335 336 337 338 339 340 341 342 343 344 if (typeof(this._AccountManager.getServersForIdentity) == 'function') { // new style345 346 347 348 349 try { 350 if (typeof (this._AccountManager.getServersForIdentity) == 'function') { // new style351 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); 352 360 } else { 353 361 var server = servers.QueryElementAt(0, Ci.nsIMsgIncomingServer); 354 362 } 355 363 } catch (NS_ERROR_FAILURE) { … … 357 365 var server = account._AccountManager.defaultAccount.incomingServer; 358 366 } 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 } 482 475 } 483 476 -
modules/vI_accountUtils.js
r3c9c29 r509348 25 25 var EXPORTED_SYMBOLS = ["getAccountsArray", "getIdentitiesArray"] 26 26 27 const {classes: Cc, interfaces: Ci, utils: Cu, results : Cr} = Components; 27 const { 28 classes: Cc, 29 interfaces: Ci, 30 utils: Cu, 31 results: Cr 32 } = Components; 28 33 29 34 Cu.import("resource://v_identity/vI_log.js"); … … 31 36 32 37 let accountManager = Components.classes["@mozilla.org/messenger/account-manager;1"] 33 38 .getService(Components.interfaces.nsIMsgAccountManager); 34 39 35 40 // copy/pasted from MsgComposeCommands.js 36 41 function queryISupportsArray(supportsArray, iid) { 37 38 39 40 result[i] = supportsArray.QueryElementAt(i, iid);41 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; 42 47 }; 43 48 44 49 function 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; 53 57 } 54 58 55 59 function 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; 68 61 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; 87 73 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 93 99 }; -
modules/vI_identityData.js
r3c9c29 r509348 45 45 46 46 function 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"); 64 70 } 65 71 identityData.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,">").replace(/</g,"<"):"" }, 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, ">").replace(/</g, "<") : "" 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)); 222 264 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 } 268 313 } 269 314 270 315 function 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 } 320 identityCollection.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 } 328 372 }; 329 373 330 374 function smtpObj(key) { 331 332 this.DEFAULT_TAG =Components.classes["@mozilla.org/intl/stringbundle;1"]333 334 335 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"); 336 380 } 337 381 smtpObj.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; 379 426 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 436 function idObj(key) { 437 this._key = key; 438 } 390 439 idObj.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; 420 475 if (this.key != compareIdObj.key) { 421 // Log.debug("id not equal ('" + this.key + "' != '" + compareIdObj.key + "')");422 } 423 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 25 25 var EXPORTED_SYMBOLS = ["identityDataExtras", "registerIdExtrasObject", "identityDataExtrasObject", "identityDataExtrasCheckboxObject"]; 26 26 27 const {classes: Cc, interfaces: Ci, utils: Cu, results : Cr} = Components; 27 const { 28 classes: Cc, 29 interfaces: Ci, 30 utils: Cu, 31 results: Cr 32 } = Components; 28 33 29 34 Cu.import("resource://v_identity/vI_log.js"); … … 47 52 .getService(Ci.nsIWindowMediator) 48 53 .getMostRecentWindow(null); 49 for each 54 for each(let [, identityDataExtrasObject] in Iterator(idExtrasObjects)) { 50 55 this.extras.push(new identityDataExtrasObject(currentWindow)); 51 56 } … … 53 58 this.loopThroughExtras( 54 59 function (extra) { 55 extra.value = rdfDatasource._getRDFValue(resource, extra.field);}); 60 extra.value = rdfDatasource._getRDFValue(resource, extra.field); 61 }); 56 62 } 57 63 identityDataExtras.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++) { 60 66 try { 61 67 returnVal = k(this.extras[i], i, returnVal) 62 } 63 catch (e) { 68 } catch (e) { 64 69 Log.warn("identityDataExtras '" + this.extras[i].field + "' returned an error:", e); 65 70 dumpCallStack(e); … … 68 73 return returnVal; 69 74 }, 70 75 71 76 // just give a duplicate of the current identityDataExtras, else we will work with pointers 72 getDuplicate : function() {77 getDuplicate: function () { 73 78 var newExtras = new identityDataExtras(); 74 79 this.loopThroughExtras(function (extra, i) { … … 77 82 return newExtras; 78 83 }, 79 84 80 85 // 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) { 82 87 this.loopThroughExtras(function (extra, i) { 83 88 extra.value = extras.extras[i].value; … … 85 90 }, 86 91 87 equal : function(identityDataExtras) {92 equal: function (identityDataExtras) { 88 93 var returnVal = true; 89 94 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; 91 96 }, returnVal); 92 97 }, 93 94 getMatrix : function() {98 99 getMatrix: function () { 95 100 var returnVal = ""; 96 101 return this.loopThroughExtras(function (extra, i, returnVal) { 97 102 if (extra.active && extra.valueHtml) 98 103 returnVal += "<tr>" + 99 100 101 104 "<td class='col1 extras '>" + stringBundle.GetStringFromName("vident.identityData.extras." + extra.field) + "</td>" + 105 "<td class='col2 extras '>" + extra.valueHtml + "</td>" + 106 "</tr>" 102 107 return returnVal; 103 108 }, returnVal); 104 109 }, 105 110 106 getCompareMatrix : function() {111 getCompareMatrix: function () { 107 112 var returnVal = ""; 108 113 return this.loopThroughExtras(function (extra, i, returnVal) { 109 114 if (extra.active) { 110 var classEqual = (extra.lastCompareResult) ?"equal":"unequal";115 var classEqual = (extra.lastCompareResult) ? "equal" : "unequal"; 111 116 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>" 116 121 } 117 122 return returnVal … … 119 124 }, 120 125 121 status : function() {126 status: function () { 122 127 var returnVal = ""; 123 128 return this.loopThroughExtras(function (extra) { 124 return returnVal += returnVal ?" ":"" + extra.status;129 return returnVal += returnVal ? " " : "" + extra.status; 125 130 }, returnVal); 126 131 }, 127 132 128 readIdentityValues : function(identity) {133 readIdentityValues: function (identity) { 129 134 this.loopThroughExtras(function (extra) { 130 135 extra.readIdentityValue(identity) … … 132 137 }, 133 138 134 setValuesToEnvironment : function() {139 setValuesToEnvironment: function () { 135 140 this.loopThroughExtras(function (extra) { 136 141 extra.setValueToEnvironment() 137 142 }); 138 143 }, 139 140 getValuesFromEnvironment : function() {144 145 getValuesFromEnvironment: function () { 141 146 this.loopThroughExtras(function (extra) { 142 147 extra.getValueFromEnvironment() 143 148 }); 144 149 }, 145 150 146 151 // add value's to the pref object, required for rdfDataTreeCollection 147 addPrefs : function(pref) {152 addPrefs: function (pref) { 148 153 this.loopThroughExtras(function (extra) { 149 154 pref[extra.field + "Col"] = extra.valueNice; … … 156 161 } 157 162 identityDataExtrasObject.prototype = { 158 value : null,// will contain the current value of the object and can be accessed from outside159 field : null,// short description of the field160 option : null,// option from preferences, boolean161 window : null,// the current Window the object was created for162 163 lastCompareValue 164 lastCompareResult 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, 165 170 166 171 get valueHtml() { 167 168 169 return "<div class='bool" + ((this.value=="true")?" checked":"") + "'>" +170 171 172 172 if (!this.value) 173 return ""; 174 return "<div class='bool" + ((this.value == "true") ? " checked" : "") + "'>" + 175 "<label class='screen'> </label>" + 176 "<label class='braille'>" + this.valueNice + "</label>" + 177 "</div>" 173 178 }, 174 179 get valueNice() { 175 176 177 return (this.value=="true")?"yes":"no";180 if (!this.value) 181 return ""; 182 return (this.value == "true") ? "yes" : "no"; 178 183 }, 179 184 get status() { … … 182 187 return ""; 183 188 }, 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) { 186 193 this.lastCompareValue = compareIdentityDataExtrasObject.valueHtml; 187 194 this.lastCompareResult = (!this.value || !compareIdentityDataExtrasObject.value || this.value == compareIdentityDataExtrasObject.value); 188 195 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 + "')"); 190 197 } 191 198 return this.lastCompareResult; 192 199 }, 193 200 // function to read the value from a given identity (probably not part of identity) 194 readIdentityValue : function(identity) {},201 readIdentityValue: function (identity) {}, 195 202 // function to set or read the value from/to the environment 196 setValueToEnvironment : function() {203 setValueToEnvironment: function () { 197 204 let id = this.currentWindow.document.documentElement.id; 198 switch (id) {199 200 201 202 203 204 205 206 207 208 209 210 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 () { 214 221 let id = this.currentWindow.document.documentElement.id; 215 switch (id) {216 217 218 219 220 221 222 223 224 225 226 227 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 () { 231 238 Log.error("setValueToEnvironment not implemented for msgCompose and " + this.field) 232 239 }, 233 setValueToEnvironment_messenger : function() {240 setValueToEnvironment_messenger: function () { 234 241 Log.error("setValueToEnvironment not implemented for Messenger and " + this.field) 235 242 }, 236 setValueToEnvironment_dataEditor : function() {243 setValueToEnvironment_dataEditor: function () { 237 244 Log.error("setValueToEnvironment not implemented for dataEditor and " + this.field) 238 245 }, 239 getValueFromEnvironment_msgCompose : function() {246 getValueFromEnvironment_msgCompose: function () { 240 247 Log.error("setValueToEnvironment not implemented for msgCompose and " + this.field) 241 248 }, 242 getValueFromEnvironment_messenger : function() {249 getValueFromEnvironment_messenger: function () { 243 250 Log.error("setValueToEnvironment not implemented for Messenger and " + this.field) 244 251 }, 245 getValueFromEnvironment_dataEditor : function() {252 getValueFromEnvironment_dataEditor: function () { 246 253 Log.error("setValueToEnvironment not implemented for dataEditor and " + this.field) 247 254 } … … 254 261 identityDataExtrasCheckboxObject.prototype = { 255 262 __proto__: identityDataExtrasObject.prototype, 256 257 updateFunction_msgCompose : function() {},258 elementID_msgCompose 259 260 readIdentityValue : function(identity) {263 264 updateFunction_msgCompose: function () {}, 265 elementID_msgCompose: null, 266 267 readIdentityValue: function (identity) { 261 268 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 () { 266 273 var element = this.currentWindow.document.getElementById(this.elementID_msgCompose); 267 274 if (!this.active || (this.value == null) || !element) 268 275 return; 269 276 270 277 this.updateFunction_msgCompose(); 271 278 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"); 273 280 element.doCommand(); 274 281 } 275 282 }, 276 277 setValueToEnvironment_dataEditor: function () {283 284 setValueToEnvironment_dataEditor: function () { 278 285 if (this.value != null) { 279 286 this.currentWindow.document.getElementById("vI_" + this.option).setAttribute("checked", this.value); … … 282 289 this.currentWindow.document.getElementById("vI_" + this.option + "_store").doCommand(); 283 290 }, 284 285 getValueFromEnvironment_msgCompose: function () {291 292 getValueFromEnvironment_msgCompose: function () { 286 293 var element = this.currentWindow.document.getElementById(this.elementID_msgCompose) 287 294 if (this.active && element) { 288 295 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 () { 294 301 if (this.currentWindow.document.getElementById("vI_" + this.option + "_store").getAttribute("checked") == "true") { 295 302 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 299 305 this.value = null; 300 306 } -
modules/vI_log.js
r3c9c29 r509348 25 25 var EXPORTED_SYMBOLS = ["setupLogging", "dumpCallStack", "MyLog", "Colors", 26 26 "clearDebugOutput", "notificationOverflow", 27 "SmartReplyNotification", "StorageNotification", "GetHeaderNotification" ] 28 29 const {classes: Cc, interfaces: Ci, utils: Cu, results : Cr} = Components; 27 "SmartReplyNotification", "StorageNotification", "GetHeaderNotification" 28 ] 29 30 const { 31 classes: Cc, 32 interfaces: Ci, 33 utils: Cu, 34 results: Cr 35 } = Components; 30 36 Cu.import("resource:///modules/gloda/log4moz.js"); 31 37 Cu.import("resource://v_identity/vI_prefs.js"); … … 52 58 53 59 shutdown: function () { 54 55 56 57 } catch (e) {};60 try { 61 Services.console.unregisterListener(this); 62 Services.obs.removeObserver(this, "quit-application"); 63 } catch (e) {}; 58 64 }, 59 65 … … 66 72 try { 67 73 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) { 75 79 // This is to avoid pathological error loops. we definitely do not 76 80 // want to propagate an error here. … … 89 93 // undefined. 90 94 let messageString = [ 91 ("" + mo) for each 92 ([,mo] in Iterator(message.messageObjects))].join(" ");95 ("" + mo) for each([, mo] in Iterator(message.messageObjects)) 96 ].join(" "); 93 97 return messageString; 94 98 } … … 104 108 // undefined. 105 109 let messageString = [ 106 ("" + mo) for each 107 ([,mo] in Iterator(message.messageObjects))].join(" ");108 return message.loggerName.replace("virtualIdentity.", "") + ":\t" + messageString 110 ("" + mo) for each([, mo] in Iterator(message.messageObjects)) 111 ].join(" "); 112 return message.loggerName.replace("virtualIdentity.", "") + ":\t" + messageString + "\n"; 109 113 } 110 114 }; … … 121 125 __proto__: Log4Moz.Appender.prototype, 122 126 123 currentWindow 124 127 currentWindow: null, 128 125 129 doAppend: function DOApp_doAppend(message) { 126 130 if (!vIprefs.get("debug_notification")) return; … … 144 148 NotificationOutputAppender.prototype = { 145 149 __proto__: Log4Moz.Appender.prototype, 146 147 currentWindow 150 151 currentWindow: null, 148 152 149 153 doAppend: function DOApp_doAppend(message) { … … 154 158 this.addNote(message); 155 159 }, 156 157 timer 158 159 clearNote: function (self) {160 161 timer: null, 162 163 clearNote: function (self) { 160 164 if (self.timer) 161 165 self.currentWindow.clearTimeout(self.timer); … … 166 170 }, 167 171 168 addNote: function (note) {172 addNote: function (note) { 169 173 let obj_notificationBox = this.currentWindow.document.getElementById("virtualIdentityExtension_vINotification"); 170 174 if (!obj_notificationBox) 171 175 return; 172 176 let oldNotification = obj_notificationBox.currentNotification 173 let newLabel = (oldNotification) ?oldNotification.label + note:note;177 let newLabel = (oldNotification) ? oldNotification.label + note : note; 174 178 this.clearNote(this); 175 179 obj_notificationBox.appendNotification(newLabel, "", "chrome://messenger/skin/icons/flag.png"); … … 177 181 if (vIprefs.get("notification_timeout") != 0) 178 182 this.timer = 179 180 183 this.currentWindow.setTimeout(this.clearNote, 184 vIprefs.get("notification_timeout") * 1000, this); 181 185 } 182 186 } … … 189 193 // height will be cut off from messagepane (in 3pane window) 190 194 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; 192 196 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 197 let tooBig = (maxHeight) ? (elem.inputField.scrollHeight > maxHeight) : false; 198 let newHeight = (tooBig) ? maxHeight : elem.inputField.scrollHeight; 199 elem.height = newHeight; 196 200 // give the box a frame if it is to big 197 201 if (tooBig) 198 202 var notificationBox = currentWindow.document.getElementById("virtualIdentityExtension_vINotificationTextbox"); 199 203 if (notificationBox) notificationBox.setAttribute("class", "plain border"); 200 204 } 201 205 … … 265 269 266 270 function _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) { 273 280 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 }; 275 290 } 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(); 310 313 } 311 314 312 315 function _stopFileLogging() { 313 314 315 316 if (DebugFileAppender) 317 Log4Moz.repository.rootLogger.removeAppender(DebugFileAppender); 318 _errorConsoleTunnel.shutdown(); 316 319 } 317 320 318 321 function _dump_extension_list() { 319 320 AddonManager.getAllAddons(function(addons) {321 var strings = addons.map(function(addon) {322 323 324 325 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 }); 328 331 } 329 332 330 333 function _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(); 347 349 } 348 350 349 351 function UpdateFileLoggerPath() { 350 351 352 353 354 355 356 } 352 dump("UpdateFileLoggerPath\n"); 353 if (vIprefs.get("debug_to_file")) { 354 _stopFileLogging(); 355 _startFileLogging(); 356 _dump_info_block(); 357 } 358 } 357 359 358 360 function 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 } 366 367 } 367 368 368 369 function 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 } 377 377 } 378 378 379 379 function 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 } 388 387 } 389 388 390 389 function 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 } 399 397 } 400 398 -
modules/vI_nameSpaceWrapper.js
r3c9c29 r509348 13 13 virtualIdentityExtension.Log.debug("init vI_overlayNameSpaceWrapper " + virtualIdentityExtension.initTime); 14 14 15 (function() { this.ns = function(fn) { fn.apply({}); }; }).apply(virtualIdentityExtension); 15 (function () { 16 this.ns = function (fn) { 17 fn.apply({}); 18 }; 19 }).apply(virtualIdentityExtension); 16 20 17 21 virtualIdentityExtension.LIB = { 18 19 getCurrentURI: function() {20 21 22 22 // Shared APIs 23 getCurrentURI: function () { 24 virtualIdentityExtension.Log.debug("getCurrentURI " + window.location.href); 25 return window.location.href; 26 }, 23 27 24 25 28 // Extension singleton shortcut 29 vI: virtualIdentityExtension 26 30 }; -
modules/vI_prefs.js
r3c9c29 r509348 25 25 var EXPORTED_SYMBOLS = ["vIprefs", "prefroot"] 26 26 27 const {classes: Cc, interfaces: Ci, utils: Cu, results : Cr} = Components; 27 const { 28 classes: Cc, 29 interfaces: Ci, 30 utils: Cu, 31 results: Cr 32 } = Components; 28 33 29 34 Cu.import("resource://v_identity/vI_log.js"); … … 44 49 // even without influencing the global pref settings 45 50 var 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); 63 101 } 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; 79 126 } 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") 97 137 } 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)) { 122 142 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); 139 147 } 140 148 } 141 149 } 142 150 } 151 } 143 152 } 144 153 -
modules/vI_rdfDatasource.js
r3c9c29 r509348 43 43 44 44 function 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 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) { 48 58 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 76 rdfDatasource.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 } 51 953 } 52 954 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 956 function rdfDatasourceAccess() { 957 this._rdfDataSource = new rdfDatasource("virtualIdentity.rdf", false); 958 this.stringBundle = Services.strings.createBundle("chrome://v_identity/locale/v_identity.properties"); 959 } 960 961 rdfDatasourceAccess.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"; 61 1001 } 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 }, 1031 1098 } 1032 1099 … … 1034 1101 // create with name of the file to import into 1035 1102 function rdfDatasourceImporter(rdfFileName) { 1036 1037 1103 this._rdfFileName = rdfFileName; 1104 if (this._rdfFileName) this.import(); 1038 1105 } 1039 1106 1040 1107 rdfDatasourceImporter.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 1056 1275 } 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 } 1219 1298 } -
modules/vI_replyToSelf.js
r3c9c29 r509348 25 25 var EXPORTED_SYMBOLS = ["initReplyTo", "addReplyToSelf"] 26 26 27 const {classes: Cc, interfaces: Ci, utils: Cu, results : Cr} = Components; 27 const { 28 classes: Cc, 29 interfaces: Ci, 30 utils: Cu, 31 results: Cr 32 } = Components; 28 33 Cu.import("resource://v_identity/vI_prefs.js"); 29 34 Cu.import("resource://v_identity/vI_log.js"); … … 35 40 replyToSelfObj.removeAttribute("hidden"); 36 41 removeAllReplyTos(vIcomposeWindow, replyToSelfObj); 37 } 38 else 42 } else 39 43 replyToSelfObj.setAttribute("hidden", "true"); 40 44 }; … … 42 46 function removeAllReplyTos(vIcomposeWindow, replyToSelfObj) { 43 47 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++) { 45 49 var awType = vIcomposeWindow.awGetPopupElement(row).selectedItem.getAttribute("value"); 46 50 if (awType == "addr_reply") { … … 55 59 let replyToSelfObj = vIcomposeWindow.document.getElementById("virtualIdentityExtension_autoReplyToSelfLabel"); 56 60 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); 58 62 Log.debug("added ReplyToSelf"); 59 replyToSelfObj.setAttribute("hidden", "true");63 replyToSelfObj.setAttribute("hidden", "true"); 60 64 } 61 65 }; -
modules/vI_smartIdentityCollection.js
r3c9c29 r509348 33 33 34 34 function smartIdentityCollection(msgHdr, preseletedID, currentIDisVID, newsgroup, recipients) { 35 36 37 38 39 40 41 42 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(); 43 43 }; 44 44 45 45 smartIdentityCollection.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 416 428 417 429 };
Note: See TracChangeset
for help on using the changeset viewer.