X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fcalendar.c;h=20949a2dec56fdd5015478552b4a8c650d40bebc;hb=8e165dd308679f195af8614d62dbdb4e43238495;hp=9012e8966ac000f0dd116b0cc1e49363238c60ca;hpb=02a84d2df98fb240746505bd10c99a734d4c464b;p=citadel.git diff --git a/webcit/calendar.c b/webcit/calendar.c index 9012e8966..20949a2de 100644 --- a/webcit/calendar.c +++ b/webcit/calendar.c @@ -6,7 +6,7 @@ #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() @@ -125,7 +125,7 @@ void cal_process_object(StrBuf *Target, } else { tt = icaltime_as_timet(t); - webcit_fmt_date(buf, tt, 0); + webcit_fmt_date(buf, 256, tt, DATEFMT_FULL); StrBufAppendPrintf(Target, "
"); StrBufAppendPrintf(Target, _("Starting date/time:")); StrBufAppendPrintf(Target, "
%s
", buf); @@ -136,7 +136,7 @@ void cal_process_object(StrBuf *Target, if (p != NULL) { t = icalproperty_get_dtend(p); tt = icaltime_as_timet(t); - webcit_fmt_date(buf, tt, 0); + webcit_fmt_date(buf, 256, tt, DATEFMT_FULL); StrBufAppendPrintf(Target, "
"); StrBufAppendPrintf(Target, _("Ending date/time:")); StrBufAppendPrintf(Target, "
%s
", buf); @@ -275,12 +275,11 @@ void cal_process_object(StrBuf *Target, /* * Deserialize a calendar object in a message so it can be displayed. - * */ void cal_process_attachment(wc_mime_attachment *Mime) { icalcomponent *cal; - + cal = icalcomponent_new_from_string(ChrPtr(Mime->Data)); FlushStrBuf(Mime->Data); if (cal == NULL) { @@ -298,9 +297,8 @@ void cal_process_attachment(wc_mime_attachment *Mime) -/** - * \brief accept/decline meeting - * Respond to a meeting request +/* + * Respond to a meeting request - accept/decline meeting */ void respond_to_request(void) { @@ -316,27 +314,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(); @@ -344,8 +342,8 @@ void respond_to_request(void) -/** - * \brief Handle an incoming RSVP +/* + * Handle an incoming RSVP */ void handle_rsvp(void) { @@ -361,18 +359,18 @@ 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.")); + 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(); @@ -398,7 +396,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 *cal, long msgnum, char *from, int unread, calview *calv) { icalproperty *ps = NULL; struct icaltimetype dtstart, dtend; @@ -581,374 +579,48 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr -/* - * 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; - - /** - * 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(_("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(_("Due date:")); - wprintf(""); - p = icalcomponent_get_first_property(vtodo, ICAL_DUE_PROPERTY); - wprintf(""); - wprintf(_("No date")); - wprintf(" "); - 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("
\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); - } -} -/* - * \brief Save an edited task - * \param supplied_vtodo the task to save - * \param 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")) { +void process_ical_object(long msgnum, int unread, + char *from, + char *FlatIcal, + icalcomponent_kind which_kind, + IcalCallbackFunc CallBack, + calview *calv + ) +{ + icalcomponent *cal, *c; - 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"))) { - icaltime_from_webform(&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); - } - if (havebstr("status")) { - icalproperty_status taskStatus = icalproperty_string_to_status( - bstr("status")); - icalcomponent_set_status(vtodo, taskStatus); - } - 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"))) { - icaltime_from_webform(&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) - ); - } + cal = icalcomponent_new_from_string(FlatIcal); + if (cal != NULL) { - /** 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); + /* A which_kind of (-1) means just load the whole thing */ + if (which_kind == (-1)) { + CallBack(cal, msgnum, from, unread, calv); } - ++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; + + /* Otherwise recurse and hunt */ + else { + + /* Simple components of desired type */ + if (icalcomponent_isa(cal) == which_kind) { + CallBack(cal, msgnum, from, unread, calv); + } + + /* Subcomponents of desired type */ + for (c = icalcomponent_get_first_component(cal, which_kind); + (c != 0); + c = icalcomponent_get_next_component(cal, which_kind)) { + CallBack(c, msgnum, from, unread, calv); + } + } - 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); + + icalcomponent_free(cal); } } - - /* * Code common to all icalendar display handlers. Given a message number and a MIME * type, we load the message and hunt for that MIME type. If found, we load @@ -956,12 +628,16 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum, char* from * the requested object type, and feed it to the specified handler. */ void load_ical_object(long msgnum, int unread, - icalcomponent_kind which_kind, - void (*callback)(icalcomponent *, long, char*, int, struct calview *), - struct calview *calv + icalcomponent_kind which_kind, + IcalCallbackFunc CallBack, + calview *calv, + int RenderAsync ) { - char buf[1024]; + StrBuf *Buf; + StrBuf *Data = NULL; + const char *bptr; + int Done = 0; char from[128] = ""; char mime_partnum[256]; char mime_filename[256]; @@ -970,124 +646,129 @@ void load_ical_object(long msgnum, int unread, int mime_length; char relevant_partnum[256]; char *relevant_source = NULL; - icalcomponent *cal, *c; + int phase = 0; /* 0 = citadel headers, 1 = mime headers, 2 = body */ + char msg4_content_type[256] = ""; + char msg4_content_encoding[256] = ""; + int msg4_content_length = 0; relevant_partnum[0] = '\0'; - sprintf(buf, "MSG4 %ld", msgnum); /* we need the mime headers */ - serv_puts(buf); - serv_getln(buf, sizeof buf); - if (buf[0] != '1') return; - - while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { - if (!strncasecmp(buf, "part=", 5)) { - extract_token(mime_filename, &buf[5], 1, '|', sizeof mime_filename); - extract_token(mime_partnum, &buf[5], 2, '|', sizeof mime_partnum); - extract_token(mime_disposition, &buf[5], 3, '|', sizeof mime_disposition); - extract_token(mime_content_type, &buf[5], 4, '|', sizeof mime_content_type); - mime_length = extract_int(&buf[5], 5); - - if ( (!strcasecmp(mime_content_type, "text/calendar")) - || (!strcasecmp(mime_content_type, "application/ics")) - || (!strcasecmp(mime_content_type, "text/vtodo")) - ) { - strcpy(relevant_partnum, mime_partnum); - } - } - else if (!strncasecmp(buf, "from=", 4)) { - extract_token(from, buf, 1, '=', sizeof(from)); - } + serv_printf("MSG4 %ld", msgnum); /* we need the mime headers */ + Buf = NewStrBuf(); + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) != 1) { + FreeStrBuf (&Buf); + return; } - - if (!IsEmptyStr(relevant_partnum)) { - relevant_source = load_mimepart(msgnum, relevant_partnum); - if (relevant_source != NULL) { - - cal = icalcomponent_new_from_string(relevant_source); - if (cal != NULL) { - - /* A which_kind of (-1) means just load the whole thing */ - if (which_kind == (-1)) { - callback(cal, msgnum, from, unread, calv); + while (!Done && (StrBuf_ServGetln(Buf)>=0)) { + if ( (StrLength(Buf)==3) && + !strcmp(ChrPtr(Buf), "000")) { + Done = 1; + break; + } + bptr = ChrPtr(Buf); + switch (phase) { + case 0: + if (!strncasecmp(bptr, "part=", 5)) { + extract_token(mime_filename, &bptr[5], 1, '|', sizeof mime_filename); + 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); + + 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); } - - /* Otherwise recurse and hunt */ - else { - - /* Simple components of desired type */ - if (icalcomponent_isa(cal) == which_kind) { - callback(cal, msgnum, from, unread, calv); - } - - /* Subcomponents of desired type */ - for (c = icalcomponent_get_first_component(cal, which_kind); - (c != 0); - c = icalcomponent_get_next_component(cal, which_kind)) { - callback(c, msgnum, from, unread, calv); - } - + } + else if (!strncasecmp(bptr, "from=", 4)) { + extract_token(from, bptr, 1, '=', sizeof(from)); + } + else if ((phase == 0) && (!strncasecmp(bptr, "text", 4))) { + phase = 1; + } + break; + case 1: + if (!IsEmptyStr(bptr)) { + if (!strncasecmp(bptr, "Content-type: ", 14)) { + safestrncpy(msg4_content_type, &bptr[14], sizeof msg4_content_type); + striplt(msg4_content_type); + } + else if (!strncasecmp(bptr, "Content-transfer-encoding: ", 27)) { + safestrncpy(msg4_content_encoding, &bptr[27], sizeof msg4_content_encoding); + striplt(msg4_content_type); + } + else if ((!strncasecmp(bptr, "Content-length: ", 16))) { + msg4_content_length = atoi(&bptr[16]); + } + break; + } + else { + phase++; + + if ((msg4_content_length > 0) + && ( !strcasecmp(msg4_content_encoding, "7bit")) + && ((!strcasecmp(mime_content_type, "text/calendar")) + || (!strcasecmp(mime_content_type, "application/ics")) + || (!strcasecmp(mime_content_type, "text/vtodo")) + || (!strcasecmp(mime_content_type, "text/todo")) + ) + ) + { } - - icalcomponent_free(cal); } - free(relevant_source); + case 2: + if (Data == NULL) + Data = NewStrBufPlain(NULL, msg4_content_length * 2); + if (msg4_content_length > 0) { + StrBuf_ServGetBLOBBuffered(Data, msg4_content_length); + phase ++; + } + else { + StrBufAppendBuf(Data, Buf, 0); + StrBufAppendBufPlain(Data, "\r\n", 1, 0); + } + case 3: + StrBufAppendBuf(Data, Buf, 0); } } - icalmemory_free_ring(); -} + FreeStrBuf(&Buf); -/* - * Display a calendar item - */ -void load_calendar_item(message_summary *Msg, int unread, struct calview *c) { - /*load_ical_object(Msg->msgnum, unread, ICAL_VEVENT_COMPONENT, display_individual_cal, c);*/ - load_ical_object(Msg->msgnum, unread, (-1), display_individual_cal, c); -} - -/* - * Display task view - */ -void display_task(message_summary *Msg, int unread) { - load_ical_object(Msg->msgnum, unread, ICAL_VTODO_COMPONENT, display_individual_cal, NULL); -} - -/* - * 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((char *)bstr("taskrm")); + /* If MSG4 didn't give us the part we wanted, but we know that we can find it + * as one of the other MIME parts, attempt to load it now. + */ + if ((Data == NULL) && (!IsEmptyStr(relevant_partnum))) { + Data = load_mimepart(msgnum, relevant_partnum); } - msgnum = lbstr("msgnum"); - if (msgnum > 0L) { - /* existing task */ - load_ical_object(msgnum, 0, - ICAL_VTODO_COMPONENT, - display_edit_individual_task, - NULL - ); - } - else { - /* new task */ - display_edit_individual_task(NULL, 0L, "", 0, NULL); + if (Data != NULL) { + relevant_source = (char*) ChrPtr(Data); + process_ical_object(msgnum, unread, + from, + relevant_source, + which_kind, + CallBack, + calv); } + FreeStrBuf (&Data); + + icalmemory_free_ring(); } /* - * save an edited task + * Display a calendar item */ -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); - } - 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; } /* @@ -1099,7 +780,7 @@ void display_edit_event(void) { msgnum = lbstr("msgnum"); if (msgnum > 0L) { /* existing event */ - load_ical_object(msgnum, 0, ICAL_VEVENT_COMPONENT, display_edit_individual_event, NULL); + load_ical_object(msgnum, 0, ICAL_VEVENT_COMPONENT, display_edit_individual_event, NULL, 0); } else { /* new event */ @@ -1116,8 +797,7 @@ void save_event(void) { msgnum = lbstr("msgnum"); if (msgnum > 0L) { - /* load_ical_object(msgnum, 0, ICAL_VEVENT_COMPONENT, save_individual_event, NULL); */ - load_ical_object(msgnum, 0, (-1), save_individual_event, NULL); + load_ical_object(msgnum, 0, (-1), save_individual_event, NULL, 0); } else { save_individual_event(NULL, 0L, "", 0, NULL); @@ -1131,13 +811,15 @@ void save_event(void) { /* * Anonymous request of freebusy data for a user */ -void do_freebusy(const char *req) { +void do_freebusy(void) +{ + 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]); } @@ -1158,7 +840,7 @@ void do_freebusy(const char *req) { 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; } @@ -1169,16 +851,62 @@ void do_freebusy(const char *req) { +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) { - 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); + RegisterReadLoopHandlerset( + VIEW_CALENDAR, + calendar_GetParamsGetServerCall, + NULL, + calendar_LoadMsgFromServer, + calendar_RenderView_or_Tail, + calendar_Cleanup); + + RegisterReadLoopHandlerset( + VIEW_CALBRIEF, + calendar_GetParamsGetServerCall, + 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"), "", 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); }