数据同步管理器设计备忘录

转载时请注明出处和作者

在设计数据同步管理器时,主要考虑到与不同的PC工具和服务器同步,提高与其它手机的互通性的,方便与第三方合作开发一些增值服务。其基本架构如下

数据同步管理器设计备忘录_object


SyncSource: 是对数据源的抽象,它提供获取数据对象和更新对象的接口。常见的数据源有名片、日程、短信、彩信、邮件、相片、录音和记事等等。这个本来是很简单的东西,但为了实现快同步,每次只传输变化的数据,要手机端记录ChangeLog,就变得有点麻烦了。

 

对于数据库记录的同步。每条记录要增加创建时间和最后修改时间字段,有了这两个字段,我们可以根据最后同步时间生成新增记录和修改记录两个集合。要生成删除记录集合,我们还要增加一个表,并为每个表增加一个删除触发器。在删除记录时,把表名、ID和删除时间加到删除表中,据此我们就可以得到删除集合了。

 

对于文件类的同步。我们在目录里放一个索引文件,里面记录文件的创建时间和删除时间,文件ID和文件名的对应关系。修改时间可以通过stat取到,就不用记录了。同样根据最后同步时间我们可以得到新增,修改,删除和正常四个集合。

 

SyncSource是插件的方式提供的,增加新的SyncSource只要按这个接口提供一个动态库就行了。它的接口如下:

 

数据同步管理器设计备忘录_服务器_02typedef SyncRet ( * SyncSrcRefFunc)(SyncSrc *  thiz);
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02typedef SyncRet ( * SyncSrcUnrefFunc)(SyncSrc *  thiz);
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02typedef SyncID ( * SyncSrcGetIDFunc)(SyncSrc *  thiz);
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02typedef  const   char *  ( * SyncSrcGetTypeFunc)(SyncSrc *  thiz);
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02typedef  const   char *  ( * SyncSrcGetNameFunc)(SyncSrc *  thiz);
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02typedef  const   char *  ( * SyncSourceGetURLFunc)(SyncSrc *  thiz);
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02typedef  const   char *  ( * SyncSourceGetDescFunc)(SyncSrc *  thiz);
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02typedef size_t ( * SyncSrcGetAllNrFunc)(SyncSrc *  thiz);
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02typedef size_t ( * SyncSrcGetDeletedNrFunc)(SyncSrc *  thiz);
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02typedef size_t ( * SyncSrcGetModifiedNrFunc)(SyncSrc *  thiz);
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02typedef size_t ( * SyncSrcGetNewNrFunc)(SyncSrc *  thiz);
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02typedef SyncObject *  ( * SyncSrcGetObjectFunc)(SyncSrc *  thiz, SyncObjectType type, size_t index);
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02typedef SyncRet ( * SyncSrcSetObjectFunc)(SyncSrc *  thiz, SyncObject *   object );
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02typedef SyncRet ( * SyncSrcAddObjectFunc)(SyncSrc *  thiz, SyncObject *   object );
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02typedef SyncRet ( * SyncSrcUpdateObjectFunc)(SyncSrc *  thiz, SyncObject *   object );
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02typedef SyncRet ( * SyncSrcDeleteObjectFunc)(SyncSrc *  thiz, SyncObject *   object );
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02typedef SyncRet ( * SyncSrcBeginSyncFunc)(SyncSrc *  thiz, SyncKind type, time_t last_sync, SyncDataFilter *  filter);
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02typedef SyncRet ( * SyncSrcEndSyncFunc)(SyncSrc *  thiz, SyncRet result);
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02typedef SyncObject *  ( * SyncSrcCreateObjectFunc)(SyncSrc *  thiz);
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02 struct  _SyncSrc
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_object_42数据同步管理器设计备忘录_服务器_43 ... {
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44SyncSrcRefFunc ref;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44SyncSrcUnrefFunc unref;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44SyncSrcGetIDFunc get_id;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44SyncSrcGetTypeFunc get_type;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44SyncSrcGetNameFunc get_name;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44SyncSourceGetURLFunc get_url;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44SyncSourceGetDescFunc get_desc;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44SyncSrcBeginSyncFunc begin_sync;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44SyncSrcEndSyncFunc end_sync;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44SyncSrcGetAllNrFunc get_all_nr;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44SyncSrcGetDeletedNrFunc get_deleted_nr;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44SyncSrcGetModifiedNrFunc get_modified_nr;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44SyncSrcGetNewNrFunc get_new_nr;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44SyncSrcGetObjectFunc get_object;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44SyncSrcSetObjectFunc set_object;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44SyncSrcAddObjectFunc add_object;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44SyncSrcUpdateObjectFunc update_object;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44SyncSrcDeleteObjectFunc delete_object;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44SyncSrcCreateObjectFunc create_object;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44char priv[0];
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_object_86} ;
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02

SyncEngine: 是对具体同步方式的抽象。比如TCard备份是一个简单的engine,在备份时,它把SyncSource提供的数据存到TCard中,在恢复时,从Tcard中取出数据,并把数据存到 SyncSource中。Sync4JEngine负责通过SyncMLfunambol服务器同步。ActiveSyncEngine负责与ActiveSync同步。第三方增加新的同步方式只要实现下面的接口:


