65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows Mobile 的 iCalendar 同步器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.73/5 (9投票s)

2010年3月4日

CPOL

2分钟阅读

viewsIcon

23613

downloadIcon

415

为 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推送到数据库。

iCalendarSync/diagram.gif

实现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所示的新窗体

iCalendarSync/figure1.jpg

在“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上进行了测试。

© . All rights reserved.