ActiveSync Service Provider实现wince联系人同步

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对象(如特定名称的根目录下文件),由该对象来充当信使.

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/116625/viewspace-998757/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/116625/viewspace-998757/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值