現在このサイトで公開しているOBEXライブラリはJavaのもののみですが、IrShot for Windowsがあることからも分かるようにC++で記述したバージョンもあります。インターフェースはJava版とほぼ同じだったりします(言語の差による部分で多少の差がありますが)。
例えばJavaでIrDAによるサーバー側接続待ちを行うコードを書くと大体以下のような感じになります(例外処理を除く)。
ObexServerConnection os = ObexManager.getServer("IrDA");
os.accept();
これをC++で書くと以下のような感じになります(例外処理を除く)。
ObexInfraredServerSocket oiss;
ObexServerConnection osc(&oiss);
osc.Accept();
ソケットオブジェクトを別に宣言する必要があり、統合されていない点を除いてまったく一緒です(Javaの命名規約によりメソッドの1文字目が小文字である点も異なるといえば異なりますけれど)。これだけの記述で赤外線リソースの確保、ネゴシエーション、開通までの処理が行えます。もちろん、Java版と同様にパケットサイズをアプリケーション側で考慮する必要もありません。自動的に分割/統合します。
同様にJavaでIrDAによるクライアント側接続要求コードを書くと大体以下のような感じなります(例外処理を除く)。
ObexClientConnection oc = ObexManager.getClient("IrDA");
while(true) {
try {
oc.connect();
break;
} catch(ObexException e) {
if(e.getStatus() == ObexException.TARGET_NOT_FOUND) {
Thread.sleep(100);
continue;
}
throw e;
}
}
ちょっとwhile(true)
でループしているのは、近くにサーバーモードで動いていて接続を受け入れてくれるデバイスが存在しない場合に待つためです。即座にターゲットがない、ということで終了してよければ上記ループはいりません。
そして同様の処理をC++で書くとこのようになります(Windows前提で例外処理を除く→Sleep()
はWin32 APIで指定したミリ秒の間、該当スレッドをスリープすることを要求するものです)。
ObexInfraredClientSocket oics;
ObexClientConnection occ(&oics);
while(true) {
try {
occ.Connect();
break;
} catch(ObexException e) {
if(e.GetStatus() == ObexException::TARGET_NOT_FOUND) {
Sleep(100);
continue;
}
throw;
}
}
このようにほぼ一緒です。このためNTTドコモやVodafone向けにOBEX処理を行うJava記述をしたことがあればすぐにC++でOBEX処理を書くことができます。もちろん認証もサポートしています。このライブラリもDLL化か何かして公開したら需要あるものでしょうか・・・?(ドキュメントを書く気力が現在なかったり orz)
ちなみにソースコードはWindows以外への移植性は考慮して書いてませんが、OBEX処理部分に関してはLPBYTE
(unsigned char*
とほぼ等価)とかLPVOID
(void*
とほぼ等価)とかを使っているくらいなのでこのあたりの型を一通りtypedef
し、MD5の計算や乱数処理、Unicode変換処理をそのOSの機能を呼び出すように変更すればアーキテクチャ関係なくほとんどのケースでポーティングできます(ビッグエンディアンおよびリトルエンディアンの差異は考慮してあります)。この部分は特に別ソースにまとめてあります。