X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Ftasks.c;h=adf758378e08cd549c26993ec61d1ba1be3770f6;hb=4b4dc864ede7c5d8d956febe4a0afb422b78e7c4;hp=d4b5b27ae521edd5292e17e19d0739cf40c51f6f;hpb=e935238cffe442d3fa0b530774bc4b3dab934bf7;p=citadel.git diff --git a/webcit/tasks.c b/webcit/tasks.c index d4b5b27ae..adf758378 100644 --- a/webcit/tasks.c +++ b/webcit/tasks.c @@ -179,12 +179,9 @@ void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum, ch icalcomponent *vtodo; icalproperty *p; struct icaltimetype IcalTime; - time_t now; int created_new_vtodo = 0; icalproperty_status todoStatus; - now = time(NULL); - if (supplied_vtodo != NULL) { vtodo = supplied_vtodo; @@ -501,7 +498,7 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum, char* from ); } /** Give this task a UID if it doesn't have one. */ - lprintf(9, "Give this task a UID if it doesn't have one.\n"); + syslog(9, "Give this task a UID if it doesn't have one.\n"); if (icalcomponent_get_first_property(vtodo, ICAL_UID_PROPERTY) == NULL) { generate_uuid(buf); @@ -511,17 +508,17 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum, char* from } /* Increment the sequence ID */ - lprintf(9, "Increment the sequence ID\n"); + syslog(9, "Increment the sequence ID\n"); while (prop = icalcomponent_get_first_property(vtodo, ICAL_SEQUENCE_PROPERTY), (prop != NULL) ) { i = icalproperty_get_sequence(prop); - lprintf(9, "Sequence was %d\n", i); + syslog(9, "Sequence was %d\n", i); if (i > sequence) sequence = i; icalcomponent_remove_property(vtodo, prop); icalproperty_free(prop); } ++sequence; - lprintf(9, "New sequence is %d. Adding...\n", sequence); + syslog(9, "New sequence is %d. Adding...\n", sequence); icalcomponent_add_property(vtodo, icalproperty_new_sequence(sequence) ); @@ -533,7 +530,7 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum, char* from * can't encapsulate something that may already be encapsulated * somewhere else. */ - lprintf(9, "Encapsulating into a full VCALENDAR component\n"); + syslog(9, "Encapsulating into a full VCALENDAR component\n"); encaps = ical_encapsulate_subcomponent(icalcomponent_new_clone(vtodo)); /* Serialize it and save it to the message base */ @@ -573,13 +570,95 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum, char* from /* Go back to wherever we came from */ if (ibstr("return_to_summary") == 1) { - summary(); + do_template("summary_page"); } else { readloop(readfwd, eUseDefault); } } + +/* + * free memory allocated using libical + */ +void delete_task(void *vCal) +{ + disp_cal *Cal = (disp_cal*) vCal; + icalcomponent_free(Cal->cal); + free(Cal->from); + free(Cal); +} + + +/* + * Load a Task into a hash table for later display. + */ +void load_task(icalcomponent *event, long msgnum, char *from, int unread, calview *calv) +{ + icalproperty *ps = NULL; + struct icaltimetype dtstart, dtend; + wcsession *WCC = WC; + disp_cal *Cal; + size_t len; + icalcomponent *cptr = NULL; + + dtstart = icaltime_null_time(); + dtend = icaltime_null_time(); + + if (WCC->disp_cal_items == NULL) { + WCC->disp_cal_items = NewHash(0, Flathash); + } + + Cal = (disp_cal*) malloc(sizeof(disp_cal)); + memset(Cal, 0, sizeof(disp_cal)); + Cal->cal = icalcomponent_new_clone(event); + + /* Dezonify and decapsulate at the very last moment */ + ical_dezonify(Cal->cal); + if (icalcomponent_isa(Cal->cal) != ICAL_VTODO_COMPONENT) { + cptr = icalcomponent_get_first_component(Cal->cal, ICAL_VTODO_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; + + /* Precalculate the starting date and time of this event, and store it in our top-level + * structure. Later, when we are rendering the calendar, we can just peek at these values + * without having to break apart every calendar item. + */ + ps = icalcomponent_get_first_property(Cal->cal, ICAL_DTSTART_PROPERTY); + if (ps != NULL) { + dtstart = icalproperty_get_dtstart(ps); + Cal->event_start = icaltime_as_timet(dtstart); + } + + /* 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_dtend(ps); + Cal->event_end = icaltime_as_timet(dtend); + } + + /* Store it in the hash list. */ + /* syslog(LOG_DEBUG, "INITIAL: %s", ctime(&Cal->event_start)); */ + Put(WCC->disp_cal_items, + (char*) &Cal->event_start, + sizeof(Cal->event_start), + Cal, + delete_task + ); +} + + + /* * Display task view */ @@ -591,7 +670,7 @@ int tasks_LoadMsgFromServer(SharedMessageStatus *Stat, { /* Not (yet?) needed here? calview *c = (calview *) *ViewSpecific; */ - load_ical_object(Msg->msgnum, is_new, ICAL_VTODO_COMPONENT, display_individual_cal, NULL, 0); + load_ical_object(Msg->msgnum, is_new, ICAL_VTODO_COMPONENT, load_task, NULL, 0); return 0; } @@ -641,7 +720,9 @@ int tasks_GetParamsGetServerCall(SharedMessageStatus *Stat, void **ViewSpecific, long oper, char *cmd, - long len) + long len, + char *filter, + long flen) { strcpy(cmd, "MSGS ALL"); Stat->maxmsgs = 32767; @@ -668,6 +749,7 @@ InitModule_TASKS tasks_GetParamsGetServerCall, NULL, NULL, + NULL, tasks_LoadMsgFromServer, tasks_RenderView_or_Tail, tasks_Cleanup);