+ /* Do the same for the ending date and time. It makes the day view much easier to render. */
+ ps = icalcomponent_get_first_property(Cal->cal, ICAL_DTEND_PROPERTY);
+ if (ps != NULL) {
+ dtend = icalproperty_get_dtstart(ps);
+ Cal->event_end = icaltime_as_timet(dtend);
+ }
+
+ /* Store it in the hash list. */
+ Put(WCC->disp_cal_items,
+ (char*) &Cal->event_start,
+ sizeof(Cal->event_start),
+ Cal,
+ delete_cal);
+
+ /* handle recurring events */
+
+ if (icaltime_is_null_time(dtstart)) return; /* Can't recur without a start time */
+
+ if (!icaltime_is_null_time(dtend)) { /* Need duration for recurrences */
+ dur = icaltime_subtract(dtend, dtstart);
+ }
+
+ /*
+ * Just let libical iterate the recurrence, and keep looping back to the top of this function,
+ * adding new hash entries that all point back to the same msgnum, until either the iteration
+ * stops or some outer bound is reached. The display code will automatically do the Right Thing.
+ */
+
+ rrule = icalcomponent_get_first_property(Cal->cal, ICAL_RRULE_PROPERTY);
+ if (!rrule) return;
+ recur = icalproperty_get_rrule(rrule);
+ ritr = icalrecur_iterator_new(recur, dtstart);
+ if (!ritr) return;
+
+ int stop_rr = 0;
+ while (next = icalrecur_iterator_next(ritr), ((!icaltime_is_null_time(next))&&(!stop_rr)) ) {
+ ++num_recur;
+
+ if (num_recur > 1) { /* Skip the first one. We already did it at the root. */
+
+ /* Note: anything we do here, we also have to do above for the root event. */
+ Cal = (disp_cal*) malloc(sizeof(disp_cal));
+ memset(Cal, 0, sizeof(disp_cal));
+
+ Cal->cal = icalcomponent_new_clone(cal);
+ Cal->unread = unread;
+ len = strlen(from);
+ Cal->from = (char*)malloc(len+ 1);
+ memcpy(Cal->from, from, len + 1);
+ ical_dezonify(Cal->cal);
+ Cal->cal_msgnum = msgnum;
+
+ ps = icalcomponent_get_first_property(Cal->cal, ICAL_DTSTART_PROPERTY);
+ if (ps != NULL) {
+ icalcomponent_remove_property(Cal->cal, ps);
+ ps = icalproperty_new_dtstart(next);
+ icalcomponent_add_property(Cal->cal, ps);
+ Cal->event_start = icaltime_as_timet(next);
+ final_recurrence = Cal->event_start;
+ }
+
+ ps = icalcomponent_get_first_property(Cal->cal, ICAL_DTEND_PROPERTY);
+ if (ps != NULL) {
+ icalcomponent_remove_property(Cal->cal, ps);
+
+ /* Make a new dtend */
+ ps = icalproperty_new_dtend(icaltime_add(next, dur));
+
+ /* and stick it somewhere */
+ icalcomponent_add_property(Cal->cal, ps);
+ }
+
+ if ( (Cal->event_start > calv->lower_bound)
+ && (Cal->event_start < calv->upper_bound) ) {
+ Put(WCC->disp_cal_items,
+ (char*) &Cal->event_start,
+ sizeof(Cal->event_start),
+ Cal,
+ delete_cal
+ );
+ }
+ else {
+ delete_cal(Cal);
+ }