Palm Programmer's Laboratory
Palm OS Programmer's Companion Volume II/3-6
3-6 PDI ライタの利用例
このセクションでは、データベースレコードから出力ストリームに PDI データを書き込む例を提供します。この例は、Examples/ToDo/Src フォルダ内の ToDoTransfer.c ファイルに含まれています。
Listing 3.7 は PDI ライタの生成および利用の例です。ToDoSendRecordTryCatch 関数は、以下の操作によって ToDo データベースから vCal オブジェクトへのデータの書き込みを制御します。
- PDI ライブラリをロードして開くために、ローカル関数 LoadPdiLibrary をコールします。LoadPdiLibrary関数は Listing 3.2 にあります。
- 新しい PDI ライタオブジェクトを生成するために、PdiWriterNew 関数をコールします。このライタオブジェクトは、media パラメータで指定された UDA 出力ストリームへの書き込みを行ないます。
- 出力ストリームに BEGIN:VCAL プロパティを書き込むために、PdiWriteBeginObject 関数をコールします。
- バージョン値を書き込むために、PdiWritePropertyValue 関数をコールします。
- ToDo レコードを書き込むために、ToDoExportVCal 関数をコールします。これは次のセクション(データベースから vCal データのエクスポート?)で説明します。
- 出力ストリームに END:VCALプロパティを書き込むために、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 データのエクスポート
ToDoExportVCal 関数は、ToDo データベースから出力ストリームに vCal レコードをエクスポートします。Listing 3.8 は、ToDoExportVCal 関数の基本的な概要です。Examples/Address/Src フォルダ内の 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); }
ToDoExportVCal 関数は以下の操作を行ないます。
- 出力ストリームに BEGIN:VTODO プロパティを書き込むために、PdiWriteBeginObject 関数をコールします。
- ToDo レコードのカテゴリ情報を書き込むために、PdiWriteProperty 関数をコールします。
- その他の ToDo レコード情報を書き込むために、PdiWriteProperty 関数をコールします。この情報には日付、完了フラグ、優先度、詳細テキストが含まれます。
- メモを書き込むために PdiWriteProperty 関数をコールし、メモのユニーク ID を書き込むために再度コールします。
- 出力ストリームに END:VTODO プロパティを書き込むために、PdiWriteEndObject 関数をコールします。
繰り返しますが、Listing 3.8 はこの関数の概要に過ぎないことに注意して下さい。関数全体を ToDoTransfer.c ファイルで確認することができます。