数据同步管理器设计备忘录_服务器_02typedef SyncRet     ( * SyncEngineRefFunc)(SyncEngine *  thiz);
数据同步管理器设计备忘录_服务器_02typedef SyncRet     ( * SyncEngineUnrefFunc)(SyncEngine *  thiz);
数据同步管理器设计备忘录_服务器_02typedef SyncID      ( * SyncEngineGetIDFunc)(SyncEngine *  thiz);
数据同步管理器设计备忘录_服务器_02typedef  const   char *  ( * SyncEngineGetNameFunc)(SyncEngine *  thiz);
数据同步管理器设计备忘录_服务器_02 typedef SyncRet     ( * SyncEngineBeginSyncFunc)(SyncEngine *  thiz, SyncPartnerConfig *  partner_config, SyncDataFilter *  filter);
数据同步管理器设计备忘录_服务器_02 typedef SyncRet     ( * SyncEngineSyncFunc)(SyncEngine *  thiz, SyncSrc *  source, time_t last_sync, SyncKind type);
数据同步管理器设计备忘录_服务器_02typedef SyncRet     ( * SyncEngineCancelFunc)(SyncEngine *  thiz);
数据同步管理器设计备忘录_服务器_02typedef SyncRet     ( * SyncEngineEndSyncFunc)(SyncEngine *  thiz);
数据同步管理器设计备忘录_服务器_02typedef SyncRet     ( * SyncEngineRegEventListenerFunc)(SyncEngine *  thiz, SyncOnEventFunc on_event,  void *  ctx);
数据同步管理器设计备忘录_服务器_02typedef SyncRet     ( * SyncEngineRegProgressListenerFunc)(SyncEngine *  thiz, SyncOnProgressFunc on_progress,  void *  ctx);
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02 struct  _SyncEngine
数据同步管理器设计备忘录_object_42数据同步管理器设计备忘录_服务器_43 ... {
数据同步管理器设计备忘录_struct_44        SyncEngineRefFunc                  ref;
数据同步管理器设计备忘录_struct_44        SyncEngineUnrefFunc                unref;
数据同步管理器设计备忘录_struct_44        SyncEngineGetIDFunc                get_id;
数据同步管理器设计备忘录_struct_44        SyncEngineGetNameFunc              get_name;
数据同步管理器设计备忘录_struct_44        SyncEngineBeginSyncFunc            begin_sync;
数据同步管理器设计备忘录_struct_44        SyncEngineSyncFunc                 sync;
数据同步管理器设计备忘录_struct_44        SyncEngineCancelFunc               cancel;
数据同步管理器设计备忘录_struct_44        SyncEngineEndSyncFunc              end_sync;
数据同步管理器设计备忘录_struct_44        SyncEngineRegEventListenerFunc     reg_event_listener;
数据同步管理器设计备忘录_struct_44        SyncEngineRegProgressListenerFunc  reg_progress_listener;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44        char priv[0];
数据同步管理器设计备忘录_object_86} ;
数据同步管理器设计备忘录_服务器_02

SyncEngineSettings主要负责SyncEngine的设置,每个SyncEngine插件都要提供一个SyncEngineSettings插件,SyncEngineSettings是和GUI相关的,所以与SyneEngine分开提供。SyncEngineSettings的接口很简单:


数据同步管理器设计备忘录_服务器_02struct  _SyncEngineSettings;
数据同步管理器设计备忘录_服务器_02typedef  struct  _SyncEngineSettings SyncEngineSettings;
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02typedef SyncID ( * SyncEngineSettingsGetIDFunc)(SyncEngineSettings *  thiz);
数据同步管理器设计备忘录_服务器_02typedef  const   char *  ( * SyncEngineSettingsGetNameFunc)(SyncEngineSettings *  thiz);
数据同步管理器设计备忘录_服务器_02typedef SyncRet ( * SyncEngineSettingsEditPartnerFunc)(SyncEngineSettings *  thiz, SyncPartnerConfig *  partner_config, SyncSettingsEditDoneFunc done,  void *  ctx);
数据同步管理器设计备忘录_服务器_02typedef SyncRet ( * SyncEngineSettingsRefFunc)(SyncEngineSettings *  thiz);
数据同步管理器设计备忘录_服务器_02typedef SyncRet ( * SyncEngineSettingsUnrefFunc)(SyncEngineSettings *  thiz);
数据同步管理器设计备忘录_服务器_02
数据同步管理器设计备忘录_服务器_02 struct  _SyncEngineSettings
数据同步管理器设计备忘录_object_42数据同步管理器设计备忘录_服务器_43 ... {
数据同步管理器设计备忘录_struct_44        SyncEngineSettingsRefFunc          ref;
数据同步管理器设计备忘录_struct_44        SyncEngineSettingsUnrefFunc        unref;
数据同步管理器设计备忘录_struct_44        SyncEngineSettingsGetIDFunc        get_id;
数据同步管理器设计备忘录_struct_44        SyncEngineSettingsGetNameFunc      get_name;
数据同步管理器设计备忘录_struct_44        SyncEngineSettingsEditPartnerFunc  edit_partner;
数据同步管理器设计备忘录_struct_44
数据同步管理器设计备忘录_struct_44        char priv[0];
数据同步管理器设计备忘录_object_86} ;
数据同步管理器设计备忘录_服务器_02


~~end~~