From 809cf4fc010629e54cdeabdc6e1920a33ae7d6e5 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Fri, 27 Dec 2002 04:40:40 +0000 Subject: [PATCH] * Another attempt at fixing timezones :( --- citadel/ChangeLog | 4 ++++ citadel/ical_dezonify.c | 34 +++++++++++++++++++++++----------- citadel/serv_calendar.c | 26 +++++++++++++++++++++++++- 3 files changed, 52 insertions(+), 12 deletions(-) diff --git a/citadel/ChangeLog b/citadel/ChangeLog index c3035f758..171f2ede9 100644 --- a/citadel/ChangeLog +++ b/citadel/ChangeLog @@ -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 Fri Jul 10 1998 Art Cancro * Initial CVS import + diff --git a/citadel/ical_dezonify.c b/citadel/ical_dezonify.c index 6a49cad4c..9297350c2 100644 --- a/citadel/ical_dezonify.c +++ b/citadel/ical_dezonify.c @@ -29,10 +29,14 @@ /* * 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 */ diff --git a/citadel/serv_calendar.c b/citadel/serv_calendar.c index 2e8acf5a5..c58502bbe 100644 --- a/citadel/serv_calendar.c +++ b/citadel/serv_calendar.c @@ -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 -- 2.30.2