Click here to Skip to main content
Click here to Skip to main content

.NET class to create and maintain vCalendar information

, 6 Feb 2003 CPOL
Rate this:
Please Sign up or sign in to vote.
.NET class to create and maintain vCalendar information
<!-- Article image -->

Sample Image - vCalendar.gif

<!-- Add the rest of your HTML here -->

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}", _<BR>             System.Environment.NewLine)
        'The following two lines seem to be required by <BR>        'Outlook to get the alarm settings
        result.AppendFormat("VERSION:2.0{0}", System.Environment.NewLine)
        result.AppendFormat("METHOD:PUBLISH{0}", _<BR>             System.Environment.NewLine)
        Dim item As vEvent
        For Each item In Events
            result.Append(item.ToString())
        Next
        result.AppendFormat("END:VCALENDAR{0}", _<BR>            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        <BR>           'Amount of time before event to display alarm
        Public Action As String         <BR>           '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, _<BR>              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}", _<BR>               System.Environment.NewLine)
            result.AppendFormat("TRIGGER:P{0}DT{1}H{2}M{3}", _<BR>               Trigger.Days, Trigger.Hours, Trigger.Minutes, _<BR>               System.Environment.NewLine)
            result.AppendFormat("ACTION:{0}{1}", Action, _<BR>               System.Environment.NewLine)
            result.AppendFormat("DESCRIPTION:{0}{1}", _<BR>               Description, System.Environment.NewLine)
            result.AppendFormat("END:VALARM{0}", _<BR>               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.  <BR>                   'Will be automatically converted to GMT
        Public DTEnd As Date         'End date of event.  <BR>                   'Will be automatically converted to GMT
        Public DTStamp As Date        'Timestamp.  <BR>                   '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}", _<BR>               System.Environment.NewLine)
            result.AppendFormat("UID:{0}{1}", UID, _<BR>               System.Environment.NewLine)
            result.AppendFormat("SUMMARY:{0}{1}", _<BR>               Summary, System.Environment.NewLine)
            result.AppendFormat("ORGANIZER:{0}{1}", Organizer, _<BR>               System.Environment.NewLine)
            result.AppendFormat("LOCATION:{0}{1}", Location, _<BR>               System.Environment.NewLine)
            result.AppendFormat("DTSTART:{0}{1}", _<BR>               DTStart.ToUniversalTime.ToString("yyyyMMdd\THHmmss\Z"), _<BR>               System.Environment.NewLine)
            result.AppendFormat("DTEND:{0}{1}", _<BR>               DTEnd.ToUniversalTime.ToString("yyyyMMdd\THHmmss\Z"), _<BR>               System.Environment.NewLine)
            result.AppendFormat("DTSTAMP:{0}{1}", _<BR>               Now.ToUniversalTime.ToString("yyyyMMdd\THHmmss\Z"), _<BR>               System.Environment.NewLine)
            result.AppendFormat("DESCRIPTION:{0}{1}", Description, _<BR>               System.Environment.NewLine)
            If URL.Length > 0 Then result.AppendFormat("URL:{0}{1}", _<BR>               URL, System.Environment.NewLine)
            Dim item As vAlarm
            For Each item In Alarms
                result.Append(item.ToString())
            Next
            result.AppendFormat("END:VEVENT{0}", _<BR>                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 <BR>        ' 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 <BR>            ' can access an intrinsic object
            ' called InnerList that represents your collection. <BR>            ' 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, <BR>            ' 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 <BR>        ' 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, <BR>            ' you can access an intrinsic object
            ' called InnerList that represents your collection. <BR>            ' 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, <BR>            ' 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, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

slolife
Web Developer
United States United States
http://www.onlinescorekeeper.com/

Comments and Discussions

 
QuestionPlease show me on how to use it? Pinmembermcflee8-Nov-04 5:02 
GeneralThe iCalendar PinmemberAnthony_Yio6-Oct-04 21:57 
GeneralRecurring event PinmemberRolfpants3-Sep-04 3:20 
GeneralRe: Recurring event PinmemberChris Becker3-Sep-04 5:43 
GeneralStandards? Hah! PinmemberBrian Lowe11-May-04 3:12 
QuestionHow to create it as email via SMTP Pinsusseric.martin5-Apr-04 13:01 
AnswerRe: How to create it as email via SMTP PinsussChris Becker5-Apr-04 13:18 
GeneralNot working Pinmembermmikey12125-Mar-04 7:17 
I have cut and pasted the code behind code that you provided but it is not working still. All i get is the output put as text in the IE browser.
 
What am i doing wrong?
 

thx

GeneralRe: Not working PinsussChris Becker25-Mar-04 7:45 
GeneralRe: Not working Pinmembermmikey12125-Mar-04 8:40 
GeneralRe: Not working PinsussChris Becker25-Mar-04 8:50 
GeneralRe: Not working Pinmembermmikey12125-Mar-04 9:45 
GeneralRe: Not working PinsussChris Becker25-Mar-04 10:17 
GeneralRe: Not working Pinmembermmikey12125-Mar-04 9:52 
GeneralRe: Not working PinsussChris Becker25-Mar-04 10:25 
GeneralRe: Not working Pinmembermmikey12125-Mar-04 10:29 
GeneralRe: Not working PinsussChris Becker25-Mar-04 10:37 
GeneralRe: Not working PinsussAnonymous3-Aug-04 8:25 
GeneralUpdates to an ASP page PinsussAnonymous7-Nov-03 6:10 
GeneralRe: Updates to an ASP page PinmemberChris Becker7-Nov-03 6:37 
GeneralRe: Updates to an ASP page PinsussAnonymous7-Nov-03 9:10 
QuestionC# version? Pinmemberneilio17-Aug-03 9:52 
AnswerRe: C# version? PinsussChris Becker25-Aug-03 18:34 
GeneralGeneral Support PinmemberCliffWoodger12-Aug-03 23:26 
GeneralRe: General Support PinsussChris Becker13-Aug-03 6:42 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web04 | 2.8.141022.2 | Last Updated 7 Feb 2003
Article Copyright 2003 by slolife
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid