cend = icalcomponent_get_dtend(comp);
length = icaltime_subtract(cend, cstart);
- rrule = icalcomponent_get_first_property(comp, ICAL_RRULE_PROPERTY);
- recur = icalproperty_get_rrule(rrule);
- iter = icalrecur_iterator_new(recur, cstart);
-
- /* Add recurrences */
+ /* Full day event */
if (icaltime_is_null_time(cstart) ||
which == ICAL_VTODO_COMPONENT) {
icalarray_append(array, &(ical_inst){
.start = cstart,
.end = cend,
});
- } else while (1) {
- istart = iend = icalrecur_iterator_next(iter);
- if (icaltime_is_null_time(istart))
- break; // no more instances
- if (!icaltime_is_null_time(cend))
- iend = icaltime_add(iend, length);
-
- if (icaltime_compare(iend, start) <= 0)
- continue; // instance ends before start time
- if (icaltime_compare(istart, end) >= 0)
- break; // instance begins after stop time
+ }
+
+ /* Add all recurrences */
+ rrule = icalcomponent_get_first_property(comp, ICAL_RRULE_PROPERTY);
+ /* One-time event */
+ if (!rrule) {
icalarray_append(array, &(ical_inst){
.cal = cal,
.comp = comp,
- .start = istart,
- .end = iend,
+ .start = cstart,
+ .end = cend,
});
}
- icalrecur_iterator_free(iter);
+ /* Recurring events */
+ while (rrule) {
+ recur = icalproperty_get_rrule(rrule);
+ iter = icalrecur_iterator_new(recur, cstart);
+
+ /* Add recurrence for this rrule */
+ while (1) {
+ istart = iend = icalrecur_iterator_next(iter);
+ if (icaltime_is_null_time(istart))
+ break; // no more instances
+ if (!icaltime_is_null_time(cend))
+ iend = icaltime_add(iend, length);
+
+ if (icaltime_compare(iend, start) <= 0)
+ continue; // instance ends before start time
+ if (icaltime_compare(istart, end) >= 0)
+ break; // instance begins after stop time
+
+ icalarray_append(array, &(ical_inst){
+ .cal = cal,
+ .comp = comp,
+ .start = istart,
+ .end = iend,
+ });
+ }
+
+ icalrecur_iterator_free(iter);
+ rrule = icalcomponent_get_next_property(comp, ICAL_RRULE_PROPERTY);
+ }
}
/* Add children */
static void read_icals(void)
{
for (ical_t *cal = calendars; cal; cal = cal->next) {
- if (cal->comp == NULL && cal->location) {
- wordexp_t wexp;
- wordexp(cal->location, &wexp, WRDE_NOCMD);
- icalparser *parser = icalparser_new();
- for (int i = 0; i < wexp.we_wordc; i++) {
- FILE *file = fopen(wexp.we_wordv[i], "r");
- if (!file)
- continue;
- icalparser_set_gen_data(parser, file);
- }
+ if (!cal->location)
+ debug("Missing location for ical '%s'", cal->cal.name);
+ if (cal->comp)
+ continue;
+ wordexp_t wexp;
+ wordexp(cal->location, &wexp, WRDE_NOCMD);
+ icalparser *parser = icalparser_new();
+ if (wexp.we_wordc > 1)
+ debug("Multiple calendards are not supported '%s'", cal->location);
+ FILE *file = fopen(wexp.we_wordv[0], "r");
+ if (!file) {
+ debug("Cannot open ical file '%s'", wexp.we_wordv[0]);
+ } else {
+ icalparser_set_gen_data(parser, file);
cal->comp = icalparser_parse(parser, (void*)fgets);
icalparser_free(parser);
- wordfree(&wexp);
}
+ wordfree(&wexp);
}
}
}
}
-void ical_test(void)
+void ical_test(char *path)
{
/* Load ical */
- FILE *file = fopen("data/all.ics", "r");
+ FILE *file = fopen(path, "r");
icalparser *parser = icalparser_new();
icalparser_set_gen_data(parser, file);
icalcomponent *comp = icalparser_parse(parser, (void*)fgets);