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

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

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
[[← 5 節に戻る|Palm OS Programmer's Companion Volume II/3-5]] [[↑3 章トップへ|Palm OS Programmer's Companion Volume II/3]] [[7 節に進む →|Palm OS Programmer's Companion Volume II/3-7]]
----
!!! 3-6 PDI ライタの利用例
 
このセクションでは、データベースレコードから出力ストリームに PDI データを書き込む例を提供します。この例は、{{span style='color:blue;font-family:monospace;',Examples/ToDo/Src}} フォルダ内の {{span style='color:blue;font-family:monospace;',ToDoTransfer.c}} ファイルに含まれています。
Listing 3.7 は PDI ライタの生成および利用の例です。{{span style='color:blue;font-family:monospace;',ToDoSendRecordTryCatch}} 関数は、以下の操作によって ToDo データベースから vCal オブジェクトへのデータの書き込みを制御します。
*PDI ライブラリをロードして開くために、ローカル関数 {{span style='color:blue;font-family:monospace;',LoadPdiLibrary}} をコールします。{{span style='color:blue;font-family:monospace;',LoadPdiLibrary}}関数は Listing 3.2 にあります。
*新しい PDI ライタオブジェクトを生成するために、{{span style='color:blue;font-family:monospace;',PdiWriterNew}} 関数をコールします。このライタオブジェクトは、{{span style='color:blue;font-family:monospace;',media}} パラメータで指定された UDA 出力ストリームへの書き込みを行ないます。
*出力ストリームに {{span style='color:blue;font-family:monospace;',BEGIN:VCAL}} プロパティを書き込むために、{{span style='color:blue;font-family:monospace;',PdiWriteBeginObject}} 関数をコールします。
*バージョン値を書き込むために、{{span style='color:blue;font-family:monospace;',PdiWritePropertyValue}} 関数をコールします。
*ToDo レコードを書き込むために、{{span style='color:blue;font-family:monospace;',ToDoExportVCal}} 関数をコールします。これは次のセクション([[データベースから vCal データのエクスポート]])で説明します。
*出力ストリームに {{span style='color:blue;font-family:monospace;',END:VCAL}}プロパティを書き込むために、{{span style='color:blue;font-family:monospace;',PdiWriteEndObject}} 関数をコールします。
*PDI ライタオブジェクトを削除し、PDI ライブラリをアンロードします。
'''Listing 3.7  PDI 出力ストリームの書き込み'''
	static Err ToDoSendRecordTryCatch (DmOpenRef dbP,
	        Int16 recordNum, ToDoDBRecordPtr recordP, UDAWriter* media)
	{
	   volatile Err error = 0;
	   UInt16 pdiRefNum;
	   PdiWriterType* writer;
	 
	   if ((error = LoadPdiLibrary(&pdiRefNum)))
	       return error;
	   writer = PdiWriterNew(pdiRefNum, media, kPdiPalmCompatibility);
	   if (writer)
	      {
	ErrTry
	      {
	         PdiWriteBeginObject(pdiRefNum, writer,
	                                                  kPdiPRN_BEGIN_VCALENDAR);
	         PdiWriteProperty(pdiRefNum, writer, kPdiPRN_VERSION);
	         PdiWritePropertyValue(pdiRefNum, writer, (Char*)"1.0",
	                                         kPdiWriteData);
	          ToDoExportVCal(dbP, recordNum, recordP, pdiRefNum,
	                                 writer, true);
	          PdiWriteEndObject(pdiRefNum, writer,
	                                                         kPdiPRN_END_VCALENDAR)
	;
	          }
	ErrCatch(inErr)
	        {
	           error = inErr;
	        } ErrEndCatch
	         PdiWriterDelete(pdiRefNum, &writer);
	       }
	   UnloadPdiLibrary(pdiRefNum);
	   return error;
	}

!データベースから vCal データのエクスポート
{{span style='color:blue;font-family:monospace;',ToDoExportVCal}} 関数は、ToDo データベースから出力ストリームに vCal レコードをエクスポートします。Listing 3.8 は、{{span style='color:blue;font-family:monospace;',ToDoExportVCal}} 関数の基本的な概要です。{{span style='color:blue;font-family:monospace;',Examples/Address/Src}} フォルダ内の {{span style='color:blue;font-family:monospace;',ToDoTransfer.c}} ファイルを参照して、この関数全体をレビューすることができます。
'''Listing 3.8 データベースから vCal データのエクスポート'''
	extern void ToDoExportVCal(DmOpenRef dbP, Int16 index,
	ToDoDBRecordPtr recordP, UInt16 pdiRefNum, PdiWriterType* writer,
	Boolean writeUniqueIDs)
	{
	Char *          note;
	      UInt32      uid;
	      Char        tempString[tempStringLengthMax];
	      UInt16      attr;
	...
	 
	   PdiWriteBeginObject(pdiRefNum, writer, kPdiPRN_BEGIN_VTODO);
	      // Emit the Category
	   PdiWriteProperty(pdiRefNum, writer, kPdiPRN_CATEGORIES);
	      // ...code to create the property string (tempString)
	   PdiWritePropertyValue(pdiRefNum, writer, tempString, kPdiWriteText);
	 
	      // Code to emit the record information, including the:
	      //   - due date
	      //   - completed flag
	      //   - priority value
	      //   - description text
	...
	 
	 
	      // Emit the note
	   if (*note != '\0')
	   {
	      PdiWriteProperty(pdiRefNum, writer, kPdiPRN_ATTACH);
	      PdiWritePropertyValue(pdiRefNum, writer, note, kPdiWriteText);
	   }
	 
	      // Emit an unique id
	   if (writeUniqueIDs)
	   {
	      PdiWriteProperty(pdiRefNum, writer, kPdiPRN_UID);
	      // Get the record's unique id and append to the string.
	      DmRecordInfo(dbP, index, NULL, &uid, NULL);
	      StrIToA(tempString, uid);
	      PdiWritePropertyValue(pdiRefNum, writer, tempString, kPdiWriteData);
	   }
	 
	   PdiWriteEndObject(pdiRefNum, writer, kPdiPRN_END_VTODO);
	}
{{span style='color:blue;font-family:monospace;',ToDoExportVCal}} 関数は以下の操作を行ないます。
*出力ストリームに {{span style='color:blue;font-family:monospace;',BEGIN:VTODO}} プロパティを書き込むために、{{span style='color:blue;font-family:monospace;',PdiWriteBeginObject}} 関数をコールします。
*ToDo レコードのカテゴリ情報を書き込むために、{{span style='color:blue;font-family:monospace;',PdiWriteProperty}} 関数をコールします。
*その他の ToDo レコード情報を書き込むために、{{span style='color:blue;font-family:monospace;',PdiWriteProperty}} 関数をコールします。この情報には日付、完了フラグ、優先度、詳細テキストが含まれます。
*メモを書き込むために {{span style='color:blue;font-family:monospace;',PdiWriteProperty}} 関数をコールし、メモのユニーク ID を書き込むために再度コールします。
*出力ストリームに {{span style='color:blue;font-family:monospace;',END:VTODO}} プロパティを書き込むために、{{span style='color:blue;font-family:monospace;',PdiWriteEndObject}} 関数をコールします。
繰り返しますが、Listing 3.8 はこの関数の概要に過ぎないことに注意して下さい。関数全体を {{span style='color:blue;font-family:monospace;',ToDoTransfer.c}} ファイルで確認することができます。
 
----
[[← 5 節に戻る|Palm OS Programmer's Companion Volume II/3-5]] [[↑3 章トップへ|Palm OS Programmer's Companion Volume II/3]] [[7 節に進む →|Palm OS Programmer's Companion Volume II/3-7]]