X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fcalendar.c;h=fadadf6c18ec8710bf01d498d208d99704f53c8a;hb=3fc2504fcc0a240ea2c933f23deaa57b23a02c53;hp=7e81620e428b8bd8ee72773bac99b4110aede83d;hpb=5a430cf37222e34d505c7472eb69d500866804ba;p=citadel.git diff --git a/webcit/calendar.c b/webcit/calendar.c index 7e81620e4..fadadf6c1 100644 --- a/webcit/calendar.c +++ b/webcit/calendar.c @@ -19,8 +19,8 @@ void cal_process_object(icalcomponent *cal, int recursion_level, long msgnum, - char *cal_partnum -) { + char *cal_partnum) +{ icalcomponent *c; icalproperty *method = NULL; icalproperty_method the_method = ICAL_METHOD_NONE; @@ -53,16 +53,16 @@ void cal_process_object(icalcomponent *cal, wprintf(""); wprintf(""); switch(the_method) { - case ICAL_METHOD_REQUEST: + case ICAL_METHOD_REQUEST: title = _("Meeting invitation"); break; - case ICAL_METHOD_REPLY: + case ICAL_METHOD_REPLY: title = _("Attendee's reply to your invitation"); break; - case ICAL_METHOD_PUBLISH: + case ICAL_METHOD_PUBLISH: title = _("Published event"); break; - default: + default: title = _("This is an unknown type of calendar item."); break; } @@ -98,7 +98,7 @@ void cal_process_object(icalcomponent *cal, if (icalcomponent_isa(cal) == ICAL_VEVENT_COMPONENT) { p = icalcomponent_get_first_property(cal, - ICAL_DTSTART_PROPERTY); + ICAL_DTSTART_PROPERTY); if (p != NULL) { t = icalproperty_get_dtstart(p); @@ -145,7 +145,9 @@ void cal_process_object(icalcomponent *cal, } /** If the component has attendees, iterate through them. */ - for (p = icalcomponent_get_first_property(cal, ICAL_ATTENDEE_PROPERTY); (p != NULL); p = icalcomponent_get_next_property(cal, ICAL_ATTENDEE_PROPERTY)) { + for (p = icalcomponent_get_first_property(cal, ICAL_ATTENDEE_PROPERTY); + (p != NULL); + p = icalcomponent_get_next_property(cal, ICAL_ATTENDEE_PROPERTY)) { wprintf("
"); wprintf(_("Attendee:")); wprintf("
"); @@ -167,8 +169,8 @@ void cal_process_object(icalcomponent *cal, /** If the component has subcomponents, recurse through them. */ for (c = icalcomponent_get_first_component(cal, ICAL_ANY_COMPONENT); - (c != 0); - c = icalcomponent_get_next_component(cal, ICAL_ANY_COMPONENT)) { + (c != 0); + c = icalcomponent_get_next_component(cal, ICAL_ANY_COMPONENT)) { /* Recursively process subcomponent */ cal_process_object(c, recursion_level+1, msgnum, cal_partnum); } @@ -187,19 +189,19 @@ void cal_process_object(icalcomponent *cal, if (is_update) { snprintf(conflict_message, sizeof conflict_message, - _("This is an update of '%s' which is already in your calendar."), conflict_name); + _("This is an update of '%s' which is already in your calendar."), conflict_name); } else { snprintf(conflict_message, sizeof conflict_message, - _("This event would conflict with '%s' which is already in your calendar."), conflict_name); + _("This event would conflict with '%s' which is already in your calendar."), conflict_name); } wprintf("
%s", (is_update ? - _("Update:") : - _("CONFLICT:") - ) - ); + _("Update:") : + _("CONFLICT:") + ) + ); wprintf("
"); escputs(conflict_message); wprintf("
\n"); @@ -224,7 +226,7 @@ void cal_process_object(icalcomponent *cal, divname, divname, msgnum, cal_partnum, _("Accept"), divname, divname, msgnum, cal_partnum, _("Tentative"), divname, divname, msgnum, cal_partnum, _("Decline") - ); + ); } @@ -233,10 +235,10 @@ void cal_process_object(icalcomponent *cal, /** \todo In the future, if we want to validate this object before \ * continuing, we can do it this way: - serv_printf("ICAL whatever|%ld|%s|", msgnum, cal_partnum); - serv_getln(buf, sizeof buf); - } - ***********/ + serv_printf("ICAL whatever|%ld|%s|", msgnum, cal_partnum); + serv_getln(buf, sizeof buf); + } + ***********/ /** Display the update buttons */ wprintf("

" @@ -250,10 +252,10 @@ void cal_process_object(icalcomponent *cal, _("Click Update to accept this reply and update your calendar."), divname, divname, msgnum, cal_partnum, _("Update"), divname, divname, msgnum, cal_partnum, _("Ignore") - ); - + ); + } - + /** Trailing HTML for the display of this object */ if (recursion_level == 0) { wprintf("

 

\n"); @@ -269,7 +271,8 @@ void cal_process_object(icalcomponent *cal, * \param msgnum number of the mesage in our db * \param cal_partnum the number of the calendar item */ -void cal_process_attachment(char *part_source, long msgnum, char *cal_partnum) { +void cal_process_attachment(char *part_source, long msgnum, char *cal_partnum) +{ icalcomponent *cal; cal = icalcomponent_new_from_string(part_source); @@ -294,7 +297,8 @@ void cal_process_attachment(char *part_source, long msgnum, char *cal_partnum) { * \brief accept/decline meeting * Respond to a meeting request */ -void respond_to_request(void) { +void respond_to_request(void) +{ char buf[1024]; begin_ajax_response(); @@ -318,8 +322,8 @@ void respond_to_request(void) { ); } else if (!strcasecmp(bstr("sc"), "decline")) { wprintf(_("You have declined this meeting invitation. " - "It has not been entered into your calendar.") - ); + "It has not been entered into your calendar.") + ); } wprintf(" "); wprintf(_("A reply has been sent to the meeting organizer.")); @@ -338,7 +342,8 @@ void respond_to_request(void) { /** * \brief Handle an incoming RSVP */ -void handle_rsvp(void) { +void handle_rsvp(void) +{ char buf[1024]; begin_ajax_response(); @@ -356,8 +361,8 @@ void handle_rsvp(void) { wprintf(_("Your calendar has been updated to reflect this RSVP.")); } else if (!strcasecmp(bstr("sc"), "ignore")) { wprintf(_("You have chosen to ignore this RSVP. " - "Your calendar has not been updated.") - ); + "Your calendar has not been updated.") + ); } wprintf("
"); } else { @@ -366,7 +371,6 @@ void handle_rsvp(void) { } end_ajax_response(); - } @@ -408,13 +412,14 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr -/* +/** * \brief edit a task * Display a task by itself (for editing) * \param supplied_vtodo the todo item we want to edit * \param msgnum number of the mesage in our db */ -void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum, char *from, int unread) { +void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum, char *from, int unread) +{ icalcomponent *vtodo; icalproperty *p; struct icaltimetype t; @@ -441,7 +446,7 @@ void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum, ch ), msgnum, from, unread - ); + ); return; } } @@ -449,26 +454,30 @@ void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum, ch vtodo = icalcomponent_new(ICAL_VTODO_COMPONENT); created_new_vtodo = 1; } - - output_headers(1, 1, 2, 0, 0, 0); - wprintf("
\n"); - wprintf(""); - wprintf("

"); + + // 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("

"); - wprintf("
\n"); - - wprintf("
\n"); - - wprintf("
" - "
"); + 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"); + wprintf(""); + wprintf("
"); + wprintf("\n"); wprintf("\n"); @@ -498,41 +514,70 @@ void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum, ch wprintf(_("Due date:")); wprintf("\n"); + icalproperty_status 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:")); @@ -485,12 +494,19 @@ void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum, ch wprintf(_("Start date:")); wprintf(""); p = icalcomponent_get_first_property(vtodo, ICAL_DTSTART_PROPERTY); + wprintf(""); + wprintf(_("No date")); + + wprintf(" "); + wprintf(_("or")); + wprintf(" "); if (p != NULL) { t = icalproperty_get_dtstart(p); } - else { - t = icaltime_from_timet(now, 0); - } display_icaltimetype_as_webform(&t, "dtstart"); wprintf("
"); p = icalcomponent_get_first_property(vtodo, ICAL_DUE_PROPERTY); + wprintf(""); + wprintf(_("No date")); + wprintf(" "); + wprintf(_("or")); + wprintf(" "); if (p != NULL) { t = icalproperty_get_due(p); } - else { - t = icaltime_from_timet(now, 0); - } display_icaltimetype_as_webform(&t, "due"); + wprintf("
\n"); + wprintf(_("Completed:")); + wprintf(""); + wprintf(""); + wprintf("
"); + wprintf(_("Category:")); + wprintf(""); + wprintf(""); + wprintf("
"); wprintf(_("Description:")); wprintf(""); - wprintf("
\n"); - wprintf("
" + wprintf("" "" "  " "\n" "  " "\n" - "
\n", + "\n", _("Save"), _("Delete"), _("Cancel") - ); - + ); + wprintf("
"); wprintf("\n"); - - wprintf("
\n"); + wprintf("
\n"); + wprintf(""); wDumpContent(1); if (created_new_vtodo) { @@ -545,7 +590,8 @@ void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum, ch * \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) { +void save_individual_task(icalcomponent *supplied_vtodo, long msgnum, char* from, int unread) +{ char buf[SIZ]; int delete_existing = 0; icalproperty *prop; @@ -570,7 +616,7 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum, char* from icalcomponent_get_first_component( vtodo, ICAL_VTODO_COMPONENT), msgnum, from, unread - ); + ); return; } } @@ -584,61 +630,84 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum, char* from /** Replace values in the component with ones from the form */ while (prop = icalcomponent_get_first_property(vtodo, - ICAL_SUMMARY_PROPERTY), prop != NULL) { + 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")); - } + 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) { + ICAL_DESCRIPTION_PROPERTY), prop != NULL) { icalcomponent_remove_property(vtodo, prop); icalproperty_free(prop); } - icalcomponent_add_property(vtodo, - icalproperty_new_description(bstr("description"))); + if (!IsEmptyStr(bstr("description"))) { + icalcomponent_add_property(vtodo, + icalproperty_new_description(bstr("description"))); + } while (prop = icalcomponent_get_first_property(vtodo, - ICAL_DTSTART_PROPERTY), prop != NULL) { + ICAL_DTSTART_PROPERTY), prop != NULL) { icalcomponent_remove_property(vtodo, prop); icalproperty_free(prop); } - icaltime_from_webform(&t, "dtstart"); - icalcomponent_add_property(vtodo, - icalproperty_new_dtstart(t) - ); - + 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 (!IsEmptyStr(bstr("status"))) { + icalproperty_status taskStatus = icalproperty_string_to_status( + bstr("status")); + icalcomponent_set_status(vtodo, taskStatus); + } while (prop = icalcomponent_get_first_property(vtodo, - ICAL_DUE_PROPERTY), prop != NULL) { + 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); } - icaltime_from_webform(&t, "due"); - icalcomponent_add_property(vtodo, - icalproperty_new_due(t) - ); - + 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) { + ICAL_UID_PROPERTY) == NULL) { generate_uuid(buf); icalcomponent_add_property(vtodo, - icalproperty_new_uid(buf) - ); + 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) ) { + ICAL_SEQUENCE_PROPERTY), (prop != NULL) ) { i = icalproperty_get_sequence(prop); lprintf(9, "Sequence was %d\n", i); if (i > sequence) sequence = i; @@ -648,8 +717,8 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum, char* from ++sequence; lprintf(9, "New sequence is %d. Adding...\n", sequence); icalcomponent_add_property(vtodo, - icalproperty_new_sequence(sequence) - ); + icalproperty_new_sequence(sequence) + ); /** * Encapsulate event into full VCALENDAR component. Clone it first, @@ -717,7 +786,8 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum, char* from void display_using_handler(long msgnum, int unread, icalcomponent_kind which_kind, void (*callback)(icalcomponent *, long, char*, int) - ) { + ) +{ char buf[1024]; char from[128] = ""; char mime_partnum[256]; @@ -744,9 +814,9 @@ void display_using_handler(long msgnum, int unread, 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")) - ) { + || (!strcasecmp(mime_content_type, "application/ics")) + || (!strcasecmp(mime_content_type, "text/vtodo")) + ) { strcpy(relevant_partnum, mime_partnum); } } @@ -771,10 +841,10 @@ void display_using_handler(long msgnum, int unread, /** Subcomponents of desired type */ for (c = icalcomponent_get_first_component(cal, - which_kind); - (c != 0); - c = icalcomponent_get_next_component(cal, - which_kind)) { + which_kind); + (c != 0); + c = icalcomponent_get_next_component(cal, + which_kind)) { callback(c, msgnum, from, unread); } icalcomponent_free(cal); @@ -791,8 +861,8 @@ void display_using_handler(long msgnum, int unread, */ void display_calendar(long msgnum, int unread) { display_using_handler(msgnum, unread, - ICAL_VEVENT_COMPONENT, - display_individual_cal); + ICAL_VEVENT_COMPONENT, + display_individual_cal); } /** @@ -801,8 +871,8 @@ void display_calendar(long msgnum, int unread) { */ void display_task(long msgnum, int unread) { display_using_handler(msgnum, unread, - ICAL_VTODO_COMPONENT, - display_individual_cal); + ICAL_VTODO_COMPONENT, + display_individual_cal); } /** @@ -810,18 +880,18 @@ void display_task(long msgnum, int unread) { */ void display_edit_task(void) { long msgnum = 0L; - + /** Force change the room if we have to */ if (havebstr("taskrm")) { - gotoroom(bstr("taskrm")); + gotoroom((char *)bstr("taskrm")); } msgnum = lbstr("msgnum"); if (msgnum > 0L) { /** existing task */ display_using_handler(msgnum, 0, - ICAL_VTODO_COMPONENT, - display_edit_individual_task); + ICAL_VTODO_COMPONENT, + display_edit_individual_task); } else { /** new task */ @@ -838,8 +908,8 @@ void save_task(void) { msgnum = lbstr("msgnum"); if (msgnum > 0L) { display_using_handler(msgnum, 0, - ICAL_VTODO_COMPONENT, - save_individual_task); + ICAL_VTODO_COMPONENT, + save_individual_task); } else { save_individual_task(NULL, 0L, "", 0); @@ -856,8 +926,8 @@ void display_edit_event(void) { if (msgnum > 0L) { /* existing event */ display_using_handler(msgnum, 0, - ICAL_VEVENT_COMPONENT, - display_edit_individual_event); + ICAL_VEVENT_COMPONENT, + display_edit_individual_event); } else { /* new event */ @@ -875,8 +945,8 @@ void save_event(void) { if (msgnum > 0L) { display_using_handler(msgnum, 0, - ICAL_VEVENT_COMPONENT, - save_individual_event); + ICAL_VEVENT_COMPONENT, + save_individual_event); } else { save_individual_event(NULL, 0L, "", 0); @@ -905,8 +975,8 @@ void do_freebusy(char *req) { len = strlen(who); if ( (!strcasecmp(&who[len-4], ".vcf")) - || (!strcasecmp(&who[len-4], ".ifb")) - || (!strcasecmp(&who[len-4], ".vfb")) ) { + || (!strcasecmp(&who[len-4], ".ifb")) + || (!strcasecmp(&who[len-4], ".vfb")) ) { who[len-4] = 0; } @@ -928,4 +998,3 @@ void do_freebusy(char *req) { free(fb); } -