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