public string Serialize() { // create calendar, Outlook will ignore the name var calendar = new Ical.Net.Calendar { Name = INLOOX_DISPLAY_NAME }; foreach (var item in _items) { // check if task item has dates if (item.HasStartDate == true && item.HasEndDate == true) { // add basic info var calendarItem = new CalendarEvent { Summary = item.Name, Start = new CalDateTime(((DateTimeOffset)item.StartDateTime).UtcDateTime, TIMEZONE_UTC), End = new CalDateTime(((DateTimeOffset)item.EndDateTime).UtcDateTime, TIMEZONE_UTC), Categories = new List <string> { INLOOX_DISPLAY_NAME, TASK_ENTITY_DISPLAY_NAME, item.PlanningReservationId.ToString() }, Uid = item.PlanningReservationId.ToString(), Description = string.Empty }; // add free/busy type calendarItem.AddProperty(STANDARD_FREE_KEY, FREE_VALUE); calendarItem.AddProperty(MICROSOFT_FREE_KEY, FREE_VALUE); // add alarm, Outlook does not support this var alarm = new Alarm() { Summary = item.Name, Trigger = new Trigger(_reminderTimespan), Action = AlarmAction.Display }; calendarItem.Alarms.Add(alarm); // add to calendar calendar.Events.Add(calendarItem); } } // create ICS output var serializer = new CalendarSerializer(); var serializedCalendar = serializer.SerializeToString(calendar); return(serializedCalendar); }
static Calendar CalendarFromTimeTable(TimeTable timeTable, IEnumerable <CourseConfig> courses) { var now = DateTime.Now; var newCal = new Calendar(); //select lessons var lessons = timeTable.Lessons .SelectMany(ls => ls.Value.Select(l => (time: ls.Key, lesson: l))) .ToList(); //Select lessons for each course var cs = courses .Select(c => (course: c, lesson: lessons .Select(l => (time: l.time, lesson: l.lesson, score: l.lesson .Score(c.Filter))) .Where(l => l.score != int.MaxValue))) .ToList(); //Warn empty courses foreach (var emptyC in cs.Where(c => !c.lesson.Any() && c.course.Warn == WarnMethod.NotFound)) { logger.Warn("Course '{0}' does not have any lessons and the warning flag is not disabled.", emptyC.course.Filter); } //Actualy add courses foreach (var l in cs.SelectMany(c => c.lesson.Select(l => (lesson: l.lesson, time: l.time, course: c.course)))) { CalendarEvent item = new CalendarEvent() { DtStart = new CalDateTime(l.time.Start), DtEnd = new CalDateTime(l.time.End), Summary = l.lesson.ToString(), }; if (Regex.IsMatch(l.course.Color, "^#[A-Fa-f0-9]{3}([A-Fa-f0-9]{3})?$")) { item.AddProperty("COLOR", l.course.Color); } else if (l.course.Color != "default") { logger.Warn("{0} is not a valid color value", l.course.Color); } newCal.Events.Add(item); } return(newCal); }
public void PropertySerialization_Tests() { const string formatted = @"FMTTYPE=text/html:<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 3.2//EN"">\n<HTML>\n<HEAD>\n<META NAME=""Generator"" CONTENT=""MS Exchange Server version rmj.rmm.rup.rpr"">\n<TITLE></TITLE>\n</HEAD>\n<BODY>\n<!-- Converted from text/rtf format -->\n\n<P DIR=LTR><SPAN LANG=""en-us""><FONT FACE=""Calibri"">This is some</FONT></SPAN><SPAN LANG=""en-us""><B> <FONT FACE=""Calibri"">HTML</FONT></B></SPAN><SPAN LANG=""en-us""><FONT FACE=""Calibri""></FONT></SPAN><SPAN LANG=""en-us""><U> <FONT FACE=""Calibri"">formatted</FONT></U></SPAN><SPAN LANG=""en-us""><FONT FACE=""Calibri""></FONT></SPAN><SPAN LANG=""en-us""><I> <FONT FACE=""Calibri"">text</FONT></I></SPAN><SPAN LANG=""en-us""><FONT FACE=""Calibri"">.</FONT></SPAN><SPAN LANG=""en-us""></SPAN></P>\n\n</BODY>\n</HTML>"; var start = DateTime.Now; var end = start.AddHours(1); var @event = new CalendarEvent { Start = new CalDateTime(start), End = new CalDateTime(end), Description = "This is a description", }; var property = new CalendarProperty("X-ALT-DESC", formatted); @event.AddProperty(property); var calendar = new Calendar(); calendar.Events.Add(@event); var serialized = new CalendarSerializer().SerializeToString(calendar); Assert.IsTrue(serialized.Contains("X-ALT-DESC;")); }