GMobileSync开发环境搭建

前期的准备工作。

首先,搭建Windows Mobile开发平台,很简单,依次装下面这些软件就可以了。

  1. Microsoft Outlook 2 003。(Microsoft ActiveSync依赖它)
  2. Microsoft ActiveSync 4.5。(用于同步手机和模拟器)
  3. Visual Studio .Net 2005。(安装C#的时候要选上smart device)
  4. Windows Mobile 5.0 Pocket PC SDK。(GMobileSync采用WM5.0的SDK)
  5. .NET library for the Google Data API。

打开GMobileSync工程,在项目的References中,引用了

Google.GData.AccessControl


Google.GData.Calendar


Google.GData.Client


Google.GData.Extensions

如果引用无效,则重新在菜单Project -> Add References里面添加一下引用,对应的DLL文件在C:\Program Files\Google\Google Data API SDK\Redist\Mobile\WindowsMobile目录下。

第二步,如何调试。选择菜单Debug -> Start Debugging 之后会出现deploy对话框。如果你有手机并已经连线,你可以选择Windows Mobile 5.0 PocketPC Device ,或者你也可以选择Windows Mobile 5.0 PocketPC Emulator。

如果选择了Emulator,部署完成之后需要执行下面的步骤来建立网络连接:

  1. 在Tools菜单中打开Device Emulator Manager。
  2. 我们刚刚部署完成,可以看到Windows Mobile 5.0 PocketPC Emulator前面显示了一个绿色的箭头,表示模拟器正在运行。
  3. 在Windows Mobile 5.0 PocketPC Emulator上点击右键,选择Cradle。
  4. ActiveSync应该会自动和Emulator建立连接。如果没有,就在ActiveSync的菜单里面选择File -> Connection Settings。在打开的对话框中选中 Allow connections to one of the following,在它的下拉菜单中选择DMA。然后点击对话框右上角的Connect按钮,完成连接。
  5. OK,此时在模拟器上已经运行GMobileSync,可以测试它的功能了。

简单的看了一下 GMobileSync源代码。

  • 程序的主要逻辑集中在frmMain.cs和GMobileSync.cs中。
  • 程序的配置信息存放在/Application Data/GMobileSync/GMobileSync.xml中,包括用户名,密码,时区,上次同步过的事件等等。
  • GMobileSync.IsReallyConnected() 会尝试下载"http://rareedge.com/gmobilesync/connected.txt",如果下载成功则表示WAP连接已经建立。感觉这种方法会影响速度,毕竟要访问国外的网站然后把文件下载下来。如果WM SDK中带有测试Internet连接的API,这里就可以得到改进吧。
  • Google Calendar中的每个Event会有一个唯一的URL地址,Mobile Outlook里面的每个Appointment有一个唯一的ID。GMobileSync.xml里面会保存上次同步过的事件,形式就是<Appointment ID, Event URL>的pair。
  • 为了日历的双向同步,需要能检查 Appointment或者Event是否改变。程序会为Appointment和Event计算md5,并且保存为Appointment的属性,GmsGoogleChecksum是Event的md5,GmsLocalChecksum是Appointment的md5。



GMobileSync的同步流程:

  1. 从Google Calendar中下载同步日期间的所有Event。
  2. 对于每个Event
    1. 出现在上次同步的列表(列表信息记录在GMobileSync.xml中)中
      1. 找到本地对于的Appointment,计算远程Event的md5 checksum,与本地Appointment的"GmsGoogleChecksum"属性比较
        1. checksum不相同,则用远程的Event信息更新本地的Appointment。


          这说明如果自上次同步之后,本地和远程都对事件修改过,那么以远程修改为准,本地修改将被丢弃。
        2. Checksum相同,do nothing
      2. 找不到本地对应的Appointment,则Appointment自上次同步后在本地被删除,删除Event。


        此时,远程修改将被丢弃。
    2. 不在上次同步的列表中,则根据Event信息新建Appointment。
  3. 从Mobile Outlook中取得同步日期间的所有Appointment。
  4. 对于每个Appointment
    1. 存在"GmsLocalChecksum"属性
      1. 计算当前Appointment的md5 checksum,与记录的checksum比较,可以知道Appointment是否在本地被修改。
      2. 根据"GmsSelfUri"属性找到Appointment对应的Event的URL,然后测试Event是否存在。
      3. Event不存在,则删除本地Appointment。本地修改将被丢弃。
      4. Event存在,且Checksum不同,则更新远程的Event。
      5. Event存在,且Checksum相同,do nothing。
    2. 不存在"GmsLocalChecksum"属性,新Appointment,添加到Google Calendar。

Comments