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 事件字段
字段 | 描述 | |
---|---|---|
类型 | 事件类型可以是以下值之一(实际值在圆括号中):
| |
状态 | 事件状态,它包含下列子字段:
| |
重试 | 同一事件的重试次数(如果不为 0)。 | |
信息 | 可选的特定于事件的信息(如果不为 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 | 查询用户是否取消并返回(实际值在圆括号内):
|
ISCEVT_QueCancelUponError(5001) | NULL | 查询用户是否取消并返回(实际值在圆括号内):
|
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 | 未能打开适配器 <适配器名称>。 | |
ISCEVT_ErrLoadAdapter(301) | NULL | 未能装入适配器 <适配器名称>。 | |
ISCEVT_ErrCloseAdapter(302) | NULL | 未能关闭适配器 <适配器名称>。 | |
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 | 无效的会话标识。 |
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 并允许同步引擎执行缺省操作。
注意:以上的星号(*)指示各种事件类型的缺省操作。
限制
用户定义的侦听器函数应遵循同步引擎的协议。否则,同步引擎可能无法正常工作。
相关概念
相关任务
相关参考