X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=webcit%2Ftasks.c;h=66b05e3e09f841ea2376a01702003a7e4c9aa92f;hp=373da4fcff45ed898d87530ec70b4e04a3be9a18;hb=HEAD;hpb=a3ba94ad306d781296c53012f732f3a910015263 diff --git a/webcit/tasks.c b/webcit/tasks.c index 373da4fcf..89910eba4 100644 --- a/webcit/tasks.c +++ b/webcit/tasks.c @@ -1,6 +1,6 @@ #include "webcit.h" #include "calendar.h" -#include "webserver.h" + /* * qsort filter to move completed tasks to bottom of task list @@ -87,11 +87,8 @@ int tasks_RenderView_or_Tail(SharedMessageStatus *Stat, time_t due; char buf[SIZ]; icalproperty *p; - wcsession *WCC = WC; - wc_printf("
" - "\n\n" - "
"); + wc_printf("\n\n"); } - wc_printf("
"); wc_printf(_("Completed?")); wc_printf(""); wc_printf(_("Name of task")); @@ -117,8 +114,8 @@ int tasks_RenderView_or_Tail(SharedMessageStatus *Stat, task_completed_cmp); } - Pos = GetNewHashPos(WCC->disp_cal_items, 0); - while (GetNextHashPos(WCC->disp_cal_items, Pos, &hklen, &HashKey, &vCal)) { + Pos = GetNewHashPos(WC->disp_cal_items, 0); + while (GetNextHashPos(WC->disp_cal_items, Pos, &hklen, &HashKey, &vCal)) { icalproperty_status todoStatus; int is_date; @@ -163,7 +160,7 @@ int tasks_RenderView_or_Tail(SharedMessageStatus *Stat, wc_printf("
\n"); + wc_printf("
\n"); /* Free the list */ DeleteHash(&WC->disp_cal_items); @@ -181,12 +178,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; @@ -235,6 +229,11 @@ void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum, ch wc_printf("
\n"); wc_printf("
\n"); wc_printf("
\n "); + + wc_printf("WBuf, WC->CurRoom.name, NULL, 0, 0); + wc_printf("\">\n"); + wc_printf("\n", WC->nonce); wc_printf("\n", msgnum); wc_printf("\n", @@ -503,7 +502,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(LOG_DEBUG, "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); @@ -513,17 +512,17 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum, char* from } /* Increment the sequence ID */ - lprintf(9, "Increment the sequence ID\n"); + syslog(LOG_DEBUG, "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(LOG_DEBUG, "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(LOG_DEBUG, "New sequence is %d. Adding...\n", sequence); icalcomponent_add_property(vtodo, icalproperty_new_sequence(sequence) ); @@ -535,7 +534,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(LOG_DEBUG, "Encapsulating into a full VCALENDAR component\n"); encaps = ical_encapsulate_subcomponent(icalcomponent_new_clone(vtodo)); /* Serialize it and save it to the message base */ @@ -575,13 +574,94 @@ 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(); + display_summary_page(); } else { - readloop(readfwd); + 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; + disp_cal *Cal; + size_t len; + icalcomponent *cptr = NULL; + + dtstart = icaltime_null_time(); + dtend = icaltime_null_time(); + + if (WC->disp_cal_items == NULL) { + WC->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(WC->disp_cal_items, + (char*) &Cal->event_start, + sizeof(Cal->event_start), + Cal, + delete_task + ); } + + /* * Display task view */ @@ -593,7 +673,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; } @@ -643,7 +723,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; @@ -669,8 +751,11 @@ InitModule_TASKS VIEW_TASKS, tasks_GetParamsGetServerCall, NULL, + NULL, + NULL, tasks_LoadMsgFromServer, tasks_RenderView_or_Tail, - tasks_Cleanup); + tasks_Cleanup, + NULL); WebcitAddUrlHandler(HKEY("save_task"), "", 0, save_task, 0); }