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)
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)
--- /dev/null
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <ical.h>
+
+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);
+ }
+}