关于复制状态机
适用于:Outlook 2013 | Outlook 2016
本主题概述用于Microsoft Outlook 2013和Microsoft Outlook 2010数据复制的状态机。
注意
必须根据本主题中的说明完全实现复制 API,才能有用或受支持。 复制 API 仅可用于在服务器中复制 Outlook 2013 或 Outlook 2010 更改。
IOSTX 和状态机
客户端按顺序调用 IOSTX::SyncBeg、 IOSTX::SyncEnd、 IOSTX::SyncHdrBeg 和 IOSTX::SyncHdrEnd ,以在本地存储和服务器之间同步 Outlook 2013 或 Outlook 2010 文件夹和项目。 实际调用顺序取决于需要复制的数据 (例如,Outlook 2013 或 Outlook 2010 文件夹的层次结构、Outlook 2013 或 Outlook 2010 文件夹、邮件项目、日历项目等) 以及同步方向 (是否从本地存储上载到服务器, 或从服务器下载到本地存储) 。 下面是一个典型的调用序列:
客户端调用 IOSTX::SyncBeg 以开始复制,指定状态标识符和指向相应数据结构的地址的指针。
Outlook 2013 或 Outlook 2010 分配数据结构,并使用客户端所需的信息初始化数据结构。
客户端执行复制,更新数据结构以向本地存储传达有关复制的任何必要信息。
执行复制后,客户端会调用 IOSTX::SetSyncResult 和 IOSTX::SyncEnd ,以通知本地存储特定复制已完成。
注意
客户端始终调用 IOSTX::SyncEnd 以结束客户端已针对特定状态开始的复制。 根据客户端需要同步的总体数据,客户端可能会多次调用 IOSTX::SyncBeg 和 IOSTX::SyncEnd 的调用对。
状态表
注意
下表列出了复制状态机中的所有有效状态,以及相应的状态标识符和数据结构。 在 “数据复制 ”列中,术语“项目”包括邮件、日历、联系人、便笺、日记和任务项。 将更改从本地存储复制到服务器时,请使用指定“UPLOAD”的状态标识符和带有“UP”前缀的数据结构 (例如 ,LR_SYNC_UPLOAD_HIERARCHY 和 UPHIER ) 。 将更改从服务器复制到本地存储时,请使用指定“DOWNLOAD”的状态标识符和带有“DN”前缀的数据结构 (例如 ,LR_SYNC_DOWNLOAD_HIERARCHY 和 DNHIER ) 。
状态 |
复制的数据 |
状态标识符 |
数据结构 |
---|---|---|---|
空闲状态 |
无 |
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_OK 在 UPFLD 中设置 [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_OK 在 UPHIER 中设置 [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 |