X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit-ng%2Fserver%2Fcaldav_reports.c;h=481d118d1c894cd6a9f27b59f596a628664c937d;hb=a0bffa36078be5c70149923399fba348494d8e5c;hp=22c90fea62ba981fffdc9b4e54b077e952db0e74;hpb=a88a550cf8b88924645686b5c2fea78c4e0bcb66;p=citadel.git diff --git a/webcit-ng/server/caldav_reports.c b/webcit-ng/server/caldav_reports.c index 22c90fea6..481d118d1 100644 --- a/webcit-ng/server/caldav_reports.c +++ b/webcit-ng/server/caldav_reports.c @@ -259,23 +259,28 @@ 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 *supplied_cal, char *start_str, char *end_str) { +int caldav_time_range_filter_matches(icalcomponent *cal, char *start_str, char *end_str) { - struct icaltimetype start = (start_str ? icaltime_from_string(start_str) : icaltime_null_time()); - struct icaltimetype end = (end_str ? icaltime_from_string(end_str) : icaltime_null_time()); - - // make a local copy of the component because we are going to modify it by converting times to UTC - icalcomponent *cal = icalcomponent_new_clone(supplied_cal); - ical_dezonify(cal); + struct icaltimetype start = ( + (!IsEmptyStr(start_str)) + ? icaltime_from_string(start_str) + : icaltime_from_string("19010101T010101Z") + ); + syslog(LOG_DEBUG, " search start: %16s --> \033[36m%s\033[0m", start_str, icaltime_as_ical_string_r(start)); - syslog(LOG_DEBUG, "\033[7mcaldav_time_range_filter_matches()\033[0m : Does this %s fall between %s and %s ?", - icalcomponent_kind_to_string(icalcomponent_isa(cal)), - start_str, - end_str + struct icaltimetype end = ( + (!IsEmptyStr(end_str)) + ? icaltime_from_string(end_str) + : icaltime_from_string("99991231T235959Z") // ISO8601 is not Y10K compliant ); + syslog(LOG_DEBUG, " search end: %16s --> \033[36m%s\033[0m", end_str, icaltime_as_ical_string_r(end)); - syslog(LOG_DEBUG, "Well, here it is:"); - syslog(LOG_DEBUG, "\033[35m%s\033[0m", icalcomponent_as_ical_string_r(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)); @@ -283,8 +288,7 @@ int caldav_time_range_filter_matches(icalcomponent *supplied_cal, char *start_st icaltimetype dte = icalcomponent_get_dtend(cal); syslog(LOG_DEBUG, "component end: \033[36m%s\033[0m", icaltime_as_ical_string_r(dte)); - icalcomponent_free(cal); - return(0); // FIXME reject everything for now + return(ical_ctdl_is_overlap(dts, dte, start, end)); // We have a convenience function for this. }