Small fixes to ical_dezonify() and its helper functions
authorArt Cancro <ajc@citadel.org>
Fri, 11 May 2007 20:58:14 +0000 (20:58 +0000)
committerArt Cancro <ajc@citadel.org>
Fri, 11 May 2007 20:58:14 +0000 (20:58 +0000)
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.

citadel/ical_dezonify.c

index 0f0027c4f8d914beacf776c462a6972a942a43a7..ce448a84e113178a582ce7e202a61a4a13233b1d 100644 (file)
@@ -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");
 }