Posted by: adnanrashid on: November 18, 2008
I needed to integrate support for vCalendar in my current project. So i went through the vCalendar spec 1.0 at http://www.imc.org/pdi/vcal-10.txt and wrote this class. Although I have not implemented all the specification features, but this should prove sufficient for the usual requirements. If you have any comments / suggestions , let me know.
using System;
using System.Text;
using System.IO;
using System.Collections;
/// <summary>
/// Summary description for VCalendar
/// </summary>
public class VCalendar
{
private string _productID;
/// <summary>
/// A unique identifier identifying the originating program
/// </summary>
public string ProductIdentifier
{
get { return _productID; }
set { _productID = value; }
}
private ArrayList _categories;
/// <summary>
/// ArrayList of categories
/// </summary>
public ArrayList Categories
{
get { return _categories; }
set { _categories = value; }
}
private DateTime _createdOn = DateTime.MinValue;
/// <summary>
/// DateTime that the vEvent was created.
/// </summary>
public DateTime CreatedOn
{
get { return _createdOn; }
set { _createdOn = value; }
}
private DateTime _completedOn = DateTime.MinValue;
/// <summary>
/// DateTime the vEvent completed on
/// </summary>
public DateTime CompletedOn
{
get { return _completedOn; }
set { _completedOn = value; }
}
private DateTime _startOn = DateTime.MinValue;
/// <summary>
/// DateTime that the vEvent will start
/// </summary>
public DateTime StartOn
{
get { return _startOn; }
set { _startOn = value; }
}
private DateTime _endOn = DateTime.MinValue;
/// <summary>
/// DateTime that the vEvent will end
/// </summary>
public DateTime EndOn
{
get { return _endOn; }
set { _endOn = value; }
}
private ClassificationType _classification = ClassificationType.PUBLIC;
/// <summary>
/// Defines the access classification for the vEvent entity
/// </summary>
public ClassificationType Classification
{
get { return _classification; }
set { _classification = value; }
}
private int _priority = 0;
/// <summary>
/// 0 = undefined, 1 = High, -1 = Low. Defaults to 0
/// </summary>
public int Priority
{
get { return _priority; }
set { _priority = value; }
}
private string _subject;
/// <summary>
/// Subject of the vEvent
/// </summary>
public string Subject
{
get { return _subject; }
set { _subject = value; }
}
private string _description;
/// <summary>
/// Description of the vEvent
/// </summary>
public string Description
{
get { return _description; }
set { _description = value; }
}
private bool _enableAlarm;
/// <summary>
/// Flag to enable the reminder alarm
/// </summary>
public bool EnableAlarm
{
get { return _enableAlarm; }
set { _enableAlarm = value; }
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.Append(“BEGIN:VCALENDAR\n”);
sb.Append(“VERSION:1.0\n”);
sb.Append(“BEGIN:VEVENT\n”);
// Product Identifier
if (!string.IsNullOrEmpty(_productID))
sb.AppendFormat(“PRODID:{0}\n”, _productID);
// Categories
if (_categories != null && _categories.Count != 0)
{
sb.Append(“CATEGORIES:”);
for (int i = 0; i < _categories.Count; i++)
{
if (i == 0)
sb.Append(_categories[0].ToString());
else
sb.AppendFormat(“;{0}”, _categories[i].ToString());
}
sb.Append(“\n”);
}
// Created On
if (_createdOn != DateTime.MinValue)
sb.AppendFormat(“DCREATED:{0}\n”, _createdOn.ToUniversalTime().ToString(“yyyyMMddTHHmmssZ”));
// Start Date Time
if (_startOn != DateTime.MinValue)
{
sb.AppendFormat(“DTSTART:{0}\n”, _startOn.ToUniversalTime().ToString(“yyyyMMddTHHmmssZ”));
// Display Reminder
if (_enableAlarm)
sb.AppendFormat(“DALARM:{0};PT5M;2;{1}\n”, _startOn.ToUniversalTime().ToString(“yyyyMMddTHHmmssZ”), _subject);
}
// End Date Time
if (_endOn != DateTime.MinValue)
sb.AppendFormat(“DTEND:{0}\n”, _endOn.ToUniversalTime().ToString(“yyyyMMddTHHmmssZ”));
// Completed On
if (_completedOn != DateTime.MinValue)
sb.AppendFormat(“COMPLETED:{0}\n”, _completedOn.ToUniversalTime().ToString(“yyyyMMddTHHmmssZ”));
// Priority
if (_priority != 0)
sb.AppendFormat(“PRIORITY:{0}\n”, _priority);
// Description
if (!string.IsNullOrEmpty(_description))
sb.AppendFormat(“DESCRIPTION:{0}\n”, _description);
// Subject
if (!string.IsNullOrEmpty(_subject))
sb.AppendFormat(“SUMMARY:{0}\n”, _subject);
if (_classification != ClassificationType.PUBLIC)
sb.AppendFormat(“CLASS:{0}\n”, Enum.GetName(typeof(ClassificationType), Classification));
sb.Append(“END:VEVENT\n”);
sb.Append(“END:vCalendar”);
return sb.ToString();
}
public void Generate(string filePath, FileMode mode)
{
FileStream fs = new FileStream(filePath, mode);
StreamWriter sw = new StreamWriter(fs);
using (sw)
{
sw.Write(this.ToString());
}
}
}
public class Attendee
{
private StatusType _status;
public StatusType Status
{
get { return _status; }
set { _status = value; }
}
private AttendeeType _role;
public AttendeeType Role
{
get { return _role; }
set { _role = value; }
}
public string _attendeeName;
public string AttendeeName
{
get { return _attendeeName; }
set { _attendeeName = value; }
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
if (!string.IsNullOrEmpty(_attendeeName))
{
sb.Append(“ATTENDEE”);
if (_role != AttendeeType.ATTENDEE)
sb.AppendFormat(“;ROLE={0}”, Enum.GetName(typeof(AttendeeType), Role));
if (_status != StatusType.NEEDS_ACTION)
sb.AppendFormat(“;STATUS={0}”, Enum.GetName(typeof(StatusType), Status));
sb.AppendFormat(“:{0}\n”, _attendeeName);
return sb.ToString();
}
else
return string.Empty;
}
}
public enum AttendeeType
{
ATTENDEE,
ORGANIZER,
OWNER,
DELEGATE,
}
public enum StatusType
{
ACCEPTED,
NEEDS_ACTION,
SENT,
TENTATIVE,
CONFIRMED,
DECLINED,
COMPLETED,
DELEGATED
}
public enum RSVPType
{
YES,
NO
}
public enum ExpectType
{
FYI,
REQUIRE,
REQUEST,
IMMEDIATE
}
public enum CategoryType
{
APPOINTMENT,
BUSINESS,
EDUCATION,
HOLIDAY,
MEETING,
MISCELLANEOUS,
PERSONAL,
TRAVEL,
VACATION
}
public enum ClassificationType
{
PUBLIC,
PRIVATE,
CONFIDENTIAL
}