Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

.NET class to create and maintain vCalendar information

0.00/5 (No votes)
6 Feb 2003 1  
.NET class to create and maintain vCalendar information

Sample Image - vCalendar.gif

Introduction

I have been porting the calendar portion of my site to ASP.NET and came to the exporting of event information to a vCalendar file that can be imported into Outlook or other calendar apps that support the vCalendar/iCalendar format. So I created a class to wrap all of the formatting of information.

Public Class vCalendar
    Public Events As vEvents

    Public Overrides Function ToString() As String
        Dim result As New System.Text.StringBuilder()
        result.AppendFormat("BEGIN:VCALENDAR{0}", _
System.Environment.NewLine) 'The following two lines seem to be required by
'Outlook to get the alarm settings
result.AppendFormat("VERSION:2.0{0}", System.Environment.NewLine) result.AppendFormat("METHOD:PUBLISH{0}", _
System.Environment.NewLine) Dim item As vEvent For Each item In Events result.Append(item.ToString()) Next result.AppendFormat("END:VCALENDAR{0}", _
System.Environment.NewLine) Return result.ToString End Function Public Sub New(ByVal Value As vEvent) Me.Events = New vEvents() Me.Events.Add(Value) End Sub Public Sub New() Me.Events = New vEvents() End Sub Public Class vAlarm Public Trigger As TimeSpan
'Amount of time before event to display alarm Public Action As String
'Action to take to notify user of alarm Public Description As String 'Description of the alarm Public Sub New() Trigger = TimeSpan.FromDays(1) Action = "DISPLAY" Description = "Reminder" End Sub Public Sub New(ByVal SetTrigger As TimeSpan) Trigger = SetTrigger Action = "DISPLAY" Description = "Reminder" End Sub Public Sub New(ByVal SetTrigger As TimeSpan, _
ByVal SetAction As String, ByVal SetDescription As String) Trigger = SetTrigger Action = SetAction Description = SetDescription End Sub Public Overrides Function ToString() As String Dim result As New System.Text.StringBuilder() result.AppendFormat("BEGIN:VALARM{0}", _
System.Environment.NewLine) result.AppendFormat("TRIGGER:P{0}DT{1}H{2}M{3}", _
Trigger.Days, Trigger.Hours, Trigger.Minutes, _
System.Environment.NewLine) result.AppendFormat("ACTION:{0}{1}", Action, _
System.Environment.NewLine) result.AppendFormat("DESCRIPTION:{0}{1}", _
Description, System.Environment.NewLine) result.AppendFormat("END:VALARM{0}", _
System.Environment.NewLine) Return result.ToString End Function End Class Public Class vEvent Public UID As String 'Unique identifier for the event Public DTStart As Date 'Start date of event.
'Will be automatically converted to GMT
Public DTEnd As Date 'End date of event.
'Will be automatically converted to GMT
Public DTStamp As Date 'Timestamp.
'Will be automatically converted to GMT
Public Summary As String 'Summary/Subject of event Public Organizer As String 'Can be mailto: url or just a name Public Location As String Public Description As String Public URL As String Public Alarms As vAlarms 'Alarms needed for this event Public Overrides Function ToString() As String Dim result As New System.Text.StringBuilder() result.AppendFormat("BEGIN:VEVENT{0}", _
System.Environment.NewLine) result.AppendFormat("UID:{0}{1}", UID, _
System.Environment.NewLine) result.AppendFormat("SUMMARY:{0}{1}", _
Summary, System.Environment.NewLine) result.AppendFormat("ORGANIZER:{0}{1}", Organizer, _
System.Environment.NewLine) result.AppendFormat("LOCATION:{0}{1}", Location, _
System.Environment.NewLine) result.AppendFormat("DTSTART:{0}{1}", _
DTStart.ToUniversalTime.ToString("yyyyMMdd\THHmmss\Z"), _
System.Environment.NewLine) result.AppendFormat("DTEND:{0}{1}", _
DTEnd.ToUniversalTime.ToString("yyyyMMdd\THHmmss\Z"), _
System.Environment.NewLine) result.AppendFormat("DTSTAMP:{0}{1}", _
Now.ToUniversalTime.ToString("yyyyMMdd\THHmmss\Z"), _
System.Environment.NewLine) result.AppendFormat("DESCRIPTION:{0}{1}", Description, _
System.Environment.NewLine) If URL.Length > 0 Then result.AppendFormat("URL:{0}{1}", _
URL, System.Environment.NewLine) Dim item As vAlarm For Each item In Alarms result.Append(item.ToString()) Next result.AppendFormat("END:VEVENT{0}", _
System.Environment.NewLine) Return result.ToString End Function Public Sub New() Me.Alarms = New vAlarms() End Sub End Class Public Class vAlarms ' The first thing to do when building a CollectionBase
' class is to inherit from System.Collections.CollectionBase
Inherits System.Collections.CollectionBase Public Overloads Function Add(ByVal Value As vAlarm) As vAlarm ' After you inherit the CollectionBase class, you
' can access an intrinsic object
' called InnerList that represents your collection.
' InnerList is of type ArrayList.
Me.InnerList.Add(Value) Return Value End Function Public Overloads Function Item(ByVal Index As Integer) As vAlarm ' To retrieve an item from the InnerList,
' pass the index of that item to the .Item property.
Return CType(Me.InnerList.Item(Index), vAlarm) End Function Public Overloads Sub Remove(ByVal Index As Integer) ' This Remove expects an index. Dim cust As vAlarm cust = CType(Me.InnerList.Item(Index), vAlarm) If Not cust Is Nothing Then Me.InnerList.Remove(cust) End If End Sub End Class Public Class vEvents ' The first thing to do when building a CollectionBase
' class is to inherit from System.Collections.CollectionBase
Inherits System.Collections.CollectionBase Public Overloads Function Add(ByVal Value As vEvent) As vEvent ' After you inherit the CollectionBase class,
' you can access an intrinsic object
' called InnerList that represents your collection.
' InnerList is of type ArrayList.
Me.InnerList.Add(Value) Return Value End Function Public Overloads Function Item(ByVal Index As Integer) As vEvent ' To retrieve an item from the InnerList,
' pass the index of that item to the .Item property.
Return CType(Me.InnerList.Item(Index), vEvent) End Function Public Overloads Sub Remove(ByVal Index As Integer) ' This Remove expects an index. Dim cust As vEvent cust = CType(Me.InnerList.Item(Index), vEvent) If Not cust Is Nothing Then Me.InnerList.Remove(cust) End If End Sub End Class End Class

I plan to add more properties as I discover them, but these are pretty much the only ones that are supported by outlook at this time. I also wanted to get some feedback on my design.

vCalendar specs

Here are some links to for the vCalendar specs (thanks Tommi):

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here