talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit b1798e12ee93466af0a75d8ef5896709668d7a01
parent 4f20d4732b11d49d3ef18e7bda4647bd5e9aead8
Author: Colin Leroy-Mira <colin@colino.net>
Date:   Thu, 29 Aug 2024 21:12:49 +0200

vCalendar: Honor VTIMEZONE component if present

Diffstat:
Msrc/plugins/vcalendar/vcal_folder.c | 51++++++++++++++++++++++++++++++++++++++++-----------
Msrc/plugins/vcalendar/vcalendar.c | 2+-
2 files changed, 41 insertions(+), 12 deletions(-)

diff --git a/src/plugins/vcalendar/vcal_folder.c b/src/plugins/vcalendar/vcal_folder.c @@ -2197,11 +2197,18 @@ static void convert_to_utc(icalcomponent *calendar) { icalcomponent *event; icaltimezone *tz, *tzutc = icaltimezone_get_utc_timezone(); - icalproperty *prop; + icalproperty *prop, *vtimezone_tz; icalparameter *tzid; + icalcomponent *vtimezone; cm_return_if_fail(calendar != NULL); + vtimezone = icalcomponent_get_first_component(calendar, ICAL_VTIMEZONE_COMPONENT); + if (vtimezone) { + vtimezone_tz = icalcomponent_get_first_property(vtimezone, ICAL_TZID_PROPERTY); + } else { + vtimezone_tz = NULL; + } for ( event = icalcomponent_get_first_component(calendar, ICAL_VEVENT_COMPONENT); @@ -2210,34 +2217,56 @@ static void convert_to_utc(icalcomponent *calendar) ICAL_VEVENT_COMPONENT)) { /* DTSTART */ - if ((prop = icalcomponent_get_first_property(event, ICAL_DTSTART_PROPERTY)) != NULL - && (tzid = icalproperty_get_first_parameter(prop, ICAL_TZID_PARAMETER)) != NULL) { + if ((prop = icalcomponent_get_first_property(event, ICAL_DTSTART_PROPERTY)) != NULL) { /* Event has its DTSTART with a timezone specification, let's convert * to UTC and remove the TZID parameter. */ - - tz = icalcomponent_get_timezone(calendar, icalparameter_get_iana_value(tzid)); + if ((tzid = icalproperty_get_first_parameter(prop, ICAL_TZID_PARAMETER)) != NULL) { + tz = icalcomponent_get_timezone(calendar, icalparameter_get_iana_value(tzid)); + debug_print("Got timezone from TZID parameter\n"); + } else if (vtimezone_tz != NULL) { + tz = icalcomponent_get_timezone(calendar, icalproperty_get_tzid(vtimezone_tz)); + debug_print("Got timezone from VTIMEZONE component\n"); + } else { + tz = NULL; + debug_print("No timezone\n"); + } if (tz != NULL) { debug_print("Converting DTSTART to UTC.\n"); icaltimetype t = icalproperty_get_dtstart(prop); + debug_print("Originally %s\n", icaltime_as_ical_string(t)); icaltimezone_convert_time(&t, tz, tzutc); icalproperty_set_dtstart(prop, t); - icalproperty_remove_parameter_by_ref(prop, tzid); + debug_print("Now %s\n", icaltime_as_ical_string(t)); + if (tzid) { + icalproperty_remove_parameter_by_ref(prop, tzid); + } } } /* DTEND */ - if ((prop = icalcomponent_get_first_property(event, ICAL_DTEND_PROPERTY)) != NULL - && (tzid = icalproperty_get_first_parameter(prop, ICAL_TZID_PARAMETER)) != NULL) { + if ((prop = icalcomponent_get_first_property(event, ICAL_DTEND_PROPERTY)) != NULL) { /* Event has its DTEND with a timezone specification, let's convert * to UTC and remove the TZID parameter. */ - - tz = icalcomponent_get_timezone(calendar, icalparameter_get_iana_value(tzid)); + if ((tzid = icalproperty_get_first_parameter(prop, ICAL_TZID_PARAMETER)) != NULL) { + tz = icalcomponent_get_timezone(calendar, icalparameter_get_iana_value(tzid)); + debug_print("Got timezone from TZID parameter\n"); + } else if (vtimezone_tz != NULL) { + tz = icalcomponent_get_timezone(calendar, icalproperty_get_tzid(vtimezone_tz)); + debug_print("Got timezone from VTIMEZONE component\n"); + } else { + tz = NULL; + debug_print("No timezone\n"); + } if (tz != NULL) { debug_print("Converting DTEND to UTC.\n"); icaltimetype t = icalproperty_get_dtend(prop); + debug_print("Originally %s\n", icaltime_as_ical_string(t)); icaltimezone_convert_time(&t, tz, tzutc); icalproperty_set_dtend(prop, t); - icalproperty_remove_parameter_by_ref(prop, tzid); + debug_print("Now %s\n", icaltime_as_ical_string(t)); + if (tzid) { + icalproperty_remove_parameter_by_ref(prop, tzid); + } } } } diff --git a/src/plugins/vcalendar/vcalendar.c b/src/plugins/vcalendar/vcalendar.c @@ -674,7 +674,7 @@ static void vcalviewer_get_request_values(VCalViewer *vcalviewer, MimeInfo *mime /* see if we have it registered and more recent */ saved_event = vcal_manager_load_event(vcalviewer->event->uid); - if (saved_event && saved_event->sequence >= vcalviewer->event->sequence) { + if (saved_event && saved_event->sequence > vcalviewer->event->sequence) { saved_event->method = vcalviewer->event->method; vcalviewer_display_event(vcalviewer, saved_event); vcal_manager_free_event(saved_event);