iscEngineListenerPF

目的

iscEngineListenerPF は、iscEngineSetListener() で登録されたユーザー定義のリスナー関数が準拠しなければならないプロトタイプを定義します。

構文

typedef isy_INT32 (*iscEngineListenerPF)(
    isy_UINT32  listenerData,
    ISCEVT*     event,
    isy_VOID*   pExtraInfo);

関数の引き数

表 139 は、iscEngineSetListenerPF 関数タイプで使用される有効な引き数をリストしたものです。

表 139. iscEngineListenerPF の引き数

データ・タイプ 引き数 用途 説明
isy_UINT32 listenerData 入力 iscEngineSetListener() による syncListenerData 引き数のデータ・セットは、 リスナー関数に転送されて戻されます
ISCEVT* event 入力 イベント・オブジェクト
isy_VOID* pExtraInfo 入力 予約済み

使用法

同期化の進行状況をモニターするためにユーザー定義のリスナー関数を使用するには、 まず、関数が iscEngineSetListenerPF 関数タイプに準拠するようにしなければなりません。 次に、iscEngineSetListener() 関数を使用してリスナー関数を登録します。 これで、同期イベントが発生するとユーザー定義のリスナー関数に通知されます。 event 引き数は、イベントに関するさまざまな情報を含む構造体です。

表 140 は、イベント構造体の全フィールドと、各フィールドの目的をリストしたものです。

表 140. iscEngineListenerPF イベントのフィールド

フィールド 説明
type イベント・タイプは、以下のいずれかの値にすることができます (括弧内は実際の値)。

ISCEVTTYPE_Info (1)
同期化の進行状況に関する情報。

ISCEVTTYPE_Conflict (2)
同期化処理における競合または操作のリジェクト。

ISCEVTTYPE_Query (3)
同期化を継続するには、多少の情報が必要です。 同期エンジンの処理を継続させるには、アプリケーション側がいくつかの必須情報 (イベント・コードに基づく) を指定しなければなりません。

ISCEVTTYPE_Retry (4)
例外が発生しており、同期化を継続するには再試行命令またはキャンセル命令が必要です。

ISCEVTTYPE_Error (5)
エラーが発生しており、同期エンジンは現在のサブスクリプション・セットの同期化処理を継続できません。

ISCEVTTYPE_Fatal (6)
致命的エラーが発生しており、同期エンジンはサブスクリプション・セットの同期化処理を継続できません。
state 以下のサブフィールドを含む、イベントの状態です。

currSubsSet
空ではない場合は、サブスクリプション・セットの名前。

currSubs
空ではない場合は、サブスクリプションの名前。

subsType
0 以外の場合は、サブスクリプション・タイプ。数字の範囲は以下のとおり。
  • 100 〜 999: 予約済み
  • 1000 〜 9999: 登録済みサブスクリプション・タイプ
  • 10000+: カスタム・サブスクリプション・タイプ

    事前定義の発信元は以下のとおり (括弧内は実際の値)。

    • ISCSUBSTYPE_Config (100): 構成
    • ISCSUBSTYPE_File (101): ファイル・サブスクリプション
    • ISCSUBSTYPE_DB2e (102): DB2 Everyplace の表サブスクリプション

syncProg
% で表される同期化の進行状況。
retry 0 以外の場合は、同じイベントに対する再試行の回数。
info イベント固有のオプショナル情報 (NULL 以外の場合)。これは、非競合イベントの場合、ストリング引き数の配列です。 競合イベントの場合、データ・タイプは ISCLISTENCONFLICT です。

event.info フィールドには、イベント固有のオプショナル情報がいくつか含まれています。 この情報を識別して解釈するには、イベント・コードを使用します。

表 141 は、イベント・タイプのカテゴリー別にすべてのイベント・コードをリストしたものです。

表 141. iscEngineListenerPF のイベント・コード

