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 @ 97d350

lite_0.1multiEditng_0.6ng_0.6_helpng_0.8ng_0.9
Last change on this file since 97d350 was 97d350, checked in by rene <rene@…>, 14 years ago

created new branch for upcoming 0.6 release. focus on object-orientation. somehow working.

  • Property mode set to 100644
File size: 12.3 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 * ***** END LICENSE BLOCK ***** */
25
26/**
27* some code copied and adapted from 'display Mail User Agent (MUA)'
28* thanks to Christian Weiske <cweiske@cweiske.de>
29*/
30/**
31* some code copied and adapted from 'enigmail'
32* thanks to Patrick Brunschwig <patrick.brunschwig@gmx.net>
33*/
34
35var vI_getHeader = {
36    messenger: null,
37    preferences : Components.classes["@mozilla.org/preferences-service;1"]
38            .getService(Components.interfaces.nsIPrefService)
39            .getBranch("extensions.virtualIdentity."),
40           
41    unicodeConverter : Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
42            .createInstance(Components.interfaces.nsIScriptableUnicodeConverter),
43
44    strings : document.getElementById("vIdentBundle"),
45   
46    headerToSearch : null,
47   
48    prepareHeaderToSearchArray : function() {
49        var headerList = vI_getHeader.unicodeConverter.ConvertToUnicode(vI_getHeader.preferences.getCharPref("smart_reply_headers")).split(/\n/)
50       
51        vI_getHeader.headerToSearch = [];
52       
53        // prepare headerToSearch for speedup.
54        for (var index = 0; index < headerList.length; index++) {
55            var headerToSearch_splitted = headerList[index].split(/:/)
56            // use first part (all before ':') as the header name
57            var headerNameToSearch = headerToSearch_splitted[0].toLowerCase()
58            // check second or third part for any number
59            var headerNumberToSearch = parseInt(headerToSearch_splitted[1])
60            if (isNaN(headerNumberToSearch)) headerNumberToSearch = parseInt(headerToSearch_splitted[2])
61           
62            // create header name to store the value
63            var headerNameToStore = "vI_" + headerNameToSearch
64            if (!isNaN(headerNumberToSearch)) headerNameToStore += ":" + headerNumberToSearch
65           
66            vI_getHeader.headerToSearch.push({ headerNameToSearch : headerNameToSearch, headerNumberToSearch : headerNumberToSearch,
67                    headerNameToStore : headerNameToStore });
68        }
69    },
70
71    getHeader: function() {
72        vI_notificationBar.clear_dump()
73        vI_notificationBar.dump("## vI_getHeader: onEndHeaders\n")
74        var index;
75
76        var srcMsgURI = GetLoadedMessage();
77        if (srcMsgURI == null) return;
78       
79        if (/type=application\/x-message-display/.test(srcMsgURI)) {
80            vI_notificationBar.dump("## vI_getHeader: opening stored Message, can't get Message Header\n");
81            return;
82        }
83       
84        try { var hdr = vI_getHeader.messenger.messageServiceFromURI(srcMsgURI).messageURIToMsgHdr(srcMsgURI); }
85        catch(vErr) {
86            vI_notificationBar.dump("## vI_getHeader: can't get Message Header.\n");
87            return;
88        };
89
90        if (!vI_getHeader.headerToSearch) vI_getHeader.prepareHeaderToSearchArray()
91
92        var found = false; var label = "";
93        var subtitle = vI_getHeader.strings.getString("vident.getHeader.noHeader");
94        // create array to count the header
95        var currentHeadersCounter = []
96        // loop through the headers
97        for (var header in currentHeaderData) {
98            var headerName = currentHeaderData[header].headerName.toLowerCase()
99
100            // remember list-id header to prevent using Mailing-List addresses as sender
101            if (headerName == "list-id") {
102                hdr.setStringProperty("vI_list-id","found");
103                vI_notificationBar.dump("## vI_getHeader: found header: list-id  ...stored to recognize mailing-list\n");
104                continue;
105            }
106
107            if (currentHeadersCounter[headerName]) currentHeadersCounter[headerName]++
108            else currentHeadersCounter[headerName] = 1
109            vI_notificationBar.dump("## vI_getHeader: found header: " + headerName + 
110                    "[:" + currentHeadersCounter[headerName] + "]");
111           
112            for (var index = 0; index < vI_getHeader.headerToSearch.length; index++) {
113                if (headerName == vI_getHeader.headerToSearch[index].headerNameToSearch &&
114                    (isNaN(vI_getHeader.headerToSearch[index].headerNumberToSearch) ||
115                        vI_getHeader.headerToSearch[index].headerNumberToSearch == currentHeadersCounter[headerName])) {
116                   
117                    var value = currentHeaderData[header].headerValue;
118                    if (currentHeadersCounter[headerName] != 1)
119                        value = hdr.getStringProperty(vI_getHeader.headerToSearch[index].headerNameToStore) + 
120                        ", " + value;
121                    hdr.setStringProperty(vI_getHeader.headerToSearch[index].headerNameToStore,vI_getHeader.unicodeConverter.ConvertFromUnicode(value) + vI_getHeader.unicodeConverter.Finish());
122
123                    storedValue = hdr.getProperty(vI_getHeader.headerToSearch[index].headerNameToStore)
124                    storedConvValue = vI_getHeader.unicodeConverter.ConvertToUnicode(storedValue)
125                    vI_notificationBar.dump(" ...stored as '" + storedConvValue + "'");
126                    if (!found) { 
127                        subtitle = vI_getHeader.strings.getString("vident.getHeader.headerFound");
128                        found = true;
129                    }
130                    label += (label)?"\n":""
131                    label += currentHeaderData[header].headerName + 
132                    "[:" + currentHeadersCounter[headerName] + "]:\t" + currentHeaderData[header].headerValue
133                    break;
134                }
135            }
136            vI_notificationBar.dump("\n");
137        }
138        vI_notificationBar.setNote(label, "get_header_notification", subtitle);
139    },
140   
141    hideExtraHeader: function() {
142        var header_list = vI_prepareHeader.addedHeaders
143        for (var index = 0; index < header_list.length; index++) {
144            var header_to_search_splitted=header_list[index].split(/:/)
145            var header_to_search=header_to_search_splitted[0].toLowerCase()
146            if (typeof(gExpandedHeaderView[header_to_search]) == "object") {
147            if (! gViewAllHeaders) {
148                gExpandedHeaderView[header_to_search].enclosingBox.setAttribute("hidden", true);
149            }
150            else {
151                gExpandedHeaderView[header_to_search].enclosingBox.removeAttribute("hidden");
152            }
153            }
154        }
155    },
156
157    setupEventListener: function() {
158        var listener = {};
159        listener.onStartHeaders = vI_getHeader.hideExtraHeader;
160        listener.onEndHeaders   = vI_getHeader.getHeader;
161        gMessageListeners.push(listener);
162
163        vI_getHeader.messenger = Components.classes["@mozilla.org/messenger;1"].createInstance();
164        vI_getHeader.messenger = vI_getHeader.messenger.QueryInterface(Components.interfaces.nsIMessenger);
165        vI_getHeader.strings = document.getElementById("vIdentBundle");
166       
167        vI_getHeader.unicodeConverter.charset = "UTF-8";
168    }
169}
170
171
172var vI_prepareHeader = {
173    prefroot : Components.classes["@mozilla.org/preferences-service;1"]
174            .getService(Components.interfaces.nsIPrefService)
175            .getBranch(null),
176
177    unicodeConverter : Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
178            .createInstance(Components.interfaces.nsIScriptableUnicodeConverter),
179           
180    addedHeaders : [],
181   
182    observer_added : false,
183   
184    init : function() {
185        vI_notificationBar.dump("## vI_prepareHeader: init\n");
186        if (vI_prepareHeader.addExtraHeader()) vI_prepareHeader.addObserver();
187    },
188   
189    cleanup : function() {
190        vI_notificationBar.dump("## vI_prepareHeader: cleanup\n");
191        vI_prepareHeader.removeObserver();
192        vI_prepareHeader.removeExtraHeader();
193    },
194   
195    addObserver : function() {
196        if (vI_prepareHeader.observer_added) return;
197        vI_prepareHeader.prefroot.QueryInterface(Components.interfaces.nsIPrefBranch2);
198        vI_prepareHeader.prefroot.addObserver("extensions.virtualIdentity.smart_reply_headers", this, false);
199        vI_prepareHeader.observer_added = true;
200        vI_notificationBar.dump("## vI_prepareHeader: prefs observer added\n");
201    },
202   
203    removeObserver : function() {
204        if (!vI_prepareHeader.observer_added) return;
205        vI_prepareHeader.prefroot.removeObserver("extensions.virtualIdentity.smart_reply_headers", this);
206        vI_notificationBar.dump("## vI_prepareHeader: prefs observer removed\n");
207        vI_prepareHeader.observer_added = false;
208    },
209   
210    // this is a adapted copy of enigEnsureExtraHeaders() from enigmail, thanks
211    addExtraHeader : function() {
212        vI_notificationBar.dump("## vI_prepareHeader: addExtraHeader\n");
213        vI_prepareHeader.unicodeConverter.charset = "UTF-8";
214        var header_list = vI_prepareHeader.unicodeConverter.ConvertToUnicode(vI_prepareHeader.prefroot.getCharPref("extensions.virtualIdentity.smart_reply_headers")).split(/\n/)
215       
216        // add List-Id to recognizable headers to prevent using Mailing-List addresses as sender
217        header_list.push("List-Id")
218
219        try {
220            var extraHdrs = " " + 
221                vI_prepareHeader.prefroot.getCharPref("mailnews.headers.extraExpandedHeaders").toLowerCase()
222                + " ";
223
224            for (var index = 0; index < header_list.length; index++) {
225                var headerToSearch_splitted = header_list[index].split(/:/)
226                var headerToSearch = headerToSearch_splitted[0].toLowerCase()
227               
228                var j; var found = false;
229                // check if Header is included in collapsed HeaderView
230                for (var j = 0; j < gCollapsedHeaderList.length; j++) {
231                    if (gCollapsedHeaderList[j].name == headerToSearch) {
232                        vI_notificationBar.dump("## vI_prepareHeader: Header '" + headerToSearch + "' in gCollapsedHeaderList\n");
233                        found = true; break;
234                    }
235                }
236                if (found) continue;
237                // check if Header is included in expanded HeaderView
238                for (var j = 0; j < gExpandedHeaderList.length; j++) {
239                    if (gExpandedHeaderList[j].name == headerToSearch) {
240                        vI_notificationBar.dump("## vI_prepareHeader: Header '" + headerToSearch + "' in gExpandedHeaderList\n");
241                        found = true; break;
242                    }
243                }
244                if (found) continue;
245
246                var addedHeadersString = " " + vI_prepareHeader.addedHeaders.join(" ") + " "
247                if ((extraHdrs.indexOf(" " + headerToSearch + " ") < 0) &&
248                    (addedHeadersString.indexOf(" " + headerToSearch + " ") < 0))
249                    vI_prepareHeader.addedHeaders.push(headerToSearch);
250                else vI_notificationBar.dump("## vI_prepareHeader: Header '" + headerToSearch + "' already in extraExpandedHeaders\n");
251            }
252           
253            if (vI_prepareHeader.addedHeaders.length > 0) {
254                extraHdrs += vI_prepareHeader.addedHeaders.join(" ");
255                extraHdrs = extraHdrs.replace(/^\s+|\s+$/g,"")
256                vI_prepareHeader.prefroot.setCharPref("mailnews.headers.extraExpandedHeaders", extraHdrs)
257            }
258            vI_notificationBar.dump("## vI_prepareHeader: extraExpandedHeaders '" + vI_prepareHeader.addedHeaders.join(" ") + "' added\n");
259           
260           
261            vI_notificationBar.dump("## vI_prepareHeader: done\n");
262            return true;
263        }
264        catch (e) {
265            vI_notificationBar.dump("## vI_prepareHeader: your application is too old, please update. Otherwise try to install mnenhy or enigmail to use additional headers.")
266            return false;
267        }
268    },
269
270    removeExtraHeader: function() {
271        vI_notificationBar.dump("## vI_prepareHeader: cleanupExtraHeader\n");
272
273        if (vI_prepareHeader.addedHeaders.length > 0) {
274            var extraHdrs = vI_prepareHeader.prefroot.getCharPref("mailnews.headers.extraExpandedHeaders").toLowerCase().split(/ /);
275       
276            for (var i = 0; i < vI_prepareHeader.addedHeaders.length; i++) {
277                for (var j = 0; j < extraHdrs.length; j++) {
278                    if (extraHdrs[j] == vI_prepareHeader.addedHeaders[i]) {
279                        extraHdrs.splice(j,1);
280                        break;
281                    }
282                }
283            }
284            vI_prepareHeader.prefroot.setCharPref("mailnews.headers.extraExpandedHeaders", extraHdrs.join(" "))
285            vI_notificationBar.dump("## vI_prepareHeader: extraExpandedHeaders '" + vI_prepareHeader.addedHeaders.join(" ") + "' removed\n");
286            vI_prepareHeader.addedHeaders = [];
287        }
288    },
289   
290    observe: function(subject, topic, data) {
291        if (topic == "nsPref:changed") {
292            vI_prepareHeader.removeExtraHeader();
293            vI_prepareHeader.addExtraHeader();
294            vI_notificationBar.dump("## vI_prepareHeader: changed preference '" + subject + " " + topic + " " + data + "'\n");
295           
296            // remove (old) prepared headerArray
297            vI_getHeader.headerToSearch = null;
298           
299            vI_notificationBar.dump("## vI_prepareHeader: reload Message\n");
300            MsgReload();
301        }
302    }
303}
304
305addEventListener('messagepane-loaded', vI_getHeader.setupEventListener, true);
306window.addEventListener("load", function(e) { vI_prepareHeader.init(); }, false);
307window.addEventListener("unload", function(e) { vI_prepareHeader.cleanup(); }, false);
Note: See TracBrowser for help on using the repository browser.