From 0404bc813538b5e119f85ab63d5fc3bdf96395dc Mon Sep 17 00:00:00 2001 From: Aptivi CEO Date: Tue, 10 Sep 2024 17:39:44 +0300 Subject: [PATCH] add - prt - Added calendar components (pt. 2) --- We've finally added some required properties along with the type restriction. Now, we need to add most of the properties found in all the calendar components. --- Type: add Breaking: False Doc Required: False Backport Required: False Part: 2/2 --- .../Parsers/VCalendarConstants.cs | 5 + .../Parsers/VCalendarParser.cs | 9 +- .../Parsers/VCalendarParserTools.cs | 67 +++-- VisualCard.Calendar/Parts/Calendar.cs | 6 +- .../Parts/Enums/CalendarIntegersEnum.cs | 8 + .../Parts/Enums/CalendarPartsArrayEnum.cs | 4 +- .../Parts/Enums/CalendarStringsEnum.cs | 12 + .../Properties/launchSettings.json | 4 + .../TestFiles/vcalendarEventTz.ics | 230 ++++++++++++++++++ .../VisualCard.ShowCalendars.csproj | 13 +- 10 files changed, 317 insertions(+), 41 deletions(-) create mode 100644 VisualCard.ShowCalendars/TestFiles/vcalendarEventTz.ics diff --git a/VisualCard.Calendar/Parsers/VCalendarConstants.cs b/VisualCard.Calendar/Parsers/VCalendarConstants.cs index eaa849e..c5eda73 100644 --- a/VisualCard.Calendar/Parsers/VCalendarConstants.cs +++ b/VisualCard.Calendar/Parsers/VCalendarConstants.cs @@ -68,6 +68,11 @@ internal static class VCalendarConstants internal const string _transparencySpecifier = "TRANSP"; internal const string _createdSpecifier = "CREATED"; internal const string _created1Specifier = "DCREATED"; + internal const string _actionSpecifier = "ACTION"; + internal const string _triggerSpecifier = "TRIGGER"; + internal const string _tzidSpecifier = "TZID"; + internal const string _tzOffsetFromSpecifier = "TZOFFSETFROM"; + internal const string _tzOffsetToSpecifier = "TZOFFSETTO"; internal const string _xSpecifier = "X-"; internal const string _typeArgumentSpecifier = "TYPE="; internal const string _valueArgumentSpecifier = "VALUE="; diff --git a/VisualCard.Calendar/Parsers/VCalendarParser.cs b/VisualCard.Calendar/Parsers/VCalendarParser.cs index 1026683..665840c 100644 --- a/VisualCard.Calendar/Parsers/VCalendarParser.cs +++ b/VisualCard.Calendar/Parsers/VCalendarParser.cs @@ -168,6 +168,7 @@ public Parts.Calendar Parse() } // Handle the part type + Type calendarType = subPart is not null ? subPart.GetType() : calendar.GetType(); string values = VcardParserTools.GetValuesString(splitArgs, defaultValue, VCalendarConstants._valueArgumentSpecifier); switch (type) { @@ -175,6 +176,9 @@ public Parts.Calendar Parse() { CalendarStringsEnum stringType = (CalendarStringsEnum)enumeration; string finalValue = value; + bool supported = VCalendarParserTools.StringSupported(stringType, CalendarVersion, calendarType); + if (!supported) + continue; // Now, handle each type individually switch (stringType) @@ -226,6 +230,9 @@ public Parts.Calendar Parse() CalendarIntegersEnum integerType = (CalendarIntegersEnum)enumeration; int primaryValue = int.Parse(value); int finalValue = 0; + bool supported = VCalendarParserTools.IntegerSupported(integerType, CalendarVersion, calendarType); + if (!supported) + continue; // Now, handle each type individually switch (integerType) @@ -257,7 +264,7 @@ public Parts.Calendar Parse() { CalendarPartsArrayEnum partsArrayType = (CalendarPartsArrayEnum)enumeration; Type? partsArrayClass = classType; - bool supported = VCalendarParserTools.EnumArrayTypeSupported(partsArrayType, CalendarVersion); + bool supported = VCalendarParserTools.EnumArrayTypeSupported(partsArrayType, CalendarVersion, calendarType); if (!supported) continue; if (fromString is null) diff --git a/VisualCard.Calendar/Parsers/VCalendarParserTools.cs b/VisualCard.Calendar/Parsers/VCalendarParserTools.cs index b8d7aa2..e22ff4d 100644 --- a/VisualCard.Calendar/Parsers/VCalendarParserTools.cs +++ b/VisualCard.Calendar/Parsers/VCalendarParserTools.cs @@ -23,53 +23,59 @@ using VisualCard.Calendar.Parts.Enums; using VisualCard.Calendar.Parts.Implementations.Event; using VisualCard.Parts.Enums; +using System.Linq; namespace VisualCard.Calendar.Parsers { internal class VCalendarParserTools { - internal static bool StringSupported(CalendarStringsEnum stringsEnum, Version calendarVersion) => + internal static bool StringSupported(CalendarStringsEnum stringsEnum, Version calendarVersion, Type componentType) => stringsEnum switch { CalendarStringsEnum.ProductId => true, CalendarStringsEnum.CalScale => calendarVersion.Major == 2, CalendarStringsEnum.Method => calendarVersion.Major == 2, - CalendarStringsEnum.Class => true, - CalendarStringsEnum.Uid => true, - CalendarStringsEnum.Organizer => true, - CalendarStringsEnum.Status => true, - CalendarStringsEnum.Summary => true, - CalendarStringsEnum.Description => true, - CalendarStringsEnum.Transparency => true, + CalendarStringsEnum.Class => TypeMatch(componentType, typeof(CalendarEvent), typeof(CalendarTodo), typeof(CalendarJournal)), + CalendarStringsEnum.Uid => TypeMatch(componentType, typeof(CalendarEvent), typeof(CalendarTodo), typeof(CalendarJournal), typeof(CalendarFreeBusy)), + CalendarStringsEnum.Organizer => TypeMatch(componentType, typeof(CalendarEvent), typeof(CalendarTodo), typeof(CalendarJournal), typeof(CalendarFreeBusy)), + CalendarStringsEnum.Status => TypeMatch(componentType, typeof(CalendarEvent), typeof(CalendarTodo), typeof(CalendarJournal)), + CalendarStringsEnum.Summary => TypeMatch(componentType, typeof(CalendarEvent), typeof(CalendarTodo), typeof(CalendarJournal), typeof(CalendarAlarm)), + CalendarStringsEnum.Description => TypeMatch(componentType, typeof(CalendarEvent), typeof(CalendarTodo), typeof(CalendarJournal), typeof(CalendarAlarm)), + CalendarStringsEnum.Transparency => TypeMatch(componentType, typeof(CalendarEvent)), + CalendarStringsEnum.Action => calendarVersion.Major == 2 && TypeMatch(componentType, typeof(CalendarAlarm)), + CalendarStringsEnum.Trigger => calendarVersion.Major == 2 && TypeMatch(componentType, typeof(CalendarAlarm)), + CalendarStringsEnum.TimeZoneId => calendarVersion.Major == 2 && TypeMatch(componentType, typeof(TimeZoneInfo)), _ => throw new InvalidOperationException("Invalid string enumeration type to get supported value"), }; - internal static bool IntegerSupported(CalendarIntegersEnum integersEnum, Version calendarVersion) => + internal static bool IntegerSupported(CalendarIntegersEnum integersEnum, Version calendarVersion, Type componentType) => integersEnum switch { - CalendarIntegersEnum.Priority => calendarVersion.Major == 2, - CalendarIntegersEnum.Sequence => true, + CalendarIntegersEnum.Priority => calendarVersion.Major == 2 && TypeMatch(componentType, typeof(CalendarEvent), typeof(CalendarTodo)), + CalendarIntegersEnum.Sequence => TypeMatch(componentType, typeof(CalendarEvent), typeof(CalendarTodo), typeof(CalendarJournal)), + CalendarIntegersEnum.TimeZoneOffsetFrom => TypeMatch(componentType, typeof(CalendarStandard), typeof(CalendarDaylight)), + CalendarIntegersEnum.TimeZoneOffsetTo => TypeMatch(componentType, typeof(CalendarStandard), typeof(CalendarDaylight)), _ => throw new InvalidOperationException("Invalid integer enumeration type to get supported value"), }; - internal static bool EnumArrayTypeSupported(CalendarPartsArrayEnum partsArrayEnum, Version calendarVersion) => + internal static bool EnumArrayTypeSupported(CalendarPartsArrayEnum partsArrayEnum, Version calendarVersion, Type componentType) => partsArrayEnum switch { - CalendarPartsArrayEnum.Attach => true, - CalendarPartsArrayEnum.Categories => true, - CalendarPartsArrayEnum.Comment => calendarVersion.Major == 2, - CalendarPartsArrayEnum.Geography => true, - CalendarPartsArrayEnum.Location => calendarVersion.Major == 2, - CalendarPartsArrayEnum.Resources => true, - CalendarPartsArrayEnum.Attendee => true, - CalendarPartsArrayEnum.DateCreated => true, - CalendarPartsArrayEnum.DateCreatedAlt => true, - CalendarPartsArrayEnum.DateStart => true, - CalendarPartsArrayEnum.DateEnd => true, + CalendarPartsArrayEnum.Attach => TypeMatch(componentType, typeof(CalendarEvent), typeof(CalendarTodo), typeof(CalendarJournal), typeof(CalendarAlarm)), + CalendarPartsArrayEnum.Categories => TypeMatch(componentType, typeof(CalendarEvent), typeof(CalendarTodo), typeof(CalendarJournal)), + CalendarPartsArrayEnum.Comment => calendarVersion.Major == 2 && TypeMatch(componentType, typeof(CalendarEvent), typeof(CalendarTodo), typeof(CalendarJournal), typeof(CalendarFreeBusy), typeof(CalendarStandard), typeof(CalendarDaylight)), + CalendarPartsArrayEnum.Geography => TypeMatch(componentType, typeof(CalendarEvent), typeof(CalendarTodo)), + CalendarPartsArrayEnum.Location => calendarVersion.Major == 2 && TypeMatch(componentType, typeof(CalendarEvent), typeof(CalendarTodo)), + CalendarPartsArrayEnum.Resources => TypeMatch(componentType, typeof(CalendarEvent), typeof(CalendarTodo)), + CalendarPartsArrayEnum.Attendee => TypeMatch(componentType, typeof(CalendarEvent), typeof(CalendarTodo), typeof(CalendarJournal), typeof(CalendarFreeBusy), typeof(CalendarAlarm)), + CalendarPartsArrayEnum.DateCreated => TypeMatch(componentType, typeof(CalendarEvent), typeof(CalendarTodo), typeof(CalendarJournal)), + CalendarPartsArrayEnum.DateCreatedAlt => TypeMatch(componentType, typeof(CalendarEvent), typeof(CalendarTodo)), + CalendarPartsArrayEnum.DateStart => TypeMatch(componentType, typeof(CalendarEvent)), + CalendarPartsArrayEnum.DateEnd => TypeMatch(componentType, typeof(CalendarEvent)), CalendarPartsArrayEnum.NonstandardNames => true, - CalendarPartsArrayEnum.DateStamp => calendarVersion.Major == 2, + CalendarPartsArrayEnum.DateStamp => calendarVersion.Major == 2 && TypeMatch(componentType, typeof(CalendarEvent), typeof(CalendarTodo), typeof(CalendarJournal), typeof(CalendarFreeBusy)), _ => throw new InvalidOperationException("Invalid parts array enumeration type to get supported value"), }; @@ -87,6 +93,9 @@ internal static string GetPrefixFromStringsEnum(CalendarStringsEnum stringsEnum) CalendarStringsEnum.Summary => VCalendarConstants._summarySpecifier, CalendarStringsEnum.Description => VCalendarConstants._descriptionSpecifier, CalendarStringsEnum.Transparency => VCalendarConstants._transparencySpecifier, + CalendarStringsEnum.Action => VCalendarConstants._actionSpecifier, + CalendarStringsEnum.Trigger => VCalendarConstants._triggerSpecifier, + CalendarStringsEnum.TimeZoneId => VCalendarConstants._tzidSpecifier, _ => throw new NotImplementedException($"String enumeration {stringsEnum} is not implemented.") }; @@ -96,6 +105,8 @@ internal static string GetPrefixFromIntegersEnum(CalendarIntegersEnum integersEn { CalendarIntegersEnum.Priority => VCalendarConstants._prioritySpecifier, CalendarIntegersEnum.Sequence => VCalendarConstants._sequenceSpecifier, + CalendarIntegersEnum.TimeZoneOffsetFrom => VCalendarConstants._tzOffsetFromSpecifier, + CalendarIntegersEnum.TimeZoneOffsetTo => VCalendarConstants._tzOffsetToSpecifier, _ => throw new NotImplementedException($"Integer enumeration {integersEnum} is not implemented.") }; @@ -179,10 +190,18 @@ internal static (PartType type, object enumeration, Type? enumType, Func (PartType.Strings, CalendarStringsEnum.Summary, null, null, "", "", []), VCalendarConstants._descriptionSpecifier => (PartType.Strings, CalendarStringsEnum.Description, null, null, "", "", []), VCalendarConstants._transparencySpecifier => (PartType.Strings, CalendarStringsEnum.Transparency, null, null, "", "", []), + VCalendarConstants._actionSpecifier => (PartType.Strings, CalendarStringsEnum.Action, null, null, "", "", []), + VCalendarConstants._triggerSpecifier => (PartType.Strings, CalendarStringsEnum.Trigger, null, null, "", "", []), + VCalendarConstants._tzidSpecifier => (PartType.Strings, CalendarStringsEnum.TimeZoneId, null, null, "", "", []), VCalendarConstants._prioritySpecifier => (PartType.Integers, CalendarIntegersEnum.Priority, null, null, "", "", []), VCalendarConstants._sequenceSpecifier => (PartType.Integers, CalendarIntegersEnum.Sequence, null, null, "", "", []), + VCalendarConstants._tzOffsetFromSpecifier => (PartType.Integers, CalendarIntegersEnum.TimeZoneOffsetFrom, null, null, "", "", []), + VCalendarConstants._tzOffsetToSpecifier => (PartType.Integers, CalendarIntegersEnum.TimeZoneOffsetTo, null, null, "", "", []), _ => throw new InvalidOperationException($"Unknown prefix {prefix}"), }; + + private static bool TypeMatch(Type componentType, params Type[] expectedTypes) => + expectedTypes.Contains(componentType); } } diff --git a/VisualCard.Calendar/Parts/Calendar.cs b/VisualCard.Calendar/Parts/Calendar.cs index 5bb9b06..d671fd1 100644 --- a/VisualCard.Calendar/Parts/Calendar.cs +++ b/VisualCard.Calendar/Parts/Calendar.cs @@ -170,7 +170,7 @@ internal BaseCalendarPartInfo[] GetPartsArray(Type partType, Version version, Di internal BaseCalendarPartInfo[] GetPartsArray(Type partType, CalendarPartsArrayEnum key, Version version, Dictionary> partsArray) { // Check for version support - if (!VCalendarParserTools.EnumArrayTypeSupported(key, version)) + if (!VCalendarParserTools.EnumArrayTypeSupported(key, version, GetType())) return []; // Get the parts enumeration according to the type @@ -209,7 +209,7 @@ public string GetString(CalendarStringsEnum key) => internal string GetString(CalendarStringsEnum key, Version version, Dictionary strings) { // Check for version support - if (!VCalendarParserTools.StringSupported(key, version)) + if (!VCalendarParserTools.StringSupported(key, version, GetType())) return ""; // Get the fallback value @@ -236,7 +236,7 @@ public int GetInteger(CalendarIntegersEnum key) => internal int GetInteger(CalendarIntegersEnum key, Version version, Dictionary integers) { // Check for version support - if (!VCalendarParserTools.IntegerSupported(key, version)) + if (!VCalendarParserTools.IntegerSupported(key, version, GetType())) return -1; // Get the fallback value diff --git a/VisualCard.Calendar/Parts/Enums/CalendarIntegersEnum.cs b/VisualCard.Calendar/Parts/Enums/CalendarIntegersEnum.cs index b2673ea..c21fcf2 100644 --- a/VisualCard.Calendar/Parts/Enums/CalendarIntegersEnum.cs +++ b/VisualCard.Calendar/Parts/Enums/CalendarIntegersEnum.cs @@ -32,5 +32,13 @@ public enum CalendarIntegersEnum /// The calendar's sequence (event, to-do, or journal) /// Sequence, + /// + /// Time zone offset from + /// + TimeZoneOffsetFrom, + /// + /// Time zone offset to + /// + TimeZoneOffsetTo, } } diff --git a/VisualCard.Calendar/Parts/Enums/CalendarPartsArrayEnum.cs b/VisualCard.Calendar/Parts/Enums/CalendarPartsArrayEnum.cs index 0f9dc6c..aa40e5d 100644 --- a/VisualCard.Calendar/Parts/Enums/CalendarPartsArrayEnum.cs +++ b/VisualCard.Calendar/Parts/Enums/CalendarPartsArrayEnum.cs @@ -57,7 +57,7 @@ public enum CalendarPartsArrayEnum /// DateCreated, /// - /// Calendar date of creation (vCalendar 1.0) (event, todo, or journal) + /// Calendar date of creation (vCalendar 1.0) (event or todo) /// DateCreatedAlt, /// @@ -69,7 +69,7 @@ public enum CalendarPartsArrayEnum /// DateEnd, /// - /// Event date stamp + /// Date stamp (event, todo, journal, or free/busy) /// DateStamp, /// diff --git a/VisualCard.Calendar/Parts/Enums/CalendarStringsEnum.cs b/VisualCard.Calendar/Parts/Enums/CalendarStringsEnum.cs index 82a8e1f..a92077a 100644 --- a/VisualCard.Calendar/Parts/Enums/CalendarStringsEnum.cs +++ b/VisualCard.Calendar/Parts/Enums/CalendarStringsEnum.cs @@ -64,5 +64,17 @@ public enum CalendarStringsEnum /// Event transparency /// Transparency, + /// + /// Alarm action + /// + Action, + /// + /// Alarm trigger + /// + Trigger, + /// + /// Time zone ID + /// + TimeZoneId, } } diff --git a/VisualCard.ShowCalendars/Properties/launchSettings.json b/VisualCard.ShowCalendars/Properties/launchSettings.json index 28d24da..6648331 100644 --- a/VisualCard.ShowCalendars/Properties/launchSettings.json +++ b/VisualCard.ShowCalendars/Properties/launchSettings.json @@ -19,6 +19,10 @@ "vCalendar 2.0 test - with X-nonstandard properties": { "commandName": "Project", "commandLineArgs": "TestFiles/veventXnonstandard.ics" + }, + "vCalendar 2.0 test - event with time zone": { + "commandName": "Project", + "commandLineArgs": "TestFiles/vcalendarEventTz.ics" } } } diff --git a/VisualCard.ShowCalendars/TestFiles/vcalendarEventTz.ics b/VisualCard.ShowCalendars/TestFiles/vcalendarEventTz.ics new file mode 100644 index 0000000..ac0f8da --- /dev/null +++ b/VisualCard.ShowCalendars/TestFiles/vcalendarEventTz.ics @@ -0,0 +1,230 @@ +BEGIN:VCALENDAR +PRODID:-//GALAXY CALENDAR//Calendar//EN +VERSION:2.0 +CALSCALE:GREGORIAN +BEGIN:VTIMEZONE +TZID:Europe/London +TZURL:http://tzurl.org/zoneinfo/Europe/London +X-LIC-LOCATION:Europe/London +BEGIN:DAYLIGHT +TZOFFSETFROM:+0000 +TZOFFSETTO:+0100 +TZNAME:BST +DTSTART:19810329T020000 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0100 +TZOFFSETTO:+0000 +TZNAME:GMT +DTSTART:19961027T030000 +RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU +END:STANDARD +BEGIN:STANDARD +TZOFFSETFROM:-000115 +TZOFFSETTO:+0000 +TZNAME:GMT +DTSTART:18471201T003448 +RDATE:18471201T003448 +END:STANDARD +BEGIN:DAYLIGHT +TZOFFSETFROM:+0000 +TZOFFSETTO:+0100 +TZNAME:BST +DTSTART:19160521T023448 +RDATE:19160521T023448 +RDATE:19170408T023448 +RDATE:19180324T023448 +RDATE:19190330T023448 +RDATE:19200328T030000 +RDATE:19210403T030000 +RDATE:19220326T030000 +RDATE:19230422T020000 +RDATE:19240413T030000 +RDATE:19250419T030000 +RDATE:19260418T030000 +RDATE:19270410T030000 +RDATE:19280422T030000 +RDATE:19290421T030000 +RDATE:19300413T030000 +RDATE:19310419T030000 +RDATE:19320417T030000 +RDATE:19330409T030000 +RDATE:19340422T030000 +RDATE:19350414T030000 +RDATE:19360419T030000 +RDATE:19370418T030000 +RDATE:19380410T030000 +RDATE:19390416T030000 +RDATE:19400225T030000 +RDATE:19460414T030000 +RDATE:19470316T030000 +RDATE:19480314T030000 +RDATE:19490403T030000 +RDATE:19500416T030000 +RDATE:19510415T030000 +RDATE:19520420T030000 +RDATE:19530419T030000 +RDATE:19540411T030000 +RDATE:19550417T030000 +RDATE:19560422T030000 +RDATE:19570414T030000 +RDATE:19580420T030000 +RDATE:19590419T030000 +RDATE:19600410T030000 +RDATE:19610326T030000 +RDATE:19620325T030000 +RDATE:19630331T030000 +RDATE:19640322T030000 +RDATE:19650321T030000 +RDATE:19660320T030000 +RDATE:19670319T030000 +RDATE:19680218T030000 +RDATE:19720319T030000 +RDATE:19730318T030000 +RDATE:19740317T030000 +RDATE:19750316T030000 +RDATE:19760321T030000 +RDATE:19770320T030000 +RDATE:19780319T030000 +RDATE:19790318T030000 +RDATE:19800316T030000 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0100 +TZOFFSETTO:+0000 +TZNAME:GMT +DTSTART:19161001T033448 +RDATE:19161001T033448 +RDATE:19170917T033448 +RDATE:19180930T033448 +RDATE:19190929T033448 +RDATE:19201025T040000 +RDATE:19211003T040000 +RDATE:19221008T040000 +RDATE:19230916T030000 +RDATE:19240921T040000 +RDATE:19251004T040000 +RDATE:19261003T040000 +RDATE:19271002T040000 +RDATE:19281007T040000 +RDATE:19291006T040000 +RDATE:19301005T040000 +RDATE:19311004T040000 +RDATE:19321002T040000 +RDATE:19331008T040000 +RDATE:19341007T040000 +RDATE:19351006T040000 +RDATE:19361004T040000 +RDATE:19371003T040000 +RDATE:19381002T040000 +RDATE:19391119T040000 +RDATE:19451007T040000 +RDATE:19461006T040000 +RDATE:19471102T040000 +RDATE:19481031T040000 +RDATE:19491030T040000 +RDATE:19501022T040000 +RDATE:19511021T040000 +RDATE:19521026T040000 +RDATE:19531004T040000 +RDATE:19541003T040000 +RDATE:19551002T040000 +RDATE:19561007T040000 +RDATE:19571006T040000 +RDATE:19581005T040000 +RDATE:19591004T040000 +RDATE:19601002T040000 +RDATE:19611029T040000 +RDATE:19621028T040000 +RDATE:19631027T040000 +RDATE:19641025T040000 +RDATE:19651024T040000 +RDATE:19661023T040000 +RDATE:19671029T040000 +RDATE:19711031T040000 +RDATE:19721029T040000 +RDATE:19731028T040000 +RDATE:19741027T040000 +RDATE:19751026T040000 +RDATE:19761024T040000 +RDATE:19771023T040000 +RDATE:19781029T040000 +RDATE:19791028T040000 +RDATE:19801026T040000 +RDATE:19811025T030000 +RDATE:19821024T030000 +RDATE:19831023T030000 +RDATE:19841028T030000 +RDATE:19851027T030000 +RDATE:19861026T030000 +RDATE:19871025T020000 +RDATE:19881023T020000 +RDATE:19891029T030000 +RDATE:19901028T030000 +RDATE:19911027T030000 +RDATE:19921025T030000 +RDATE:19931024T030000 +RDATE:19941023T030000 +RDATE:19951022T030000 +END:STANDARD +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +TZNAME:BDST +DTSTART:19410504T030000 +RDATE:19410504T030000 +RDATE:19420405T030000 +RDATE:19430404T030000 +RDATE:19440402T030000 +RDATE:19450402T030000 +RDATE:19470413T030000 +END:DAYLIGHT +BEGIN:DAYLIGHT +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +TZNAME:BST +DTSTART:19410810T040000 +RDATE:19410810T040000 +RDATE:19420809T040000 +RDATE:19430815T040000 +RDATE:19440917T040000 +RDATE:19450715T040000 +RDATE:19470810T040000 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0100 +TZOFFSETTO:+0100 +TZNAME:BST +DTSTART:19681027T010000 +RDATE:19681027T010000 +END:STANDARD +BEGIN:STANDARD +TZOFFSETFROM:+0000 +TZOFFSETTO:+0000 +TZNAME:GMT +DTSTART:19960101T010000 +RDATE:19960101T010000 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +DTSTAMP:20240902T113221Z +UID:20240902T113221Z-1@GALAXY-CALENDAR-EVENT-4ff38e00-2373-4580-87b2-0d88 + 26f60702 +CREATED:20240902T113221Z +SUMMARY;ENCODING=QUOTED-PRINTABLE:Frameworks 6.6 tar +STATUS:CONFIRMED +TRANSP:TRANSPARENT +DTSTART;VALUE=DATE:20240906 +DTEND;VALUE=DATE:20240907 +X-GALAXY-ORIGINAL-INSTANCE-TIME:19700101T010000 +X-GALAXY-ORIGINAL-INSTANCE-TIME-RAW:0 +ORGANIZER:mailto:031gkgqg1hjf8lcmj0em1d2sj8@group.calendar.google.com +X-GALAXY-LUNAR:0 +BEGIN:VALARM +TRIGGER:-PT5M +ACTION:DISPLAY +DESCRIPTION:Alarm +END:VALARM +END:VEVENT +END:VCALENDAR diff --git a/VisualCard.ShowCalendars/VisualCard.ShowCalendars.csproj b/VisualCard.ShowCalendars/VisualCard.ShowCalendars.csproj index 3e4ce20..051c2ab 100644 --- a/VisualCard.ShowCalendars/VisualCard.ShowCalendars.csproj +++ b/VisualCard.ShowCalendars/VisualCard.ShowCalendars.csproj @@ -18,19 +18,10 @@ Always - - - - - Always - - - Always - - + Always - + Always