1 什么是ActiveSync Service Provider(ASP)
参考文章,引用2处有一个完整的例子
引用1 Developing ActiveSync Service Providers: The First Look
引用2 Developing ActiveSync Service Providers: Desktop Part Implementation
引用3(中文)
2 为什么要'重现'联系人同步
实际上,mobile和wince上都有现成的联系人同步组件.如果你可以接受POOM复杂的接口,接受POOM中联系人的固定属性以及POOM存储联系人的实现方式,那好,加上POOM同步组件就可以了.
POOM联系人在wince上是存在ObjectStore中的Contact数据库(CEDATABASE中).在wince5上,ObjectStore只能在RAM中.目前我还没找到方法将联系人存到其他地方,除非自己在适当的时候,一个一个读出来,存到文件,再在适当的时候,一个一个读出来,再存回去(这种方式也会带来同步的问题,因为同步是基于OID的,而再恢复联系人的时候,我们无法控制恢复联系人的OID).在wince6上,ObjectStore是基于HIVE的,若实现HIVE则可以轻易保存好联系人,但保存联系人会导致一个很怪异的问题,就是系统下次重启时,会将initdb.ini中的数据再次导入ObjectStore,导致ObjectStore中的数据出现大量重复.
3 如何实现联系人同步
wince上联系人,任务等同步都是在pegobj.dll中实现.编译引用2处下载的例子,修改DevASPSimpleFldr.cpp函数 CASPSimpleFolder::GetName(),返回_T("Contact"),编译好的文件添加到设备注册表
[HKEY_LOCAL_MACHINEWindows CE ServicesSynchronizationObjectsContact]
"Store"="DevASPSimple.dll"
即可用来同步联系人,当然由于例子的限制,只能同步一个联系人.
两个可能需要考虑的地方
1) Packet的解析:
同步读写数据时,会调用IReplObjHandler的SetPacket,GetPacket接口.数据格式为(B 为字节)
数据头 8B 其中前两个字节为 属性的数目,其他的无用
属性列表
CEPROPID 4B
若CEPROPID 第10位(0x400)为1,说明该属性已被删除,属性内容为空
否则
CEVT_I2,CEVT_UI2 2B
CEVT_I4,CEVT_UI4,CEVT_BOOL 4B
CEVT_FILETIME 8B
CEVT_LPWSTR 0结尾
CEVT_BLOB 长度n 4B+ 内容(nB)
另外CEPROPID为0x4005001F,属性视为已被删除(在pegob中对该属性做了特殊处理,我们应该可以简单忽略)
2) ASP是基于ObjectStore的,任意ObjectStore的变动,Server都会通知ASP,ASP判断是不是它关心的Object,判断会影响到多少个Item,然后再设置相应的属性.如果我们的联系人不存在ObjectStore中,修改联系人后,还需要修改特定的ObjectStore对象(如特定名称的根目录下文件),由该对象来充当信使.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/116625/viewspace-998757/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/116625/viewspace-998757/