Palm Programmer's Laboratory
Palm OS Programmer's Companion Volume II/1-6
1-6 データベースの送受信
Exchange Manager を使用してデータベース全体を送受信したい、というのは一般的なことです。例えば、アプリケーションのユーザに、そのファイルのビーム送信によってあなたのアプリケーションに関連づけられたPDBファイルのユーザのバージョンをお互いに共有させたいかもしれません。データベースの送受信には、送信時にデータベースをバイトストリームに展開することと、戻り時にそれをもとに戻すこと、という追加のステップが含まれます。
データベースの送信
データベースを送信するためには、以下のようにします。
- ExgSocket 形式のデータ構造体を生成し、どのライブラリを使用してどのデータを送信するかについての情報を含めて初期化します。詳細は、「Exchange Socket 構造体の初期化」を参照して下さい。
- Exchange ライブラリとの接続を確立するために、ExgPut をコールします。
- ExgDBWrite をコールして、データベース送信に使用するコールバック関数へのポインタを渡します。その関数の中で、ExgSend をコールします
- 接続を終了するために、ExgDisconnect をコールします。
ExgDBWrite 関数は、送信するデータベースのローカルIDとカード番号、およびコールバック関数へのポインタ、をパラメータとして受け取ります。また、ファイル一覧に出現するデータベースの名前とコールバック関数に渡すアプリケーション特有のデータも渡します。この場合、アプリケーション特有のデータとしてExchange ソケット構造体へのポインタを渡します。もし他のデータが必要なら、Exchange ソケット構造体の代わりにExchange ソケット構造体を含む構造体を作成し、その構造体へのポインタを渡します。
書込みコールバック関数は、データ送信のために何度もコールされることが必要です。それは以下の3つの引数を取ります。つまり、送信するデータへのポインタ、データの大きさ、ExgDBWrite の2番目の引数として渡されるアプリケーション特有のデータ、です。
Listing 1.8 は、どのようにデータベースを送信するかの例を示しています。SendMe 関数は、データベースのクリエータIDとカード番号を探し、それを SendDatabase に渡します。SendDatabase 関数は、Exchange ソケット構造体を生成し初期化し、すべての情報を ExgDBWrite 関数に渡します。ExgDBWrite 関数はデータベースをストレージヒープに配置し、それをバイトストリームに変換し、そのバイトストリームを書込みコールバック関数 WriteDBData の1番目の引数として渡します。WriteDBData は Exchange ソケットとデータストリームを ExgSend コールにフォワードし、その size パラメータに送信バイト数( ExgSend の戻り値)をセットし、 ExgSend によって返されたエラーを返します。
Listing 1.8 データベースの送信
// Callback for ExgDBWrite to send data with Exchange Manager Err WriteDBData(const void* dataP, ULong* sizeP, void* userDataP) { Err err; *sizeP = ExgSend((ExgSocketPtr)userDataP, (void*)dataP, *sizeP, &err); return err; } Err SendDatabase (Word cardNo, LocalID dbID, CharPtr nameP, CharPtr descriptionP) { ExgSocketType exgSocket; Err err; // Create exgSocket structure MemSet(&exgSocket, sizeof(exgSocket), 0); exgSocket.description = descriptionP; exgSocket.name = nameP; // Start an exchange put operation err = ExgPut(&exgSocket); if (!err) { err = ExgDBWrite(WriteDBData, &exgSocket, NULL, dbID, cardNo); err = ExgDisconnect(&exgSocket, err); } return err; } // Sends this application Err SendMe(void) { Err err; // Find our app using its internal name LocalID dbID = DmFindDatabase(0, "Beamer"); if (dbID) err = SendDatabase(0, dbID, "Beamer.prc", "Beamer application"); else err = DmGetLastErr(); return err; }
Exchange マネージャに関連づけられた ExgDBWrite については何もないので、他の転送メカニズムを使用してデータベースを送信するのに使用されることに注意して下さい。 例えば、もし Palm ハンドヘルドからデスクトップPCにデータベースをシリアルポート経由で転送するなら、ExgDBWrite が使えます。
データベースの受信
ランチャーアプリケーションはデータベースを拡張子.prcまたは.pdbのファイルで受け取ります。もしデータベース受信時にあなたのアプリケーションを起動させたいなら、異なる拡張子を使えばデータベースの受信をあなたのアプリケーション内で処理することができます。例えば、ブックがビームされたときにはブックリーダーアプリケーションを起動させたいかもしれません。この場合、ブックリーダーアプリケーションはブック用データベースとして.bk のような拡張子を使うことができます。
他のデータオブジェクトの受信(データの受信を参照)と同様に、同じ起動コードへの応答によりデータベースを受信します。しかし、sysAppLaunchCmdExgReceiveData 起動コードへの応答は少々異なります。
- 接続を受け入れるために ExgAccept をコールします。
- ExgDBRead をコールし、データベースの読み取りに使用されるコールバック関数へのポインタを渡します。その関数内で ExgReceive をコールします。
- 接続を終了するために、ExgDisconnect をコールします。
ExgDBRead 関数はパラメータとして、コールバック関数への2つのポインタを取ります。最初のコールバック関数は、データ読み取りのために複数回コールされる関数です。2番目の関数は、受信したデータベースが既にデバイスに存在する場合に使用されます。