X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fcalendar.c;h=2897ba20188d9a007eeb1623af1fee2709f5e3e7;hb=4b4dc864ede7c5d8d956febe4a0afb422b78e7c4;hp=398fcd538e8085afd8638e7aa6f4a2d4c5c45a69;hpb=adc9f3079beac31291ee9c94d7db00575aa4694e;p=citadel.git diff --git a/webcit/calendar.c b/webcit/calendar.c index 398fcd538..2897ba201 100644 --- a/webcit/calendar.c +++ b/webcit/calendar.c @@ -1,12 +1,26 @@ /* - * $Id$ - * * Functions which handle calendar objects and their processing/display. + * + * Copyright (c) 1996-2011 by the citadel.org team + * + * This program is open source software. You can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "webcit.h" #include "webserver.h" - +#include "calendar.h" /* * Process a calendar object. At this point it's already been deserialized by cal_process_attachment() @@ -34,6 +48,7 @@ void cal_process_object(StrBuf *Target, int is_update = 0; char divname[32]; static int divcount = 0; + const char *ch; sprintf(divname, "rsvp%04x", ++divcount); @@ -60,7 +75,7 @@ void cal_process_object(StrBuf *Target, the_method = icalproperty_get_method(method); StrBufAppendPrintf(Target, "
", divname); - StrBufAppendPrintf(Target, ""); + StrBufAppendPrintf(Target, ""); StrBufAppendPrintf(Target, ""); switch(the_method) { case ICAL_METHOD_REQUEST: @@ -168,11 +183,11 @@ void cal_process_object(StrBuf *Target, StrBufAppendPrintf(Target, "
"); StrBufAppendPrintf(Target, _("Attendee:")); StrBufAppendPrintf(Target, "
"); - safestrncpy(buf, icalproperty_get_attendee(p), sizeof buf); - if (!strncasecmp(buf, "MAILTO:", 7)) { + ch = icalproperty_get_attendee(p); + if ((ch != NULL) && !strncasecmp(buf, "MAILTO:", 7)) { /** screen name or email address */ - strcpy(buf, &buf[7]); + safestrncpy(buf, ch + 7, sizeof(buf)); striplt(buf); StrEscAppend(Target, NULL, buf, 0, 0); StrBufAppendPrintf(Target, " "); @@ -196,7 +211,7 @@ void cal_process_object(StrBuf *Target, if (the_method == ICAL_METHOD_REQUEST) { /* Check for conflicts */ - lprintf(9, "Checking server calendar for conflicts...\n"); + syslog(9, "Checking server calendar for conflicts...\n"); serv_printf("ICAL conflicts|%ld|%s|", msgnum, cal_partnum); serv_getln(buf, sizeof buf); if (buf[0] == '1') { @@ -224,7 +239,7 @@ void cal_process_object(StrBuf *Target, StrBufAppendPrintf(Target, "
\n"); } } - lprintf(9, "...done.\n"); + syslog(9, "...done.\n"); StrBufAppendPrintf(Target, ""); @@ -284,7 +299,7 @@ void cal_process_attachment(wc_mime_attachment *Mime) FlushStrBuf(Mime->Data); if (cal == NULL) { StrBufAppendPrintf(Mime->Data, _("There was an error parsing this calendar item.")); - StrBufAppendPrintf(Mime->Data, "
\n"); + StrBufAppendPrintf(Mime->Data, "
\n"); return; } @@ -314,27 +329,27 @@ void respond_to_request(void) serv_getln(buf, sizeof buf); if (buf[0] == '2') { - wprintf(""); + wc_printf(""); if (!strcasecmp(bstr("sc"), "accept")) { - wprintf(_("You have accepted this meeting invitation. " + wc_printf(_("You have accepted this meeting invitation. " "It has been entered into your calendar.") ); } else if (!strcasecmp(bstr("sc"), "tentative")) { - wprintf(_("You have tentatively accepted this meeting invitation. " + wc_printf(_("You have tentatively accepted this meeting invitation. " "It has been 'pencilled in' to your calendar.") ); } else if (!strcasecmp(bstr("sc"), "decline")) { - wprintf(_("You have declined this meeting invitation. " + wc_printf(_("You have declined this meeting invitation. " "It has not been entered into your calendar.") ); } - wprintf(" "); - wprintf(_("A reply has been sent to the meeting organizer.")); - wprintf(""); + wc_printf(" "); + wc_printf(_("A reply has been sent to the meeting organizer.")); + wc_printf(""); } else { - wprintf(""); - wprintf("%s\n", &buf[4]); - wprintf(""); + wc_printf(""); + wc_printf("%s\n", &buf[4]); + wc_printf(""); } end_ajax_response(); @@ -359,18 +374,21 @@ void handle_rsvp(void) serv_getln(buf, sizeof buf); if (buf[0] == '2') { - wprintf(""); + wc_printf(""); if (!strcasecmp(bstr("sc"), "update")) { - wprintf(_("Your calendar has been updated to reflect this RSVP.")); + /* Translators: RSVP aka Répondez s'il-vous-plaît Is the term + that the recipient of an ical-invitation should please + answer this request. */ + wc_printf(_("Your calendar has been updated to reflect this RSVP.")); } else if (!strcasecmp(bstr("sc"), "ignore")) { - wprintf(_("You have chosen to ignore this RSVP. " + wc_printf(_("You have chosen to ignore this RSVP. " "Your calendar has not been updated.") ); } - wprintf(""); + wc_printf(""); } else { - wprintf(" %s\n", &buf[4]); - wprintf(""); + wc_printf(" %s\n", &buf[4]); + wc_printf(""); } end_ajax_response(); @@ -396,7 +414,7 @@ void delete_cal(void *vCal) * 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) +void display_individual_cal(icalcomponent *event, long msgnum, char *from, int unread, calview *calv) { icalproperty *ps = NULL; struct icaltimetype dtstart, dtend; @@ -415,22 +433,29 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr int num_recur = 0; int stop_rr = 0; + /* first and foremost, check for bogosity. bail if we see no DTSTART property */ + + if (icalcomponent_get_first_property(icalcomponent_get_first_component( + event, ICAL_VEVENT_COMPONENT), ICAL_DTSTART_PROPERTY) == NULL) + { + return; + } + + /* ok, chances are we've got a live one here. let's try to figure out where it goes. */ + dtstart = icaltime_null_time(); dtend = icaltime_null_time(); - if (WCC->disp_cal_items == NULL) + 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); + Cal->cal = icalcomponent_new_clone(event); /* 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); @@ -465,6 +490,7 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr } /* 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), @@ -484,7 +510,7 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr * 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. */ - cptr = cal; + cptr = event; if (icalcomponent_isa(cptr) != ICAL_VEVENT_COMPONENT) { cptr = icalcomponent_get_first_component(cptr, ICAL_VEVENT_COMPONENT); } @@ -502,12 +528,11 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr ++num_recur; if (num_recur > 1) { /* Skip the first one. We already did it at the root. */ icalcomponent *cptr; - /* lprintf(9, "REPEATS: %s\n", icaltime_as_ical_string(next)); */ /* 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->cal = icalcomponent_new_clone(event); Cal->unread = unread; len = strlen(from); Cal->from = (char*)malloc(len+ 1); @@ -521,27 +546,31 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr cptr = icalcomponent_get_first_component(Cal->cal, ICAL_VEVENT_COMPONENT); } if (cptr) { - ps = icalcomponent_get_first_property(cptr, ICAL_DTSTART_PROPERTY); - if (ps != NULL) { + + /* Remove any existing DTSTART properties */ + while ( ps = icalcomponent_get_first_property(cptr, ICAL_DTSTART_PROPERTY), + ps != NULL + ) { icalcomponent_remove_property(cptr, ps); - ps = icalproperty_new_dtstart(next); - icalcomponent_add_property(cptr, ps); - - Cal->event_start = icaltime_as_timet(next); - final_recurrence = Cal->event_start; } - ps = icalcomponent_get_first_property(cptr, ICAL_DTEND_PROPERTY); - if (ps != NULL) { + /* Add our shiny new DTSTART property from the iteration */ + ps = icalproperty_new_dtstart(next); + icalcomponent_add_property(cptr, ps); + Cal->event_start = icaltime_as_timet(next); + final_recurrence = Cal->event_start; + + /* Remove any existing DTEND properties */ + while ( ps = icalcomponent_get_first_property(cptr, ICAL_DTEND_PROPERTY), + (ps != NULL) + ) { icalcomponent_remove_property(cptr, ps); - - /* Make a new dtend */ - ps = icalproperty_new_dtend(icaltime_add(next, dur)); - - /* and stick it somewhere */ - icalcomponent_add_property(cptr, ps); } + /* Add our shiny new DTEND property from the iteration */ + ps = icalproperty_new_dtend(icaltime_add(next, dur)); + icalcomponent_add_property(cptr, ps); + } /* Dezonify and decapsulate at the very last moment */ @@ -555,8 +584,10 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr } } - if ( (Cal->event_start > calv->lower_bound) - && (Cal->event_start < calv->upper_bound) ) { + if ( (Cal->event_start > calv->lower_bound) + && (Cal->event_start < calv->upper_bound) + ) { + /* syslog(LOG_DEBUG, "REPEATS: %s", ctime(&Cal->event_start)); */ Put(WCC->disp_cal_items, (char*) &Cal->event_start, sizeof(Cal->event_start), @@ -573,421 +604,11 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr } } icalrecur_iterator_free(ritr); - /* lprintf(9, "Performed %d recurrences; final one is %s", num_recur, ctime(&final_recurrence)); */ - -} - - - -/* - * Display a task by itself (for editing) - */ -void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum, char *from, - int unread, struct calview *calv) -{ - 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; - - /* - * It's safe to convert to UTC here because there are no recurrences to worry about. - */ - ical_dezonify(vtodo); - - /* - * If we're looking at a fully encapsulated VCALENDAR - * rather than a VTODO component, attempt to use the first - * relevant VTODO subcomponent. If there is none, the - * NULL returned by icalcomponent_get_first_component() will - * tell the next iteration of this function to create a - * new one. - */ - if (icalcomponent_isa(vtodo) == ICAL_VCALENDAR_COMPONENT) { - display_edit_individual_task( - icalcomponent_get_first_component( - vtodo, ICAL_VTODO_COMPONENT - ), - msgnum, from, unread, calv - ); - return; - } - } - else { - vtodo = icalcomponent_new(ICAL_VTODO_COMPONENT); - created_new_vtodo = 1; - } - - /* TODO: Can we take all this and move it into a template? */ - output_headers(1, 1, 1, 0, 0, 0); - wprintf(""); - p = icalcomponent_get_first_property(vtodo, ICAL_SUMMARY_PROPERTY); - /* Get summary early for title */ - wprintf("
\n"); - wprintf("
"); - wprintf(_("Edit task")); - wprintf("- "); - if (p != NULL) { - escputs((char *)icalproperty_get_comment(p)); - } - wprintf("
"); - - wprintf("
\n"); - wprintf("
\n"); - wprintf("
\n "); - wprintf("\n", WC->nonce); - wprintf("\n", msgnum); - wprintf("\n", - ibstr("return_to_summary")); - wprintf("
"); - wprintf("
"); - wprintf("\n"); - - wprintf("\n"); - - wprintf("\n"); - - wprintf("\n"); - todoStatus = icalcomponent_get_status(vtodo); - wprintf(""); - /* start category field */ - p = icalcomponent_get_first_property(vtodo, ICAL_CATEGORIES_PROPERTY); - wprintf("\n "); - /* end category field */ - wprintf("
"); - wprintf(_("Summary:")); - wprintf("" - "
"); - wprintf(_("Start date:")); - wprintf(""); - p = icalcomponent_get_first_property(vtodo, ICAL_DTSTART_PROPERTY); - wprintf(""); - wprintf(_("No date")); - - wprintf(" "); - wprintf(""); - wprintf(_("or")); - wprintf(" "); - if (p != NULL) { - IcalTime = icalproperty_get_dtstart(p); - } - else - IcalTime = icaltime_current_time_with_zone(get_default_icaltimezone()); - display_icaltimetype_as_webform(&IcalTime, "dtstart", 0); - - wprintf(""); - wprintf(_("Time associated")); - wprintf("
"); - wprintf(_("Due date:")); - wprintf(""); - p = icalcomponent_get_first_property(vtodo, ICAL_DUE_PROPERTY); - wprintf(""); - wprintf(_("No date")); - wprintf(" "); - wprintf("\n"); - wprintf(_("or")); - wprintf(" "); - if (p != NULL) { - IcalTime = icalproperty_get_due(p); - } - else - IcalTime = icaltime_current_time_with_zone(get_default_icaltimezone()); - display_icaltimetype_as_webform(&IcalTime, "due", 0); - - wprintf(""); - wprintf(_("Time associated")); - wprintf("
\n"); - wprintf(_("Completed:")); - wprintf(""); - wprintf(""); - wprintf("
"); - wprintf(_("Category:")); - wprintf(""); - wprintf(""); - wprintf("
"); - wprintf(_("Description:")); - wprintf(""); - wprintf("
\n"); - - wprintf("" - "" - "  " - "\n" - "  " - "\n" - "\n", - _("Save"), - _("Delete"), - _("Cancel") - ); - wprintf("
"); - wprintf("
\n"); - wprintf("
\n"); - wprintf(""); - wDumpContent(1); - - if (created_new_vtodo) { - icalcomponent_free(vtodo); - } + /* syslog(9, "Performed %d recurrences; final one is %s", num_recur, ctime(&final_recurrence)); */ } -/* - * Save an edited task - * - * supplied_vtodo the task to save - * msgnum number of the mesage in our db - */ -void save_individual_task(icalcomponent *supplied_vtodo, long msgnum, char* from, int unread, - struct calview *calv) -{ - char buf[SIZ]; - int delete_existing = 0; - icalproperty *prop; - icalcomponent *vtodo, *encaps; - int created_new_vtodo = 0; - int i; - int sequence = 0; - struct icaltimetype t; - - if (supplied_vtodo != NULL) { - vtodo = supplied_vtodo; - /** - * If we're looking at a fully encapsulated VCALENDAR - * rather than a VTODO component, attempt to use the first - * relevant VTODO subcomponent. If there is none, the - * NULL returned by icalcomponent_get_first_component() will - * tell the next iteration of this function to create a - * new one. - */ - if (icalcomponent_isa(vtodo) == ICAL_VCALENDAR_COMPONENT) { - save_individual_task( - icalcomponent_get_first_component( - vtodo, ICAL_VTODO_COMPONENT), - msgnum, from, unread, calv - ); - return; - } - } - else { - vtodo = icalcomponent_new(ICAL_VTODO_COMPONENT); - created_new_vtodo = 1; - } - if (havebstr("save_button")) { - /** Replace values in the component with ones from the form */ - - while (prop = icalcomponent_get_first_property(vtodo, - ICAL_SUMMARY_PROPERTY), prop != NULL) { - icalcomponent_remove_property(vtodo, prop); - icalproperty_free(prop); - } - if (havebstr("summary")) { - - icalcomponent_add_property(vtodo, - icalproperty_new_summary(bstr("summary"))); - } else { - icalcomponent_add_property(vtodo, - icalproperty_new_summary(_("Untitled Task"))); - } - - while (prop = icalcomponent_get_first_property(vtodo, - ICAL_DESCRIPTION_PROPERTY), prop != NULL) { - icalcomponent_remove_property(vtodo, prop); - icalproperty_free(prop); - } - if (havebstr("description")) { - icalcomponent_add_property(vtodo, - icalproperty_new_description(bstr("description"))); - } - - while (prop = icalcomponent_get_first_property(vtodo, - ICAL_DTSTART_PROPERTY), prop != NULL) { - icalcomponent_remove_property(vtodo, prop); - icalproperty_free(prop); - } - if (IsEmptyStr(bstr("nodtstart"))) { - if (yesbstr("dtstart_time")) { - icaltime_from_webform(&t, "dtstart"); - } - else { - icaltime_from_webform_dateonly(&t, "dtstart"); - } - icalcomponent_add_property(vtodo, - icalproperty_new_dtstart(t) - ); - } - while(prop = icalcomponent_get_first_property(vtodo, - ICAL_STATUS_PROPERTY), prop != NULL) { - icalcomponent_remove_property(vtodo,prop); - icalproperty_free(prop); - } - while(prop = icalcomponent_get_first_property(vtodo, - ICAL_PERCENTCOMPLETE_PROPERTY), prop != NULL) { - icalcomponent_remove_property(vtodo,prop); - icalproperty_free(prop); - } - - if (havebstr("status")) { - icalproperty_status taskStatus = icalproperty_string_to_status(bstr("status")); - icalcomponent_set_status(vtodo, taskStatus); - icalcomponent_add_property(vtodo, - icalproperty_new_percentcomplete( - (strcasecmp(bstr("status"), "completed") ? 0 : 100) - ) - ); - } - else { - icalcomponent_add_property(vtodo, icalproperty_new_percentcomplete(0)); - } - while (prop = icalcomponent_get_first_property(vtodo, - ICAL_CATEGORIES_PROPERTY), prop != NULL) { - icalcomponent_remove_property(vtodo,prop); - icalproperty_free(prop); - } - if (!IsEmptyStr(bstr("category"))) { - prop = icalproperty_new_categories(bstr("category")); - icalcomponent_add_property(vtodo,prop); - } - while (prop = icalcomponent_get_first_property(vtodo, - ICAL_DUE_PROPERTY), prop != NULL) { - icalcomponent_remove_property(vtodo, prop); - icalproperty_free(prop); - } - if (IsEmptyStr(bstr("nodue"))) { - if (yesbstr("due_time")) { - icaltime_from_webform(&t, "due"); - } - else { - icaltime_from_webform_dateonly(&t, "due"); - } - icalcomponent_add_property(vtodo, - icalproperty_new_due(t) - ); - } - /** 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"); - if (icalcomponent_get_first_property(vtodo, - ICAL_UID_PROPERTY) == NULL) { - generate_uuid(buf); - icalcomponent_add_property(vtodo, - icalproperty_new_uid(buf) - ); - } - - /* Increment the sequence ID */ - lprintf(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); - if (i > sequence) sequence = i; - icalcomponent_remove_property(vtodo, prop); - icalproperty_free(prop); - } - ++sequence; - lprintf(9, "New sequence is %d. Adding...\n", sequence); - icalcomponent_add_property(vtodo, - icalproperty_new_sequence(sequence) - ); - - /* - * Encapsulate event into full VCALENDAR component. Clone it first, - * for two reasons: one, it's easier to just free the whole thing - * when we're done instead of unbundling, but more importantly, we - * can't encapsulate something that may already be encapsulated - * somewhere else. - */ - lprintf(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 */ - serv_puts("ENT0 1|||4"); - serv_getln(buf, sizeof buf); - if (buf[0] == '4') { - serv_puts("Content-type: text/calendar"); - serv_puts(""); - serv_puts(icalcomponent_as_ical_string(encaps)); - serv_puts("000"); - - /* - * Probably not necessary; the server will see the UID - * of the object and delete the old one anyway, but - * just in case... - */ - delete_existing = 1; - } - icalcomponent_free(encaps); - } - - /** - * If the user clicked 'Delete' then explicitly delete the message. - */ - if (havebstr("delete_button")) { - delete_existing = 1; - } - - if ( (delete_existing) && (msgnum > 0L) ) { - serv_printf("DELE %ld", lbstr("msgnum")); - serv_getln(buf, sizeof buf); - } - - if (created_new_vtodo) { - icalcomponent_free(vtodo); - } - - /* Go back to wherever we came from */ - if (ibstr("return_to_summary") == 1) { - summary(); - } - else { - readloop(readfwd); - } -} @@ -996,7 +617,7 @@ void process_ical_object(long msgnum, int unread, char *FlatIcal, icalcomponent_kind which_kind, IcalCallbackFunc CallBack, - struct calview *calv + calview *calv ) { icalcomponent *cal, *c; @@ -1039,7 +660,7 @@ void process_ical_object(long msgnum, int unread, void load_ical_object(long msgnum, int unread, icalcomponent_kind which_kind, IcalCallbackFunc CallBack, - struct calview *calv, + calview *calv, int RenderAsync ) { @@ -1052,7 +673,6 @@ void load_ical_object(long msgnum, int unread, char mime_filename[256]; char mime_content_type[256]; char mime_disposition[256]; - int mime_length; char relevant_partnum[256]; char *relevant_source = NULL; int phase = 0; /* 0 = citadel headers, 1 = mime headers, 2 = body */ @@ -1082,11 +702,12 @@ void load_ical_object(long msgnum, int unread, extract_token(mime_partnum, &bptr[5], 2, '|', sizeof mime_partnum); extract_token(mime_disposition, &bptr[5], 3, '|', sizeof mime_disposition); extract_token(mime_content_type, &bptr[5], 4, '|', sizeof mime_content_type); - mime_length = extract_int(&bptr[5], 5); + /* do we care? mime_length = */extract_int(&bptr[5], 5); if ( (!strcasecmp(mime_content_type, "text/calendar")) || (!strcasecmp(mime_content_type, "application/ics")) || (!strcasecmp(mime_content_type, "text/vtodo")) + || (!strcasecmp(mime_content_type, "text/todo")) ) { strcpy(relevant_partnum, mime_partnum); } @@ -1121,6 +742,7 @@ void load_ical_object(long msgnum, int unread, && ((!strcasecmp(mime_content_type, "text/calendar")) || (!strcasecmp(mime_content_type, "application/ics")) || (!strcasecmp(mime_content_type, "text/vtodo")) + || (!strcasecmp(mime_content_type, "text/todo")) ) ) { @@ -1167,55 +789,15 @@ void load_ical_object(long msgnum, int unread, /* * Display a calendar item */ -void load_calendar_item(message_summary *Msg, int unread, struct calview *c) { - load_ical_object(Msg->msgnum, unread, (-1), display_individual_cal, c, 1); -} - -/* - * Display task view - */ -void display_task(message_summary *Msg, int unread) { - load_ical_object(Msg->msgnum, unread, ICAL_VTODO_COMPONENT, display_individual_cal, NULL, 0); -} - -/* - * Display the editor component for a task - */ -void display_edit_task(void) { - long msgnum = 0L; - - /* Force change the room if we have to */ - if (havebstr("taskrm")) { - gotoroom(sbstr("taskrm")); - } - - msgnum = lbstr("msgnum"); - if (msgnum > 0L) { - /* existing task */ - load_ical_object(msgnum, 0, - ICAL_VTODO_COMPONENT, - display_edit_individual_task, - NULL, 0 - ); - } - else { - /* new task */ - display_edit_individual_task(NULL, 0L, "", 0, NULL); - } -} - -/* - * save an edited task - */ -void save_task(void) { - long msgnum = 0L; - msgnum = lbstr("msgnum"); - if (msgnum > 0L) { - load_ical_object(msgnum, 0, ICAL_VTODO_COMPONENT, save_individual_task, NULL, 0); - } - else { - save_individual_task(NULL, 0L, "", 0, NULL); - } +int calendar_LoadMsgFromServer(SharedMessageStatus *Stat, + void **ViewSpecific, + message_summary* Msg, + int is_new, + int i) +{ + calview *c = (calview*) *ViewSpecific; + load_ical_object(Msg->msgnum, is_new, (-1), display_individual_cal, c, 1); + return 0; } /* @@ -1259,14 +841,14 @@ void save_event(void) { * Anonymous request of freebusy data for a user */ void do_freebusy(void) -{ /// TODO: request line const char *req) { - const char req[] = ""; +{ + const char *req = ChrPtr(WC->Hdr->HR.ReqLine); char who[SIZ]; char buf[SIZ]; int len; long lines; - extract_token(who, req, 1, ' ', sizeof who); + extract_token(who, req, 0, ' ', sizeof who); if (!strncasecmp(who, "/freebusy/", 10)) { strcpy(who, &who[10]); } @@ -1279,7 +861,7 @@ void do_freebusy(void) who[len-4] = 0; } - lprintf(9, "freebusy requested for <%s>\n", who); + syslog(9, "freebusy requested for <%s>\n", who); serv_printf("ICAL freebusy|%s", who); serv_getln(buf, sizeof buf); @@ -1287,7 +869,7 @@ void do_freebusy(void) hprintf("HTTP/1.1 404 %s\n", &buf[4]); output_headers(0, 0, 0, 0, 0, 0); hprintf("Content-Type: text/plain\r\n"); - wprintf("%s\n", &buf[4]); + wc_printf("%s\n", &buf[4]); end_burst(); return; } @@ -1298,20 +880,66 @@ void do_freebusy(void) +int calendar_Cleanup(void **ViewSpecific) +{ + calview *c; + + c = (calview *) *ViewSpecific; + + wDumpContent(1); + free (c); + *ViewSpecific = NULL; + + return 0; +} + +int __calendar_Cleanup(void **ViewSpecific) +{ + calview *c; + + c = (calview *) *ViewSpecific; + + free (c); + *ViewSpecific = NULL; + + return 0; +} + void InitModule_CALENDAR (void) { + RegisterReadLoopHandlerset( + VIEW_CALENDAR, + calendar_GetParamsGetServerCall, + NULL, + NULL, + NULL, + calendar_LoadMsgFromServer, + calendar_RenderView_or_Tail, + calendar_Cleanup); + + RegisterReadLoopHandlerset( + VIEW_CALBRIEF, + calendar_GetParamsGetServerCall, + NULL, + NULL, + NULL, + calendar_LoadMsgFromServer, + calendar_RenderView_or_Tail, + calendar_Cleanup); + + + RegisterPreference("daystart", _("Calendar day view begins at:"), PRF_INT, NULL); RegisterPreference("dayend", _("Calendar day view ends at:"), PRF_INT, NULL); RegisterPreference("weekstart", _("Week starts on:"), PRF_INT, NULL); - WebcitAddUrlHandler(HKEY("freebusy"), do_freebusy, COOKIEUNNEEDED|ANONYMOUS|FORCE_SESSIONCLOSE); - WebcitAddUrlHandler(HKEY("display_edit_task"), display_edit_task, 0); - WebcitAddUrlHandler(HKEY("save_task"), save_task, 0); - WebcitAddUrlHandler(HKEY("display_edit_event"), display_edit_event, 0); - WebcitAddUrlHandler(HKEY("save_event"), save_event, 0); - WebcitAddUrlHandler(HKEY("respond_to_request"), respond_to_request, 0); - WebcitAddUrlHandler(HKEY("handle_rsvp"), handle_rsvp, 0); + WebcitAddUrlHandler(HKEY("freebusy"), "", 0, do_freebusy, COOKIEUNNEEDED|ANONYMOUS|FORCE_SESSIONCLOSE); + WebcitAddUrlHandler(HKEY("display_edit_task"), "", 0, display_edit_task, 0); + WebcitAddUrlHandler(HKEY("display_edit_event"), "", 0, display_edit_event, 0); + WebcitAddUrlHandler(HKEY("save_event"), "", 0, save_event, 0); + WebcitAddUrlHandler(HKEY("respond_to_request"), "", 0, respond_to_request, 0); + WebcitAddUrlHandler(HKEY("handle_rsvp"), "", 0, handle_rsvp, 0); }