[[← 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]]