X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fcalendar.c;h=f7e48d8bfca4b35737a9d077f6a6a6c8391e1567;hb=d159f2a1a8cf9efccb8f733d7e2452c5f7cfbf64;hp=300d0ebb81f9f18e611bf2af064b739b352baf9d;hpb=f33d1d12b6d8de28cb449c129e1b4ddf0471c7bf;p=citadel.git diff --git a/webcit/calendar.c b/webcit/calendar.c index 300d0ebb8..f7e48d8bf 100644 --- a/webcit/calendar.c +++ b/webcit/calendar.c @@ -38,7 +38,7 @@ void cal_process_attachment(char *part_source, long msgnum, char *cal_partnum) { " but support for calendars is not available on this " "particular system. Please ask your system administrator to " "install a new version of the Citadel web service with " - "calendaring enabled.
\n" + "calendaring enabled.
\n" ); } @@ -48,7 +48,7 @@ void display_calendar(long msgnum) { "Cannot display calendar item. You are seeing this error " "because your WebCit service has not been installed with " "calendar support. Please contact your system administrator." - "
\n"); + "
\n"); } void display_task(long msgnum) { @@ -56,7 +56,7 @@ void display_task(long msgnum) { "Cannot display to-do item. You are seeing this error " "because your WebCit service has not been installed with " "calendar support. Please contact your system administrator." - "
\n"); + "
\n"); } #else /* WEBCIT_WITH_CALENDAR_SERVICE */ @@ -332,7 +332,7 @@ void cal_process_attachment(char *part_source, long msgnum, char *cal_partnum) { cal = icalcomponent_new_from_string(part_source); if (cal == NULL) { - wprintf("Error parsing calendar object
\n"); + wprintf("Error parsing calendar object
\n"); return; } @@ -352,12 +352,14 @@ void cal_process_attachment(char *part_source, long msgnum, char *cal_partnum) { void respond_to_request(void) { char buf[SIZ]; - output_headers(3); + output_headers(1, 1, 2, 0, 0, 0, 0); + wprintf("
\n"); wprintf("
" "Respond to meeting request" - "

\n" + "\n" ); + wprintf("
\n
\n"); serv_printf("ICAL respond|%s|%s|%s|", bstr("msgnum"), @@ -394,7 +396,7 @@ void respond_to_request(void) { wprintf("wc_roomname); - wprintf("\">
Return to messages

\n"); + wprintf("\">
Return to messages
\n"); wDumpContent(1); } @@ -407,12 +409,14 @@ void respond_to_request(void) { void handle_rsvp(void) { char buf[SIZ]; - output_headers(3); + output_headers(1, 1, 2, 0, 0, 0, 0); + wprintf("
\n"); wprintf("
" "" "Update your calendar with this RSVP" - "

\n" + "\n" + "
\n
\n" ); serv_printf("ICAL handle_rsvp|%s|%s|%s|", @@ -445,7 +449,7 @@ void handle_rsvp(void) { wprintf("wc_roomname); - wprintf("\">
Return to messages

\n"); + wprintf("\">
Return to messages
\n"); wDumpContent(1); } @@ -517,14 +521,17 @@ void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum) { created_new_vtodo = 1; } - output_headers(3); - wprintf("
" + output_headers(1, 1, 2, 0, 0, 0, 0); + wprintf("
\n" + "
" "Edit task" - "

\n" + "
\n" + "
\n
\n" ); - - do_template("beginbox_nt"); + wprintf("
" + "
"); + wprintf("
\n"); wprintf("\n", msgnum); @@ -582,7 +589,7 @@ void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum) { wprintf("
\n"); - do_template("endbox"); + wprintf("
\n"); wDumpContent(1); if (created_new_vtodo) { @@ -598,8 +605,10 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum) { char buf[SIZ]; int delete_existing = 0; icalproperty *prop; - icalcomponent *vtodo; + icalcomponent *vtodo, *encaps; int created_new_vtodo = 0; + int i; + int sequence = 0; if (supplied_vtodo != NULL) { vtodo = supplied_vtodo; @@ -665,14 +674,50 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum) { icaltime_from_webform("due") ) ); - + + /* 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 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_gets(buf); if (buf[0] == '4') { serv_puts("Content-type: text/calendar"); serv_puts(""); - serv_puts(icalcomponent_as_ical_string(vtodo)); + serv_puts(icalcomponent_as_ical_string(encaps)); serv_puts("000"); /* Probably not necessary; the server will see the UID @@ -681,6 +726,7 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum) { */ delete_existing = 1; } + icalcomponent_free(encaps); } /* @@ -794,7 +840,7 @@ void display_edit_task(void) { /* Force change the room if we have to */ if (strlen(bstr("taskrm")) > 0) { - gotoroom(bstr("taskrm"), 0); + gotoroom(bstr("taskrm")); } msgnum = atol(bstr("msgnum")); @@ -884,7 +930,7 @@ void do_freebusy(char *req) { if (buf[0] != '1') { wprintf("HTTP/1.0 404 %s\n", &buf[4]); - output_headers(0); + output_headers(0, 0, 0, 0, 0, 0, 0); wprintf("Content-Type: text/plain\n"); wprintf("\n"); wprintf("%s\n", &buf[4]);