From 375a750de473ec3d52f4f03758d90f490160a340 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Wed, 25 Dec 2002 06:41:44 +0000 Subject: [PATCH] * ical_dezonify.c: added (function to strip localized timestamps out of a component and replace them with UTC timestamps) --- citadel/ChangeLog | 5 ++ citadel/Makefile.in | 8 ++- citadel/ical_dezonify.c | 135 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 145 insertions(+), 3 deletions(-) create mode 100644 citadel/ical_dezonify.c diff --git a/citadel/ChangeLog b/citadel/ChangeLog index 592c5d454..b3a52ec05 100644 --- a/citadel/ChangeLog +++ b/citadel/ChangeLog @@ -1,4 +1,8 @@ $Log$ + Revision 601.93 2002/12/25 06:41:44 ajc + * ical_dezonify.c: added (function to strip localized timestamps out of + a component and replace them with UTC timestamps) + Revision 601.92 2002/12/19 04:51:49 ajc * database_cleanup.sh: added @@ -4315,3 +4319,4 @@ Sat Jul 11 00:20:48 EDT 1998 Nathan Bryant Fri Jul 10 1998 Art Cancro * Initial CVS import + diff --git a/citadel/Makefile.in b/citadel/Makefile.in index 97d9dc2a7..5ab914811 100644 --- a/citadel/Makefile.in +++ b/citadel/Makefile.in @@ -93,7 +93,7 @@ SOURCES=aidepost.c auth.c base64.c chkpwd.c citadel.c citadel_ipc.c \ serv_spam.c serv_test.c serv_mrtg.c serv_spam.c serv_upgrade.c \ serv_vandelay.c serv_vcard.c server_main.c setup.c snprintf.c \ stats.c support.c sysdep.c tools.c user_ops.c userlist.c \ - whobbs.c vcard.c + whobbs.c vcard.c ical_dezonify.c DEP_FILES=$(SOURCES:.c=.d) @@ -218,8 +218,10 @@ aidepost: aidepost.o libcitserver.la $(LIBOBJS) modules/libpas2.la: serv_pas2.lo md5.lo $(LIBTOOL) libcitserver.la $(LTSHARE) -o libpas2.la ../serv_pas2.lo ../md5.lo ../libcitserver.la -modules/libcalendar.la: serv_calendar.lo $(LIBTOOL) libcitserver.la - $(LTSHARE) -o libcalendar.la ../serv_calendar.lo ../libcitserver.la +modules/libcalendar.la: serv_calendar.lo ical_dezonify.lo \ + $(LIBTOOL) libcitserver.la + $(LTSHARE) -o libcalendar.la ../serv_calendar.lo ../ical_dezonify.lo \ + ../libcitserver.la citmail: citmail.o config.o $(CC) citmail.o config.o $(LDFLAGS) -o citmail $(LIBS) diff --git a/citadel/ical_dezonify.c b/citadel/ical_dezonify.c new file mode 100644 index 000000000..c2b6022aa --- /dev/null +++ b/citadel/ical_dezonify.c @@ -0,0 +1,135 @@ +#include +#include +#include +#include +#include +#include +#include + +void ical_dezonify(icalcomponent *cal); + +/* + * 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. + */ +void ical_dezonify_backend(icalcomponent *cal, icalproperty *prop) { + icaltimezone *t; + icalparameter *param; + const char *tzid; + struct icaltimetype TheTime; + + /* Give me nothing and I will give you nothing in return. */ + if (cal == NULL) return; + + /* Hunt for a TZID parameter in this property. */ + param = icalproperty_get_first_parameter(prop, ICAL_TZID_PARAMETER); + if (param == NULL) { + printf("No tzid parameter found - " + "perhaps this component is already UTC?\n"); + return; + } + + /* Get the stringish name of this TZID. */ + tzid = icalparameter_get_tzid(param); + if (tzid == NULL) { + printf("icalparameter_get_tzid() returned NULL\n"); + return; + } + + /* Convert it to an icaltimezone type. */ + t = icalcomponent_get_timezone(cal, tzid); + if (t == NULL) { + printf("icalcomponent_get_timezone(%s) returned NULL\n", tzid); + } + + /* Now we know the timezone. Convert to UTC. */ + + if (icalproperty_isa(prop) == ICAL_DTSTART_PROPERTY) { + TheTime = icalproperty_get_dtstart(prop); + } + else if (icalproperty_isa(prop) == ICAL_DTEND_PROPERTY) { + TheTime = icalproperty_get_dtend(prop); + } + + /* Do the conversion. + * (I had to specify the 'from' and 'to' timezones backwards. Is the + * API documentation wrong?) + */ + icaltimezone_convert_time(&TheTime, + icaltimezone_get_utc_timezone(), + t + ); + + /* Now strip the TZID parameter, because it's incorrect now. */ + icalproperty_remove_parameter(prop, ICAL_TZID_PARAMETER); + + if (icalproperty_isa(prop) == ICAL_DTSTART_PROPERTY) { + icalproperty_set_dtstart(prop, TheTime); + } + else if (icalproperty_isa(prop) == ICAL_DTEND_PROPERTY) { + icalproperty_set_dtend(prop, TheTime); + } + +} + + +/* + * Recursive portion of ical_dezonify() + */ +void ical_dezonify_recur(icalcomponent *cal, icalcomponent *rcal) { + icalcomponent *c; + icalproperty *p; + + /* + * Recurse through all subcomponents *except* VTIMEZONE ones. + */ + for (c=icalcomponent_get_first_component( + rcal, ICAL_ANY_COMPONENT); + c != NULL; + c = icalcomponent_get_next_component( + rcal, ICAL_ANY_COMPONENT) + ) { + if (icalcomponent_isa(c) != ICAL_VTIMEZONE_COMPONENT) { + ical_dezonify_recur(cal, c); + } + } + + /* + * Now look for DTSTART and DTEND properties + */ + for (p=icalcomponent_get_first_property( + rcal, ICAL_ANY_PROPERTY); + p != NULL; + p = icalcomponent_get_next_property( + rcal, ICAL_ANY_PROPERTY) + ) { + if ( + (icalproperty_isa(p) == ICAL_DTSTART_PROPERTY) + || (icalproperty_isa(p) == ICAL_DTEND_PROPERTY) + ) { + ical_dezonify_backend(cal, p); + } + } +} + + +/* + * Convert all DTSTART and DTEND properties in all subcomponents to UTC. + * This function will search any VTIMEZONE subcomponents to learn the + * relevant timezone information. + */ +void ical_dezonify(icalcomponent *cal) { + icalcomponent *vt = NULL; + + /* Convert all times to UTC */ + ical_dezonify_recur(cal, cal); + + /* Strip out VTIMEZONE subcomponents -- we don't need them anymore */ + while (vt = icalcomponent_get_first_component( + cal, ICAL_VTIMEZONE_COMPONENT), vt != NULL) { + icalcomponent_remove_component(cal, vt); + icalcomponent_free(vt); + } +} -- 2.30.2