+/*
+ * This is the meat-and-bones of the first part of our two-phase calendar display.
+ * As we encounter calendar items in messages being read from the server, we break out
+ * any iCalendar objects and store them in a hash table. Later on, the second phase will
+ * use this hash table to render the calendar for display.
+ */
+void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unread, struct calview *calv)
+{
+ icalproperty *ps = NULL;
+ struct icaltimetype dtstart, dtend;
+ struct icaldurationtype dur;
+ wcsession *WCC = WC;
+ disp_cal *Cal;
+ size_t len;
+ time_t final_recurrence = 0;
+ icalcomponent *cptr = NULL;
+
+ /* recur variables */
+ icalproperty *rrule = NULL;
+ struct icalrecurrencetype recur;
+ icalrecur_iterator *ritr = NULL;
+ struct icaltimetype next;
+ int num_recur = 0;
+ int stop_rr = 0;
+
+ dtstart = icaltime_null_time();
+ dtend = icaltime_null_time();
+
+ if (WCC->disp_cal_items == NULL)
+ WCC->disp_cal_items = NewHash(0, Flathash);
+
+ /* Note: anything we do here, we also have to do below for the recurrences. */
+ Cal = (disp_cal*) malloc(sizeof(disp_cal));
+ memset(Cal, 0, sizeof(disp_cal));
+ Cal->cal = icalcomponent_new_clone(cal);
+
+ /* Dezonify and decapsulate at the very last moment */
+ /* lprintf(9, "INITIAL: %s\n", icaltime_as_ical_string(icalproperty_get_dtstart(
+ icalcomponent_get_first_property(icalcomponent_get_first_component(
+ Cal->cal, ICAL_VEVENT_COMPONENT), ICAL_DTSTART_PROPERTY)))
+ ); */
+ ical_dezonify(Cal->cal);
+ if (icalcomponent_isa(Cal->cal) != ICAL_VEVENT_COMPONENT) {
+ cptr = icalcomponent_get_first_component(Cal->cal, ICAL_VEVENT_COMPONENT);
+ if (cptr) {
+ cptr = icalcomponent_new_clone(cptr);
+ icalcomponent_free(Cal->cal);
+ Cal->cal = cptr;
+ }
+ }
+
+ Cal->unread = unread;
+ len = strlen(from);
+ Cal->from = (char*)malloc(len+ 1);
+ memcpy(Cal->from, from, len + 1);
+ Cal->cal_msgnum = msgnum;