ActiveSync编程总结(三)

40 篇文章 0 订阅

冲突处理

如果一个对象同时在设备和桌面端被改换,在它被同步之前。这儿产生了冲突。ActiveSync manager首先发布一个命令给设备来获得对象到桌面???设备上的IReplObjHandler中的方法被调用,ActiveSync provider从设备store中读取数据,数据被送到桌面端,桌面端的IReplObjHandler被调用来创建一个临时对象。在设备和桌面端都被调用中,RSF_CONFLICT_OBJECT被设置为REPLSETUP::dwFlags,数据被写完之后,ActiveSync manager调用ActiveSync provider填充CONFINFO结构来个性化文本描述....

设备ActiveSync provider

设备ActiveSync provider被实现为一个dllStockpor例子设备ActiveSync provider被命名为stdevs.dll,这个dll导出了四个函数...

文件系统对象 vs 同步对象

windowsCE中,文件系统能够拥有对象,例如文件,目录和记录,数据库等。文件系统中的每个对象被赋予了一个32bit的唯一的ID。举一个简单例子,一个ActiveSync provider可以把这个作为一个同步对象的ID。例如:如果windowsCE数据库中的记录必须被同步, provider可以使用文件系统ID作为object ID并且返回给ActiveSync manager。在更复杂的例子中,一个文件包含多个对象的,ActiveSync provider也许需要返回超过一个objectID当文件变化的时候,这时就不能再使用winCE对象ID了,只能产生你自己的ID系统。

初始化和终止

InitObjType对于设备ActiveSync provider来说初始化和结束时都会被调用。如果ActiveSync provider支持多个对象类型的同步,InitObjType将会为每个对象类型调用一次,通过给定的不为NULLlpszObjType。当ActiveSync终止,给定的lpszObjTypenull,然后ActiveSync provider将会释放它分配的任何资源。

ActiveSync通过使用一个partner位支持两个桌面计算机和一个基于winCE的设备进行同步(同时吗?),为什么不支持4个?奇怪。ActiveSync manager初始化ActiveSync provider时(设备端)传递一个partner位给InitObjType.这位将会被设置为1如果连接的那个桌面是第一个伙伴,或者设置为2,如果是第二个伙伴。如果一个ActiveSync provider使用同步对象的脏位来检查是否被修改或其他,它在设置或重置这个脏位时必须考虑这个伙伴位,为什么啊?

对象的列举

设备端对象的列举和桌面很不同。当设备被连接上时,ActiveSync manager枚举每个文件系统对象(除了ROM中的files或者\windows目录下的)并为每个ActiveSync provider调用ObjectNotify函数。ActiveSync provider决定是否它将同步给定的文件系统对象,并且,如果这样的话,它会通知ActiveSync manager有多少同步对象包含在文件系统中。这时通常的方式,如果一个文件代表多个对象的话这个将变得很大

一个新函数可以被加入:FindObjects...

ObjectNotify和探测变化与删除

ObjectNotify会被频繁调用,最好要以最高的效率来实现。它会快速检查OBJNOTIFY结构中的信息来发现和这个调用是否和ActiveSync provider感兴趣的一种对象类型相关?典型的,一个ActiveSync provider简单地检查OBJNOTIFY结构中的给定的文件系统ID和标记位

OBJNOTIFY会像下面那样定义

typedef struct tagObjNotify

{

UINT cbStruct;

OBJTYPENAME szObjType;

UINT uFlags;

UINT uPartnerBit;

CEOID oidObject;

CEOIDINFO oidInfo

UINT cOidChg;

UINT cOidDel;

UINT *poid;

}OBJNOTIFY,*POBJNOTIFY;

OBJNOTIFY::uFlags有下面的定义

ONF_FILE OBJNOTIFY::oidObject是一个文件

ONF_DIRECTORY OBJNOTIFY::oidObject是一个目录

ONF_RECORD    OBJNOTIFY::oidObject是一条记录

还可以是一个数据库,ONF_CHANGED文件系统对象变化了

ONF_DELETED文件系统对象被删除了...

如果文件系统对象包含了多个同步对象,ActiveSync provider将设置OBJNOTIFY::poid来指向一个objectID的列表

典型的,一个文件系统对象影射到一个同步对象,所以ActiveSync provider通常设置OBJNOTIFY::poid映射OBJNOTIFY::oidObject

在下面几种情况下ActiveSync manager调用ObjectNotify

