Palm Programmer's Laboratory

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

C/C++ Sync Suite Companion601/8

← 7 章に戻る ↑トップへ 9 章に進む →

8 デスクトップ通知機能の作成

デスクトップ コンピュータ上のアプリケーションとコンジットの両方が同時にデスクトップ上の同じユーザ データを変更する可能性がある場合、HotSync マネージャは、デスクトップ アプリケーションに HotSync が開始されたことを通知することができます。これにより、両方が同時にデスクトップ上のデータを変更することがないようにします。このメッセージ機能を使用可能にするために、あなたは 通知機能(原文: notifier)を実装しなければなりません。通知機能はオプションの DLL であり、コンジットとはまったく別個のものです。あなたはこれを実装することにより HotSync マネージャからあなたのデスクトップ アプリケーションへメッセージを送ることができます。

NOTE
あなたのコンジットがデスクトップ データにアクセスするが、デスクトップ アプリケーションとデータを共有しない場合、あなたは通知機能を提供する必要はありません。

通知機能の概要は Introduction to Conduit Development の中の 「デスクトップ通知機能」 を、HotSync マネージャが通知機能を呼び出すときのことについての更なる情報は 「通知機能の呼び出し」 を参照してください。

この章には以下の節があります:

必要条件 ^TOP^

HotSync 実施の間に HotSync マネージャにあなたの通知機能を呼び出させるために:

  • C/C++ Sync Suite Reference の中の 第18章 「デスクトップ アプリケーション通知機能 API」 の中で指定されているデスクトップ アプリケーション通知機能 API を実装します。
  • 以下の 2 つの方法のどちらかであなたの通知機能を HotSync マネージャに登録します:
    • コンジット マネージャ(CondMgr.dll)の一部である通知機能インストール マネージャ API を使用します。この API は、あなたのインストーラ アプリケーションがプログラム的にエンド ユーザのコンピュータ上の通知機能を登録、変更、登録解除することを可能にします。第 9 章 「通知機能インストール マネージャ API の使用」 を参照してください。
    • あなたがコードを書くことなしに通知機能をあなたの開発マシンに登録、登録解除することを可能にする Windows アプリケーションであるコンジット コンフィグレーション ユーティリティ(CondCfg.exe)を使用します。Conduit Development Utilities Guide「通知機能情報の登録と変更」|Conduit Development Utilities Guide601/3 を参照してください。

