[[← 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とカード番号を探し、それを 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]]