- icaltimetype dts = icalcomponent_get_dtstart(cal);
- 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%-16s\033[0m (%s)", icaltime_as_ical_string_r(dte), icaltime_get_tzid(dte));
+ icalproperty *rrule;
+ rrule = icalcomponent_get_first_property(cal, ICAL_RRULE_PROPERTY);
+ if (rrule) {
+ if (icaltime_is_null_time(dtend)) {
+ dtend = dtstart;
+ }
+ struct icaldurationtype dur = icaltime_subtract(dtend, dtstart); // recurrences need duration to find dtend
+ struct icalrecurrencetype recur = icalproperty_get_rrule(rrule);
+
+ icalrecur_iterator *ritr = icalrecur_iterator_new(recur, dtstart); // iterate through recurrences
+ int rcount = 0;
+ syslog(LOG_DEBUG, "\033[7m RECURRENCE: \033[0m");
+ while (dtstart = icalrecur_iterator_next(ritr), !icaltime_is_null_time(dtstart)) {
+ dtend = icaltime_add(dtstart, dur);
+ syslog(LOG_DEBUG, "recurrence %3d start: \033[36m%-16s\033[0m (%s)", rcount, icaltime_as_ical_string_r(dtstart), icaltime_get_tzid(dtstart));
+ syslog(LOG_DEBUG, "recurrence %3d end: \033[36m%-16s\033[0m (%s)", rcount, icaltime_as_ical_string_r(dtend), icaltime_get_tzid(dtend));
+
+ // Does THIS recurrence match the query?
+ if (ical_ctdl_is_overlap(dtstart, dtend, search_start, search_end)) {
+ icalrecur_iterator_free(ritr);
+ return(1);
+ }