Palm Programmer's Laboratory

トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

Palm OS Programmer's Companion Volume II/1-6

← 5 節に戻る ↑1 章トップへ 7 節に進む →


1-6 データベースの送受信

 
Exchange Manager を使用してデータベース全体を送受信したい、というのは一般的なことです。例えば、アプリケーションのユーザに、そのファイルのビーム送信によってあなたのアプリケーションに関連づけられたPDBファイルのユーザのバージョンをお互いに共有させたいかもしれません。データベースの送受信には、送信時にデータベースをバイトストリームに展開することと、戻り時にそれをもとに戻すこと、という追加のステップが含まれます。

データベースの送信

データベースを送信するためには、以下のようにします。

  1. ExgSocket 形式のデータ構造体を生成し、どのライブラリを使用してどのデータを送信するかについての情報を含めて初期化します。詳細は、「Exchange Socket 構造体の初期化」を参照して下さい。
  2. Exchange ライブラリとの接続を確立するために、ExgPut をコールします。
  3. ExgDBWrite をコールして、データベース送信に使用するコールバック関数へのポインタを渡します。その関数の中で、ExgSend をコールします
  4. 接続を終了するために、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 起動コードへの応答は少々異なります。

  1. 接続を受け入れるために ExgAccept をコールします。
  2. ExgDBRead をコールし、データベースの読み取りに使用されるコールバック関数へのポインタを渡します。その関数内で ExgReceive をコールします。
  3. 接続を終了するために、ExgDisconnect をコールします。

ExgDBRead 関数はパラメータとして、コールバック関数への2つのポインタを取ります。最初のコールバック関数は、データ読み取りのために複数回コールされる関数です。2番目の関数は、受信したデータベースが既にデバイスに存在する場合に使用されます。


← 5 節に戻る ↑1 章トップへ 7 節に進む →