X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fevent.c;h=d786998ab8ef818c0d5bebf7e15b291c1b04b7e1;hb=HEAD;hp=9b05425bb8c4452e23e60128582b52206c85af70;hpb=77ad06c3f4bf4d2a4e3a7ff82ec94fcdff343273;p=citadel.git diff --git a/webcit/event.c b/webcit/event.c index 9b05425bb..ffe0688ab 100644 --- a/webcit/event.c +++ b/webcit/event.c @@ -1,11 +1,20 @@ /* - * $Id$ - * * Editing calendar events. + * + * Copyright (c) 2002-2012 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, version 3. + * + * 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. */ #include "webcit.h" -#include "webserver.h" + +#include "calendar.h" /* * Display an event by itself (for editing) @@ -13,8 +22,9 @@ * msgnum reference on the citserver */ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum, char *from, - int unread, struct calview *calv) + int unread, calview *calv) { + wcsession *WCC = WC; icalcomponent *vevent; icalproperty *p; icalvalue *v; @@ -29,14 +39,53 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum, char buf[SIZ]; int organizer_is_me = 0; int i, j = 0; + /************************************************************ + * Uncomment this to see the UID in calendar events for debugging int sequence = 0; + */ char weekday_labels[7][32]; char month_labels[12][32]; long weekstart = 0; icalproperty *rrule = NULL; struct icalrecurrencetype recur; + char weekday_is_selected[7]; + int which_rrmonthtype_is_preselected = 0; + + int rrmday; + int rrmweekday; + + icaltimetype day1; + int weekbase; + int rrmweek; + int rrymweek; + int rrymweekday; + int rrymonth; + int which_rrend_is_preselected; + int which_rryeartype_is_preselected; + + const char *ch; + const char *tabnames[3]; + const char *frequency_units[8]; + const char *ordinals[6]; + + frequency_units[0] = _("seconds"); + frequency_units[1] = _("minutes"); + frequency_units[2] = _("hours"); + frequency_units[3] = _("days"); + frequency_units[4] = _("weeks"); + frequency_units[5] = _("months"); + frequency_units[6] = _("years"); + frequency_units[7] = _("never"); + + + ordinals[0] = "0"; + ordinals[1] = _("first"); + ordinals[2] = _("second"); + ordinals[3] = _("third"); + ordinals[4] = _("fourth"); + ordinals[5] = _("fifth"); + - char *tabnames[3]; tabnames[0] = _("Event"); tabnames[1] = _("Attendees"); tabnames[2] = _("Recurrence"); @@ -44,7 +93,7 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum, get_pref_long("weekstart", &weekstart, 17); if (weekstart > 6) weekstart = 0; - lprintf(9, "display_edit_individual_event(%ld) calview=%s year=%s month=%s day=%s\n", + syslog(LOG_DEBUG, "display_edit_individual_event(%ld) calview=%s year=%s month=%s day=%s\n", msgnum, bstr("calview"), bstr("year"), bstr("month"), bstr("day") ); @@ -106,45 +155,49 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum, /* Learn the sequence */ p = icalcomponent_get_first_property(vevent, ICAL_SEQUENCE_PROPERTY); + /************************************************************ + * Uncomment this to see the UID in calendar events for debugging if (p != NULL) { sequence = icalproperty_get_sequence(p); } - + */ /* Begin output */ - output_headers(1, 1, 2, 0, 0, 0); - wprintf("
\n"); - wprintf("

"); - wprintf(_("Add or edit an event")); - wprintf("

"); - wprintf("
\n"); + output_headers(1, 1, 1, 0, 0, 0); + wc_printf("
\n"); + wc_printf("

"); + wc_printf(_("Add or edit an event")); + wc_printf("