1.连接后立即调用,ActiveSync manager列举所有的文件系统对象并且调用ObjectNotify来从一个文件系统对象中获得同步对象IDs的链表(如果一个file system object对应)无论ONF_CHANGED或是ONF_DELETED标记位被设置,ActiveSync provider都将察看文件系统对象并且决定有多少同步对象被改变了,和有多少需要更新日期。需要设置OBJNOTIFY::poid来指向一个objectID链表,这个链表中的第一个OBJNOTIFY::cOidChg是改变了的object IDs,并且他们之中的下一个OBJNOTIFY::cOidDel是最新的object IDs,典型的是:一个文件系统对象映射了一个同步对象,所以ActiveSync只需要简单地把OBJNOTIFY::poid指向&OBJBOTIFY::oidObject,设置OBJNOTIFY::cOidChg1,比国内且设置OBJNOTIFY::cOidDel0,如果文件系统对象被改变了。否则,(删除的情况)则前者设为0,后者设为1

2.当一个文件系统对象改变了,在设备连接的时候。无论ONF_CHANGEDONF_DELETED都必须被设置。ActiveSync Provider将设置OBJNOTIFY::cOidChgOBJNOTIFY::cOidDelOBJNOTIFY::poid象先前所说的那样。除非OBJNOTIFY::cOidDel是数量很多的已经被删除的同步对象??

3.在接到了一个来自桌面的关于对象已经被成功同步的承认之后,ActiveSync provider将标记object为最新,ONF_CLEAR_CHANGE通常这种情况下被设置。OBJNOTIFY::oidObject是这个同步对象的object ID,不是文件系统对象的IDActiveSync provider将会把对象设置为最新,因此它在下次被改变之前不会再次被同步

4.ObjectNotify函数在ObjectNotify函数中设置了ONF_CALL_BACK,两秒钟之后会被再次调用,本例子中该参数被设置(这种设置法...)

发送和接收对象

发送和接收对象的实现和桌面端的 provider采用了同样的方法。他们共同使用同样的IReplObjHandler接口,所有接受的包保证以相同的次序和大小。

开发ActiveSync provider建议的步骤

下面是你希望去设计和开发ActiveSync provider所需要的步骤地简单的概要

1.定义一共有多少种你需要同步的对象,适当地为每个对象命名。如果这个名称和其他ActiveSync名称相同,原始服务 provider会被替代。这种做法是有意义的:开发一个单一的ActiveSync provider支持同一个store中的相似的德对象类型的同步(拗口...)例如:一个ActiveSync provider被开发作同步Appointment,Contact,Task,Message对象类型

2.在每个对象类型中定义对象的object ID

3.确定列举每个对象类型中有多少个对象

4.确定如何检查一个对象是否被改变了,典型的,最后一次修改的时间戳常被用到。一个改变数字(一个数字每次对象被更改就增加1)也常被用到

5.定义用于HREPLITEMHREPLFLD用到的数据结构,典型的,HREPLITEM被投射为一个包含了objectID,时间戳和其他任何对象特定属性的一个数据结构,HREPLFLD被投射为一个不同的数据结构,包含了对象类型的过滤器(??)

6.store定义一个唯一的ProgID,例如:MS.WinCE.OutLook,包含了用于这个store的一个GUID

7.实现桌面端接口和设备端函数的各种方法

8.IReplStore::BytesToObject,IReplStore::ObjectToBytes,IReplStore::CompareItem,ObjectNotify必须高效,因为他们被频繁调用

9.阅读“问题和回答”一章,确认关心到了所有的点

10.编译,配置和测试ActiveSync服务 provider

windows CE2.1ActiveSync的新增特性:

windowsCE2.1是用在象掌上电脑Handheld PC Pro那样的设备的操作系统,它比起用在Handheld PC 之上的操作系统windowsCE2.0有了很多改善,例如,你现在可以创建一个不依赖于数据库卷标在内部文件系统上或者在存储卡上(PC卡或者CF卡)

每个数据库卷标赋予了一个唯一的CEGUID,每个数据库中的每条纪录被签署了一个object ID,这个ID仅在这个卷中唯一

一个新的设备函数,FindObjects,被加入到支持数据库卷的同步中,使用这个函数,你能够直接列举出

你需要同步的所有对象(不用FindFirstItemFindNextItem了?)并且将这个对象ID列表返回给ActiveSync manager,如果你需要同步超过一个卷,你需要为每个卷都返回一个list

下面是FindObject..

FindObjects每次连接时被调用一次。第一次调用时,ActiveSync manager设置uFlags0 provider将会列举所有它要同步的对象并返回一个objectIDlist,通过poid指向。...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值