Firefox ExtensionでC++プログラムを動かしてみるテスト 〜その1 IDLでAPIを書いてみる〜

あまり積極的に使われてないようだが、Firefox ExtentionはJavaScriptだけではなくC++Javaで書かれたプログラムを動かす事が出来る。

一応、今までの実験で本当に動かす事が出来るという確認は取れたのでいよいよサンプルコードの実装に取りかかってみる。

SDK

実装には、Gecko SDKが必要になる。以降の話は1.9.1を前提で進める。
https://developer.mozilla.org/en/Gecko_SDK#Downloading

ここから入手し展開するだけで動くはずである。
しかし、MacOS Xでは色々細工をしないと動かない。
メンドイので後でまとめる事にして省略。

XPIDL

XPIDLを用いてJavaScriptC++間のインタフェースを定義する。
これにより、C++なクラスがJavaScriptで扱えるようになる。

#include "nsISupports.idl"

[scriptable, uuid(3A5769F0-8F50-465A-8682-4C0F0F76AE4F)]
interface testIKVS : nsISupports
{
	void open();
	long get(in long key);
	void put(in long key, in long value);
	void close();
};

こんなのを書いてみた。
超単純なKey value storeをイメージ。stringはメモリ管理がややこしくなりそうなので辞め、ここではkeyもvalueもlongを想定。

一行目のincludeはnsISupportsを継承するのに必要で、この継承はXPCOMモジュールを作るのに必要なんだろう、多分。

uuidはuuidgenコマンドなどで生成する。ない場合は自分でジェネる。

記述方法は大体C++っぽいけど、型がちょっと違う。
型の種類はここの一覧表をみると良い:
http://www.mozilla.org/scriptable/xpidl/idl-authors-guide/rules.html#types
数値型は幅で名前が決まってて、intというのはなかったりする。

メソッド引数の場合、型名の手前にin/out/inoutのいずれかを書かなければならない。
inは普通に値を読む場合、outはメソッド内でポインタ渡しされた領域に値を書く場合、inoutは読み書き両方あるよ、という事だろう。

IDLが書けたらtestIKVS.idlってファイル名で保存し、以下のようにxpidlコマンドを実行するとxptファイルとヘッダファイルが生成される:

$xulrunner-sdk/bin/xpidl -m typelib -I$xulrunner-sdk/sdk/idl testIKVS.idl
$xulrunner-sdk/bin/xpidl -m header -I$xulrunner-sdk/sdk/idl testIKVS.idl