These are now known as "the_beginning_of_time" and
"the_end_of_time" and closely track the time boundaries within
which libical can safely operate.
Supplied these as default values when filling variables to call the
time range compare function, allowing us to remove the check-for-null
code in that function.
# This program is open source software. Use, duplication, or
# disclosure are subject to the GNU General Public License v3.
# This program is open source software. Use, duplication, or
# disclosure are subject to the GNU General Public License v3.
-CFLAGS := $(CFLAGS) -ggdb -Wno-format-truncation -DDEBUG_ICAL_OVERLAP
+CFLAGS := $(CFLAGS) -ggdb -Wno-format-truncation
LDFLAGS := $(LDFLAGS)
SRC := server
LDFLAGS := $(LDFLAGS)
SRC := server
-#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 {
// A CalDAV REPORT can only be one type. This is stored in the report_type member.
enum cr_type {
// 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.
// 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.
#endif
// RFC4791 7.8 "calendar-query" REPORT - Client will send a lot of search criteria.
#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.
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
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
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
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
) {
)
&& (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);
++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
}
while (attr[a]) {
len += snprintf(&newfilter[len], SIZ-len, "|%s", attr[a++]); // now save the attributes
}
- if (!strcasecmp(el, CAL"comp-filter")) {
+ if (!strcasecmp(el, CALDAV"comp-filter")) {
--crp->comp_filter_nesting_level;
}
--crp->comp_filter_nesting_level;
}
// 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) {
// 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.
// IMPLEMENTATION NOTE:
// ical_ctdl_is_overlap() works because icaltime_compare() is really smart.
// from having to convert everything to UTC before comparing. Nice!
icaltimetype dts = icalcomponent_get_dtstart(cal);
// 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);
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.
}
return(ical_ctdl_is_overlap(dts, dte, start, end)); // We have a convenience function for this.
}
}
else if (!strcasecmp(t[1], "time-range")) { // RFC4791 9.9
}
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)<num_tokens; i+=2) {
for (int i=2; (i+1)<num_tokens; i+=2) {
- char *tr_start = NULL;
- char *tr_end = NULL;
+ char *tr_start = (char *)the_beginning_of_time; // default if not specified
+ char *tr_end = (char *)the_end_of_time; // default if not specified
if (!strcasecmp(t[i], "start")) {
tr_start = t[i+1];
}
if (!strcasecmp(t[i], "start")) {
tr_start = t[i+1];
}