自作のヘッダの値をメールツリーの追加カラムに反映させる方法 〜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