イベント・タイプ: ISCEVTTYPE_Info
イベント・コード イベント情報 (argc) 説明
ISCEVT_InfGeneral (1000) NULL 一般情報 (デバッグ目的) です。
ISCEVT_InfSyncStarted (1001) NULL 同期化が開始されました。
ISCEVT_InfPrepMsg (1002) NULL メッセージの準備中。
ISCEVT_InfSendMsg (1003) NULL メッセージの送信中。
ISCEVT_InfWaitMsg (1004) NULL サーバー応答の待機中。
ISCEVT_InfApplyMsg (1005) NULL サーバー・メッセージを適用中です。
ISCEVT_InfCancelingSync (1006) NULL 同期の取り消し中。
ISCEVT_InfSubsSetStarted (1007) NULL サブスクリプション・セットの同期化が開始されました。
ISCEVT_InfSyncingSubs (1008) NULL サブスクリプションの同期化が開始されました。
ISCEVT_InfSubsSetFailed (1009) NULL サブスクリプション・セットの同期化が失敗しました。
ISCEVT_InfSubsSetCanceled (1010) NULL サブスクリプション・セットの同期化がキャンセルされました。
ISCEVT_InfSubsSetSucceeded (1011) NULL サブスクリプション・セットの同期化が正常に終了しました。
ISCEVT_InfSyncSucceeded (1012) NULL 同期化が正常に終了しました。
SCEVT_InfSyncFailed (1013) NULL (一部のサブスクリプション・セットで) 同期化が失敗しました。
ISCEVT_InfSyncCanceled (1014) NULL 同期化が (ユーザーによって) キャンセルされました。
ISCEVT_InfSyncProg (1015) NULL % で表される同期化の進行状況です。
ISCEVT_InfNoNewChange (1016) NULL 新規のサーバー変更はありません。プルおよび確認フェーズをスキップします。
ISCEVT_InfLoginFailed (1017) NULL 指定したログイン情報が認証プロセスをパスしました。

表 142. iscEngineListenerPF のイベント・コード

イベント・タイプ: ISCEVTTYPE_Conflict
イベント・コード イベント情報 (argc) 説明
ISCEVT_CftReject (2000) ISCLISTENCONFLICT データ競合が同期内で発見されました。実際の 競合データは ISCLISTENCONFLICT 構造体で表され、その参照ポインターが event.info を介してアプリケーションに戻されます。

表 143. iscEngineListenerPF のイベント・コード

イベント・タイプ: ISCEVTTYPE_Retry
イベント・コード イベント情報 (argc) 説明
ISCEVT_TryNetConn (4601) NULL サーバーへの接続を再試行します。
ISCEVT_TrySendRequest (4602) NULL 要求の送信を再試行します。
ISCEVT_TryRecvReply (4603) NULL 応答の受信を再試行します。
ISCEVT_TryRecvTimeout (4604) NULL 受信応答を待機する時間を延ばします。
SCEVT_TryRecvAck (4605) NULL 確認通知の受信を再度試みます。

表 144. iscEngineListenerPF のイベント・コード

イベント・タイプ: ISCEVTTYPE_Query
イベント・コード イベント情報 (argc) 説明
ISCEVT_QueCancel (5000) NULL ユーザーがキャンセルしたかどうかを照会して、次に示す値を戻します (括弧内は実際の値)。
  • ISCRTNCB_ReplyYes (3): ユーザーがキャンセルした場合
  • ISCRTNCB_ReplyNo (2): ユーザーが処理の継続を選択した場合
  • ISCRTNCB_Default (0): デフォルト (つまり、ISCRTNCB_ReplyNo)
ISCEVT_QueCancelUponError (5001) NULL ユーザーがキャンセルしたかどうかを照会して、次に示す値を戻します (括弧内は実際の値)。
  • ISCRTNCB_ReplyYes (3): ユーザーがキャンセルした場合
  • ISCRTNCB_ReplyNo (2): ユーザーが処理の継続を選択した場合
  • ISCRTNCB_Default (0): デフォルト (つまり、ISCRTNCB_ReplyNo)
ISCEVT_QueLogin (5002) ISCLISTENARG(3)

info->argv[0]

info->argv[1]

info->argv[2]

アダプターによって要求されたログイン情報です。 リスナーはイベント情報で要求された情報を提供し、実際の値 (1) と共に ISCRTNCB_Done を戻さなければなりません。

データ・ソースのターゲット名

ユーザー名を保持するブランク・バッファー

パスワードを保持するブランク・バッファー

ISCEVT_QueSubsTarget (5003)

ISCLISTENARG(1)

info->argv[0]