"); + wc_printf("
\n"); - wprintf("
\n"); - - wprintf("
"); + wc_printf("
\n"); /************************************************************ * Uncomment this to see the UID in calendar events for debugging - wprintf("UID == "); + wc_printf("UID == "); p = icalcomponent_get_first_property(vevent, ICAL_UID_PROPERTY); if (p != NULL) { escputs((char *)icalproperty_get_comment(p)); } - wprintf("
\n"); - wprintf("SEQUENCE == %d
\n", sequence); + wc_printf("
\n"); + wc_printf("SEQUENCE == %d
\n", sequence); *************************************************************/ - wprintf("
\n"); - wprintf("\n", WC->nonce); + wc_printf("\n"); + wc_printf("\n", WC->nonce); + + wc_printf("WBuf, WCC->CurRoom.name, NULL, 0, 0); + wc_printf("\">\n"); - wprintf("\n", + wc_printf("\n", msgnum); - wprintf("\n", + wc_printf("\n", bstr("calview")); - wprintf("\n", + wc_printf("\n", bstr("year")); - wprintf("\n", + wc_printf("\n", bstr("month")); - wprintf("\n", + wc_printf("\n", bstr("day")); @@ -152,33 +205,33 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum, begin_tab(0, 3); /* Put it in a borderless table so it lines up nicely */ - wprintf("\n"); + wc_printf("
\n"); - wprintf("\n"); + wc_printf("\">\n"); - wprintf("\n"); + wc_printf("\">\n"); - wprintf("\n"); + wc_printf("\n"); - /* - * If this is an all-day-event, set the end time to be identical to - * the start time (the hour/minute/second will be set to midnight). - * Otherwise extract or create it. - */ - wprintf("\n"); + wc_printf("\n"); - wprintf(""); + wc_printf(""); /* * For a new event, the user creating the event should be the @@ -276,7 +344,7 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum, */ if (icalcomponent_get_first_property(vevent, ICAL_ORGANIZER_PROPERTY) == NULL) { - sprintf(organizer_string, "MAILTO:%s", WC->cs_inet_email); + sprintf(organizer_string, "mailto:%s", ChrPtr(WC->cs_inet_email)); icalcomponent_add_property(vevent, icalproperty_new_organizer(organizer_string) ); @@ -289,9 +357,9 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum, organizer = icalcomponent_get_first_property(vevent, ICAL_ORGANIZER_PROPERTY); if (organizer != NULL) { strcpy(organizer_string, icalproperty_get_organizer(organizer)); - if (!strncasecmp(organizer_string, "MAILTO:", 7)) { + if (!strncasecmp(organizer_string, "mailto:", 7)) { strcpy(organizer_string, &organizer_string[7]); - striplt(organizer_string); + string_trim(organizer_string); serv_printf("ISME %s", organizer_string); serv_getln(buf, sizeof buf); if (buf[0] == '2') { @@ -300,14 +368,14 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum, } } - wprintf("\n"); + wc_printf("\n"); /* Transparency */ - wprintf("\n"); + wc_printf("\n"); /* Done with properties. */ - wprintf("
"); - wprintf(_("Summary")); - wprintf("\n" - ""); + wc_printf(_("Summary")); + wc_printf("\n" + "
"); - wprintf(_("Location")); - wprintf("\n" - ""); + wc_printf(_("Location")); + wc_printf("\n" + "
"); - wprintf(_("Start")); - wprintf("\n"); + wc_printf("
"); + wc_printf(_("Start")); + wc_printf("\n"); p = icalcomponent_get_first_property(vevent, ICAL_DTSTART_PROPERTY); if (p != NULL) { t_start = icalproperty_get_dtstart(p); @@ -211,64 +264,79 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum, ((yesbstr("alldayevent")) ? 1 : 0), icaltimezone_get_utc_timezone() ); - t_start.is_utc = 1; - } display_icaltimetype_as_webform(&t_start, "dtstart", 0); - wprintf("%s", - (t_start.is_date ? "CHECKED=\"CHECKED\"" : "" ), + (t_start.is_date ? "checked=\"checked\"" : "" ), _("All day event") ); - wprintf("
"); - wprintf(_("End")); - wprintf("\n"); - if (t_start.is_date) { - t_end = t_start; + wc_printf("
"); + wc_printf(_("End")); + wc_printf("\n"); + p = icalcomponent_get_first_property(vevent, + ICAL_DTEND_PROPERTY); + if (p != NULL) { + t_end = icalproperty_get_dtend(p); + + /* + * If this is an all-day-event, the end time is set to real end + * day + 1, so we have to adjust accordingly. + */ + if (t_start.is_date) { + icaltime_adjust(&t_end, -1, 0, 0, 0); + } } else { - p = icalcomponent_get_first_property(vevent, - ICAL_DTEND_PROPERTY); - if (p != NULL) { - t_end = icalproperty_get_dtend(p); + if (created_new_vevent == 1) { + /* set default duration */ + if (t_start.is_date) { + /* + * If this is an all-day-event, set the end time to be identical to + * the start time (the hour/minute/second will be set to midnight). + */ + t_end = t_start; + } + else { + /* + * If this is not an all-day event and there is no + * end time specified, make the default one hour + * from the start time. + */ + t_end = t_start; + t_end.hour += 1; + t_end.second = 0; + t_end = icaltime_normalize(t_end); + /* t_end = icaltime_from_timet(now, 0); */ + } } else { /* - * If this is not an all-day event and there is no - * end time specified, make the default one hour - * from the start time. + * If an existing event has no end date/time this is + * supposed to mean end = start. */ t_end = t_start; - t_end.hour += 1; - t_end.second = 0; - t_end = icaltime_normalize(t_end); - /* t_end = icaltime_from_timet(now, 0); */ } } display_icaltimetype_as_webform(&t_end, "dtend", 0); - wprintf("
"); - wprintf(_("Notes")); - wprintf("\n" - "
"); - wprintf(_("Organizer")); - wprintf(""); + wc_printf("
"); + wc_printf(_("Organizer")); + wc_printf(""); escputs(organizer_string); if (organizer_is_me) { - wprintf(" "); - wprintf(_("(you are the organizer)")); - wprintf("\n"); + wc_printf(" "); + wc_printf(_("(you are the organizer)")); + wc_printf("\n"); } /* @@ -316,16 +384,16 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum, * especially if this is a new event and there is no organizer already * in the calendar object. */ - wprintf(""); + wc_printf("\">"); - wprintf("
"); - wprintf(_("Show time as:")); - wprintf(""); + wc_printf("
"); + wc_printf(_("Show time as:")); + wc_printf(""); p = icalcomponent_get_first_property(vevent, ICAL_TRANSP_PROPERTY); if (p == NULL) { @@ -342,76 +410,78 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum, v = NULL; } - wprintf(""); - wprintf(_("Free")); - wprintf("  "); + wc_printf(">"); + wc_printf(_("Free")); + wc_printf("  "); - wprintf(""); - wprintf(_("Busy")); + wc_printf(">"); + wc_printf(_("Busy")); - wprintf("
\n"); + wc_printf("\n"); end_tab(0, 3); /* Attendees tab (need to move things here) */ begin_tab(1, 3); - wprintf("\n"); /* same table style as the event tab */ - wprintf("\n"); + wc_printf("
"); - wprintf(_("Attendees")); - wprintf("
" - ""); - wprintf(_("(One per line)")); - wprintf("\n"); + wc_printf("\n"); /* same table style as the event tab */ + wc_printf("\n"); - wprintf("
"); + wc_printf(_("Attendees")); + wc_printf("
" + ""); + wc_printf(_("(One per line)")); + wc_printf("\n"); /* Pop open an address book -- begin */ - wprintf( + wc_printf( " " - "" + "" "", _("Attendees"), _("Contacts") ); /* Pop open an address book -- end */ - wprintf("
" - "
\n"); + wc_printf("
\n"); end_tab(1, 3); /* Recurrence tab */ @@ -430,64 +500,43 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum, recur.freq = ICAL_WEEKLY_RECURRENCE; } - wprintf("%s", - (rrule ? "CHECKED=\"CHECKED\"" : "" ), + (rrule ? "checked=\"checked\"" : "" ), _("This is a recurring event") ); - wprintf("
\n"); /* begin 'rrule_div' div */ - - wprintf("\n"); - - char *frequency_units[] = { - _("seconds"), - _("minutes"), - _("hours"), - _("days"), - _("weeks"), - _("months"), - _("years"), - _("never") - }; - - char *ordinals[] = { - "0", - _("first"), - _("second"), - _("third"), - _("fourth"), - _("fifth") - }; - - wprintf("
"); - wprintf(_("Recurrence rule")); - wprintf(""); + wc_printf("
\n"); /* begin 'rrule_div' div */ + + wc_printf("\n"); + + wc_printf("\n"); + wc_printf("\n"); - int which_rrend_is_preselected = 0; + which_rrend_is_preselected = 0; if (!icaltime_is_null_time(recur.until)) which_rrend_is_preselected = 2; if (recur.count > 0) which_rrend_is_preselected = 1; - wprintf("\n"); + wc_printf("\n"); - wprintf("
"); + wc_printf(_("Recurrence rule")); + wc_printf(""); if ((recur.freq < 0) || (recur.freq > 6)) recur.freq = 4; - wprintf("%s ", _("Repeats every")); + wc_printf("%s ", _("Repeats every")); - wprintf(" ", recur.interval); + wc_printf(" ", recur.interval); - wprintf("\n"); + wc_printf("\n"); - wprintf("
"); /* begin 'weekday_selector' div */ - wprintf("%s
", _("on these weekdays:")); + wc_printf("
"); /* begin 'weekday_selector' div */ + wc_printf("%s
", _("on these weekdays:")); - char weekday_is_selected[7]; memset(weekday_is_selected, 0, 7); for (i=0; i%s\n", weekday_labels[i]); + wc_printf("%s\n", weekday_labels[i]); } - wprintf("
\n"); /* end 'weekday_selector' div */ + wc_printf("
\n"); /* end 'weekday_selector' div */ - int which_rrmonthtype_is_preselected = 0; - wprintf("
"); /* begin 'monthday_selector' div */ + wc_printf("
"); /* begin 'monthday_selector' div */ - wprintf("", - ((which_rrmonthtype_is_preselected == 0) ? "checked" : "") + ((which_rrmonthtype_is_preselected == 0) ? "checked='checked'" : "") ); - int rrmday = t_start.day; - int rrmweekday = icaltime_day_of_week(t_start) - 1; + rrmday = t_start.day; + rrmweekday = icaltime_day_of_week(t_start) - 1; /* Figure out what week of the month we're in */ - icaltimetype day1 = t_start; + day1 = t_start; day1.day = 1; - int weekbase = icaltime_week_number(day1); - int rrmweek = icaltime_week_number(t_start) - weekbase + 1; + weekbase = icaltime_week_number(day1); + rrmweek = icaltime_week_number(t_start) - weekbase + 1; /* Are we going by day of the month or week/day? */ @@ -545,189 +593,192 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum, rrmweekday = icalrecurrencetype_day_day_of_week(recur.by_day[0]) - 1; } - wprintf(_("on day %s%d%s of the month"), "", rrmday, ""); - wprintf("
\n"); + wc_printf(_("on day %s%d%s of the month"), "", rrmday, ""); + wc_printf("
\n"); - wprintf("", - ((which_rrmonthtype_is_preselected == 1) ? "checked" : "") + ((which_rrmonthtype_is_preselected == 1) ? "checked='checked'" : "") ); - wprintf(_("on the ")); - wprintf(" \n"); + wc_printf(" \n"); - wprintf(""); + wc_printf(""); - wprintf(" %s
\n", _("of the month")); + wc_printf(" %s
\n", _("of the month")); - wprintf("
\n"); /* end 'monthday_selector' div */ + wc_printf("
\n"); /* end 'monthday_selector' div */ - int rrymweek = rrmweek; - int rrymweekday = rrmweekday; - int rrymonth = t_start.month; - int which_rryeartype_is_preselected = 0; + rrymweek = rrmweek; + rrymweekday = rrmweekday; + rrymonth = t_start.month; + which_rryeartype_is_preselected = 0; - if ( (recur.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) - && (recur.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX) ) { + if ( + (recur.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) + && (recur.by_day[0] != 0) + && (recur.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX) + && (recur.by_month[0] != 0) + ) { which_rryeartype_is_preselected = 1; rrymweek = icalrecurrencetype_day_position(recur.by_day[0]); rrymweekday = icalrecurrencetype_day_day_of_week(recur.by_day[0]) - 1; rrymonth = recur.by_month[0]; } - wprintf("
"); /* begin 'yearday_selector' div */ + wc_printf("
"); /* begin 'yearday_selector' div */ - wprintf("", - ((which_rryeartype_is_preselected == 0) ? "checked" : "") + ((which_rryeartype_is_preselected == 0) ? "checked='checked'" : "") ); - wprintf(_("every ")); - wprintf("%s
", _("year on this date")); + wc_printf(_("every ")); + wc_printf("%s
", _("year on this date")); - wprintf("", - ((which_rryeartype_is_preselected == 1) ? "checked" : "") + ((which_rryeartype_is_preselected == 1) ? "checked='checked'" : "") ); - wprintf(_("on the ")); - wprintf(" \n"); + wc_printf(" \n"); - wprintf(""); + wc_printf(""); - wprintf(" %s ", _("of")); + wc_printf(" %s ", _("of")); - wprintf(""); - wprintf("
\n"); + wc_printf(""); + wc_printf("
\n"); - wprintf("
\n"); /* end 'yearday_selector' div */ + wc_printf("
\n"); /* end 'yearday_selector' div */ - wprintf("
"); - wprintf(_("Recurrence range")); - wprintf("\n"); + wc_printf("
"); + wc_printf(_("Recurrence range")); + wc_printf("\n"); - wprintf("", - ((which_rrend_is_preselected == 0) ? "checked" : "") + ((which_rrend_is_preselected == 0) ? "checked='checked'" : "") ); - wprintf("%s
\n", _("No ending date")); + wc_printf("%s
\n", _("No ending date")); - wprintf("", - ((which_rrend_is_preselected == 1) ? "checked" : "") + ((which_rrend_is_preselected == 1) ? "checked='checked'" : "") ); - wprintf(_("Repeat this event")); - wprintf(" ", recur.count); - wprintf(_("times")); - wprintf("
\n"); + wc_printf(_("Repeat this event")); + wc_printf(" ", recur.count); + wc_printf(_("times")); + wc_printf("
\n"); - wprintf("", - ((which_rrend_is_preselected == 2) ? "checked" : "") + ((which_rrend_is_preselected == 2) ? "checked='checked'" : "") ); - wprintf(_("Repeat this event until ")); + wc_printf(_("Repeat this event until ")); if (icaltime_is_null_time(recur.until)) { recur.until = icaltime_add(t_start, icaldurationtype_from_int(604800)); } display_icaltimetype_as_webform(&recur.until, "rruntil", 1); - wprintf("
\n"); + wc_printf("
\n"); - wprintf("
\n"); - wprintf("
\n"); /* end 'rrule' div */ + wc_printf("
\n"); + wc_printf("
\n"); /* end 'rrule' div */ end_tab(2, 3); /* submit buttons (common area beneath the tabs) */ begin_tab(3, 3); - wprintf("
" - "" + wc_printf("
" + "" "  " - "\n" + "\n" "  " - "\n" + "\n" "  " - "\n" - "
\n", + "\n" + "
\n", _("Save"), _("Delete"), _("Check attendee availability"), _("Cancel") ); - wprintf("
\n"); end_tab(3, 3); - - wprintf("
\n"); /* end 'fix_scrollbar_bug' div */ + wc_printf("\n"); StrBufAppendPrintf(WC->trailing_javascript, - "eventEditAllDay(); \n" - "RecurrenceShowHide(); \n" + "eventEditAllDay(); \n" + "RecurrenceShowHide(); \n" + "EnableOrDisableCheckButton(); \n" ); - address_book_popup(); + do_template("addressbook_popup"); + wDumpContent(1); if (created_new_vevent) { @@ -742,7 +793,8 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum, * msgnum: the index on the citserver */ void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *from, - int unread, struct calview *calv) { + int unread, calview *calv) { + StrBuf *Buf; char buf[SIZ]; icalproperty *prop; icalcomponent *vevent, *encaps; @@ -757,6 +809,7 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *fr char organizer_string[SIZ]; int sequence = 0; enum icalproperty_transp formtransp = ICAL_TRANSP_NONE; + const char *ch; if (supplied_vevent != NULL) { vevent = supplied_vevent; @@ -775,7 +828,7 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *fr if (icalcomponent_isa(vevent) == ICAL_VCALENDAR_COMPONENT) { save_individual_event( icalcomponent_get_first_component( - vevent, ICAL_VEVENT_COMPONENT), + vevent, ICAL_VEVENT_COMPONENT), msgnum, from, unread, NULL ); return; @@ -797,15 +850,19 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *fr icalproperty_free(prop); } + /* Add NOW() to the calendar object... */ + icalcomponent_set_dtstamp(vevent, + icaltime_from_timet_with_zone( + time(NULL), 0, icaltimezone_get_utc_timezone())); + if (havebstr("summary")) { - icalcomponent_add_property(vevent, icalproperty_new_summary(bstr("summary"))); } else { icalcomponent_add_property(vevent, - icalproperty_new_summary("Untitled Event")); + icalproperty_new_summary(_("Untitled Event"))); } - + while (prop = icalcomponent_get_first_property(vevent, ICAL_LOCATION_PROPERTY), prop != NULL) { icalcomponent_remove_property(vevent, prop); @@ -866,14 +923,21 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *fr icalproperty_free(prop); } - if (all_day_event == 0) { - icaltime_from_webform(&t, "dtend"); - icalcomponent_add_property(vevent, - icalproperty_new_dtend(icaltime_normalize(t) - ) - ); + if (all_day_event) { + icaltime_from_webform_dateonly(&t, "dtend"); + + /* with this field supposed to be non-inclusive we have to add one day */ + icaltime_adjust(&t, 1, 0, 0, 0); + } + else { + icaltime_from_webform(&t, "dtend"); } + icalcomponent_add_property(vevent, + icalproperty_new_dtend(icaltime_normalize(t) + ) + ); + /* recurrence rules -- begin */ /* remove any existing rule */ @@ -994,14 +1058,14 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *fr icalcomponent_add_property(vevent, icalproperty_new_sequence(sequence) ); - + /* * Set the organizer, only if one does not already exist *and* * the form is supplying one */ strcpy(buf, bstr("organizer")); if ( (icalcomponent_get_first_property(vevent, - ICAL_ORGANIZER_PROPERTY) == NULL) + ICAL_ORGANIZER_PROPERTY) == NULL) && (!IsEmptyStr(buf)) ) { /* set new organizer */ @@ -1018,11 +1082,7 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *fr /* First, strip out the parenthesized partstats. */ strcpy(form_attendees, bstr("attendees")); - do { - i = strlen(form_attendees); - stripout(form_attendees, '(', ')'); - j = strlen(form_attendees); - } while (i != j); + while ( stripout(form_attendees, '(', ')') != 0); /* Next, change any commas to newlines, because we want newline-separated attendees. */ j = strlen(form_attendees); @@ -1038,21 +1098,21 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *fr /* Now iterate! */ for (i=0; iImportantMessage, &buf[4]); + case '4': + while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {} + break; + case '2': + AppendImportantMessage(buf + 4, - 1); + break; + default: + break; } icalmemory_free_ring (); icalcomponent_free(encaps); @@ -1145,8 +1211,13 @@ STARTOVER: for (attendee = icalcomponent_get_first_property(vevent, ICAL_ATTENDE icalcomponent_free(vevent); } - /* If this was a save or delete, go back to the calendar view. */ + /* If this was a save or delete, go back to the calendar or summary view. */ if (!havebstr("check_button")) { - readloop(readfwd); + if (!strcasecmp(bstr("calview"), "summary")) { + display_summary_page(); + } + else { + readloop(readfwd, eUseDefault); + } } }