ActiveSync Service Provider實現wince聯絡人同步

simplaman發表於2008-01-30

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章