From: Art Cancro Date: Fri, 11 May 2007 20:58:14 +0000 (+0000) Subject: Small fixes to ical_dezonify() and its helper functions X-Git-Tag: v7.86~3374 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=f9f3d96f461ddf73c50b7c04503dba4c0f8608b8 Small fixes to ical_dezonify() and its helper functions to handle properties that are declared 'TZID=GMT' which is a valid but unorthodox way of declaring that the property is UTC/GMT. The functions now detect this style of declaration and automatically converts to 'Z syntax'. Calendar events created or modified by the Outlook connector now show up in WebCit with the correct time. --- diff --git a/citadel/ical_dezonify.c b/citadel/ical_dezonify.c index 0f0027c4f..ce448a84e 100644 --- a/citadel/ical_dezonify.c +++ b/citadel/ical_dezonify.c @@ -55,13 +55,13 @@ icaltimezone *get_default_icaltimezone(void) */ void ical_dezonify_backend(icalcomponent *cal, icalcomponent *rcal, - icalproperty *prop) -{ + icalproperty *prop) { icaltimezone *t = NULL; icalparameter *param; - const char *tzid; + const char *tzid = NULL; struct icaltimetype TheTime; + int utc_declared_as_tzid = 0; /**< Component declared 'TZID=GMT' instead of using Z syntax */ /* Give me nothing and I will give you nothing in return. */ if (cal == NULL) return; @@ -75,7 +75,17 @@ void ical_dezonify_backend(icalcomponent *cal, /* Convert it to an icaltimezone type. */ if (tzid != NULL) { - t = icalcomponent_get_timezone(cal, tzid); + lprintf(9, " * Stringy supplied timezone is: '%s'\n", tzid); + if ( (!strcasecmp(tzid, "UTC")) || (!strcasecmp(tzid, "GMT")) ) { + utc_declared_as_tzid = 1; + lprintf(9, " * ...and we handle that internally.\n"); + } + else { + t = icalcomponent_get_timezone(cal, tzid); + lprintf(9, " * ...and I %s have tzdata for that zone.\n", + (t ? "DO" : "DO NOT") + ); + } } } @@ -98,17 +108,24 @@ void ical_dezonify_backend(icalcomponent *cal, return; } - lprintf(CTDL_DEBUG, " * Was: %s\n", icaltime_as_ical_string(TheTime)); + lprintf(9, " * Was: %s\n", icaltime_as_ical_string(TheTime)); + if (TheTime.is_utc) { - lprintf(CTDL_DEBUG, " * This property is ALREADY UTC.\n"); + lprintf(9, " * This property is ALREADY UTC.\n"); + } + + else if (utc_declared_as_tzid) { + lprintf(9, " * Replacing '%s' TZID with 'Z' suffix.\n", tzid); + TheTime.is_utc = 1; } + else { /* Do the conversion. */ if (t != NULL) { - lprintf(CTDL_DEBUG, " * Timezone prop found. Converting to UTC.\n"); + lprintf(9, " * Timezone prop found. Converting to UTC.\n"); } else { - lprintf(CTDL_DEBUG, " * Converting default timezone to UTC.\n"); + lprintf(9, " * Converting default timezone to UTC.\n"); } if (t == NULL) { @@ -123,7 +140,7 @@ void ical_dezonify_backend(icalcomponent *cal, } icalproperty_remove_parameter_by_kind(prop, ICAL_TZID_PARAMETER); - lprintf(CTDL_DEBUG, " * Now: %s\n", icaltime_as_ical_string(TheTime)); + lprintf(9, " * Now: %s\n", icaltime_as_ical_string(TheTime)); /* Now add the converted property back in. */ if (icalproperty_isa(prop) == ICAL_DTSTART_PROPERTY) { @@ -165,11 +182,9 @@ void ical_dezonify_recurse(icalcomponent *cal, icalcomponent *rcal) { /* * Now look for DTSTART and DTEND properties */ - for (p=icalcomponent_get_first_property( - rcal, ICAL_ANY_PROPERTY); + for (p=icalcomponent_get_first_property(rcal, ICAL_ANY_PROPERTY); p != NULL; - p = icalcomponent_get_next_property( - rcal, ICAL_ANY_PROPERTY) + p = icalcomponent_get_next_property(rcal, ICAL_ANY_PROPERTY) ) { if ( (icalproperty_isa(p) == ICAL_DTSTART_PROPERTY) @@ -191,7 +206,7 @@ void ical_dezonify_recurse(icalcomponent *cal, icalcomponent *rcal) { void ical_dezonify(icalcomponent *cal) { icalcomponent *vt = NULL; - lprintf(CTDL_DEBUG, "ical_dezonify() started\n"); + lprintf(9, "ical_dezonify() started\n"); /* Convert all times to UTC */ ical_dezonify_recurse(cal, cal); @@ -203,7 +218,7 @@ void ical_dezonify(icalcomponent *cal) { icalcomponent_free(vt); } - lprintf(CTDL_DEBUG, "ical_dezonify() completed\n"); + lprintf(9, "ical_dezonify() completed\n"); }