- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
[[← 5 節に戻る|Palm OS Programmer's Companion Volume II/1-5]] [[↑1 章トップへ|Palm OS Programmer's Companion Volume II/1]] [[7 節に進む →|Palm OS Programmer's Companion Volume II/1-7]]
----
!!!1-6 データベースの送受信
Exchange Manager を使用してデータベース全体を送受信したい、というのは一般的なことです。例えば、アプリケーションのユーザに、そのファイルのビーム送信によってあなたのアプリケーションに関連づけられたPDBファイルのユーザのバージョンをお互いに共有させたいかもしれません。データベースの送受信には、送信時にデータベースをバイトストリームに展開することと、戻り時にそれをもとに戻すこと、という追加のステップが含まれます。
!!データベースの送信
データベースを送信するためには、以下のようにします。
+{{span style='color:blue;font-family:monospace;',ExgSocket}} 形式のデータ構造体を生成し、どのライブラリを使用してどのデータを送信するかについての情報を含めて初期化します。詳細は、「[[Exchange Socket 構造体の初期化|Palm OS Programmer's Companion Volume II/1-2]]」を参照して下さい。
+Exchange ライブラリとの接続を確立するために、{{span style='color:blue;font-family:monospace;',ExgPut}} をコールします。
+{{span style='color:blue;font-family:monospace;',ExgDBWrite}} をコールして、データベース送信に使用するコールバック関数へのポインタを渡します。その関数の中で、{{span style='color:blue;font-family:monospace;',ExgSend}} をコールします
+接続を終了するために、{{span style='color:blue;font-family:monospace;',ExgDisconnect}} をコールします。
{{span style='color:blue;font-family:monospace;',ExgDBWrite}} 関数は、送信するデータベースのローカルIDとカード番号、およびコールバック関数へのポインタ、をパラメータとして受け取ります。また、ファイル一覧に出現するデータベースの名前とコールバック関数に渡すアプリケーション特有のデータも渡します。この場合、アプリケーション特有のデータとしてExchange ソケット構造体へのポインタを渡します。もし他のデータが必要なら、Exchange ソケット構造体の代わりにExchange ソケット構造体を含む構造体を作成し、その構造体へのポインタを渡します。
書込みコールバック関数は、データ送信のために何度もコールされることが必要です。それは以下の3つの引数を取ります。つまり、送信するデータへのポインタ、データの大きさ、{{span style='color:blue;font-family:monospace;',ExgDBWrite}} の2番目の引数として渡されるアプリケーション特有のデータ、です。
Listing 1.8 は、どのようにデータベースを送信するかの例を示しています。SendMe 関数は、データベースのクリエータIDとカード番号を探し、それを {{span style='color:blue;font-family:monospace;',SendDatabase}} に渡します。SendDatabase 関数は、Exchange ソケット構造体を生成し初期化し、すべての情報を {{span style='color:blue;font-family:monospace;',ExgDBWrite}} 関数に渡します。{{span style='color:blue;font-family:monospace;',ExgDBWrite}} 関数はデータベースをストレージヒープに配置し、それをバイトストリームに変換し、そのバイトストリームを書込みコールバック関数 WriteDBData の1番目の引数として渡します。WriteDBData は Exchange ソケットとデータストリームを {{span style='color:blue;font-family:monospace;',ExgSend}} コールにフォワードし、その {{span style='color:blue;font-family:monospace;',size}} パラメータに送信バイト数( {{span style='color:blue;font-family:monospace;',ExgSend}} の戻り値)をセットし、 {{span style='color:blue;font-family:monospace;',ExgSend}} によって返されたエラーを返します。
Listing 1.8 は、どのようにデータベースを送信するかの例を示しています。SendMe 関数は、データベースのクリエータIDとカード番号を探し、それを SendDatabase に渡します。SendDatabase 関数は、Exchange ソケット構造体を生成し初期化し、すべての情報を {{span style='color:blue;font-family:monospace;',ExgDBWrite}} 関数に渡します。{{span style='color:blue;font-family:monospace;',ExgDBWrite}} 関数はデータベースをストレージヒープに配置し、それをバイトストリームに変換し、そのバイトストリームを書込みコールバック関数 WriteDBData の1番目の引数として渡します。WriteDBData は Exchange ソケットとデータストリームを {{span style='color:blue;font-family:monospace;',ExgSend}} コールにフォワードし、その {{span style='color:blue;font-family:monospace;',size}} パラメータに送信バイト数( {{span style='color:blue;font-family:monospace;',ExgSend}} の戻り値)をセットし、 {{span style='color:blue;font-family:monospace;',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 マネージャに関連づけられた {{span style='color:blue;font-family:monospace;',ExgDBWrite}} については何もないので、他の転送メカニズムを使用してデータベースを送信するのに使用されることに注意して下さい。 例えば、もし Palm ハンドヘルドからデスクトップPCにデータベースをシリアルポート経由で転送するなら、{{span style='color:blue;font-family:monospace;',ExgDBWrite}} が使えます。
!!データベースの受信
ランチャーアプリケーションはデータベースを拡張子.prcまたは.pdbのファイルで受け取ります。もしデータベース受信時にあなたのアプリケーションを起動させたいなら、異なる拡張子を使えばデータベースの受信をあなたのアプリケーション内で処理することができます。例えば、ブックがビームされたときにはブックリーダーアプリケーションを起動させたいかもしれません。この場合、ブックリーダーアプリケーションはブック用データベースとして.bk のような拡張子を使うことができます。
他のデータオブジェクトの受信([[データの受信|Palm OS Programmer's Companion Volume II/1-5]]を参照)と同様に、同じ起動コードへの応答によりデータベースを受信します。しかし、{{span style='color:blue;font-family:monospace;',sysAppLaunchCmdExgReceiveData}} 起動コードへの応答は少々異なります。
+接続を受け入れるために {{span style='color:blue;font-family:monospace;',ExgAccept}} をコールします。
+{{span style='color:blue;font-family:monospace;',ExgDBRead}} をコールし、データベースの読み取りに使用されるコールバック関数へのポインタを渡します。その関数内で {{span style='color:blue;font-family:monospace;',ExgReceive}} をコールします。
+接続を終了するために、{{span style='color:blue;font-family:monospace;',ExgDisconnect}} をコールします。
{{span style='color:blue;font-family:monospace;',ExgDBRead}} 関数はパラメータとして、コールバック関数への2つのポインタを取ります。最初のコールバック関数は、データ読み取りのために複数回コールされる関数です。2番目の関数は、受信したデータベースが既にデバイスに存在する場合に使用されます。
----
[[← 5 節に戻る|Palm OS Programmer's Companion Volume II/1-5]] [[↑1 章トップへ|Palm OS Programmer's Companion Volume II/1]] [[7 節に進む →|Palm OS Programmer's Companion Volume II/1-7]]