いずれかのコンジットを呼び出す前とコンジットの完了後に再びコンジットを呼び出す前に、HotSync マネージャは以下のデスクトップ通知機能 API 呼び出しで登録された各通知機能を呼び出します:

 BOOL HS_Notify (int nCode

nCode パラメータ値はメッセージ コードであり、nUserId パラメータ値はユーザ - そのユーザのために同期が実行されようとしている - の ID です。通知機能は通知機能が受け取る nCode 値を理解して、デスクトップ アプリケーションにそれが知る必要があることを知らせなければなりません。

表 8.1 は、HotSync マネージャが通知機能に送るメッセージ コードについて説明しています。「一般的な応答」列はどのようにデスクトップ アプリケーションが応答すべきなのか、通知機能はどのような値を HotSync マネージャに返すべきなのかを示しています。

重要
デスクトップ アプリケーションはあなたの個々のコンジットが失敗したかどうかは通知されません。


表 8.1 HotSync マネージャの通知メッセージ

メッセージ コード 説明 一般的な応答
HS_SYNC_FAILURE デスクトップ アプリケーションに同期が不成功に完了したことを通知します。 メッセージは失敗した理由について示しません。
HS_SYNC_QUERYOK デスクトップ アプリケーションが同期可能かどうかを決定するためにデスクトップ アプリケーションにおくられます。 アプリケーションが同期できる場合、TRUE を返します。{[br}}ユーザが現在データを編集していてアプリケーションが同期できない場合、FALSE を返し、ユーザにユーザは編集を終わらせてから HotSync 実施を再試行するようにメッセージを表示します。HotSync マネージャは同期操作を中止します。
HS_SYNC_STARTED デスクトップ アプリケーションにユーザが同期を始めようとしているということを通知します。 指定されたユーザが現在そのデスクトップ アプリケーションを使用している場合、アプリケーションはユーザのデータをディスクに保存します。保存が失敗した場合、デスクトップ アプリケーションは FALSE を返し、HotSync マネージャは同期操作を中止します。
他のすべての場合では、デスクトップ アプリケーションは TRUE を返します。
HS_SYNC_SUCCESS デスクトップ アプリケーションに同期操作が成功裏に完了したことを通知します。 ユーザのリストが変更された場合、アプリケーションはそのユーザ データを再読み込みしなければなりません。
HS_USER_UPDATE デスクトップ アプリケーションにユーザ リストが変更されたことを通知します。 アプリケーションは同期操作の完了後にリストの中のユーザを読み込んでユーザ データを再読み込みしなければなりません。

通知機能の例 ^TOP^

コード 8.1 の通知機能の例は、Palm OS Desktop にメッセージを送るという機能をベースにしています。HSNotify.h ファイルは <CDK>\C++\Win\include の中にあります。


コード 8.1 通知機能の例

#include <windows.h>
#include <hsnotify.h>

const char* pszPilotDesktopWndClass = "Bell XS-1";
const char* pszHotSyncWndClass = "KittyHawk";

#define WM_POKEWILMA(WM_USER+0xBAC4)
#define PW_IDENTIFY0
#define PW_SYNCSTART1
#define PW_SYNCSUCCESS2
#define PW_SYNCFAILURE3
#define PW_ADVISEUSER4
#define PW_SYNCOKQUERY5
#define PW_UPDATEUSERS6

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD ul_reason_for_call, 
                       LPVOID lpReserved )

{
   switch (ul_reason_for_call)
   {
      case DLL_PROCESS_ATTACH:
      case DLL_THREAD_ATTACH:
      case DLL_THREAD_DETACH:
      case DLL_PROCESS_DETACH:
      break;
   }
   return TRUE;
}

// GetNotifierVersion() is optional. HotSync Manager does not call it. However, 
// it may be useful for your desktop application to call this function to 
// identify the version of your notifier.
NOTIFY_API DWORD GetNotifierVersion()
{
   return 0;
}

// HS_Notify() passes messages from HotSync Manager to your 
// desktop application.
NOTIFY_API BOOL HS_Notify(int nCode,int nUserID)
{
   BOOL bRtn = TRUE;

   // Find the Palm OS Desktop application.
   HWND hWnd = FindWindow(pszPilotDesktopWndClass,NULL);

   if (hWnd != NULL)
   {
      // Make sure it's the right Palm OS Desktop.
      if (SendMessage(hWnd,WM_POKEWILMA,PW_IDENTIFY,0) == WM_POKEWILMA)
      {
         switch (nCode)
         {
            case HS_SYNC_QUERYOK:
            bRtn = (SendMessage(hWnd,WM_POKEWILMA,PW_SYNCOKQUERY,0) == 0);
            break;

            case HS_SYNC_STARTED:
            bRtn = (SendMessage(hWnd,WM_POKEWILMA,PW_SYNCSTART,nUserID) == 0);
            break;

            case HS_SYNC_SUCCESS:
            SendMessage(hWnd,WM_POKEWILMA,PW_SYNCSUCCESS,nUserID);
            break;

            case HS_SYNC_FAILURE:
            SendMessage(hWnd,WM_POKEWILMA,PW_SYNCFAILURE,nUserID);
            break;

            case HS_USER_UPDATE:
            SendMessage(hWnd,WM_POKEWILMA,PW_UPDATEUSERS,nUserID);
            break;
         }
      }
   }

   return bRtn;
}

← 7 章に戻る ↑トップへ 9 章に進む →