--- /dev/null
+/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-\r
+ * ***** BEGIN LICENSE BLOCK *****\r
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1\r
+ *\r
+ * The contents of this file are subject to the Mozilla Public License Version\r
+ * 1.1 (the "License"); you may not use this file except in compliance with\r
+ * the License. You may obtain a copy of the License at\r
+ * http://www.mozilla.org/MPL/\r
+ *\r
+ * Software distributed under the License is distributed on an "AS IS" basis,\r
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License\r
+ * for the specific language governing rights and limitations under the\r
+ * License.\r
+ *\r
+ * The Original Code is mozilla.org Code.\r
+ *\r
+ * The Initial Developer of the Original Code is\r
+ * BT Global Services / Etat francais Ministere de la Defense\r
+ * Portions created by the Initial Developer are Copyright (C) 1998-2001\r
+ * the Initial Developer. All Rights Reserved.\r
+ *\r
+ * Contributor(s):\r
+ * Eric Ballet Baz BT Global Services / Etat francais Ministere de la Defense\r
+ * Copyright (c) 2014 CASSIDIAN - All rights reserved\r
+ *\r
+ * Alternatively, the contents of this file may be used under the terms of\r
+ * either of the GNU General Public License Version 2 or later (the "GPL"),\r
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),\r
+ * in which case the provisions of the GPL or the LGPL are applicable instead\r
+ * of those above. If you wish to allow use of your version of this file only\r
+ * under the terms of either the GPL or the LGPL, and not to allow others to\r
+ * use your version of this file under the terms of the MPL, indicate your\r
+ * decision by deleting the provisions above and replace them with the notice\r
+ * and other provisions required by the GPL or the LGPL. If you do not delete\r
+ * the provisions above, a recipient may use your version of this file under\r
+ * the terms of any one of the MPL, the GPL or the LGPL.\r
+ *\r
+ * ***** END LICENSE BLOCK ***** */\r
+\r
+// MDN Disposition Type for Deletion\r
+var MDN_DISPOSE_TYPE_DELETED = 3;\r
+var MDN_Registered=false;\r
+//Save the original built SetupCommandUpdateHandlers functions\r
+var mdn_extended_OriginalSetupCommandUpdateHandlers;\r
+if(!mdn_extended_OriginalSetupCommandUpdateHandlers)\r
+{\r
+ mdn_extended_OriginalSetupCommandUpdateHandlers=SetupCommandUpdateHandlers;\r
+}\r
+\r
+// Controller object that will handle deletion commands : used to override default controller\r
+var mdn_extended_MDN_DeleteController = {\r
+ supportsCommand: function(command) {\r
+ switch (command) {\r
+ case "cmd_delete":\r
+ case "button_delete":\r
+ case "cmd_shiftDelete":\r
+ return true;\r
+ default:\r
+ return false;\r
+ }\r
+ },\r
+ isCommandEnabled: function(command) {\r
+ // Delegate this call to the default controller\r
+ return DefaultController.isCommandEnabled(command);\r
+ },\r
+ doCommand: function(command) {\r
+ // if the user invoked a key short cut then it is possible that we got here for a command which is really disabled. kick out if the command should be disabled.\r
+ if (!this.isCommandEnabled(command)) {\r
+ return;\r
+ }\r
+ // HandleMDNDeleteResponse for each message to delete\r
+ var selectedMessages = gFolderDisplay.selectedMessageUris;\r
+ if (selectedMessages) {\r
+ var nbSelectedMessages = selectedMessages.length;\r
+ for (var i = 0; i < nbSelectedMessages; i++) {\r
+ var URL = mdn_extended_createURLFromURI(selectedMessages[i]);\r
+ var headers = mdn_extended_createHeadersFromURI(selectedMessages[i]);\r
+ mdn_extended_HandleMDNDeleteResponse(URL, headers);\r
+ }\r
+ }\r
+ // Delegate deletion to the default controller\r
+ DefaultController.doCommand(command);\r
+ },\r
+ onEvent: function(event) {\r
+ }\r
+};\r
+\r
+function mdn_extended_createHeadersFromURI(messageURI) {\r
+ var messageService = messenger.messageServiceFromURI(messageURI);\r
+ var messageStream = Components.classes["@mozilla.org/network/sync-stream-listener;1"].createInstance().QueryInterface(Components.interfaces.nsIInputStream);\r
+ var inputStream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance().QueryInterface(Components.interfaces.nsIScriptableInputStream);\r
+ inputStream.init(messageStream);\r
+ var newuri = messageService.streamMessage(messageURI,messageStream, msgWindow, null, false, null);\r
+\r
+ var content = "";\r
+ inputStream.available();\r
+ while (inputStream.available()) {\r
+ content = content + inputStream.read(512);\r
+ var p = content.indexOf("\r\n\r\n");\r
+ var p1 = content.indexOf("\r\r");\r
+ var p2 = content.indexOf("\n\n");\r
+ if (p > 0) {\r
+ content = content.substring(0, p);\r
+ break;\r
+ }\r
+ if (p1 > 0) {\r
+ content = content.substring(0, p1);\r
+ break;\r
+ }\r
+ if (p2 > 0) {\r
+ content = content.substring(0, p2);\r
+ break;\r
+ }\r
+ if (content.length > 512 * 8)\r
+ {\r
+ throw "Could not find end-of-headers line.";\r
+ return null;\r
+ }\r
+ }\r
+ content = content + "\r\n";\r
+\r
+ var headers = Components.classes["@mozilla.org/messenger/mimeheaders;1"].createInstance().QueryInterface(Components.interfaces.nsIMimeHeaders);\r
+ headers.initialize(content, content.length);\r
+ return headers;\r
+}\r
+\r
+function mdn_extended_createURLFromURI(messageURI) {\r
+ var messageService = messenger.messageServiceFromURI(messageURI);\r
+ var holder = new Object();\r
+ messageService.GetUrlForUri(messageURI, holder, null);\r
+ holder.value.QueryInterface(Components.interfaces.nsIMsgMailNewsUrl);\r
+ return holder.value;\r
+}\r
+\r
+\r
+// This function handles all mdn delete response generation\r
+function mdn_extended_HandleMDNDeleteResponse(aUrl, headers) {\r
+ if (!aUrl) {\r
+ return;\r
+ }\r
+ var msgFolder = aUrl.folder;\r
+ var msgURI = gFolderDisplay.selectedMessageUris[0]; //GetLoadedMessage();\r
+ if (!msgFolder || !msgURI || gFolderDisplay.selectedMessageIsNews) {\r
+ return;\r
+ }\r
+ // If the message is already in the Trash don't send a MDN delete report\r
+ if (msgFolder.isSpecialFolder( Components.interfaces.nsMsgFolderFlags.Trash, true)) {\r
+ return;\r
+ }\r
+ // if the message is marked as junk, do NOT attempt to process a return receipt in order to better protect the user\r
+ var msgHdr = gFolderDisplay.selectedMessage;\r
+ var junkScore = msgHdr.getStringProperty("junkscore");\r
+ if(junkScore !== "0") {\r
+ return;\r
+ }\r
+ var msgHdr = messenger.msgHdrFromURI(msgURI);\r
+ var mimeHdr = headers;\r
+ // If we didn't get the message id when we downloaded the message header,\r
+ // we cons up an md5: message id. If we've done that, we'll try to extract\r
+ // the message id out of the mime headers for the whole message.\r
+ var msgId = msgHdr.messageId;\r
+ if (msgId.split(":")[0] == "md5") {\r
+ var mimeMsgId = mimeHdr.extractHeader("Message-Id", false);\r
+ if (mimeMsgId) {\r
+ msgHdr.messageId = mimeMsgId;\r
+ }\r
+ }\r
+ // Check if the message has already been delete (IMAP)\r
+ var msgFlags = msgHdr.flags;\r
+ if ((msgFlags & Components.interfaces.nsMsgMessageFlags.IMAPDeleted)) {\r
+ return;\r
+ }\r
+ // Check if the positive MDN message has been sent\r
+ if ((msgFlags & Components.interfaces.nsMsgMessageFlags.MDNReportSent)) {\r
+ return;\r
+ }\r
+ // Check if the msg has a "Disposition-Notification-To" header.\r
+ var DNTHeader = mimeHdr.extractHeader("Disposition-Notification-To", false);\r
+ var oldDNTHeader = mimeHdr.extractHeader("Return-Receipt-To", false);\r
+ if (!DNTHeader && !oldDNTHeader) {\r
+ return;\r
+ }\r
+ // Everything looks good so far, let's generate the MDN delete response.\r
+ var mdnGenerator = Components.classes["@mozilla.org/messenger-mdn/generator;1"].createInstance(Components.interfaces.nsIMsgMdnGenerator);\r
+ if (mdnGenerator.process(MDN_DISPOSE_TYPE_DELETED, msgWindow, msgFolder, msgHdr.messageKey, mimeHdr, true)) {\r
+ mdnGenerator.userAgreed();\r
+ }\r
+}\r
+\r
+\r
+// Extension Hook : replace the built in SetupCommandUpdateHandlers functions defined in mail3PaneWindowCommands.js and in messageWindow.js with our own..\r
+SetupCommandUpdateHandlers = function mdn_extended_SetupCommandUpdateHandlers() {\r
+ //Test if the MDN controller is registered\r
+ // to have not some calls in loop\r
+ if(!MDN_Registered)\r
+ {\r
+ // Call built in SetupCommandUpdateHandlers function\r
+ mdn_extended_OriginalSetupCommandUpdateHandlers();\r
+\r
+ // Register our MDN_DeleteController as the first controller in the list\r
+ top.controllers.insertControllerAt(0, mdn_extended_MDN_DeleteController);\r
+ MDN_Registered=true;\r
+ dump("MDN_DeleteController Registered\n");\r
+ }\r
+}\r
+\r
+\r
+\r