アダプターによって要求されたデータベース情報。リスナーは、 イベント情報で 要求された情報を提供し、デフォルトのターゲット・ディレクトリーを 使用するためにISCRTNCB_Done または ISCRTNCB_Default を戻します。

サブスクリプション用ディレクトリー。


表 145. iscEngineListenerPF のイベント・コード

イベント・タイプ: ISCEVTTYPE_Error
イベント・コード イベント情報 (argc) 説明
ISCEVT_ErrOpenAdapter (300) NULL アダプター <adapter name> のオープンに失敗しました。
ISCEVT_ErrLoadAdapter (301) NULL アダプター <adapter name> のロードに失敗しました。
ISCEVT_ErrCloseAdapter (302) NULL アダプター <adapter name> のクローズに失敗しました。
ISCEVT_ErrAuthenticateKey (306) NULL 認証が失敗しました (無効な暗号鍵)。同期化は打ち切られました。
ISYNCEVT_ErrClientCryptoFailed (307) NULL クライアントの暗号化または暗号化解除が失敗しました。同期化は打ち切られました。
ISCEVT_ErrEncryptNotAvail (308) NULL 暗号化が利用不可です。
ISCEVT_ErrEncryptLibOpen (309) NULL 暗号化ライブラリーのオープンに失敗しました。
ISCEVT_ErrSubsNotFound (311) NULL サーバーがサブスクリプションを検出できません。
ISCRTN_ErrSubsNotAvail (312) NULL サブスクリプションがサーバーによってブロックされています。
ISCRTN_ErrSubsDefAltered (316) NULL 同期エンジンが最後に構成を同期化した後に、サブスクリプション定義が変更されています。
ISCEVT_ErrAllocResource (400) NULL アダプター・リソースの割り振りに失敗しました。
ISCEVT_ErrConnectData (401) NULL ターゲット・データへの接続に失敗しました。
ISCEVT_ErrDisconnectData (402) NULL ターゲット・データからの切断に失敗しました。
ISCEVT_ErrNoData (403) NULL データが見つかりません。
ISCEVT_ErrMessageFormat (412) NULL 予期しないメッセージ・フォーマットです。
ISCEVT_ErrNotFound (413) ISCLISTENARG(2)

info->argv[0]

info->argv[1]

要求されたデータが見つかりません。

データ・ソースのターゲット名

データ名

ISCEVT_ErrEndOfData (414) NULL 予期しないデータの終わりです。
ISCEVT_ErrDataTooLong (415) ISCLISTENARG(3)

info->argv[0]

info->argv[1]

info->argv[2]

データが長すぎるため、切り捨てられました。

データ・ソースのターゲット名

データ名

データ・エレメント名 (空ではない場合)

ISCEVT_ErrSyncDisabled (417) NULL サーバーは、ユーザーが使用可能ではないと報告しています。
ISCEVT_ErrServerException (418) NULL サーバーは、不明な例外を報告しています。
ISCEVT_ErrReadOnly (420) ISCLISTENARG(2)

info->argv[0]

info->argv[1]

読み取り専用データを更新しようとしました。

データ・ソースのターゲット名

データ名

ISCEVT_ErrOperation (421) NULL データに対する正しくない操作です。
ISCEVT_ErrUnauthorized (423) NULL ターゲット・データへのアクセスが許可されていません。
ISCEVT_ErrNotAvailable (424) ISCLISTENARG(2)

info->argv[0]

info->argv[1]

要求されたデータが利用不能です。

データ・ソースのターゲット名

データ名

ISCEVT_ErrNotSupported (425) ISCLISTENARG(3)

info->argv[0]

info->argv[1]

info->argv[2]

要求されたデータはサポートされていません。

データ・ソースのターゲット名

データ名

データ・エレメント名 (空ではない場合)

ISCEVT_ErrNetConn (601) NULL サーバーへの接続に失敗しました。
ISCEVT_ErrSendRequest (602) NULL 要求の送信に失敗しました。
ISCEVT_ErrRecvReply (603) NULL 応答の受信に失敗しました。
ISCEVT_ErrRecvTimeout (604) NULL 応答の受信中にタイムアウトになりました。
ISCEVT_ErrRecvAck (605) NULL 確認通知の受信が失敗しました。
ISCRTN_ErrCloseNetLib (608) NULL ネットワーク・ライブラリーのクローズに失敗しました。
ISCEVT_ErrOutOfMemory (610) NULL メモリー不足。
ISCEVT_ErrInternal (698) ISCLISTENARG(1)

