トップ 一覧 検索 ヘルプ RSS ログイン

Palm OS Programmer's Companion Volume II/1-6の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
[[← 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]]