Advertisement
rubo77

thunderbird EditEmailSubject 2.0.2

Mar 18th, 2013
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  Copyright (C) 2011-2012 JC Prin. (jisse44)
  3.  
  4.     This program is free software: you can redistribute it and/or modify
  5.     it under the terms of the GNU General Public License as published by
  6.     the Free Software Foundation.
  7.  
  8.     This program is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.     GNU General Public License for more details.
  12.  
  13.     You should have received a copy of the GNU General Public License
  14.     along with this program.  If not, see <http://www.gnu.org/licenses/>
  15. */
  16.  
  17. var objEditemailsubject = {
  18.    
  19.     msgFolder : null,  
  20.     msgHeader : null,
  21.     consoleService : Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService),
  22.         extSettings : Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch),
  23.  
  24.  
  25.     initDialog : function() {
  26.  
  27.         objEditemailsubject.consoleService.logStringMessage("EditEmailSubject start");
  28.         document.getElementById("editemailsubjectInput").value = window.arguments[0].subject;
  29.     },
  30.  
  31.  
  32.     exitDialog : function(cancel) {
  33.  
  34.         window.arguments[0].cancel = cancel;
  35.         if (cancel) return true;
  36.  
  37.         window.arguments[0].subject = document.getElementById("editemailsubjectInput").value;
  38.  
  39.         return true;
  40.     },
  41.  
  42.  
  43.    
  44.  
  45.     getOrigDate : function() {
  46.  
  47.         var dateOrig = "";
  48.         try {
  49.             var str_message = objEditemailsubject.listener.text;
  50.             dateOrig = str_message.split("\nDate:")[1].split("\n")[0];
  51.             dateOrig = dateOrig.replace(/ +$/,"");
  52.             dateOrig = dateOrig.replace(/^ +/,"");
  53.         }
  54.         catch(e) {}
  55.         return dateOrig;
  56.     },
  57.    
  58.  
  59.     edit: function() {
  60.  
  61.         if (objEditemailsubject.extSettings.getBoolPref("extensions.editemailsubject.localOnly")) {
  62.            
  63.             //var msg = gDBView.hdrForFirstSelectedMessage;
  64.             //objEditemailsubject.msgHeader = msg.QueryInterface(Components.interfaces.nsIMsgDBHdr);
  65.             objEditemailsubject.msgHeader = gDBView.hdrForFirstSelectedMessage;
  66.        
  67.             var newMsgHeader = {};
  68.             newMsgHeader.subject = objEditemailsubject.msgHeader.mime2DecodedSubject;
  69.  
  70.             window.openDialog("chrome://editemailsubject/content/editemailsubjectPopup.xul","","chrome,modal,centerscreen,resizable ",newMsgHeader);
  71.  
  72.             if (newMsgHeader.cancel) return;
  73.  
  74.             objEditemailsubject.msgHeader.subject = unescape(encodeURIComponent(newMsgHeader.subject));
  75.         }
  76.         else {
  77.             var msgUri = gFolderDisplay.selectedMessageUris[0];
  78.             var mms = messenger.messageServiceFromURI(msgUri).QueryInterface(Components.interfaces.nsIMsgMessageService);
  79.  
  80.             objEditemailsubject.msgHeader = mms.messageURIToMsgHdr(msgUri);
  81.             objEditemailsubject.msgFolder = objEditemailsubject.msgHeader.folder;
  82.             mms.streamMessage(msgUri, objEditemailsubject.listener, null, null, false, null);
  83.         }  
  84.     },
  85.  
  86.  
  87.     cleanNR : function(data) {
  88.  
  89.         var newData = data.replace(/\r/g, "");  //for RFC2822
  90.  
  91.         newData = newData.replace(/\n/g, "\r\n");
  92.  
  93.         return newData;
  94.     },
  95.  
  96.  
  97.     listener : {
  98.  
  99.         QueryInterface : function(iid)  {
  100.  
  101.                     if (iid.equals(Components.interfaces.nsIStreamListener) ||  
  102.                         iid.equals(Components.interfaces.nsISupports))
  103.                      return this;
  104.        
  105.                     throw Components.results.NS_NOINTERFACE;
  106.                     return 0;
  107.             },
  108.        
  109.             onStartRequest : function (aRequest, aContext) {
  110.             objEditemailsubject.listener.text = "";        
  111.         },
  112.            
  113.             onStopRequest : function (aRequest, aContext, aStatusCode) {
  114.  
  115.             var isImap = (objEditemailsubject.msgFolder.server.type == "imap") ? true : false;
  116.             var date = objEditemailsubject.getOrigDate();
  117.             var originalSubject = objEditemailsubject.msgHeader.mime2DecodedSubject;               
  118.             var newMsgHeader = {};
  119.  
  120.             if (objEditemailsubject.msgHeader.flags & 0x0010) originalSubject ="Re: "+ originalSubject;
  121.             newMsgHeader.subject = originalSubject;
  122.             newMsgHeader.date = date;
  123.             newMsgHeader.replyto = objEditemailsubject.msgHeader.getStringProperty("replyTo");
  124.             newMsgHeader.author = objEditemailsubject.msgHeader.mime2DecodedAuthor;
  125.             newMsgHeader.recipients = objEditemailsubject.msgHeader.mime2DecodedRecipients;
  126.  
  127.             var text = objEditemailsubject.listener.text;
  128.             if (text.indexOf("X-EditEmailSubject:") < 0) window.openDialog("chrome://editemailsubject/content/editemailsubjectPopup.xul","","chrome,modal,centerscreen,resizable",newMsgHeader);
  129.             else window.openDialog("chrome://editemailsubject/content/editemailsubjectPopup2.xul","","chrome,modal,centerscreen,resizable",newMsgHeader);
  130.  
  131.             if (newMsgHeader.cancel) return;
  132.        
  133.             var newSubEnc = unescape(encodeURIComponent(newMsgHeader.subject));
  134.             var newAuthEnc = unescape(encodeURIComponent(newMsgHeader.author));    
  135.             var newRecEnc = unescape(encodeURIComponent(newMsgHeader.recipients));
  136.  
  137.             var newReplytoEnc = "";
  138.             if (newMsgHeader.replyto) newReplytoEnc = unescape(encodeURIComponent(newMsgHeader.replyto));
  139.             else newReplytoEnc = null;
  140.        
  141.             var data = objEditemailsubject.cleanNR(objEditemailsubject.listener.text);
  142.             var endHeaders = data.search(/\r\n\r\n/);
  143.             var headers = data.substring(0,endHeaders);
  144.  
  145.             while(headers.match(/\r\nSubject: .*\r\n\s+/))
  146.                 headers = headers.replace(/(\r\nSubject: .*)(\r\n\s+)/, "$1 ");
  147.  
  148.             while(headers.match(/\r\nFrom: .*\r\n\s+/))
  149.                 headers = headers.replace(/(\r\nFrom: .*)(\r\n\s+)/, "$1 ");
  150.  
  151.             while(headers.match(/\r\nTo: .*\r\n\s+/))
  152.                 headers = headers.replace(/(\r\nTo: .*)(\r\n\s+)/, "$1 ");
  153.  
  154.             if (headers.indexOf("Subject:") > -1) headers = headers.replace(/\nSubject: .*\r\n/, "\nSubject: "+ newSubEnc+"\r\n");
  155.             else headers = headers+("\r\nSubject: "+newSubEnc);
  156.  
  157.             if (headers.indexOf("From:") > -1) headers = headers.replace(/\nFrom: .*\r\n/, "\nFrom: "+ newAuthEnc+"\r\n");
  158.             else headers = headers+("\r\nFrom: "+newAuthEnc);
  159.  
  160.             if (headers.indexOf("To:") > -1) headers = headers.replace(/\nTo: .*\r\n/, "\nTo: "+ newRecEnc+"\r\n");
  161.             else headers = headers+("\r\nTo: "+newRecEnc);
  162.  
  163.             if (headers.indexOf("Date:") > -1) headers = headers.replace(/\nDate: .*\r\n/, "\nDate: "+newMsgHeader.date+"\r\n");
  164.             else headers = headers+("\r\nDate: "+newMsgHeader.date);
  165.  
  166.             if (newReplytoEnc) {
  167.                 if (headers.indexOf("Reply-To:") > -1) headers = headers.replace(/\nReply\-To: .*\r\n/, "\nReply-To: "+newMsgHeader.replyto+"\r\n");
  168.                 else headers = headers+("\r\nReply-To: "+newMsgHeader.replyto);
  169.             }
  170.            
  171.             /* Hack to prevent blank line into headers and binary attachments broken. Thanks to Achim Czasch for fix */    
  172.             headers = headers.replace(/\r\r/,"\r");
  173.    
  174.             data = headers + data.substring(endHeaders);
  175.  
  176.             data = data.replace(/^From - .+\r\n/, "");
  177.             data = data.replace(/X-Mozilla-Status.+\r\n/, "");
  178.             data = data.replace(/X-Mozilla-Status2.+\r\n/, "");
  179.             data = data.replace(/X-Mozilla-Keys.+\r\n/, "");
  180.  
  181.            
  182.             var now = new Date;
  183.             var EditEmailSubjectHead = "X-EditEmailSubject: "+now.toString();
  184.             EditEmailSubjectHead = EditEmailSubjectHead.replace(/\(.+\)/, "");
  185.             EditEmailSubjectHead = EditEmailSubjectHead.substring(0,75);
  186.  
  187.             var EditEmailSubjectOriginal = "X-EditEmailSubject-OriginalSubject: "+unescape(encodeURIComponent(objEditemailsubject.msgHeader.mime2DecodedSubject));
  188.             EditEmailSubjectOriginal = EditEmailSubjectOriginal.replace(/\(.+\)/, "");
  189.  
  190.             if (data.indexOf("\nX-EditEmailSubject: ") < 0) data = data.replace("\r\n\r\n","\r\n"+EditEmailSubjectHead+"\r\n"+EditEmailSubjectOriginal+"\r\n\r\n");
  191.             else data = data.replace(/\nX-EditEmailSubject: .+\r\n/,"\n"+EditEmailSubjectHead+"\r\n");
  192.                
  193.                        
  194.             if (isImap) {
  195.                 objEditemailsubject.consoleService.logStringMessage("isImap");
  196.                 // Some IMAP provider (for ex. GMAIL) doesn't register changes in sorce if the main headers
  197.                 // are not different from an existing message. To work around this limit, the "Date" field is
  198.                 // modified, if necessary, adding a second to the time (or decreasing a second if second are 59)
  199.                 var newDate = date.replace(/(\d{2}):(\d{2}):(\d{2})/, function (str, p1, p2, p3) {
  200.                     var z = parseInt(p3)+1;
  201.                     if (z > 59) z = 58;
  202.                     if (z < 10) z = "0"+z.toString();
  203.                     return p1+":"+p2+":"+z});
  204.                 data = data.replace(date,newDate);
  205.             }
  206.  
  207.             var tempFile = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("TmpD", Components.interfaces.nsIFile);  
  208.             tempFile.append("EMS.eml");
  209.             tempFile.createUnique(0,0664);
  210.  
  211.             var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
  212.             foStream.init(tempFile, 2, 0x200, false);
  213.             foStream.write(data,data.length);
  214.             foStream.close();
  215.                    
  216.             var flags = objEditemailsubject.msgHeader.flags;
  217.             var keys = objEditemailsubject.msgHeader.getStringProperty("keywords");
  218.  
  219.             objEditemailsubject.list = Components.classes["@mozilla.org/array;1"].createInstance(Components.interfaces.nsIMutableArray);
  220.             objEditemailsubject.list.appendElement(objEditemailsubject.msgHeader, false);
  221.  
  222.             var fileSpec = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
  223.             fileSpec.initWithPath(tempFile.path);
  224.             var folderCopy = objEditemailsubject.msgHeader.folder;
  225.             var extService = Components.classes['@mozilla.org/uriloader/external-helper-app-service;1'].getService(Components.interfaces.nsPIExternalAppLauncher);
  226.             extService.deleteTemporaryFileOnExit(fileSpec);
  227.  
  228.             folderCopy.copyFileMessage(fileSpec, null, false, flags, keys, null, objEditemailsubject.copyListener);
  229.             //objEditemailsubject.msgFolder.deleteMessages(objEditemailsubject.list,null,true,true,null,false);
  230.                            
  231.         },
  232.    
  233.             onDataAvailable : function (aRequest, aContext, aInputStream, aOffset, aCount) {
  234.  
  235.             var scriptStream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance().QueryInterface(Components.interfaces.nsIScriptableInputStream);
  236.             scriptStream.init(aInputStream);
  237.             objEditemailsubject.listener.text += scriptStream.read(scriptStream.available());
  238.          }        
  239.     },
  240.  
  241.  
  242.     copyListener : {
  243.  
  244.         QueryInterface : function(iid) {
  245.  
  246.             if (iid.equals(Components.interfaces.nsIMsgCopyServiceListener) ||
  247.             iid.equals(Components.interfaces.nsISupports))
  248.             return this;
  249.  
  250.             throw Components.results.NS_NOINTERFACE;
  251.             return 0;
  252.         },
  253.  
  254.         GetMessageId: function (messageId) {},
  255.         OnProgress: function (progress, progressMax) {},
  256.         OnStartCopy: function () {},
  257.         OnStopCopy: function (status) {},
  258.  
  259.         SetMessageKey: function (key) {
  260.  
  261.             if (objEditemailsubject.msgFolder.server.type == "imap" || objEditemailsubject.msgFolder.server.type == "news") {
  262.                 Components.classes["@mozilla.org/messenger/services/session;1"].getService(Components.interfaces.nsIMsgMailSession).AddFolderListener(objEditemailsubject.folderListener, Components.interfaces.nsIFolderListener.all);
  263.                 objEditemailsubject.folderListener.key = key;
  264.                 objEditemailsubject.folderListener.URI = objEditemailsubject.msgFolder.URI;
  265.             }
  266.             else setTimeout(function() {objEditemailsubject.postActions(key);}, 500);
  267.         }
  268.     },
  269.  
  270.     postActions : function(key) {
  271.  
  272.         gDBView.selectMsgByKey(key);
  273.         var msgHeader = objEditemailsubject.msgFolder.GetMessageHeader(key);
  274.  
  275.         if (msgHeader.flags & 2) objEditemailsubject.msgFolder.addMessageDispositionState(msgHeader,0);
  276.             if (msgHeader.flags & 4096) objEditemailsubject.msgFolder.addMessageDispositionState(msgHeader,1);
  277.        
  278.         objEditemailsubject.msgFolder.deleteMessages(objEditemailsubject.list,null,true,true,null,false);
  279.     },
  280.  
  281.     folderListener  : {
  282.  
  283.         OnItemAdded: function(parentItem, item, view) {
  284.  
  285.             try {
  286.                 var msgHeader = item.QueryInterface(Components.interfaces.nsIMsgDBHdr);
  287.             }
  288.             catch(e) {
  289.                      return;
  290.             }
  291.             if (objEditemailsubject.folderListener.key == msgHeader.messageKey && objEditemailsubject.folderListener.URI == msgHeader.folder.URI) {
  292.                 objEditemailsubject.postActions(objEditemailsubject.folderListener.key);
  293.                 Components.classes["@mozilla.org/messenger/services/session;1"].getService(Components.interfaces.nsIMsgMailSession).RemoveFolderListener(objEditemailsubject.folderListener);
  294.             }            
  295.         },
  296.  
  297.         OnItemRemoved: function(parentItem, item, view) {},
  298.         OnItemPropertyChanged: function(item, property, oldValue, newValue) {},
  299.         OnItemIntPropertyChanged: function(item, property, oldValue, newValue) {},
  300.         OnItemBoolPropertyChanged: function(item, property, oldValue, newValue) {},
  301.         OnItemUnicharPropertyChanged: function(item, property, oldValue, newValue){},
  302.         OnItemPropertyFlagChanged: function(item, property, oldFlag, newFlag) {},
  303.         OnItemEvent: function(folder, event) {}
  304.     }
  305.  
  306. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement