(参考MSDN Programmer’s guide of ActiveSync)
WindowsPE设备和桌面端作同步,在每一端都有ActiveSync manager(管理器)和ActiveSync provider(提供者)两部分组成,我们要编写的是ActiveSync provider部分。桌面端需要继承俩接口IReplStore,IReplObjHandler;而CE端只需要继承一个接口IReplObjHandler。桌面端和设备端的同步结构图如图所示:
桌面端的ActiveSync提供者需要编写一个com组件dll,该组件需要继承俩接口。
一个是IReplStore(这个负责处理具体查找哪些同步对象,桌面端数据存储结构是:Store->folder->Item,Item代表对象类型,是ActiveSync同步处理中的最基本的单元,(一个ActiveSync Provider支持多个对象类型的同步,例如在Outlook provider中,支持约会,联系和计划任务三种同步类型,ASPSimple仅包含一个,就是一个文本文件)Item至少包含两个属性,(1.唯一性标示和2.判断这个item是否被修改)具体到Aspsample例子,是CReplItem对象,包含一个文件最后更新时间(用于判断该文件是否被更改了)和文件的绝对路径(唯一的对象标识符)),根据MSDN中的程序员向导,item的唯一属性还需要满足可以排序这一特性,另外为了高效最好让Item尽量小,ActiveSync会通过HREPLITEM指针来访问这些数据(CReplItem对象)。
另一个接口是IReplObjHandler,这个接口用于根据manager提供的对象生成需要同步的文件或者根据需要同步的文件来生成内存中的同步对象。
AspSample例子中,COM组件的对外接口:DllGetClassObject(const CLSID&clsid,const IID&iid,void **ppv)中创建了一个CASPSimpleFactory对象,并把指针赋给*ppv,该对象继承自IClassFactory接口,负责产生所需要的对象,具体就是store对象。用户得到指向类厂对象的ppv指针后,就可以调用CASPSimpleFactory::CreateInstance函数创建一个CASPSimpleStore对象,同样也是靠用户传入的ppv指针接收CASPSimpleStory对象,得到这个对象的指针,用户(其实就是ActiveSync管理器)就可以调用CASPSimpleStory接口提供的函数来获得存储中指定要同步的CReplItem对象,并和设备端作同步操作了。
概述
ActiveSync技术是为了使winCE系统和桌面电脑之间的数据同步而设计的一种体系结构。数据同步不同于数据传输。一个数据传输过程在两个电脑之间发送一系列数据,但是没有必要检查传输的数据和接受电脑上的数据有什么不同。数据同步,需要以最后一次同步时的数据为准,来判断所监控的对象(比如一个文件sample.txt),是发生了改变还是删除。在一个同步过程中,只有相对最后一次同步结果发生了改变或删除的对象才会被传输。ActiveSync也处理这种情况:当桌面端和设备端的同步对象都发生了变化。
你可以开发ActiveSync provider来同步任何形式的数据。WinCE提供了几个缺省的ActiveSync service provider,举例来说,微软Outlook ActiveSync service provider同步微软Outlook消息,并用WinCE设备上的Outlook来与客户端协同(the Microsoft Outlook ActiveSync Service Provider synchronizes the Microsoft Outlook® messaging and collaboration client with Outlook data on your Windows CE-based device) 当你的ActiveSync service provider被安装后,而且所需要的注册表入口已经被创建,你需要同步的数据(例如:sample.txt)将会自动在桌面和WinCE设备端同步。
ActiveSync manager能够维护多个可以应用于所有数据类型的同步任务,例如这些任务可以是:维护一张在设备和桌面之间映射数据的表;探测变化;传输数据;解决这种情况下的冲突:如果和最后一次同步相比两端都发生了变化。ActiveSync manager内建在Window CE服务之中,你只需要开发和注册ActiveSync provider来同步你的数据(provider去做和你的数据相关的任务,例如把一个对象转化为一个字节流并逆向转换,枚举和同步数据相关的对象,提供一个用户界面等)
设计考虑事项
一个object是你想同步的一项,在你的程序中也许需要同步几个不同类型的对象。举例来说,微软Outlook ActiveSync service provider同步约会(appointments),联系(contact),电子邮件和任务。“对象类型”(Object Type)是一组同步对象的名称。举例来说,“约会”用于微软Outlook的一系列约会。“文件夹”(folder)类似于对象类型。多数情况下用于接口方法的命名。对象和对象类型完全依赖于你的应用程序,它可以是你选择的任意一项或多项。“存储”(store)包含所有你程序中涉及的所有对象。一个store可以是一个数据库或者一个文件。
开始,你必须决定你需要同步的数据是什么样(比如,一个sample.txt文件)。接下来,你必须定义object(用于唯一标示要同步的数据,比如CReplItem对象中存放了sample.txt的绝对路径和最后一次修改时间)、object type和store。对象必须有一个标示,即一个object ID。一个object ID是一个32bit的值,可以是整型,一个字符串或一系列字节。它需要满足以下标准:每个object的object ID,,在同一类型中它必须唯一,它一旦被设定就不允许改变,如果它所标示的object被删除,那么它不允许被重复使用。object ID必须可排序,它们必须允许你来决定哪个对象先到。一个object必须也可以表示出自从设备和桌面端最后一次同步以来发生了变化(AspSample中表示object的CReplItem类用同步文件sample.txt最后一次修改时间指示该文件是否发生了变化)。Store可以使一个一个平滑文件(flat file),一个winCE数据库;或者一切其他用户自定义的格式。但它必须容纳objects。
下一步,你必须指定你的应用程序如何和这些object协同工作。程序必须能够持续列举objects(利用CAspSampleFolder::FindFirstItem和FindNextItem来查看指定多个需要同步的文件的属性,为每个文件创建一个object(new CReplItem,并且把指向这个object的指针放到FindFirstItem和FindNextItem的参数中,让ActiveSync manager来接收,这一过程也许会重复多次,取决于你需要同步的文件的个数,因为反复调用,所以MSDN中称为持续列举objects)。程序还必须能把一个对象(还是它代表的同步文件呢?)转换为一系列的字节,用于桌面电脑和winCE设备之间的传输。同样它还可以把一系列字节转换为回一个对象(还是它代表的同步文件?)。你也许需要开发你自己的界面,例如一个让用户来选择同步选项的对话框。
你需要为某种对象类型创建一个名称。这个名称会在注册表和你要开发的代码中使用。一个用于显示对象类型的名称可以在注册表中建立(如appointment这个类型名称会在ActiveSync Option对话框中显示)这一点很重要:object和object type是逻辑定义的,你自己来创建,而且可以是需要的任何东西。(例如CReplItem对象,保存了一个全路径名和一个sample.txt文件的最后修改日期)
ActiveSync 服务 provider
开发ActiveSync service provider,需要开发两个模块,一个工作在桌面端,一个工作在winCE设备端。这两个模块都是dll动态库。下面的图表显示了那些模块如何与你的应用程序合作。桌面模块是一个典型的32bit处理服务器,由两个COM接口实现:IReplStore和IReplObjHandler。设备模块也实现了IReplObjHandler接口,和六个函数:InitObjType,ObjectNotify,GetObjTypeInfo,ReportStatus,FindObjects和SyncData。ReportStatus可选。FindObject和SyncData仅用于winCE2.1版本。这些函数通过ActiveSync service manager提供的接口工作,ActiveSync service provider的这两部分都使用IReplObjHandler接口传输数据
ActiveSync结构图
Desktop Interfaces
IReplStore是开发者必须编写的ActiveSync provider桌面端模块中最重要的一个接口。这个接口一共22个方法,大致可以分为以下几类
1.存储操作:Initialize,GetStoreInfo,CompareStoreIDs
2.对象列举:FindFirstItem,FindNextItem,FindItemClose
3.对象信息:CompareItem,IsItemChanged,IsItemReplicated,UpdateItem
4.处理操作:ObjectToBytes,BytesToObject,FreeObject,CopyObject,IsValidObject
5.用户界面:ActivateDialog,GetObjTypeUIData,GetConflictInfo,RemoveDuplicates
6.其他杂项:ReportStatus,GetFolderInfo,IsFolderChanged.
IReplObjHandler是用于序列化对象的接口(把同步对象转换成一系列的字节)和反序列化(把一系列字节转换回一个对象),他们也用来从存储中删除一个对象。他的方法有:Setup,GetPacket,SetPacket,Reset,DeleteObject
ActiveSync管理者提供了一个接口:IReplNotify,给服务提供者。这个接口有四个方法:OnItemNotify,GetWindow,SetStatusText,和QueryDevice,请参考 IReplNotify一章来获取这个接口的细节。
设备功能
设备一端的ActiveSync提供者必须实现和导出这三个函数:InitObjType,ObjectNotify,和GetObjTypeInfo。在windowsCE2.1种,它也可以实现FindObjects和syncData(参考ActiveSync为WindowsCE2.1新增了什么来获取细节)它也能有选择地实现和导出ReportStatus。InitObjType被用于初始化和结束设备的ActiveSync提供者。ObjectNotify是用于处理对象标示和改变的探测的(判断对象是否发生了改变)GetObjTypeInfo是用于返回对象类型相关的设备信息的。
ReportStatus允许一个设备ActiveSync提供者被一个特定事件所通知。
配置
你必须为ActiveSync管理者建立正确的配置以注册一个ActiveSync服务提供者。开始,你需要为桌面组件提供一个程序标示(ProgId)。这必须是一个唯一的名字。例如,用于微软Outlook ActiveSync服务提供者的ProgID是“MS.WinCE.Outlook.”第二,你需要为服务提供者产生一个GUID(或CLSID),你必须在注册表中创建下列键值来注册服务提供者:
HKEY_CLASSES_ROOT\Clsid\<Class ID>\InProcServer32
HKEY_CLASSES_ROOT\Clsid\<Class ID>\ProgID
HKEY_CLASSES_ROOT\<ProgID>\CLSID
InProcServer32的缺省值是这个实现了IReplStore接口的32bit DLL文件的全路径,举例来说,微软OutLook,缺省值将是outstore.dll全路径。ProgID键的缺省值,在这个例子中,将会是MS.WinCE.Outlook.CLSID被COM用于创建一个store接口的实例
在service provider被注册之后,你必须在HKEY_LOCAL_MACHINE主键下子目录下,注册它同步的每个对象类型。下面例子注册了约会,联系和任务这三种对象类型
HKEY_LOCAL_MACHINE
Software
Microsoft
Windows CE Services
Services
Synchronization
Objects
Appointment
Contact
Task
每个对象类型名称是一个键,在每个键下面,你必须定义五个值:缺省,显示名称,复数名,存储和失效。以微软OutLook例子中的约会对象类型为例,我们需要有以下值:
[Default] “Outlook Appointment Object”
Display Name “Appointment”
Plural Name “Appointments”
Store “MS.WinCE.Outlook”
Disabled 0
缺省是同步对象的描述名称,显示名和复数名是文本,将会显示在各种用户界面中,存储值是ActiveSync服务提供者的ProgId的名字,Disabled告诉我们这种同步缺省状态下是否无效。
无论何时一个新的设备连接到桌面电脑时,一个新设备profile将在移动设备文件夹中被创建时(这是用户用于管理设备profiles的桌面程序),在HKEY_LOCAL_MACHINE下面的同步对象注册表键将会被复制到HKEY_CURRENT_USER中,在我们这个例子中,我们间拥有约会,联系和任务注册键,如下图所示:
HKEY_CURRENT_USER
Software
Microsoft
Windows CE Services
Partners
<Device ID>
Services
Synchronization
Objects
Appointment
Contact
Tasks
设备的注册和以上过程很相似但更简单。所有你需要去做的就是在HKEY_LOCAL_MACHINE下注册ActiveSync设备组件,下面现实了在微软outlook例子中的正确的注册: