Palm Programmer's Laboratory

トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

Palm OS Programmer's Companion Volume II/3-6

← 5 節に戻る ↑3 章トップへ 7 節に進む →


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


← 5 節に戻る ↑3 章トップへ 7 節に進む →