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 ファイルで確認することができます。