info->argv[0]

その他の内部エラーが発生しました。

エラー状態 (ストリング)。


表 146. iscEngineListenerPF のイベント・コード

イベント・タイプ: ISCEVTTYPE_Fatal
イベント・コード イベント情報 (argc) 説明
ISCEVT_FatSyncCfgAbort (303) NULL 構成の同期化が失敗しました。同期化は打ち切られました。
ISCEVT_FatAuthenticateFailed (304) NULL 認証が失敗しました。同期化は打ち切られました。
ISCEVT_FatIncompVersion (310) NULL 非互換バージョンの同期クライアントです。
ISCEVT_FatInvalidSession (313) NULL 無効なセッション ID です。
ISCEVT_FatSyncGroup (314) NULL ユーザーがどの同期グループにも属していません。
ISCEVT_FatRegisterDevice (315) NULL ユーザー用のデバイスの登録に失敗しました。
ISCEVT_FatNetOpenConn (600) NULL サーバーへの接続のオープンに失敗しました。
ISCEVT_FatOpenNetLib (606) NULL ネットワーク・ライブラリーのロードに失敗しました。
ISCEVT_FatResolveHost (609) NULL ホスト名の解決に失敗しました。
ISCEVT_FatServerForbidden (611) NULL サーバーへの同期化が禁止されています。
ISCEVT_FatServerNotFound (612) NULL サーバーが見つかりません。
ISCEVT_FatServer (613) NULL サーバーのエラー。
ISCEVT_FatServerNotAvail (614) NULL サーバーから応答がありません。
ISCEVT_FatNetUnknown (699) NULL 不明なネットワーク・エラーです。

例:

isy_INT32 mySyncListener(
    isy_UINT32 listenerData,
    ISCEVT*  event,
    isy_VOID*  pExtraInfo)
{
    char *statusMsg = appEventCodeToMessage(event);
    int   timesRetried;
 
    switch (event->type) {
      case ISCEVTTYPE_Info:
        appStatusBar(statusMsg);
        // appStatusBar can be any routine which shows the statusMsg (e.g., in a
        // status bar)
        return ISCRTNCB_Done;
 
      case ISCEVTTYPE_Retry:
        timesRetried = event->retry;
        if (timesRetried >= 3) // Try no more than 3 times
            return ISCRTNCB_ReplyNo;
        else
            return appRetryCancelBox(statusMsg, 10); // 10 sec timeout
        // appRetryCancelBox can be any routine which shows a window with two
        // buttons: Cancel and Retry.  It returns
        //   ISCRTNCB_ReplyYes, if user clicks Retry
        //   ISCRTNCB_ReplyNo, if user clicks Cancel
        // If the user doesn't make choice, it returns ISCRTNCB_Default.
        break;
 
      // all other event types, don't care
				  default:
        return ISCRTNCB_Default;
    } // switch (event->type)
} // mySyncListener

戻りコード

イベント・タイプが ISCEVTTYPE_Retry である場合、リスナー関数は以下のいずれかのコードを戻します。

イベント・タイプが ISCEVTTYPE_Query である場合、戻りコードの意味はイベント・コードの値によって決まります。 つまり、リスナーはイベント・コードをチェックし、該当する値を戻します。 しかし、ユーザーが照会に応答しない場合、アプリケーションは以下のコードを戻します。

ISCEVTTYPE_Retry および ISCEVTTYPE_Query 以外のイベント・タイプの場合、同期エンジンは戻りコードを無視します。 リスナーは単に ISCRTNCB_Done を戻します。

: 評価対象外のイベントの場合、リスナー関数は単に ISCRTNCB_Default を戻し、 同期エンジンでデフォルトのアクションを実行します。

: 上記の中で示されているアスタリスク (*) は、各イベント・タイプのデフォルトのアクションを示しています。

制約事項

ユーザー定義のリスナー関数は、同期エンジンのプロトコルに従わなければなりません。 従わない場合、同期エンジンが正しく動作しない可能性があります。

関連した概念

関連したタスク

関連した解説