X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit-ng%2Fserver%2Fcaldav_reports.c;h=1a6b931f6c689fd88c26798c669ab0c786104002;hb=41966209672df12d0de6bcf5ec38628170f6c82a;hp=481d118d1c894cd6a9f27b59f596a628664c937d;hpb=cf62d75a721b553e35bcbcc040dde194d69b87be;p=citadel.git diff --git a/webcit-ng/server/caldav_reports.c b/webcit-ng/server/caldav_reports.c index 481d118d1..1a6b931f6 100644 --- a/webcit-ng/server/caldav_reports.c +++ b/webcit-ng/server/caldav_reports.c @@ -4,8 +4,11 @@ #include "webcit.h" -#define CAL "urn:ietf:params:xml:ns:caldav:" // Shorthand for the XML namespace of CalDAV -#define CALLEN sizeof(CAL)-1 // And the length of that string +#define CALDAV "urn:ietf:params:xml:ns:caldav:" // Shorthand for the XML namespace of CalDAV +#define CALDAVLEN sizeof(CALDAV)-1 // And the length of that string + +const char *the_beginning_of_time = "19010101T010101Z"; +const char *the_end_of_time = "99991231T235959Z"; // A CalDAV REPORT can only be one type. This is stored in the report_type member. enum cr_type { @@ -14,7 +17,6 @@ enum cr_type { cr_freebusy_query }; - // Data type for CalDAV Report Parameters. // As we slog our way through the XML we learn what the client is asking for // and build up the contents of this data type. @@ -42,45 +44,45 @@ void caldav_xml_start(void *data, const char *el, const char **attr) { #endif // RFC4791 7.8 "calendar-query" REPORT - Client will send a lot of search criteria. - if (!strcasecmp(el, CAL"calendar-query")) { + if (!strcasecmp(el, CALDAV"calendar-query")) { crp->report_type = cr_calendar_query; } // RFC4791 7.9 "calendar-multiget" REPORT - Client will supply a list of specific hrefs. - else if (!strcasecmp(el, CAL"calendar-multiget")) { + else if (!strcasecmp(el, CALDAV"calendar-multiget")) { crp->report_type = cr_calendar_multiget; } // RFC4791 7.10 "free-busy-query" REPORT - else if (!strcasecmp(el, CAL"free-busy-query")) { + else if (!strcasecmp(el, CALDAV"free-busy-query")) { crp->report_type = cr_freebusy_query; } // RFC4791 9.7 create a filter array if this query contains a "filter" stanza - else if (!strcasecmp(el, CAL"filter")) { + else if (!strcasecmp(el, CALDAV"filter")) { crp->filters = array_new(SIZ); crp->filter_nest = crp->comp_filter_nesting_level; } // Handle the filters defined in RFC4791 9.7.1 through 9.7.5 - else if ( ( (!strcasecmp(el, CAL"comp-filter")) - || (!strcasecmp(el, CAL"prop-filter")) - || (!strcasecmp(el, CAL"param-filter")) - || (!strcasecmp(el, CAL"is-not-defined")) - || (!strcasecmp(el, CAL"text-match")) - || (!strcasecmp(el, CAL"time-range")) + else if ( ( (!strcasecmp(el, CALDAV"comp-filter")) + || (!strcasecmp(el, CALDAV"prop-filter")) + || (!strcasecmp(el, CALDAV"param-filter")) + || (!strcasecmp(el, CALDAV"is-not-defined")) + || (!strcasecmp(el, CALDAV"text-match")) + || (!strcasecmp(el, CALDAV"time-range")) ) && (crp->filters) // Make sure we actually allocated an array ) { - if (!strcasecmp(el, CAL"comp-filter")) { + if (!strcasecmp(el, CALDAV"comp-filter")) { ++crp->comp_filter_nesting_level; } char newfilter[SIZ]; int a = 0; int len = snprintf(newfilter, SIZ, "%d|", crp->comp_filter_nesting_level - crp->filter_nest - 1); - len += snprintf(&newfilter[len], SIZ-len, "%s", &el[CALLEN]); // filter name without the namespace + len += snprintf(&newfilter[len], SIZ-len, "%s", &el[CALDAVLEN]); // filter name without the namespace while (attr[a]) { len += snprintf(&newfilter[len], SIZ-len, "|%s", attr[a++]); // now save the attributes } @@ -101,7 +103,7 @@ void caldav_xml_end(void *data, const char *el) { // end logging #endif - if (!strcasecmp(el, CAL"comp-filter")) { + if (!strcasecmp(el, CALDAV"comp-filter")) { --crp->comp_filter_nesting_level; } @@ -261,19 +263,11 @@ void caldav_report_one_item(struct http_transaction *h, struct ctdlsession *c, S // Returns nonzero if the supplied icalcomponent occurs within the specified time range int caldav_time_range_filter_matches(icalcomponent *cal, char *start_str, char *end_str) { - 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)); + struct icaltimetype start = icaltime_from_string(start_str); + syslog(LOG_DEBUG, " search start: \033[36m%16s\033[0m (%s)", icaltime_as_ical_string_r(start), icaltime_get_tzid(start)); - 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)); + struct icaltimetype end = icaltime_from_string(end_str); + syslog(LOG_DEBUG, " search end: \033[36m%16s\033[0m (%s)", icaltime_as_ical_string_r(end), icaltime_get_tzid(end)); // IMPLEMENTATION NOTE: // ical_ctdl_is_overlap() works because icaltime_compare() is really smart. @@ -283,10 +277,10 @@ int caldav_time_range_filter_matches(icalcomponent *cal, char *start_str, char * // 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)); + syslog(LOG_DEBUG, "component start: \033[36m%16s\033[0m (%s)", icaltime_as_ical_string_r(dts), icaltime_get_tzid(dts)); icaltimetype dte = icalcomponent_get_dtend(cal); - syslog(LOG_DEBUG, "component end: \033[36m%s\033[0m", icaltime_as_ical_string_r(dte)); + syslog(LOG_DEBUG, "component end: \033[36m%16s\033[0m (%s)", icaltime_as_ical_string_r(dte), icaltime_get_tzid(dte)); return(ical_ctdl_is_overlap(dts, dte, start, end)); // We have a convenience function for this. } @@ -407,10 +401,10 @@ int caldav_apply_filters(void *cal, Array *filters, int apply_at_level) { } else if (!strcasecmp(t[1], "time-range")) { // RFC4791 9.9 - syslog(LOG_DEBUG, "time range filter at level %d FIXME not implemented yet", this_rule_level); + syslog(LOG_DEBUG, "time range filter at level %d FIXME add recur", this_rule_level); for (int i=2; (i+1)