* Another attempt at fixing timezones :(
authorArt Cancro <ajc@citadel.org>
Fri, 27 Dec 2002 04:40:40 +0000 (04:40 +0000)
committerArt Cancro <ajc@citadel.org>
Fri, 27 Dec 2002 04:40:40 +0000 (04:40 +0000)
citadel/ChangeLog
citadel/ical_dezonify.c
citadel/serv_calendar.c

index c3035f75853438d23dbf0a72f1197b7fc114b202..171f2ede9d7749e42d77a4c020f2a041f41d618e 100644 (file)
@@ -1,4 +1,7 @@
  $Log$
+ Revision 601.97  2002/12/27 04:40:40  ajc
+ * Another attempt at fixing timezones :(
+
  Revision 601.96  2002/12/25 23:17:07  ajc
  * ical_dezonify.c: shuffle around #includes and #ifdef's
 
@@ -4329,3 +4332,4 @@ Sat Jul 11 00:20:48 EDT 1998 Nathan Bryant <bryant@cs.usm.maine.edu>
 
 Fri Jul 10 1998 Art Cancro <ajc@uncensored.citadel.org>
        * Initial CVS import
+
index 6a49cad4cc7cf39641d01580d28e1e7c266e6749..9297350c2fcdfff6db7e13793839d4126126a933 100644 (file)
 /*
  * Back end function for ical_dezonify()
  *
- * We supply this with the master component and the property (which will
- * be a DTSTART or DTEND) which we want to convert to UTC.
+ * We supply this with the master component, the relevant component,
+ * and the property (which will be a DTSTART of DTEND)
+ * which we want to convert to UTC.
  */
-void ical_dezonify_backend(icalcomponent *cal, icalproperty *prop) {
+void ical_dezonify_backend(icalcomponent *cal,
+                       icalcomponent *rcal,
+                       icalproperty *prop) {
+
        icaltimezone *t;
        icalparameter *param;
        const char *tzid;
@@ -61,22 +65,28 @@ void ical_dezonify_backend(icalcomponent *cal, icalproperty *prop) {
        else if (icalproperty_isa(prop) == ICAL_DTEND_PROPERTY) {
                TheTime = icalproperty_get_dtend(prop);
        }
+       else {
+               return;
+       }
 
-       /* Do the conversion.
-        */
+       /* Remove the property from the component. */
+       icalcomponent_remove_property(rcal, prop);
+       icalproperty_free(prop);
+
+       /* Do the conversion. */
        icaltimezone_convert_time(&TheTime,
                                t,
                                icaltimezone_get_utc_timezone()
        );
 
-       /* Now strip the TZID parameter, because it's incorrect now. */
-       icalproperty_remove_parameter(prop, ICAL_TZID_PARAMETER);
-
+       /* Now add the converted property back in. */
        if (icalproperty_isa(prop) == ICAL_DTSTART_PROPERTY) {
-               icalproperty_set_dtstart(prop, TheTime);
+               prop = icalproperty_new_dtstart(TheTime);
+               icalcomponent_add_property(rcal, prop);
        }
        else if (icalproperty_isa(prop) == ICAL_DTEND_PROPERTY) {
-               icalproperty_set_dtend(prop, TheTime);
+               prop = icalproperty_new_dtend(TheTime);
+               icalcomponent_add_property(rcal, prop);
        }
 
 }
@@ -116,7 +126,7 @@ void ical_dezonify_recur(icalcomponent *cal, icalcomponent *rcal) {
                        (icalproperty_isa(p) == ICAL_DTSTART_PROPERTY)
                        || (icalproperty_isa(p) == ICAL_DTEND_PROPERTY)
                   ) {
-                       ical_dezonify_backend(cal, p);
+                       ical_dezonify_backend(cal, rcal, p);
                }
        }
 }
@@ -139,6 +149,8 @@ void ical_dezonify(icalcomponent *cal) {
                icalcomponent_remove_component(cal, vt);
                icalcomponent_free(vt);
        }
+
+       lprintf(9, "dezonify:\n%s\n", icalcomponent_as_ical_string(cal));
 }
 
 #endif /* HAVE_ICAL_H */
index 2e8acf5a55b140086210cd267be61f64e8cbc6ef..c58502bbe0e489111a13271bc2edc0dcab4a6332 100644 (file)
@@ -1046,6 +1046,8 @@ void ical_create_room(void)
  */
 void ical_send_out_invitations(icalcomponent *cal) {
        icalcomponent *the_request = NULL;
+       icaltimezone *utc_timezone = NULL;
+       icalcomponent *utc_component = NULL;
        char *serialized_request = NULL;
        char *request_message_text = NULL;
        struct CtdlMessage *msg = NULL;
@@ -1127,7 +1129,29 @@ void ical_send_out_invitations(icalcomponent *cal) {
        /* Set the method to REQUEST */
        icalcomponent_set_method(encaps, ICAL_METHOD_REQUEST);
 
-       /* FIXME: here we need to insert a VTIMEZONE object. */
+       /* Insert a VTIMEZONE subcomponent telling the dumbass calendar agent
+        * at the other end about UTC.  This is necessary because some calendar
+        * agents assume that an unqualified time is UTC while others assume
+        * it is local.
+        */
+       utc_timezone = icaltimezone_get_utc_timezone();
+       if (utc_timezone == NULL) {
+               lprintf(9, "%s:%d: utc_timezone is null\n",__FILE__,__LINE__);
+       }
+       else {
+               utc_component = icaltimezone_get_component(utc_timezone);
+       }
+       if (utc_component == NULL) {
+               lprintf(9, "%s:%d: utc_component is null\n",__FILE__,__LINE__);
+       }
+       else {
+               icalcomponent_add_component(encaps, utc_component);
+       }
+
+       /* Now make sure all of the DTSTART and DTEND properties are
+        * labelled as UTC.  (FIXME do this)
+        */
+       ical_dezonify(the_request);
 
        /* Here we go: put the VEVENT into the VCALENDAR.  We now no longer
         * are responsible for "the_request"'s memory -- it will be freed