自作のヘッダの値をメールツリーの追加カラムに反映させる方法 〜Thunderbird Extention①〜
Thunderbirdのアドオン作成において、メールのヘッダにアドオン用のヘッダを追加したい場合があると思う。
そこで詰まるのは、カスタムヘッダを追加して、その値をツリーに反映させる方法である。
その方法(と思われるもの)はMDCで紹介されている。
https://developer.mozilla.org/en/Extensions/Thunderbird/customDBHeaders_Preference
しかし、この通りにコードを書いても自作のヘッダの値は読み取れなかった。
getCellText: function(row, col) { //get the messages header so that we can extract the 'X-Superfluous' field var key = gDBView.getKeyAt(row); var hdr = gDBView.db.GetMsgHdrForKey(key); var retval = hdr.getStringProperty("x-superfluous"); dump("x-superfluous: " + retval + "\n"); return retval; },
の
hdr.getStringProperty("x-superfluous");
でプロパティを取得できていないのだ。
なぜ取得できないのかを、延々と考えていたが結局わからず、他にも同じところで詰まっている人がいないか探してみた。
http://groups.google.co.jp/group/mozilla.dev.extensions/browse_thread/thread/3ed8c0e6c6cc5431
http://forums.mozillazine.org/viewtopic.php?t=286938
http://forums.mozillazine.org/viewtopic.php?f=19&t=472969&start=0
などが見つかり、ようやく解決した。
どうやら、nsIMsgDBHdrインタフェースのgetStringProperty("ヘッダ名")メソッドでは、元々用意されているであろうヘッダ(reply-toとかReferencesとか)の値しか取得できないらしいのだ。
どうやらnsIMimeHeadersインタフェースのメソッドを使う必要があるみたいだ。
でもこのnsIMimeHeadersの詳細が良く分からず、コピペになってしまったw
以下、messenger.xulにオーバレイしているxulファイルがインクルードしているjsファイルの中身
ヘッダ名:"X-xxx"
追加カラム名:"xxxCol"
var columnHandler = { getCellText: function(row, col) { //get the messages header so that we can extract the 'X-xxx' field var key = gDBView.getKeyAt(row); //その行(row)のメッセージのkeyを取得 var index = gDBView.findIndexFromKey(key,false); //取得したkeyからそのメッセージのindexを取得 var uri = gDBView.getURIForViewIndex(index); //取得したindexからMessageURIを取得 var headers = mfGetHeaders(uri); //指定したMessageURIのヘッダ一覧を取得 if (headers == null) return ""; var retval = headers.extractHeader("X-xxx",false); //取得したヘッダ一覧から"X-xxx"ヘッダの値を取得 return retval; }, getSortStringForRow: function(hdr) { return headers.extractHeader("X-xxx",false); }, isString: function() {return true;}, getCellProperties: function(row, col, props){}, getImageSrc: function(row, col) {return null;}, getSortLongForRow: function(hdr) {return 0;} } function addCustomColumnHandler() { gDBView.addColumnHandler("xxxCol",columnHandler); } var CreateDbObserver = { // Components.interfaces.nsIObserver observer: function(aMsgFolder, aTopic, aData) { addCustomColumnHandler(); } } function doOnceLoaded(){ var ObserverService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService); ObserverService.addObserver(CreateDbObserver, "MsgCreateDBView", false); window.document.getElementById('folderTree').addEventListener("select",addCustomColumnHandler,false); } window.addEventListener("load",doOnceLoaded,false); function mfGetHeaders(messageURI) { //var messageURI = GetFirstSelectedMessage(); var messageService = messenger.messageServiceFromURI(messageURI); var messageStream = Components.classes["@mozilla.org/network/sync-stream-listener;1"].createInstance() .QueryInterface(Components.interfaces.nsIInputStream); var inputStream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance() .QueryInterface(Components.interfaces.nsIScriptableInputStream); inputStream.init(messageStream); try { messageService.streamMessage(messageURI,messageStream, msgWindow, null, false, null); } catch (ex) { mfDump("Could not stream message '" + messageURI + "'."); return null; } var content = ""; inputStream.available(); while (inputStream.available()) { content = content + inputStream.read(512); var p = content.indexOf("\r\n\r\n"); var p1 = content.indexOf("\r\r"); var p2 = content.indexOf("\n\n"); if (p > 0) { content = content.substring(0, p); break; } if (p1 > 0) { content = content.substring(0, p1); break; } if (p2 > 0) { content = content.substring(0, p2); break; } if (content.length > 512 * 8) { mfDump("Could not find end-of-headers line."); return null; } } content = content + "\r\n"; var headers = Components.classes["@mozilla.org/messenger/mimeheaders;1"].createInstance() .QueryInterface(Components.interfaces.nsIMimeHeaders); headers.initialize(content, content.length); return headers; }
これを実装するために、何日悩んだことかw
でも、MDCのページの画像を見る限り、getStringProperty("ヘッダ名")でカスタムヘッダの値は取得できてるようにしか見えない…
詳細分かる人いたら教えてくださいm(_ _)m