关于复制状态机

适用于:Outlook 2013 | Outlook 2016

本主题概述用于Microsoft Outlook 2013和Microsoft Outlook 2010数据复制的状态机。

注意

必须根据本主题中的说明完全实现复制 API,才能有用或受支持。 复制 API 仅可用于在服务器中复制 Outlook 2013 或 Outlook 2010 更改。

IOSTX 和状态机

客户端按顺序调用 IOSTX::SyncBegIOSTX::SyncEndIOSTX::SyncHdrBegIOSTX::SyncHdrEnd ,以在本地存储和服务器之间同步 Outlook 2013 或 Outlook 2010 文件夹和项目。 实际调用顺序取决于需要复制的数据 (例如,Outlook 2013 或 Outlook 2010 文件夹的层次结构、Outlook 2013 或 Outlook 2010 文件夹、邮件项目、日历项目等) 以及同步方向 (是否从本地存储上载到服务器, 或从服务器下载到本地存储) 。 下面是一个典型的调用序列:

  1. 客户端调用 IOSTX::SyncBeg 以开始复制,指定状态标识符和指向相应数据结构的地址的指针。

  2. Outlook 2013 或 Outlook 2010 分配数据结构,并使用客户端所需的信息初始化数据结构。

  3. 客户端执行复制,更新数据结构以向本地存储传达有关复制的任何必要信息。

  4. 执行复制后,客户端会调用 IOSTX::SetSyncResultIOSTX::SyncEnd ,以通知本地存储特定复制已完成。

注意

客户端始终调用 IOSTX::SyncEnd 以结束客户端已针对特定状态开始的复制。 根据客户端需要同步的总体数据,客户端可能会多次调用 IOSTX::SyncBegIOSTX::SyncEnd 的调用对。

状态表

注意

下表列出了复制状态机中的所有有效状态,以及相应的状态标识符和数据结构。 在 “数据复制 ”列中,术语“项目”包括邮件、日历、联系人、便笺、日记和任务项。 将更改从本地存储复制到服务器时,请使用指定“UPLOAD”的状态标识符和带有“UP”前缀的数据结构 (例如 ,LR_SYNC_UPLOAD_HIERARCHYUPHIER ) 。 将更改从服务器复制到本地存储时,请使用指定“DOWNLOAD”的状态标识符和带有“DN”前缀的数据结构 (例如 ,LR_SYNC_DOWNLOAD_HIERARCHYDNHIER ) 。

状态
复制的数据
状态标识符
数据结构
空闲状态

LR_SYNC_IDLE

同步状态
文件夹或项目
LR_SYNC
同步
上传层次结构状态
Folders
LR_SYNC_UPLOAD_HIERARCHY
UPHIER
上传文件夹状态
Folder
LR_SYNC_UPLOAD_FOLDER
UPFLD
同步内容状态
项目
LR_SYNC_CONTENTS
SYNCCONT
上传表状态
项目
LR_SYNC_UPLOAD_TABLE
UPTBL
上传消息状态
项目
LR_SYNC_UPLOAD_MESSAGE
UPMSG
上传读取状态
项目
LR_SYNC_UPLOAD_MESSAGE_READ
UPREAD
上传删除状态
项目
LR_SYNC_UPLOAD_MESSAGE_DEL
UPDEL
下载层次结构状态
Folders
LR_SYNC_DOWNLOAD_HIERARCHY
DNHIER
下载表状态
项目
LR_SYNC_DOWNLOAD_TABLE
DNTBL
下载邮件头状态
邮件头
LR_SYNC_DOWNLOAD_HEADER
HDRSYNC

示例:上传文件夹层次结构

上传文件夹层次结构时,将执行以下一系列步骤:

步骤
操作
状态
相关数据结构
1. 客户端使用 IOSTX::SyncBeg 启动层次结构上传。 LR_SYNC_UPLOAD_HIERARCHY
UPHIER
2. Outlook 2013 或 Outlook 2010 使用客户端的信息填充 UPHIER 。 这包括初始化 [out] 参数: iEnt 设置为 0,cEnt 设置为层次结构中需要上传的文件夹数。 LR_SYNC_UPLOAD_HIERARCHY
UPHIER
3. 客户端执行实际层次结构上传。 例如,如果 cEnt 为 10,则对于 10 个文件夹中的每个文件夹,客户端将调用 IOSTX::SyncBeg,指定用于上传文件夹的相应状态标识符和数据结构。 LR_SYNC_UPLOAD_FOLDER
UPFLD
4. Outlook 2013 或 Outlook 2010 通过初始化其 [out] 参数(包括文件夹上传的原因、指向文件夹对象的指针和文件夹的条目 ID)来填充 UPFLD LR_SYNC_UPLOAD_FOLDER
UPFLD
5. 客户端上传指定的文件夹。 LR_SYNC_UPLOAD_FOLDER
UPFLD
6. 客户端通知本地存储文件夹上传完成:成功后,客户端使用 UPF_OKUPFLD 中设置 [in] 参数 ulFlags,然后调用 IOSTX::SetSyncResult (S_OK) IOSTX::SyncEnd。 失败时,客户端不会使用 UPF_OK 标志设置 ulFlags。 它调用 IOSTX::SetSyncResult,传入 HRESULT 值,并调用 IOSTX::SyncEnd LR_SYNC_UPLOAD_FOLDER
UPFLD
7. 如果设置了 UPF_OK,Outlook 2013 或 Outlook 2010 将清除上传文件夹的内部请求。 然后,无论 ulFlags 的状态如何,它都会清理任何内部簿记信息。 虽然层次结构中仍有要上传的文件夹 (iEnt 仍小于 cEnt) ,但客户端和 Outlook 2013 或 Outlook 2010 会重复步骤 3 到 7。 LR_SYNC_UPLOAD_FOLDER
UPFLD
8. 客户端通知本地存储完成层次结构上传:成功后,客户端使用 UPH_OKUPHIER 中设置 [in] 标志,然后调用 IOSTX::SetSyncResult (S_OK) IOSTX::SyncEnd。 失败时,客户端不会设置 UPH_OK 标志。 它调用 IOSTX::SetSyncResult,传入 HRESULT 值,并调用 IOSTX::SyncEnd LR_SYNC_UPLOAD_HIERARCHY
UPHIER
9. 如果设置了 UPH_OK,Outlook 2013 或 Outlook 2010 将清除上传层次结构的内部请求。 然后,无论 ulFlags 的状态如何,它都会清理任何内部簿记信息。 LR_SYNC_UPLOAD_HIERARCHY
UPHIER

另请参阅

关于复制 API
MAPI 常量
SYNCSTATE