Palm Programmer's Laboratory
Introduction to Conduit Development601/4
この章ではコンジットの基本コンセプト -- コンジットのタイプ、コンジットが何をするのか、コンジットが実装する同期ロジックの例、開発者がコンジットを開発するときに守らなくてはならない原則 -- について説明します。
この章では以下の節を含みます。
コンジットのタイプ ^TOP^
コンジットはさまざまなタスクを実行できますが、表 4.1 の中で説明されている 3 つの大きなタイプに分けられます。
コンジットのタイプ | 説明 | 注意 |
---|---|---|
同期コンジット | 通常、ハンドヘルド上のデータベースをデスクトップと同期させるためにコンジット開発者が設計したもの | Windows のための HotSync マネージャは、ハンドヘルド上の作成者 ID と一致するアプリケーションが存在する場合にのみ、登録された同期コンジットを実行します。これの例外は HotSync マネージャ 6.0 以降に存在します: コンジットは、アプリケーションがハンドヘルド上の作成者 ID と一致するかどうかに関係なく、そのコンジットが常に実行されなけらばならないということを指示することができます。 |
インストール コンジット | Palm OS アプリケーションとデータベースをハンドヘルドのメイン メモリまたは拡張カード上のファイルにインストールします。PalmSource(訳者注: 現 ACCESS)は HotSync マネージャにいくつかのインストール コンジットを付属させて出荷します。 | Windows のための HotSync マネージャは、HotSync マネージャが同期コンジットを実行する前と後の両方で、インストール コンジットを実行します。 |
バックアップ コンジット | 同期されることを指定されているレコードを持たないハンドヘルド データベースとアプリケーション全体をデスクトップにコピーします。PalmSource は HotSync マネージャに Backup と名前を付けられたバックアップ コンジットを付属させて出荷します。 バックアップ コンジットは、関連付けされた同期コンジットを持たないハンドヘルド データベースとアプリケーションのために、機能することを意図しています。 |
HotSync マネージャは、HotSync マネージャが同期コンジットを実行した後に、バックアップ コンジットを実行します。 |
コンジット設計の原理 ^TOP^
HotSync テクノロジは Palm OS プラットフォームの成功に非常に重要な役割を果たしてきました。この理由の 1 つは、HotSync マネージャによって呼び出されるコンジットは素早く実行され、設計目標の強力なセットを守り通しているからです。表 4.2 の中で説明されていることと同じ目標を掲げてコンジットを開発する必要があります。
設計目標 | 説明 |
---|---|
高速な実行 | HotSync プロセスのための支配的な目標は、HotSync が同期を非常に素早く完了させることです。処理スピードの最適化とデスクトップとハンドヘルド間で伝送されるデータの最小化のためにコンジットを設計する必要があります。 |
0 データ ロス | コンジットは、HotSync 実施の間に接続が失われることも含めてどんな状況下であってもデータの喪失を防ぐために要求される、測定を行わなくてはなりません。 |
優れた衝突の処理 | ミラー-イメージ同期を実行するコンジットは、優美に変更の衝突 -- または'二重変更とも呼ばれます -- を処理できなくてはなりません。これは、ユーザがデスクトップ コンピュータ上とハンドヘルド上の両方でレコードを変更するときに、起こります。衝突を管理するのに加えて、コンジットは、ユーザにこの状況を知らせるために、エントリをログに追加するべきです。 |
ユーザの相互作用を必要としない | ユーザは HotSync ボタンを押すだけであとは何の操作も要求されずに同期が行われると予測します。コンジットはユーザの操作を必要としないように組み立てられる必要があります。これは、同期をリモートで(例えば、ネットワークを通して)同期を行うためにデスクトップ コンピュータを操作できないユーザにとって、特に重要なことです。 |
コンジット タスク ^TOP^
コンジットは、ハンドヘルド上の特定のアプリケーションのために、デスクトップ コンピュータとデータの同期をとります。コンジットは以下のタスクを実行します。
- ハンドヘルド上のデータベースのオープンとクローズ
- ハンドヘルドとデスクトップ コンピュータ上のレコードの追加、削除、変更、要求があればフォーマットの変換
各アプリケーションはデータをそれぞれのフォーマットで保存するため、各コンジットはカスタム データの処理と変換アルゴリズムを実装しなくてはなりません。ハンドヘルド上のデータと一緒に機能するために、コンジットは同期マネージャ API を呼び出します同期マネージャ API は Classic同期マネージャ API の中で説明します。
コンジット エントリ ポイント ^TOP^
コンジットのタスクを実行するために、HotSync マネージャはコンジットのエントリ ポイントを呼び出します。エントリ ポイントは、同期ロジック、ユーザによるカスタム、HotSync マネージャの問い合わせへの応答を実装します。HotSync マネージャが作成するコンジットの中で呼び出すエントリ ポイントには 2 つのタイプがあります。
- 各コンジットの中で実装されなければならない必須エントリ ポイント
- 追加の情報または機能を提供するオプション エントリ ポイント
この節ではこれらのコンジット エントリ ポイントの簡単な説明を行います。これらの関数についての更なる情報は、コンジットを作成するのに使用する Sync Suite のための案内文書(関連文書)を参照してください。
表 4.3 はエントリ ポイント関数の要約を示します。
表 4.3 HotSync マネージャによって呼び出されるコンジット エントリ ポイント
関数タイプ | Windows のための C/C++ Sync Suite 関数名 | COM Sync Suite 関数名 | 説明 |
---|---|---|---|
必須 | N/A | N/A | HotSync マネージャのために表示するコンジットの名前を返します。 |
必須 | GetConduitVersion | IPDClientNotify->GetConduitVersion | コンジットのバージョン番号を返します。 |
必須 | OpenConduit | IPDClientNotify->BeginProcess | メイン コンジット エントリ ポイント。 |
必須 | GetConduitInfo | IPDClientNotify->GetConduitInfo | コンジットについての情報を HotSync マネージャに返します。(渡されたパラメータに基づいて) |
カスタム(オプション) | ConfigureConduit(HotSync 3.0.1 より前) または CfgConduit(HotSync 3.0.1 以降) |
IPDClientNotify->ConfigureConduit(HotSync 3.0.1 より前) または IPDClientNotify->CfgConduit(HotSync 3.0.1 以降) |
ユーザがコンジットをコンフィグレーションすることを可能にするダイアログを提供します。 PalmSource はこの機能を提供することを強く推奨します。 |
オプション | GetConduitName | N/A | HotSync マネージャのために表示するコンジットの名前を返します。 |
HotSync ログへのメッセージの追加 ^TOP^
HotSync 実施の間、HotSync マネージャと実行されているすべてのコンジットは、メッセージをデスクトップ上またはハンドヘルド上あるいはその両方の HotSync ログに追加することができます。ハンドヘルド ログは容量に制限があるため、エントリはできる限り短くしてください。通常ではないメッセージをすべてデスクトップ ログに追加する場合、HotSync マネージャは HotSync 実施の終了時にユーザに通知を行います。
コンジットはメッセージをデバッグ目的で HotSync ログに追加することもできます。
デスクトップ HotSync ログ
各 Sync Suite はメッセージのログをとるための関数を提供します。各メッセージ文字列にはオプションでタイム-スタンプを付けたり、指定された動作タイプと関連付けることができます。多分、最も単純なログをとる関数は、以下で各 Sync Suite のために示す通りの、エントリをデスクトップ HotSync ログに追加する関数です。
C/C++ Sync Suite の中にある LogAddEntry()
long LogAddEntry ( LPCTSTR pszEntry, Activity act, BOOL bTimeStamp)
COM Sync Suite の中にある AddLogEntry()|COM Sync Suite Reference601/4
Sub AddLogEntry ( ByVal pLogText As String, _ [ByVal eActivity As ELogActivity = eText], _ [ByVal bTimeStamp As Boolean = True], _ [ByVal bPalmLog As Boolean = False])
これらの関数はそれぞれ、コンジットがメッセージを追加する動作を指定することを可能にします: Activity (C/C++ Sync Suite) または ELogActivity|COM Sync Suite Reference601/6 (COM Sync Suite) 値の 1 つを渡します。ログ エントリが追加されるたびに、HotSync マネージャは、いくつの警告が起こったかを追跡するために、カウンタを +1 します。カウントされないログ動作値は以下の通りです。
C/C++ Sync Suite | COM Sync Suite |
---|---|
slSyncStarted | eSyncStarted |
slSyncFinished | eSyncFinished |
slSyncAborted | eSyncAborted |
slText | eText |
すべてのログ動作値のうち、2 つのみが明示的に、コンジットの LogAddEntry()/AddLogEntry() 呼び出しの中で指定したものに関係なく、テキストをログに追加します。
C/C++ Sync Suite | COM Sync Suite |
---|---|
slSyncAborted | eSyncAborted |
slText | eText |
他のすべてのログ動作値を指定すると、指定されたテキストのみが挿入されます。
同期エラーまたは警告が起こらなかったとき、slSyncFinished/eSyncFinished は指定したメッセージが後に続くテキスト "OK" をログに挿入します。一方、1 つ以上の同期警告のログをとられた場合、slSyncFinished/eSyncFinished はテキスト "OK" を挿入し、それからコンジットが指定したメッセージ、それからテキスト "with X message(s)"(X にはログをとられたメッセージの数が入ります)を挿入します。このテキストは、インストールした HotSync マネージャのバージョンによっては、ローカライズされているかもしれません。
slSyncAborted/eSyncAborted 動作コードは、" synchronization failed" が後に続く、渡されたメッセージを表示します。
- NOTE
- PalmSource 社によって提供されたコンジットは、slSyncFinished と slSyncAborted 動作のために、単純にコンジット名を LogAddEntry に渡します。この結果として、"OK Address Book" や "Address Book synchronization failed" などがメッセージの中に現れます。PalmSource は、整合性のために、開発者がこの標準に従うことを提案しています。
HotSync マネージャ バージョン 6.0.1 からは、デスクトップ上の HotSync ログは HTML ファイルとして保存されます; それより前のバージョンでは、ログは ASCII テキスト ファイルです。ユーザがログを閲覧するとき、HotSync マネージャはログを表示するためにデスクトップのデフォルトの Web ブラウザを呼び出します。HTML ファーマットのログは HotSync マネージャとコンジットが以下のことをするのを可能にします。
- より読みやすくするためにエントリをフォーマットする・
- コンジット開発者の Web サイト上の詳細情報へのハイパーテキスト リンクを提供する。
- スクリプトを追加することによってログを「アクティブ」にする。
ログ エントリの追加とログ動作値の指定を行うとき、エントリは、エントリのログをとらせる動作のタイプ -- 警告、エラー、コンジットの開始/完了、など -- を示すのを助けるために、自動的にフォーマットされます。すべての動作タイプは特別な HTML 制御文字を排除し、それによりフォーマット エラーを引き起こすのを防ぎます; しかしながら、1 つの特別なログ動作値 -- slHTMLText/eHTMLText -- は、HTML 特性を活かすために、呼び出し先が HTML タグや文字を含むどんな文字列でも渡すことを許可します。
図 4.1 は HTML フォーマットの HotSync ログの例を示しています。この図はまた、各動作タイプが HotSync マネージャによってどのようにフォーマットされるかについても示しています。
図 4.1 HotSync ログ動作タイプによって使用されるフォーマットの例
ハンドヘルド HotSync ログ
ハンドヘルド ログは容量に制限があるため、エントリはできる限り短くしてください。
各 Sync Suite はメッセージをハンドヘルド HotSync ログに追加するための関数を提供します:
C/C++ Sync Suite の中にある SyncAddLogEntry()
SInt32 SyncAddLogEntry (const char *pText)
COM Sync Suite の中にある AddLogEntry()|COM Sync Suite Reference601/4
Sub AddLogEntry ( ByVal pLogText As String, _ [ByVal eActivity As ELogActivity = eText], _ [ByVal bTimeStamp As Boolean = True], _ [ByVal bPalmLog As Boolean = False])
COM Sync Suite では、ハンドヘルド ログに書き込むための関数とデスクトップ ログに書き込むための関数が同じであることに注意してください。しかしながら、上記の関数の両方とも、ハンドヘルド ログに書き込めるのはフォーマットされていないテキストだけです。
参照
C/C++ Sync Suite Reference の中の LogAddEntry() と SyncAddLogEntry()、COM Sync Suite Reference の中の AddLogEntry()|COM Sync Suite Reference601/4
同期のタイプ ^TOP^
同期のタイプは、関係するアプリケーションの性質とそれらアプリケーションのデータをどのように扱うかに依存します。デスクトップとハンドヘルド同期のタイプは 表 4.4 の中で要約してあります。
同期のタイプ | 説明 | 注意 |
---|---|---|
ミラー-イメージ | デスクトップ上とハンドヘルド上の両方で実行される理想的なアプリケーションを想定します; それは両方で変更を行うことを可能にし; 両方で等価のデータを作成します。 この種の同期のサンプル アプリケーションは、アドレス帳と予定表アプリケーションです。 |
コンジットは、同じレコードがデスクトップ上とハンドヘルド上の両方で変更された(二重変更と呼ばれます)とき、衝突を解決する手段を提供しなくてはなりません。この解決手段は、ユーザの介入無しに行われなくてはなりません。 |
一方通行 | デスクトップ上とハンドヘルド上の両方で実行されるアプリケーションを想定しますが、どちらかでしかデータ変更は許可されず、それをもう一方にコピーします。 例: 株価プログラム -- デスクトップ上でデータを更新し、最新データをハンドヘルドにコピーします。 |
より短時間で実現可能で、これを選択可能ならば使用すべきです。 |
トランザクション-ベース | レコードの同期をとる際に、デスクトップ コンピュータ上で追加の処理(訳者注: 余計な処理という意味です。データを追加するという意味ではありません。)を実行する必要があるアプリケーションを想定します。 例: E-mail プログラム -- デスクトップ コンピュータ上の受信箱を更新するためにトランザクション処理を使用します。 |
HotSync 処理を遅くします。必要な場合にのみ使用します。 |
- NOTE
- コンジットの目標の大部分は同期時間を最小化することです。これはコンジットのために使用することができる同期の最も単純な手段を選択すべきであるということを意味します。同期のタイプを単純なものから複雑なものの順に並べると、バックアップ、一方通行、ミラー-イメージ、トランザクション-ベースです。
同期ロジック ^TOP^
ユーザはハンドヘルド上またはデスクトップ コンピュータ上のどちらかでもデータを変更することができます。コンジットの設計次第で、その同期ロジックは、正確な同期を保証するために、さまざまは変更シチュエーションを扱う必要があるかもしれません。
この節では、Classic Generic Framework によって実装されるロジックについて説明します。スキーマ データベースのための同期ロジックはこの文書ではカバーされません。
レコードの同期 ^TOP^
表 4.5 の中で示されているロジックは、各レコード変更状態の結果として生じる動作をリストしています。これらの状態は、レコードが追加されたのか、変更されたのか、変更されたのか、それともアーカイブされたのかを示すために維持されるレコードの状態ビットに基づきます。
ハンドヘルド レコード状態 | デスクトップ レコード状態 | 動作 |
---|---|---|
Add | No record | ハンドヘルド レコードをデスクトップ データベースに追加します。 |
Archive | Delete | ハンドヘルド レコードをアーカイブし、ハンドヘルドとデスクトップ データベースの両方からレコードを削除します。 |
Archive | No change | ハンドヘルド レコードをアーカイブし、ハンドヘルド データベースとデスクトップ データベースの両方からレコードを削除します。 |
Archive | No record | ハンドヘルド レコードをアーカイブします。 |
Archive, change | Change | 変更が(訳者補足: ハンドヘルドとデスクトップで)同じである場合、ハンドヘルド レコードとデスクトップ レコードの両方をアーカイブします。 変更が同じでない場合、ハンドヘルド レコードのアーカイブは行わず、その代わり、デスクトップ レコードをハンドヘルド レコードに追加し、ハンドヘルド レコードをデスクトップ データベースに追加します。 |
Archive, no change | Change | ハンドヘルド レコードのアーカイブは行わず、その代わり、そのレコードをデスクトップ レコードで置き換えます。 |
Change | Archive, change | 変更が同じである場合、ハンドヘルド レコードをアーカイブし、それからハンドヘルド データベースとデスクトップ データベースの両方からレコードを削除します。 変更が同じでない場合、デスクトップ レコードのアーカイブは行わず、その代わり、デスクトップ レコードをハンドヘルド レコードに追加し、ハンドヘルド レコードをデスクトップ データベースに追加します。 |
Change | Archive, no change | デスクトップ レコードのアーカイブは行わず、その代わり、そのレコードをハンドヘルド レコードで置き換えます。 |
Change | Change | 変更が同じである場合、何もしません。 変更が同じでない場合、ハンドヘルド レコードをデスクトップ データベースに追加し、デスクトップ レコードをハンドヘルド データベースに追加します。 |
Change | Delete | デスクトップ レコードの削除は行わず、その代わり、デスクトップ レコードをハンドヘルド レコードで置き換えます。 |
Change | No change | デスクトップ レコードをハンドヘルド レコードで置き換えます。 |
Delete | Change | ハンドヘルド レコードの削除は行わず、その代わり、ハンドヘルド レコードをデスクトップ レコードで置き換えます。 |
Delete | No change | デスクトップ データベースとハンドヘルド データベースからレコードを削除します。 |
No change | Archive | デスクトップ レコードをアーカイブし、それから両方のデータベースからレコードを削除します。 |
No change | Change | ハンドヘルド レコードをデスクトップ レコードで置き換えます。 |
No change | Delete | デスクトップ データベースとハンドヘルド データベースからレコードを削除します。 |
カテゴリの同期 ^TOP^
表 4.6 の中で示されているロジックは、各カテゴリ変更状態の結果として生じる動作をリストしています。
カテゴリ名の状態 | カテゴリ ID の状態 | カテゴリ インデックスの状態 | 動作 |
---|---|---|---|
デスクトップの名前とハンドヘルドの名前が一致する | N/A | デスクトップのインデックスとハンドヘルドのインデックスが一致する | 何もしません。 |
デスクトップの名前とハンドヘルドの名前が一致する | N/A | デスクトップのインデックスとハンドヘルドのインデックスが一致しない | カテゴリに属するすべてのデスクトップ レコードをハンドヘルドのカテゴリ ID を使うように変更します。 |
デスクトップの名前がハンドヘルド上では見つからず、デスクトップの名前は変更されている | デスクトップの ID とハンドヘルドの ID が一致する | N/A | ハンドヘルド上のカテゴリ名をデスクトップに一致するように変更します。 |
デスクトップの名前がハンドヘルド上では見つからない | デスクトップの ID がハンドヘルド上では見つからない | デスクトップのインデックスとハンドヘルドのインデックスが一致しない | デスクトップ カテゴリをハンドへルドに追加します。 |
デスクトップの名前がハンドヘルド上では見つからない | デスクトップの ID がハンドヘルド上では見つからない | デスクトップのインデックスはすでにハンドヘルド上で使用されている | デスクトップ カテゴリをハンドへルド上の次のフリーのインデックスに追加し、カテゴリに属するデスクトップ レコードを新しいインデックスを使用するように更新します。 |