Do not convert compared times to UTC.
authorArt Cancro <ajc@citadel.org>
Thu, 21 Mar 2024 18:30:29 +0000 (11:30 -0700)
committerArt Cancro <ajc@citadel.org>
Thu, 21 Mar 2024 18:30:29 +0000 (11:30 -0700)
ical_ctdl_is_overlap() works because icaltime_compare() is really smart.
It looks at the time zone of the dtstart/dtend and can apparently go back up the icalcomponent
hierarchy to find its time zone data.  I tested this by creating an event with a fictional
time zone and it did the right thing.  It even showed the fictional name to me.  This saves us
from having to convert everything to UTC before comparing.  Nice!

citadel/server/modules/calendar/ical_ctdl_is_overlap.c
webcit-ng/server/caldav_reports.c

index d980c554b53645faf385fa786a3908f0eb50dbe0..fbec0f572163919011f8da30e48428da83c837a1 100644 (file)
@@ -38,11 +38,11 @@ int ical_ctdl_is_overlap(
        }
 
 #ifdef DEBUG_ICAL_OVERLAP
-       syslog(LOG_DEBUG, "Comparing t1start=%s,t1end=%s to t2start=%s,t2end=%s",
-               icaltime_as_ical_string_r(t1start),
-               icaltime_as_ical_string_r(t1end),
-               icaltime_as_ical_string_r(t2start),
-               icaltime_as_ical_string_r(t2end)
+       syslog(LOG_DEBUG, "Comparing t1start=%s(%s),t1end=%s(%s) to t2start=%s(%s),t2end=%s(%s)",
+               icaltime_as_ical_string_r(t1start),     icaltime_get_tzid(t1start),
+               icaltime_as_ical_string_r(t1end),       icaltime_get_tzid(t1end),
+               icaltime_as_ical_string_r(t2start),     icaltime_get_tzid(t2start),
+               icaltime_as_ical_string_r(t2end),       icaltime_get_tzid(t2end)
        );
 #endif
 
index 3c7797eed7cc798815af1977ddea819eee83d742..481d118d1c894cd6a9f27b59f596a628664c937d 100644 (file)
@@ -259,7 +259,7 @@ void caldav_report_one_item(struct http_transaction *h, struct ctdlsession *c, S
 
 // Compare function for "time-range" tests (RFC4791 section 9.9)
 // Returns nonzero if the supplied icalcomponent occurs within the specified time range
-int caldav_time_range_filter_matches(icalcomponent *cal_in, char *start_str, char *end_str) {
+int caldav_time_range_filter_matches(icalcomponent *cal, char *start_str, char *end_str) {
 
        struct icaltimetype start = (
                (!IsEmptyStr(start_str))
@@ -275,20 +275,12 @@ int caldav_time_range_filter_matches(icalcomponent *cal_in, char *start_str, cha
        );
        syslog(LOG_DEBUG, "   search   end: %16s --> \033[36m%s\033[0m", end_str, icaltime_as_ical_string_r(end));
 
-
-// NOTE TO ME: The header file says
-// "This converts both times to the UTC timezone and compares them."
-//     LIBICAL_ICAL_EXPORT int icaltime_compare(const struct icaltimetype a, const struct icaltimetype b);
-// How does it do that without knowing the time zone?  Does it use a private method to look up into the
-// parent component to find a VTIMEZONE component?  Find out.  If it can do that, we don't have to dezonify.
-
-
-
-       // make a local copy of the component because we are going to modify it by converting times to UTC
-       icalcomponent *cal = icalcomponent_new_clone(cal_in);
-       ical_dezonify(cal);
-
-
+       // IMPLEMENTATION NOTE:
+       // ical_ctdl_is_overlap() works because icaltime_compare() is really smart.
+       // It looks at the time zone of the dtstart/dtend and can apparently go back up the icalcomponent
+       // hierarchy to find its time zone data.  I tested this by creating an event with a fictional
+       // time zone and it did the right thing.  It even showed the fictional name to me.  This saves us
+       // from having to convert everything to UTC before comparing.  Nice!
 
        icaltimetype dts = icalcomponent_get_dtstart(cal);
        syslog(LOG_DEBUG, "component start: \033[36m%s\033[0m", icaltime_as_ical_string_r(dts));
@@ -296,10 +288,7 @@ int caldav_time_range_filter_matches(icalcomponent *cal_in, char *start_str, cha
        icaltimetype dte = icalcomponent_get_dtend(cal);
        syslog(LOG_DEBUG, "component   end: \033[36m%s\033[0m", icaltime_as_ical_string_r(dte));
 
-       int result = ical_ctdl_is_overlap(dts, dte, start, end);        // We have a convenience function for this.
-
-       icalcomponent_free(cal);
-       return(result);
+       return(ical_ctdl_is_overlap(dts, dte, start, end));     // We have a convenience function for this.
 }