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

source: chrome/content/v_identity/vI_getHeader.js @ c135ae

ng_0.8 0.8.9
Last change on this file since c135ae was 641d95, checked in by rene <rene@…>, 11 years ago

fixed to re-enable smartReply

  • Property mode set to 100644
File size: 15.5 KB
Line 
1/* ***** BEGIN LICENSE BLOCK *****
2    This program is free software; you can redistribute it and/or modify
3    it under the terms of the GNU General Public License as published by
4    the Free Software Foundation; either version 2 of the License, or
5    (at your option) any later version.
6
7    This program is distributed in the hope that it will be useful,
8    but WITHOUT ANY WARRANTY; without even the implied warranty of
9    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10    GNU General Public License for more details.
11
12    You should have received a copy of the GNU General Public License
13    along with this program; if not, write to the Free Software
14    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
15
16    The Original Code is the Virtual Identity Extension.
17
18    The Initial Developer of the Original Code is Rene Ejury.
19    Portions created by the Initial Developer are Copyright (C) 2007
20    the Initial Developer. All Rights Reserved.
21
22    Contributor(s): Christian Weiske
23    Contributor(s): Patrick Brunschwig
24    Contributor(s): http://xulsolutions.blogspot.com/2006/07/creating-uninstall-script-for.html
25
26 * ***** END LICENSE BLOCK ***** */
27
28/**
29* some code copied and adapted from 'display Mail User Agent (MUA)'
30* thanks to Christian Weiske <cweiske@cweiske.de>
31*/
32/**
33* some code copied and adapted from 'enigmail'
34* thanks to Patrick Brunschwig <patrick.brunschwig@gmx.net>
35*/
36/**
37* some code copied and adapted from 'http://xulsolutions.blogspot.com/2006/07/creating-uninstall-script-for.html'
38* thanks to the unknown programmer
39*/
40
41virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) {
42var getHeader = {
43    messenger: null,
44    preferences : Components.classes["@mozilla.org/preferences-service;1"]
45            .getService(Components.interfaces.nsIPrefService)
46            .getBranch("extensions.virtualIdentity."),
47           
48    unicodeConverter : Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
49            .createInstance(Components.interfaces.nsIScriptableUnicodeConverter),
50
51    strings : document.getElementById("vIdentBundle"),
52   
53    headerToSearch : null,
54   
55    prepareHeaderToSearchArray : function() {
56        var headerList = getHeader.unicodeConverter.ConvertToUnicode(getHeader.preferences.getCharPref("smart_reply_headers")).split(/\n/)
57       
58        getHeader.headerToSearch = [];
59       
60        // prepare headerToSearch for speedup.
61        for (var index = 0; index < headerList.length; index++) {
62            var headerToSearch_splitted = headerList[index].split(/:/)
63            // use first part (all before ':') as the header name
64            var headerNameToSearch = headerToSearch_splitted[0].toLowerCase()
65            // check second or third part for any number
66            var headerNumberToSearch = parseInt(headerToSearch_splitted[1])
67            if (isNaN(headerNumberToSearch)) headerNumberToSearch = parseInt(headerToSearch_splitted[2])
68           
69            // create header name to store the value
70            var headerNameToStore = "vI_" + headerNameToSearch
71            if (!isNaN(headerNumberToSearch)) headerNameToStore += ":" + headerNumberToSearch
72           
73            getHeader.headerToSearch.push({ headerNameToSearch : headerNameToSearch, headerNumberToSearch : headerNumberToSearch,
74                    headerNameToStore : headerNameToStore });
75        }
76    },
77
78    getHeaderDummy: function() {
79       
80    },
81   
82    getHeader: function(hdr) {
83        vI.notificationBar.clear_dump()
84        var index;
85
86        if (!getHeader.headerToSearch) getHeader.prepareHeaderToSearchArray()
87
88        var found = false; var label = "";
89        var subtitle = getHeader.strings.getString("vident.getHeader.noHeader");
90        // create array to count the header
91        var currentHeadersCounter = [];
92       
93        var listId = false; var received = false; var content_base = false;
94        for (var header in currentHeaderData) {
95            var headerName = currentHeaderData[header].headerName.toLowerCase();
96//          vI.notificationBar.dump("## getHeader: found header: " + currentHeaderData[header].headerName + "\n");
97
98            // remember list-id header to prevent using Mailing-List addresses as sender
99            if (!listId && headerName == "list-id") {
100                hdr.setStringProperty("vI_list-id","found"); listId = true;
101                vI.notificationBar.dump("## getHeader: found header: list-id  ...stored to recognize mailing-list\n");
102//              continue;
103            }
104
105            // remember received header to prevent using Mailing-List addresses as sender
106            if (!received && headerName == "received") {
107                hdr.setStringProperty("vI_received","found"); received = true;
108                vI.notificationBar.dump("## getHeader: found header: received  ...stored to recognize received mail\n");
109//              continue;
110            }
111           
112            // remember content-base header to prevent using Blog/News-Feed addresses as sender
113            if (!content_base && headerName == "content-base") {
114                hdr.setStringProperty("vI_content_base","found"); content_base = true;
115                vI.notificationBar.dump("## getHeader: found header: content-base  ...stored to recognize blog/news-feed\n");
116//              continue;
117            }
118
119            if (currentHeadersCounter[headerName]) currentHeadersCounter[headerName]++
120            else currentHeadersCounter[headerName] = 1
121           
122            for (var index = 0; index < getHeader.headerToSearch.length; index++) {
123                if (headerName == getHeader.headerToSearch[index].headerNameToSearch &&
124                    (isNaN(getHeader.headerToSearch[index].headerNumberToSearch) ||
125                        getHeader.headerToSearch[index].headerNumberToSearch == currentHeadersCounter[headerName])) {
126                   
127                    var value = currentHeaderData[header].headerValue;
128                    if (currentHeadersCounter[headerName] != 1)
129                        value = hdr.getStringProperty(getHeader.headerToSearch[index].headerNameToStore) + 
130                        ", " + value;
131                    hdr.setStringProperty(getHeader.headerToSearch[index].headerNameToStore,getHeader.unicodeConverter.ConvertFromUnicode(value) + getHeader.unicodeConverter.Finish());
132
133                    var storedValue = hdr.getProperty(getHeader.headerToSearch[index].headerNameToStore)
134                    var storedConvValue = getHeader.unicodeConverter.ConvertToUnicode(storedValue)
135                    vI.notificationBar.dump("## getHeader: found header: " + headerName +
136                        "[:" + currentHeadersCounter[headerName] + "] - stored as '" + 
137                        storedConvValue + "'\n");
138                    if (!found) { 
139                        subtitle = getHeader.strings.getString("vident.getHeader.headerFound");
140                        found = true;
141                    }
142                    label += (label)?"\n":""
143                    label += currentHeaderData[header].headerName + 
144                    "[:" + currentHeadersCounter[headerName] + "]:\t" + currentHeaderData[header].headerValue
145                    break;
146                }
147            }
148        }
149        vI.notificationBar.setNote(label, "get_header_notification", subtitle);
150    },
151   
152    hideExtraHeader: function() {
153        var addedHdrs = prepareHeader.prefroot.getCharPref("extensions.virtualIdentity.smart_reply_added_extraHeaders").split(/ /);
154        for (var index = 0; index < addedHdrs.length; index++) {
155            var header_to_search_splitted=addedHdrs[index].split(/:/)
156            var header_to_search=header_to_search_splitted[0].toLowerCase()
157            if (typeof(gExpandedHeaderView[header_to_search]) == "object") {
158                if (! gViewAllHeaders) {
159                    gExpandedHeaderView[header_to_search].enclosingBox.setAttribute("hidden", true);
160                }
161                else {
162                    gExpandedHeaderView[header_to_search].enclosingBox.removeAttribute("hidden");
163                }
164            }
165        }
166    },
167
168    setupEventListener: function() {
169        var listener = {};
170        listener.onStartHeaders = getHeader.hideExtraHeader;
171        listener.onEndHeaders   = getHeader.getHeaderDummy;
172        gMessageListeners.push(listener);
173
174        getHeader.messenger = Components.classes["@mozilla.org/messenger;1"].createInstance();
175        getHeader.messenger = getHeader.messenger.QueryInterface(Components.interfaces.nsIMessenger);
176        getHeader.strings = document.getElementById("vIdentBundle");
177       
178        getHeader.unicodeConverter.charset = "UTF-8";
179       
180        // read headers later if msg is loaded completely - this ensures compatibility to Thunderbird Conversation
181        getHeader.orig_OnMsgLoaded = OnMsgLoaded;
182        OnMsgLoaded = getHeader.OnMsgLoaded;
183    },
184   
185    OnMsgLoaded: function(url) {
186        const Cc = Components.classes;
187        const Ci = Components.interfaces;
188        // Necko URL, so convert it into a message header
189        let ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
190        var neckoURL = ioService.newURI(null, null, url.baseURI);
191        neckoURL.QueryInterface(Ci.nsIMsgMessageUrl);
192       
193        var msgHdr = neckoURL.messageHeader;
194        if (msgHdr) getHeader.getHeader(msgHdr);
195        getHeader.orig_OnMsgLoaded(url)
196    }
197}
198
199
200var prepareHeader = {
201    prefroot : Components.classes["@mozilla.org/preferences-service;1"]
202            .getService(Components.interfaces.nsIPrefService)
203            .getBranch(null),
204
205    unicodeConverter : Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
206            .createInstance(Components.interfaces.nsIScriptableUnicodeConverter),
207           
208    observer_added : false,
209   
210    init : function() {
211        prepareHeader.orig_initializeHeaderViewTables = initializeHeaderViewTables;
212        initializeHeaderViewTables = prepareHeader.replacement_initializeHeaderViewTables;
213        if (prepareHeader.addExtraHeader()) prepareHeader.addObserver();
214    },
215   
216    replacement_initializeHeaderViewTables : function() {
217        prepareHeader.cleanup();
218        vI.notificationBar.dump("## getHeader: initializeHeaderViewTables\n");
219        prepareHeader.orig_initializeHeaderViewTables();
220        if (prepareHeader.addExtraHeader()) prepareHeader.addObserver();
221    },
222   
223    cleanup : function() {
224        prepareHeader.removeObserver();
225        prepareHeader.removeExtraHeader();
226    },
227   
228    addObserver : function() {
229        if (prepareHeader.observer_added) return;
230        prepareHeader.prefroot.QueryInterface(Components.interfaces.nsIPrefBranch2);
231        prepareHeader.prefroot.addObserver("extensions.virtualIdentity.smart_reply_headers", this, false);
232        prepareHeader.uninstallObserver.register();
233        prepareHeader.observer_added = true;
234    },
235   
236    removeObserver : function() {
237        if (!prepareHeader.observer_added) return;
238        prepareHeader.prefroot.removeObserver("extensions.virtualIdentity.smart_reply_headers", this);
239        prepareHeader.uninstallObserver.unregister();
240        prepareHeader.observer_added = false;
241    },
242   
243    // this is a adapted copy of enigEnsureExtraHeaders() from enigmail, thanks
244    addExtraHeader : function() {
245        prepareHeader.unicodeConverter.charset = "UTF-8";
246        var header_list = prepareHeader.unicodeConverter.ConvertToUnicode(prepareHeader.prefroot.getCharPref("extensions.virtualIdentity.smart_reply_headers")).split(/\n/)
247       
248        // add List-Id to recognizable headers to prevent using Mailing-List addresses as sender
249        header_list.push("List-Id")
250
251        // add Received to recognizable headers to detect if mail was sent or received
252        header_list.push("Received")
253
254        // add Website to recognizable headers to detect Blog/News-Posts
255        header_list.push("content-base")
256
257//      try {
258            var extraHdrs = " " + 
259                prepareHeader.prefroot.getCharPref("mailnews.headers.extraExpandedHeaders").toLowerCase();
260
261            var addedHeaders = prepareHeader.prefroot.getCharPref("extensions.virtualIdentity.smart_reply_added_extraHeaders");
262
263            for (var index = 0; index < header_list.length; index++) {
264                var headerToSearch_splitted = header_list[index].split(/:/)
265                var headerToSearch = headerToSearch_splitted[0].toLowerCase()
266               
267                var j; var found = false;
268               
269                // collapsedHeaderView is removed in
270                // https://bugzilla.mozilla.org/show_bug.cgi?id=480623
271                // http://build.mozillamessaging.com/mercurial/comm-central/rev/1fbbd90413d9
272                if (typeof(gCollapsedHeaderList) != "undefined") {
273                    // check if Header is included in collapsed HeaderView
274                    for (var j = 0; j < gCollapsedHeaderList.length; j++) {
275                        if (gCollapsedHeaderList[j].name == headerToSearch) {
276    //                      vI.notificationBar.dump("## prepareHeader: Header '" + headerToSearch + "' in gCollapsedHeaderList\n");
277                            found = true; break;
278                        }
279                    }
280                    if (found) continue;
281                }
282
283                // check if Header is included in expanded HeaderView
284                for (var j = 0; j < gExpandedHeaderList.length; j++) {
285                    if (gExpandedHeaderList[j].name == headerToSearch) {
286//                      vI.notificationBar.dump("## prepareHeader: Header '" + headerToSearch + "' in gExpandedHeaderList\n");
287                        found = true; break;
288                    }
289                }
290                if (found) continue;
291
292                if ((extraHdrs.indexOf(" " + headerToSearch + " ") < 0) &&
293                    (addedHeaders.indexOf(" " + headerToSearch + " ") < 0))
294                        addedHeaders += " " + headerToSearch;
295//              else vI.notificationBar.dump("## prepareHeader: Header '" + headerToSearch + "' already in extraExpandedHeaders\n");
296            }
297           
298            addedHeaders = addedHeaders.replace(/^\s+|\s+$/g,"")
299            if (addedHeaders.length > 0) {
300                extraHdrs += " " + addedHeaders;
301                extraHdrs = extraHdrs.replace(/^\s+|\s+$/g,"")
302                prepareHeader.prefroot.setCharPref("mailnews.headers.extraExpandedHeaders", extraHdrs)
303                prepareHeader.prefroot.setCharPref("extensions.virtualIdentity.smart_reply_added_extraHeaders", addedHeaders)
304                vI.notificationBar.dump("## prepareHeader: extraExpandedHeaders '" + addedHeaders + "' added\n");
305            }       
306
307            return true;
308//      }
309//      catch (e) {
310//          vI.notificationBar.dump("## prepareHeader: your application is too old, please update. Otherwise try to install mnenhy or enigmail to use additional headers.")
311//          return false;
312//      }
313    },
314
315    removeExtraHeader: function() {
316        vI.notificationBar.dump("## prepareHeader: cleanupExtraHeader\n");
317
318        var addedHdrs = prepareHeader.prefroot.getCharPref("extensions.virtualIdentity.smart_reply_added_extraHeaders").split(/ /);
319
320        if (addedHdrs.length > 0) {
321            var extraHdrs = prepareHeader.prefroot.getCharPref("mailnews.headers.extraExpandedHeaders").toLowerCase().split(/ /);
322       
323            for (var i = 0; i < addedHdrs.length; i++) {
324                for (var j = 0; j < extraHdrs.length; j++) {
325                    if (extraHdrs[j] == addedHdrs[i]) {
326                        extraHdrs.splice(j,1);
327                        break;
328                    }
329                }
330            }
331            vI.notificationBar.dump("## prepareHeader: extraExpandedHeaders '" + addedHdrs.join(" ") + "' removed\n");
332            prepareHeader.prefroot.setCharPref("mailnews.headers.extraExpandedHeaders", extraHdrs.join(" "))
333            prepareHeader.prefroot.setCharPref("extensions.virtualIdentity.smart_reply_added_extraHeaders", "")
334        }
335    },
336   
337    observe: function(subject, topic, data) {
338        if (topic == "nsPref:changed") {
339            prepareHeader.removeExtraHeader();
340            prepareHeader.addExtraHeader();
341            vI.notificationBar.dump("## prepareHeader: changed preference '" + subject + " " + topic + " " + data + "'\n");
342           
343            // remove (old) prepared headerArray
344            getHeader.headerToSearch = null;
345           
346            vI.notificationBar.dump("## prepareHeader: reload Message\n");
347            MsgReload();
348        }
349    },
350
351//  code adapted from http://xulsolutions.blogspot.com/2006/07/creating-uninstall-script-for.html
352    uninstallObserver : {
353        _uninstall : false,
354        observe : function(subject, topic, data) {
355            if (topic == "quit-application-granted") {
356                /* uninstall stuff. */
357                vI.notificationBar.dump("## vI.uninstall: uninstall/disabledment \n");
358                prepareHeader.removeExtraHeader();
359                vI.notificationBar.dump("## vI.uninstall: uninstall/disablement done\n");
360                this.unregister();
361            }
362        },
363        register : function() {
364            Components.classes["@mozilla.org/observer-service;1"].
365                getService(Components.interfaces.nsIObserverService).
366                    addObserver(this, "quit-application-granted", false);
367        },
368        unregister : function() {
369            Components.classes["@mozilla.org/observer-service;1"].
370                getService(Components.interfaces.nsIObserverService).
371                    removeObserver(this,"quit-application-granted");
372        }
373    }
374}
375addEventListener('messagepane-loaded', getHeader.setupEventListener, true);
376window.addEventListener("load", function(e) { prepareHeader.init(); }, false);
377window.addEventListener("unload", function(e) { prepareHeader.cleanup(); }, false);
378}});
Note: See TracBrowser for help on using the repository browser.