Windows Mobile 的 iCalendar 同步器






4.73/5 (9投票s)
为 Windows Mobile 和 Pocket Outlook 开发一个简单的 Google iCalendar 同步器

引言
本文描述了一个为Windows Mobile开发的简单应用程序,它可以与外部提供程序(在本例中为Google)同步日历,该提供程序能够以iCalendar格式提供事件。
背景
iCalendar是一种允许交换事件/会议请求和任务的文件格式。该标准共享的文件具有.ics扩展名。接收iCalendar数据文件的用户可以轻松地回复发送者或反提议另一个会议日期/时间。iCalendar上的一个非常简单的事件应该是
BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
DTSTART:200714T170000Z
DTEND:20070715T035959Z
SUMMARY: Dinner with my father
END:VEVENT
END:VCALENDAR
该标准基于RFC 2445。
Using the Code
该代码基于J. Tim Spurway开发的iCalendar解析器,并适配到Windows Mobile和Microsoft Compact Framework .NET 3.5。该应用程序是用C#开发的。
开发该系统的主要步骤是
- 实现Emitter以接收事件
- 将事件与Outlook日历同步,以及
- 实现用户界面
以下序列图显示了整个应用程序。当用户调用“Form”实现的“Sync”方法时,系统会发出HTTP请求,然后解析服务器刷新的iCalendar流。“Parser”(由J. Tim Spurway和Robert Prouse实现)将找到的token传递给实现的“IEmitter”接口。在我们的例子中,我们通过“OutlookCalendarEmitter”实现了IEmitter
,它访问Outlook日历并将Appointment推送到数据库。

实现Emitter以接收事件
“IEmitter
”是一个简单的接口
,能够从“Parser
”类接收来自iCalendar
流源的事件和属性
class OutlookCalendarEmitter : IEmitter
{
//local cache
DateTime start = DateTime.Now;
DateTime end = DateTime.Now;
string summary = "";
//temp var
string currentTag = "";
string currentValue = "";
string currentComponent = "";
...
public void doEndComponent()
{
Debug.WriteLine("doEndComponent: currentTag=" + currentTag);
if (currentComponent.Equals("Vevent"))
{
AddAppointment(summary, summary, start, end);
}
}
public void doID(Token t)
{
Debug.WriteLine("doID: \t" + t.TokenText);
currentTag = t.TokenText;
}
public void doValueProperty(Token t, Token iprop)
{
if (iprop != null)
{
Debug.WriteLine(t.TokenText + " " + iprop.TokenText);
currentTag = t.TokenText;
currentValue = iprop.TokenText;
}
else
{
currentValue = t.TokenText;
}
}
public void doRest(Token t, Token id)
{
doPrepare(id.TokenText, t.TokenText);
}
}
当为“VEvent
”调用“doEndComponent()
”时,您可以调用以下方法在Pocket PC日历上添加一个约会
AddAppointment(summary, summary, start, end);
接口Microsoft Outlook Pocket Calendar
现在是时候实现“AddAppointment(summary, summary, start, end);
”方法了。我们需要访问“OutlookSession
”并将新事件放入“Appointments
”。
class OutlookCalendarEmitter : IEmitter
{
string formatDate = "yyyyMMdd'T'HHmmss'Z'";
CultureInfo culture = CultureInfo.InvariantCulture;
OutlookSession session = new OutlookSession();
...
private void AddAppointment
(String subject, String text, DateTime start, DateTime end)
{
Debug.WriteLine("Appointment");
Appointment a = null;
for (int i = 0; i < session.Appointments.Items.Count; i++)
{
Appointment app = session.Appointments.Items[i];
if (app.Subject.Equals(subject))
{
a = app;
break;
}
}
if (a==null) a=session.Appointments.Items.AddNew();
a.Subject = subject;
a.Body = text;
a.Start = start;
a.End = end;
a.Subject = subject;
a.Update();
}
}
开发用户界面
在Visual Studio中,创建一个如图1所示的新窗体

在“Sync Now”按钮上,调用(双击)“Sync
”方法。
private WebRequest req = null;
private OutlookCalendarEmitter emitter = new OutlookCalendarEmitter();
private void DoSync()
{
string urlText = this.textBoxUrl.Text;
try
{
req = WebRequest.Create(urlText);
req.Method = "GET";
TextReader reader = new StreamReader(req.GetResponse().GetResponseStream());
Parser parser = new Parser(reader, emitter);
parser.Parse();
}
catch (Exception e)
{
this.listBox1.Items.Add("Error: " + e.Message);
}
req = null;
}
项目
在附带的代码中,您可以找到J. Tim Spurway开发的iparser、用户界面以及用于分发它的cabinet项目。该应用程序在Treo 750上进行了测试。