public ActionResult Download(Guid entityListId, Guid viewId, string from, string to, string filter, string search) { DateTime parsedFrom; var fromDate = DateTime.TryParseExact(from, "yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out parsedFrom) ? parsedFrom : DateTime.UtcNow.AddYears(-10); DateTime parsedTo; var toDate = DateTime.TryParseExact(to, "yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out parsedTo) ? parsedTo : DateTime.UtcNow.AddYears(10); var dataAdapter = new EntityListCalendarDataAdapter( new EntityReference("adx_entitylist", entityListId), new EntityReference("savedquery", viewId), new PortalConfigurationDataAdapterDependencies(requestContext: Request.RequestContext)); var events = dataAdapter.SelectEvents(fromDate, toDate, filter, search) .OrderBy(e => e.Start) .ThenBy(e => e.Summary); var vcalendar = new VCalendar(events.Select(GetVEvent)); return(new ContentResult { ContentType = "text/calendar", Content = vcalendar.ToString() }); }
public void UnitTest1() { var calString = @"BEGIN:VCALENDAR BEGIN:VFREEBUSY FREEBUSY:19980314T233000Z/19980315T003000Z FREEBUSY:19980316T153000Z/19980316T163000Z FREEBUSY:19980318T030000Z/19980318T040000Z URL:http://www.example.com/calendar/busytime/jsmith.ifb END:VFREEBUSY END:VCALENDAR "; VCalendar calendar = VCalendar.Parse(calString); var calendarString = calendar.ToString(); UnicodeEncoding uniencoding = new UnicodeEncoding(); UTF8Encoding utf8Encoding = new UTF8Encoding(); var toWrite = utf8Encoding.GetBytes(calendarString); File.Delete("output1.ics"); using (var writer = File.OpenWrite("output1.ics")) { writer.Seek(0, SeekOrigin.End); writer.Write(toWrite, 0, toWrite.Length); } using (var reader = File.OpenText("output1.ics")) { var writedCal = reader.ReadToEnd(); var writedCalLines = Parser.CalendarReader(writedCal); var expectedLines = Parser.CalendarReader(calString); Assert.Equal(expectedLines.Length, writedCalLines.Length); for (int i = 0; i < writedCalLines.Length; i++) { Assert.Contains(expectedLines[i], writedCalLines); } } Assert.NotNull(calendarString); }
public void BuildVCalendar() { var calString = @"BEGIN:VCALENDAR PRODID:-//Google Inc//Google Calendar 70.9054//EN VERSION:2.0 CALSCALE:GREGORIAN X-WR-CALNAME:[email protected] X-WR-TIMEZONE:America/Los_Angeles BEGIN:VTIMEZONE TZID:America/Los_Angeles X-LIC-LOCATION:America/Los_Angeles BEGIN:DAYLIGHT TZOFFSETFROM:-0800 TZOFFSETTO:-0700 TZNAME:PDT DTSTART:19700308T020000 RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3 END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:-0700 TZOFFSETTO:-0800 TZNAME:PST DTSTART:19701101T020000 RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11 END:STANDARD END:VTIMEZONE BEGIN:VEVENT DTSTART;TZID=America/Los_Angeles:20120629T130000 DTEND;TZID=America/Los_Angeles:20120629T140000 DTSTAMP:20120629T112428Z UID:[email protected] RRULE:FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYDAY=TU; BYMONTHDAY=2,3,4,5,6,7,8 RRULE:FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYDAY=TU; BYMONTHDAY=2,3,4,5,6,7,8 CREATED:20120629T111935Z DESCRIPTION:foo LAST-MODIFIED:20120629T112428Z LOCATION:Barcelona SEQUENCE:0 STATUS:CONFIRMED SUMMARY:Demo B2G Calendar TRANSP:OPAQUE BEGIN:VALARM ACTION:EMAIL DESCRIPTION:This is an event reminder SUMMARY:Alarm notification ATTENDEE:mailto:[email protected] ATTENDEE:mailto:[email protected] TRIGGER:-P0DT0H30M0S END:VALARM BEGIN:VALARM ACTION:DISPLAY DESCRIPTION:This is an event reminder TRIGGER:-P0DT0H30M0S END:VALARM END:VEVENT END:VCALENDAR "; VCalendar calendar = VCalendar.Parse(calString); var calendarString = calendar.ToString(); UnicodeEncoding uniencoding = new UnicodeEncoding(); UTF8Encoding utf8Encoding = new UTF8Encoding(); var toWrite = utf8Encoding.GetBytes(calendarString); File.Delete("output1.ics"); using (var writer = File.OpenWrite("output1.ics")) { writer.Seek(0, SeekOrigin.End); writer.Write(toWrite, 0, toWrite.Length); } using (var reader = File.OpenText("output1.ics")) { var writedCal = reader.ReadToEnd(); var writedCalLines = Parser.CalendarReader(writedCal); var expectedLines = Parser.CalendarReader(calString); Assert.Equal(expectedLines.Length, writedCalLines.Length); for (int i = 0; i < writedCalLines.Length; i++) { Assert.Contains(expectedLines[i], writedCalLines); } } Assert.NotNull(calendarString); }
public void ToStringTest() { var calString = @"BEGIN:VCALENDAR PRODID:-//Google Inc//Google Calendar 70.9054//EN VERSION:2.0 CALSCALE:GREGORIAN X-WR-CALNAME:[email protected] X-WR-TIMEZONE:America/Los_Angeles BEGIN:VTIMEZONE TZID:America/Los_Angeles X-LIC-LOCATION:America/Los_Angeles BEGIN:DAYLIGHT TZOFFSETFROM:-0800 TZOFFSETTO:-0700 TZNAME:PDT DTSTART:19700308T020000 RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:-0700 TZOFFSETTO:-0800 TZNAME:PST DTSTART:19701101T020000 RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU RDATE:19450603T010000 END:STANDARD END:VTIMEZONE BEGIN:VEVENT DTSTART;TZID=America/Los_Angeles:20120629T130000 DTEND;TZID=America/Los_Angeles:20120629T140000 DTSTAMP:20120629T112428Z UID:[email protected] RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU CREATED:20120629T111935Z DESCRIPTION:foo LAST-MODIFIED:20120629T112428Z LOCATION:Barcelona SEQUENCE:0 STATUS:CONFIRMED SUMMARY:Demo B2G Calendar TRANSP:OPAQUE BEGIN:VALARM ACTION:EMAIL DESCRIPTION:This is an event reminder SUMMARY:Alarm notification ATTENDEE:mailto:[email protected] TRIGGER:-P0DT0H30M0S END:VALARM BEGIN:VALARM ACTION:DISPLAY DESCRIPTION:This is an event reminder TRIGGER:-P0DT0H30M0S END:VALARM END:VEVENT END:VCALENDAR "; VCalendar calendar = VCalendar.Parse(calString); var xmlDoc = @"<?xml version=""1.0"" encoding=""utf-8"" ?> <C:calendar-query xmlns:D=""DAV:"" xmlns:C=""urn:ietf:params:xml:ns:caldav""> <D:prop> <D:getetag/> <C:calendar-data> <C:comp name=""VCALENDAR""> <C:prop name=""VERSION""/> <C:comp name=""VEVENT""> <C:prop name=""SUMMARY""/> <C:prop name=""UID""/> <C:prop name=""DTSTART""/> <C:prop name=""DTEND""/> </C:comp> <C:comp name=""VTIMEZONE""/> </C:comp> </C:calendar-data> </D:prop> <C:filter> <C:comp-filter name=""VCALENDAR""> <C:comp-filter name=""VEVENT""> <C:time-range start=""20060104T000000Z"" end=""20060105T000000Z""/> </C:comp-filter> </C:comp-filter> </C:filter> </C:calendar-query>"; var xmlTree = XmlTreeStructure.Parse(xmlDoc); var node = xmlTree.GetChildAtAnyLevel("calendar-data"); var newCalString = calendar.ToString(node); var newCal = new VCalendar(newCalString); Assert.Equal(2, newCal.CalendarComponents.Count); Assert.Contains("VEVENT", newCal.CalendarComponents.Keys); Assert.Contains("VTIMEZONE", newCal.CalendarComponents.Keys); Assert.Equal(4, newCal.CalendarComponents["VEVENT"].First().Properties.Count); }
public void Returns_Correct_VCalendar() { // Arrange var e0 = new EventModel(Rnd.DateTime, Rnd.DateTime, false, Rnd.Str, Rnd.Str, Rnd.Str, false); var e1 = new EventModel(Rnd.DateTime, Rnd.DateTime, false, Rnd.Str, Rnd.Str, Rnd.Str, true); var events = ImmutableList.Create(e0, e1); var lastModified = Rnd.DateTime; var lastModifiedStr = VCalendar.Format(lastModified); var calendar = new CalendarModel(events, lastModified); var tzid = Rnd.Str; var domain = Rnd.Str; var vcal = new VCalendar(calendar, tzid); var expected = new StringBuilder() .AppendLine("BEGIN:VCALENDAR") .AppendLine("VERSION:2.0") .AppendLine("PRODID:-//bfren//NONSGML Jeebs.Calendar//EN") .AppendLine("CALSCALE:GREGORIAN") .AppendLine("X-PUBLISHED-TTL:PT1H") .AppendLine("BEGIN:VTIMEZONE") .AppendLine("TZID:Europe/London") .AppendLine("BEGIN:STANDARD") .AppendLine("TZNAME:GMT") .AppendLine("DTSTART:19710101T020000") .AppendLine("TZOFFSETFROM:+0100") .AppendLine("TZOFFSETTO:+0000") .AppendLine("RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU") .AppendLine("END:STANDARD") .AppendLine("BEGIN:DAYLIGHT") .AppendLine("TZNAME:BST") .AppendLine("DTSTART:19710101T010000") .AppendLine("TZOFFSETFROM:+0000") .AppendLine("TZOFFSETTO:+0100") .AppendLine("RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU") .AppendLine("END:DAYLIGHT") .AppendLine("END:VTIMEZONE") .AppendLine("BEGIN:VEVENT") .AppendLine($"UID:{lastModifiedStr}-000000@{domain}") .AppendLine($"CREATED:{lastModifiedStr}") .AppendLine($"LAST-MODIFIED:{lastModifiedStr}") .AppendLine($"DTSTAMP:{lastModifiedStr}") .AppendLine($"SUMMARY:{e0.Summary}") .AppendLine($"DESCRIPTION:{e0.Description}") .AppendLine($"LOCATION:{e0.Location}") .AppendLine($"DTSTART;TZID={tzid}:{VCalendar.Format(e0.Start)}") .AppendLine($"DTEND;TZID={tzid}:{VCalendar.Format(e0.End)}") .AppendLine("END:VEVENT") .AppendLine("BEGIN:VEVENT") .AppendLine($"UID:{lastModifiedStr}-000001@{domain}") .AppendLine($"CREATED:{lastModifiedStr}") .AppendLine($"LAST-MODIFIED:{lastModifiedStr}") .AppendLine($"DTSTAMP:{lastModifiedStr}") .AppendLine($"SUMMARY:{e1.Summary}") .AppendLine($"DESCRIPTION:{e1.Description}") .AppendLine($"LOCATION:{e1.Location}") .AppendLine($"DTSTART;TZID={tzid}:{VCalendar.Format(e1.Start)}") .AppendLine($"DTEND;TZID={tzid}:{VCalendar.Format(e1.End)}") .AppendLine("TRANSP:TRANSPARENT") .AppendLine("END:VEVENT") .AppendLine("END:VCALENDAR") .ToString(); // Act var result = vcal.ToString(domain); // Assert Assert.Equal(expected, result); }