|
Imports System.Net |
|
Imports System.IO |
|
Imports System.XML |
|
Imports System.Data |
|
Imports System.Configuration |
|
Imports System.Security.Cryptography.X509Certificates |
|
Imports System.DirectoryServices |
|
|
|
Partial Class os_TeamCalendar |
|
Inherits System.Web.UI.Page |
|
|
|
Const errorLevel As Integer = 2 ' 2 = verbose, 1 = concise |
|
|
|
Protected Sub Page_Load1(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load |
|
' sharing calendar must be set to reviewer http://office.microsoft.com/en-us/outlook/HP011111491033.aspx |
|
|
|
If (Not IsPostBack) Then |
|
RadScheduler1.SelectedDate = Today |
|
Dim dt As New DataTable() |
|
dt.Columns.Add("StartTime", System.Type.GetType("System.DateTime")) |
|
dt.Columns.Add("EndTime", System.Type.GetType("System.DateTime")) |
|
dt.Columns.Add("NameID", System.Type.GetType("System.String")) |
|
dt.Columns.Add("Name", System.Type.GetType("System.String")) |
|
dt.Columns.Add("Location", System.Type.GetType("System.String")) |
|
dt.Columns.Add("Subject", System.Type.GetType("System.String")) |
|
dt.Columns.Add("Status", System.Type.GetType("System.String")) |
|
dt.Columns.Add("Type", System.Type.GetType("System.String")) |
|
dt.Columns.Add("RecurrenceRule", System.Type.GetType("System.String")) |
|
dt.Columns.Add("RecurrenceParentID", System.Type.GetType("System.Int32")) |
|
|
|
Dim strUsers As String = System.Configuration.ConfigurationManager.AppSettings("Usernames") |
|
Dim arrUsers() As String = strUsers.Split(",") |
|
Dim strUser As String |
|
|
|
For Each strUser In arrUsers |
|
LookUpCalendar(strUser, RadScheduler1.SelectedDate, dt) |
|
Next |
|
|
|
RadScheduler1.DataSource = dt |
|
RadScheduler1.DataBind() |
|
|
|
Else |
|
|
|
End If |
|
End Sub |
|
|
|
Sub LookUpCalendar(ByVal Name As String, ByVal dDate As DateTime, ByRef dt As DataTable) |
|
|
|
Dim strURL As String = "http://" & System.Configuration.ConfigurationManager.AppSettings("EMailServer") & "/exchange/" & Name & "/calendar/" |
|
|
|
Dim strRequest As String = "<?xml version=""1.0""?>" & _ |
|
"<g:searchrequest xmlns:g=""DAV:"">" & _ |
|
"<g:sql>SELECT ""urn:schemas:calendar:location"", ""urn:schemas:httpmail:subject"", " & _ |
|
"""urn:schemas:calendar:dtstart"", ""urn:schemas:calendar:dtend"", " & _ |
|
"""urn:schemas:calendar:busystatus"", ""urn:schemas:calendar:instancetype"" " & _ |
|
"FROM Scope('SHALLOW TRAVERSAL OF """ & strURL & """') " & _ |
|
"WHERE NOT ""urn:schemas:calendar:instancetype"" = 1 " & _ |
|
"AND ""DAV:contentclass"" = 'urn:content-classes:appointment' " & _ |
|
"AND ""urn:schemas:calendar:dtstart"" > '" & _ |
|
String.Format("{0:yyyy/MM/dd}", dDate) & " 00:00:00' " & _ |
|
"AND ""urn:schemas:calendar:dtend"" < '" & _ |
|
String.Format("{0:yyyy/MM/dd}", dDate.AddDays(1)) & " 00:00:00' " & _ |
|
"ORDER BY ""urn:schemas:calendar:dtstart"" ASC" & _ |
|
"</g:sql></g:searchrequest>" |
|
|
|
'0 = " Instance type: 0-Single appointment<br>" |
|
'1 = " Instance type: 1-Master recurring appointment<br>" |
|
'2 = " Instance type: 2-Single instance, recurring appointment<br>" |
|
'3 = " Instance type: 3-Exception to a recurring appointment<br>" |
|
|
|
Dim strStatusText As String = "" |
|
Dim Status As Integer |
|
Dim ResponseXmlDoc As XmlDocument = SendRequest("SEARCH", strURL, strRequest, strStatusText, Status) |
|
AddToSchedule(ResponseXmlDoc, Name, dt) |
|
|
|
'Display the results. |
|
If (Status >= 200 And Status < 300) Then |
|
'AddInfo("<br>" & Name & " " & "Result = " & Status & ": " & strStatusText, 2) |
|
ElseIf Status = 401 Then |
|
'AddInfo("<br><font color='red'>Permission denied!</font>", 1) |
|
'AddInfo("<br><font color='red'>Check your permissions for this item.</font>", 2) |
|
Else |
|
'AddInfo("<br><font color='red'>Request failed.</font>", 1) |
|
'AddInfo("<br><font color='red'>Result = " & Status & ": " & strStatusText & "</font>", 2) |
|
End If |
|
|
|
End Sub |
|
|
|
Sub AddToSchedule(ByVal ResponseXmlDoc As System.Xml.XmlDocument, ByVal Name As String, ByRef dt As DataTable) |
|
' Build a list of the DAV:href XML nodes, corresponding to the folders |
|
' in the mailbox. The DAV: namespace is typically assigned the a: prefix in the XML response body. |
|
If (ResponseXmlDoc Is Nothing) Then Return |
|
Dim HrefNodes As System.Xml.XmlNodeList = ResponseXmlDoc.GetElementsByTagName("a:href") |
|
' Build a list of the urn:schemas:httpmail:subject XML nodes, |
|
' The urn:schemas:httpmail: namespace is typically assigned the e: prefix in the XML response body. |
|
Dim SubjectNodeList As System.Xml.XmlNodeList = ResponseXmlDoc.GetElementsByTagName("e:subject") |
|
' Build a list of the urn:schemas:calendar:location XML nodes, |
|
' The urn:schemas:calendar: namespace is typically assigned the d: prefix in the XML response body. |
|
Dim LocationNodeList As System.Xml.XmlNodeList = ResponseXmlDoc.GetElementsByTagName("d:location") |
|
' Build a list of the urn:schemas:calendar:dtstart XML nodes, |
|
Dim StartTimeNodeList As System.Xml.XmlNodeList = ResponseXmlDoc.GetElementsByTagName("d:dtstart") |
|
' Build a list of the urn:schemas:calendar:dtend XML nodes, |
|
Dim EndTimeNodeList As System.Xml.XmlNodeList = ResponseXmlDoc.GetElementsByTagName("d:dtend") |
|
' Build a list of the urn:schemas:calendar:busystatus XML nodes, |
|
Dim BusyStatusNodeList As System.Xml.XmlNodeList = ResponseXmlDoc.GetElementsByTagName("d:busystatus") |
|
' Build a list of the urn:schemas:calendar:instancetype XML nodes, |
|
Dim InstanceTypeNodeList As System.Xml.XmlNodeList = ResponseXmlDoc.GetElementsByTagName("d:instancetype") |
|
|
|
' Loop through the returned items (if any). |
|
If SubjectNodeList.Count > 0 Then |
|
|
|
Dim i As Integer |
|
For i = 0 To SubjectNodeList.Count - 1 |
|
Dim dr As DataRow = dt.NewRow() |
|
dr("Subject") = SubjectNodeList(i).InnerText |
|
dr("Location") = LocationNodeList(i).InnerText |
|
dr("StartTime") = DateTime.Parse(StartTimeNodeList(i).InnerText) |
|
dr("EndTime") = DateTime.Parse(EndTimeNodeList(i).InnerText) |
|
dr("Status") = BusyStatusNodeList(i).InnerText |
|
dr("NameID") = Name |
|
dr("Name") = Name |
|
dr("Type") = InstanceTypeNodeList(i).InnerText |
|
dr("RecurrenceRule") = DBNull.Value |
|
dr("RecurrenceParentID") = DBNull.Value |
|
'0 = " Instance type: 0-Single appointment<br>" |
|
'1 = " Instance type: 1-Master recurring appointment<br>" |
|
'2 = " Instance type: 2-Single instance, recurring appointment<br>" |
|
'3 = " Instance type: 3-Exception to a recurring appointment<br>" |
|
dt.Rows.Add(dr) |
|
Next |
|
End If |
|
|
|
End Sub |
|
|
|
Function SendRequest(ByVal strCommand As String, ByVal strURL As String, ByVal strBody As String, _ |
|
ByRef strStatusText As String, ByRef iStatCode As Integer) As XmlDocument |
|
|
|
Try |
|
' Create a new CredentialCache object and fill it with the network credentials required to access the server. |
|
Dim Username As String = System.Configuration.ConfigurationManager.AppSettings("UserForReadingCalendars") |
|
Dim Password As String = System.Configuration.ConfigurationManager.AppSettings("PwdForReadingCalendars") |
|
Dim strDomain As String = System.Configuration.ConfigurationManager.AppSettings("WindowsDomain") |
|
|
|
Dim myCred As New NetworkCredential(strDomain & "\" & Username, Password) |
|
Dim myUri As System.Uri = New System.Uri(strURL) |
|
Dim MyCredentialCache As New CredentialCache |
|
MyCredentialCache.Add(myUri, "Basic", myCred) |
|
' Create the HttpWebRequest object. |
|
Dim objRequest As HttpWebRequest = CType(WebRequest.Create(strURL), HttpWebRequest) |
|
' Add the network credentials to the request. |
|
objRequest.Credentials = MyCredentialCache |
|
' Specify the method. |
|
objRequest.Method = strCommand |
|
' Set Headers |
|
objRequest.KeepAlive = True |
|
objRequest.Headers.Set("Pragma", "no-cache") |
|
objRequest.ContentType = "text/xml" |
|
|
|
'Set the request timeout to 5 minutes |
|
objRequest.Timeout = 300000 |
|
|
|
If (strBody.Length > 0) Then |
|
' Store the data in a byte array |
|
Dim ByteQuery() As Byte = System.Text.Encoding.ASCII.GetBytes(strBody) |
|
objRequest.ContentLength = ByteQuery.Length |
|
Dim QueryStream As Stream = objRequest.GetRequestStream() |
|
' Write the data to be posted to the Request Stream |
|
QueryStream.Write(ByteQuery, 0, ByteQuery.Length) |
|
QueryStream.Close() |
|
End If |
|
|
|
' Send the method request and get the response from the server. |
|
Dim objResponse As HttpWebResponse = CType(objRequest.GetResponse(), HttpWebResponse) |
|
' Get the Status code |
|
iStatCode = objResponse.StatusCode |
|
strStatusText = objResponse.StatusDescription |
|
' Get the XML response stream. |
|
Dim ResponseStream As System.IO.Stream = objResponse.GetResponseStream() |
|
' Create the XmlDocument object from the XML response stream. |
|
Dim ResponseXmlDoc As New System.Xml.XmlDocument |
|
ResponseXmlDoc.Load(ResponseStream) |
|
' Clean up. |
|
ResponseStream.Close() |
|
objResponse.Close() |
|
Return ResponseXmlDoc |
|
|
|
Catch ex As Exception |
|
Throw ex |
|
|
|
End Try |
|
|
|
Return Nothing |
|
|
|
End Function |
|
|
|
End Class |
|
|