1: /// <summary>
2: /// Returns a list of the user's calendar items.
3: /// </summary>
4: /// <param name="UserName">User name used for logging in</param>
5: /// <param name="Password">Password for logging in</param>
6: /// <param name="Directory">User's directory</param>
7: /// <param name="StartDate">Date to start at</param>
8: /// <param name="EndDate">Date to end at</param>
9: /// <param name="Server">Server Name</param>
10: /// <returns>A list of the user's calendar items in VCalendar format, between two date ranges</returns>
11: public static List<VCalendar> GetCalendarItems(string UserName, string Password, string Server, string Directory, DateTime StartDate, DateTime EndDate)
12: {
13: List<VCalendar> ReturnArray = new List<VCalendar>();
14: string Uri = string.Format("http://{0}/exchange/{1}/calendar/", Server, Directory);
15:
16: string Query = "<?xml version=\"1.0\"?>"
17: + "<g:searchrequest xmlns:g=\"DAV:\">"
18: + "<g:sql>SELECT \"urn:schemas:calendar:location\", \"urn:schemas:httpmail:subject\", "
19: + "\"urn:schemas:httpmail:textdescription\", "
20: + "\"urn:schemas:calendar:dtstart\", \"urn:schemas:calendar:dtend\", "
21: + "\"urn:schemas:calendar:busystatus\", \"urn:schemas:calendar:instancetype\" "
22: + "FROM Scope('SHALLOW TRAVERSAL OF \"" + Uri + "\"') "
23: + "WHERE ((\"urn:schemas:calendar:dtstart\" >= '" + StartDate.ToString("yyyy/MM/dd hh:mm:ss") + "' "
24: + "AND \"urn:schemas:calendar:dtstart\" <= '" + EndDate.ToString("yyyy/MM/dd hh:mm:ss") + "') "
25: + "OR (\"urn:schemas:calendar:dtend\" >= '" + StartDate.ToString("yyyy/MM/dd hh:mm:ss") + "' "
26: + "AND \"urn:schemas:calendar:dtstart\" <= '" + EndDate.ToString("yyyy/MM/dd hh:mm:ss") + "')) "
27: + "AND \"DAV:contentclass\" = 'urn:content-classes:appointment' "
28: + "AND NOT \"urn:schemas:calendar:instancetype\" = 1 "
29: + "ORDER BY \"urn:schemas:calendar:dtstart\" ASC"
30: + "</g:sql></g:searchrequest>";
31: byte[] Contents = System.Text.Encoding.UTF8.GetBytes(Query);
32:
33: HttpWebRequest Request = HttpWebRequest.Create(Uri) as HttpWebRequest;
34: System.Net.CredentialCache MyCredentialCache = new System.Net.CredentialCache();
35: if (!string.IsNullOrEmpty(UserName) && !string.IsNullOrEmpty(Password))
36: {
37: MyCredentialCache.Add(new System.Uri(Uri),
38: "NTLM",
39: new System.Net.NetworkCredential(UserName, Password));
40: }
41: else
42: {
43: MyCredentialCache.Add(new System.Uri(Uri),
44: "Negotiate",
45: (System.Net.NetworkCredential)CredentialCache.DefaultCredentials);
46: }
47: Request.Credentials = MyCredentialCache;
48: Request.Method = "SEARCH";
49: Request.ContentLength = Contents.Length;
50: Request.ContentType = "text/xml";
51:
52: using (System.IO.Stream RequestStream = Request.GetRequestStream())
53: {
54: RequestStream.Write(Contents, 0, Contents.Length);
55:
56: using (HttpWebResponse Response = Request.GetResponse() as HttpWebResponse)
57: {
58: using (System.IO.Stream ResponseStream = Response.GetResponseStream())
59: {
60: XmlDocument Document = new XmlDocument();
61: Document.Load(ResponseStream);
62: foreach (XmlElement Element in Document.GetElementsByTagName("a:prop"))
63: {
64: VCalendar Cal = new VCalendar();
65: if (Element["e:textdescription"] != null)
66: {
67: Cal.Description = Element["e:textdescription"].InnerText;
68: }
69: if (Element["e:subject"] != null)
70: {
71: Cal.Subject = Element["e:subject"].InnerText;
72: }
73: if (Element["d:location"] != null)
74: {
75: Cal.Location = Element["d:location"].InnerText;
76: }
77: if (Element["d:dtstart"] != null)
78: {
79: Cal.StartTime = DateTime.Parse(Element["d:dtstart"].InnerText);
80: }
81: if (Element["d:dtend"] != null)
82: {
83: Cal.EndTime = DateTime.Parse(Element["d:dtend"].InnerText);
84: }
85: ReturnArray.Add(Cal);
86: }
87: }
88: }
89: }
90: return ReturnArray;
91: }