X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fevent.c;h=c9deb38b69ebb1da80173188df78c99ed40967f4;hb=cf934431c7c8c1091b38c0b374f6a3b9293841ca;hp=9c4aabd21d3b804ea1d54c9df44d6dae6668e37a;hpb=2dfb099ebb1debfc33600d4bb6029e06f1b27143;p=citadel.git diff --git a/webcit/event.c b/webcit/event.c index 9c4aabd21..c9deb38b6 100644 --- a/webcit/event.c +++ b/webcit/event.c @@ -2,38 +2,18 @@ * $Id$ * * Editing calendar events. - * */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include "webcit.h" #include "webserver.h" -#ifdef WEBCIT_WITH_CALENDAR_SERVICE - /* - * Display an event by itself (for editing) + * \brief Display an event by itself (for editing) + * \param supplied_vevent the event to edit + * \param msgnum reference on the citserver */ -void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) { +void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum, char *from, int unread) { icalcomponent *vevent; icalproperty *p; icalvalue *v; @@ -50,13 +30,18 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) int i; int sequence = 0; + lprintf(9, "display_edit_individual_event(%ld) calview=%s year=%s month=%s day=%s\n", + msgnum, bstr("calview"), bstr("year"), bstr("month"), bstr("day") + ); + now = time(NULL); strcpy(organizer_string, ""); strcpy(attendee_string, ""); if (supplied_vevent != NULL) { vevent = supplied_vevent; - /* If we're looking at a fully encapsulated VCALENDAR + /** + * If we're looking at a fully encapsulated VCALENDAR * rather than a VEVENT component, attempt to use the first * relevant VEVENT subcomponent. If there is none, the * NULL returned by icalcomponent_get_first_component() will @@ -66,8 +51,8 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) if (icalcomponent_isa(vevent) == ICAL_VCALENDAR_COMPONENT) { display_edit_individual_event( icalcomponent_get_first_component( - vevent, ICAL_VEVENT_COMPONENT - ), msgnum + vevent, ICAL_VEVENT_COMPONENT), + msgnum, from, unread ); return; } @@ -77,17 +62,53 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) created_new_vevent = 1; } - /* Learn the sequence */ + /** Learn the sequence */ p = icalcomponent_get_first_property(vevent, ICAL_SEQUENCE_PROPERTY); if (p != NULL) { sequence = icalproperty_get_sequence(p); } - /* Begin output */ - output_headers(1, 1, 0, 0, 0, 0, 0); - do_template("beginbox_nt"); - wprintf("

 " - " Add or edit an event

\n"); + /** Begin output */ + output_headers(1, 1, 2, 0, 0, 0); + wprintf("
\n"); + wprintf("

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

"); + wprintf("
\n"); + + wprintf("
\n"); + + wprintf("\n" + ); + + + wprintf("
" + "
\n"); /************************************************************ * Uncomment this to see the UID in calendar events for debugging @@ -100,7 +121,8 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) wprintf("SEQUENCE == %d
\n", sequence); *************************************************************/ - wprintf("
\n"); + wprintf("\n"); + wprintf("\n", WC->nonce); wprintf("\n", msgnum); @@ -113,10 +135,12 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) wprintf("\n", bstr("day")); - /* Put it in a borderless table so it lines up nicely */ + /** Put it in a borderless table so it lines up nicely */ wprintf("\n"); - wprintf("\n"); - wprintf("\n"); - wprintf("\n"); - /* If this is an all-day-event, set the end time to be identical to + /** + * 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"); - wprintf(""); - /* For a new event, the user creating the event should be the + /** + * For a new event, the user creating the event should be the * organizer. Set this field accordingly. */ if (icalcomponent_get_first_property(vevent, ICAL_ORGANIZER_PROPERTY) @@ -255,34 +266,35 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) ); } - /* Determine who is the organizer of this event. + /** + * Determine who is the organizer of this event. * We need to determine "me" or "not me." */ - organizer = icalcomponent_get_first_property(vevent, - ICAL_ORGANIZER_PROPERTY); + 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)) { strcpy(organizer_string, &organizer_string[7]); striplt(organizer_string); - lprintf(9, "ISME %s\n", organizer_string); serv_printf("ISME %s", organizer_string); - serv_gets(buf); - lprintf(9, "%s\n", buf); + serv_getln(buf, sizeof buf); if (buf[0] == '2') { organizer_is_me = 1; } } } - wprintf("\n"); - /* Transparency */ - wprintf("\n"); - /* Attendees */ - wprintf("\n"); - /* Done with properties. */ + /** Done with properties. */ wprintf("
Summary\n" + wprintf("
"); + wprintf(_("Summary")); + wprintf("\n" "
Location\n" + wprintf("
"); + wprintf(_("Location")); + wprintf("\n" "
Start\n"); + wprintf("
"); + wprintf(_("Start")); + wprintf("\n"); p = icalcomponent_get_first_property(vevent, ICAL_DTSTART_PROPERTY); if (p != NULL) { t_start = icalproperty_get_dtstart(p); @@ -146,18 +174,18 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) } else { localtime_r(&now, &tm_now); - if (strlen(bstr("year")) > 0) { + if (!IsEmptyStr(bstr("year"))) { tm_now.tm_year = atoi(bstr("year")) - 1900; tm_now.tm_mon = atoi(bstr("month")) - 1; tm_now.tm_mday = atoi(bstr("day")); } - if (strlen(bstr("hour")) > 0) { + if (!IsEmptyStr(bstr("hour"))) { tm_now.tm_hour = atoi(bstr("hour")); tm_now.tm_min = atoi(bstr("minute")); tm_now.tm_sec = 0; } else { - tm_now.tm_hour = 9; + tm_now.tm_hour = 0; tm_now.tm_min = 0; tm_now.tm_sec = 0; } @@ -173,43 +201,22 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) display_icaltimetype_as_webform(&t_start, "dtstart"); wprintf("All day event", - (t_start.is_date ? "CHECKED" : "" ) + "VALUE=\"yes\" onClick=\"grey_all_day();\"" + " %s >%s", + (t_start.is_date ? "CHECKED" : "" ), + _("All day event") ); wprintf("
End\n"); + wprintf("
"); + wprintf(_("End")); + wprintf("\n"); if (t_start.is_date) { t_end = t_start; } @@ -220,7 +227,8 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) t_end = icalproperty_get_dtend(p); } else { - /* If this is not an all-day event and there is no + /** + * If this is not an all-day event and there is no * end time specified, make the default one hour * from the start time. */ @@ -234,7 +242,9 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) display_icaltimetype_as_webform(&t_end, "dtend"); wprintf("
Notes\n" + wprintf("
"); + wprintf(_("Notes")); + wprintf("\n" "
Organizer"); + wprintf("
"); + wprintf(_("Organizer")); + wprintf(""); escputs(organizer_string); if (organizer_is_me) { - wprintf(" " - "(you are the organizer)\n"); + wprintf(" "); + wprintf(_("(you are the organizer)")); + wprintf("\n"); } - /* + /** * Transmit the organizer as a hidden field. We don't want the user * to be able to change it, but we do want it fed back to the server, * especially if this is a new event and there is no organizer already @@ -294,12 +306,14 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) wprintf("
Show time as:"); + /** Transparency */ + wprintf("
"); + wprintf(_("Show time as:")); + wprintf(""); p = icalcomponent_get_first_property(vevent, ICAL_TRANSP_PROPERTY); if (p == NULL) { - /* No transparency found. Default to opaque (busy). */ + /** No transparency found. Default to opaque (busy). */ p = icalproperty_new_transp(ICAL_TRANSP_OPAQUE); if (p != NULL) { icalcomponent_add_property(vevent, p); @@ -315,20 +329,39 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) wprintf("Free  "); + wprintf(">"); + wprintf(_("Free")); + wprintf("  "); wprintf("Busy"); + wprintf(">"); + wprintf(_("Busy")); wprintf("
Attendees
" - "(One per line)" - "
" - "
\n
" - "" + "" "  " - "\n" + "\n" "  " - "\n" + "\n" "  " - "\n" - "
\n" + "\n" + "\n", + _("Save"), + _("Delete"), + _("Check attendee availability"), + _("Cancel") ); wprintf("
\n"); + wprintf("
\n"); wprintf("\n" ); - - do_template("endbox"); + + address_book_popup(); wDumpContent(1); if (created_new_vevent) { @@ -404,20 +419,21 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) } } -/* - * Save an edited event - * +/** + * \brief Save an edited event + * \param supplied_vevent the event to save + * \param msgnum the index on the citserver */ -void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { +void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *from, int unread) { char buf[SIZ]; icalproperty *prop; icalcomponent *vevent, *encaps; int created_new_vevent = 0; int all_day_event = 0; - struct icaltimetype event_start; + struct icaltimetype event_start, t; icalproperty *attendee = NULL; char attendee_string[SIZ]; - int i; + int i, j; int foundit; char form_attendees[SIZ]; char organizer_string[SIZ]; @@ -426,7 +442,8 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { if (supplied_vevent != NULL) { vevent = supplied_vevent; - /* If we're looking at a fully encapsulated VCALENDAR + /** + * If we're looking at a fully encapsulated VCALENDAR * rather than a VEVENT component, attempt to use the first * relevant VEVENT subcomponent. If there is none, the * NULL returned by icalcomponent_get_first_component() will @@ -436,8 +453,8 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { if (icalcomponent_isa(vevent) == ICAL_VCALENDAR_COMPONENT) { save_individual_event( icalcomponent_get_first_component( - vevent, ICAL_VEVENT_COMPONENT - ), msgnum + vevent, ICAL_VEVENT_COMPONENT), + msgnum, from, unread ); return; } @@ -447,35 +464,45 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { created_new_vevent = 1; } - if ( (!strcasecmp(bstr("sc"), "Save")) - || (!strcasecmp(bstr("sc"), "Check attendee availability")) ) { + if ( (!IsEmptyStr(bstr("save_button"))) + || (!IsEmptyStr(bstr("check_button"))) ) { - /* Replace values in the component with ones from the form */ + /** Replace values in the component with ones from the form */ while (prop = icalcomponent_get_first_property(vevent, ICAL_SUMMARY_PROPERTY), prop != NULL) { icalcomponent_remove_property(vevent, prop); icalproperty_free(prop); } - icalcomponent_add_property(vevent, - icalproperty_new_summary(bstr("summary"))); - while (prop = icalcomponent_get_first_property(vevent, - ICAL_LOCATION_PROPERTY), prop != NULL) { - icalcomponent_remove_property(vevent, prop); - icalproperty_free(prop); - } - icalcomponent_add_property(vevent, - icalproperty_new_location(bstr("location"))); - - while (prop = icalcomponent_get_first_property(vevent, - ICAL_DESCRIPTION_PROPERTY), prop != NULL) { - icalcomponent_remove_property(vevent, prop); - icalproperty_free(prop); - } - icalcomponent_add_property(vevent, - icalproperty_new_description(bstr("description"))); + if (!IsEmptyStr(bstr("summary"))) { + icalcomponent_add_property(vevent, + icalproperty_new_summary(bstr("summary"))); + } else { + icalcomponent_add_property(vevent, + icalproperty_new_summary("Untitled Event")); + } + + while (prop = icalcomponent_get_first_property(vevent, + ICAL_LOCATION_PROPERTY), prop != NULL) { + icalcomponent_remove_property(vevent, prop); + icalproperty_free(prop); + } + if (!IsEmptyStr(bstr("location"))) { + icalcomponent_add_property(vevent, + icalproperty_new_location(bstr("location"))); + } + while (prop = icalcomponent_get_first_property(vevent, + ICAL_DESCRIPTION_PROPERTY), prop != NULL) { + icalcomponent_remove_property(vevent, prop); + icalproperty_free(prop); + } + if (!IsEmptyStr(bstr("description"))) { + icalcomponent_add_property(vevent, + icalproperty_new_description(bstr("description"))); + } + while (prop = icalcomponent_get_first_property(vevent, ICAL_DTSTART_PROPERTY), prop != NULL) { icalcomponent_remove_property(vevent, prop); @@ -489,16 +516,15 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { all_day_event = 0; } - event_start = icaltime_from_webform("dtstart"); if (all_day_event) { - event_start.is_date = 1; - event_start.hour = 0; - event_start.minute = 0; - event_start.second = 0; + icaltime_from_webform_dateonly(&event_start, "dtstart"); + } + else { + icaltime_from_webform(&event_start, "dtstart"); } - - /* The following odd-looking snippet of code looks like it + /** + * The following odd-looking snippet of code looks like it * takes some unnecessary steps. It is done this way because * libical incorrectly turns an "all day event" into a normal * event starting at midnight (i.e. it serializes as date/time @@ -507,9 +533,7 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { */ prop = icalproperty_new_dtstart(event_start); if (all_day_event) { - icalproperty_set_value(prop, - icalvalue_new_date(event_start) - ); + icalproperty_set_value(prop, icalvalue_new_date(event_start)); } if (prop) icalcomponent_add_property(vevent, prop); @@ -527,15 +551,15 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { } if (all_day_event == 0) { + icaltime_from_webform(&t, "dtend"); icalcomponent_add_property(vevent, - icalproperty_new_dtend(icaltime_normalize( - icaltime_from_webform("dtend")) + icalproperty_new_dtend(icaltime_normalize(t) ) ); } - /* See if transparency is indicated */ - if (strlen(bstr("transp")) > 0) { + /** See if transparency is indicated */ + if (!IsEmptyStr(bstr("transp"))) { if (!strcasecmp(bstr("transp"), "opaque")) { formtransp = ICAL_TRANSP_OPAQUE; } @@ -549,69 +573,70 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { icalproperty_free(prop); } - lprintf(9, "adding new property...\n"); icalcomponent_add_property(vevent, icalproperty_new_transp(formtransp)); - lprintf(9, "...added it.\n"); } - /* Give this event a UID if it doesn't have one. */ - lprintf(9, "Give this event a UID if it doesn't have one.\n"); + /** Give this event a UID if it doesn't have one. */ if (icalcomponent_get_first_property(vevent, ICAL_UID_PROPERTY) == NULL) { generate_uuid(buf); - icalcomponent_add_property(vevent, - icalproperty_new_uid(buf) - ); + icalcomponent_add_property(vevent, icalproperty_new_uid(buf)); } - /* Increment the sequence ID */ - lprintf(9, "Increment the sequence ID\n"); + /** Increment the sequence ID */ while (prop = icalcomponent_get_first_property(vevent, 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(vevent, prop); icalproperty_free(prop); } ++sequence; - lprintf(9, "New sequence is %d. Adding...\n", sequence); icalcomponent_add_property(vevent, icalproperty_new_sequence(sequence) ); - /* Set the organizer, only if one does not already exist *and* + /** + * Set the organizer, only if one does not already exist *and* * the form is supplying one */ - lprintf(9, "Setting the organizer...\n"); strcpy(buf, bstr("organizer")); if ( (icalcomponent_get_first_property(vevent, ICAL_ORGANIZER_PROPERTY) == NULL) - && (strlen(buf) > 0) ) { + && (!IsEmptyStr(buf)) ) { - /* set new organizer */ + /** set new organizer */ sprintf(organizer_string, "MAILTO:%s", buf); icalcomponent_add_property(vevent, - icalproperty_new_organizer(organizer_string) + icalproperty_new_organizer(organizer_string) ); } - /* + /** * Add any new attendees listed in the web form */ - lprintf(9, "Add any new attendees\n"); /* First, strip out the parenthesized partstats. */ strcpy(form_attendees, bstr("attendees")); stripout(form_attendees, '(', ')'); - /* Now iterate! */ + /* Next, change any commas to newlines, because we want newline-separated attendees. */ + j = strlen(form_attendees); + for (i=0; i 0) { - lprintf(9, "Attendee: <%s>\n", buf); + if (!IsEmptyStr(buf)) { sprintf(attendee_string, "MAILTO:%s", buf); foundit = 0; @@ -630,18 +655,17 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { } } - /* + /** * Remove any attendees *not* listed in the web form */ -STARTOVER: lprintf(9, "Remove unlisted attendees\n"); - for (attendee = icalcomponent_get_first_property(vevent, ICAL_ATTENDEE_PROPERTY); attendee != NULL; attendee = icalcomponent_get_next_property(vevent, ICAL_ATTENDEE_PROPERTY)) { +STARTOVER: for (attendee = icalcomponent_get_first_property(vevent, ICAL_ATTENDEE_PROPERTY); attendee != NULL; attendee = icalcomponent_get_next_property(vevent, ICAL_ATTENDEE_PROPERTY)) { strcpy(attendee_string, icalproperty_get_attendee(attendee)); if (!strncasecmp(attendee_string, "MAILTO:", 7)) { strcpy(attendee_string, &attendee_string[7]); striplt(attendee_string); foundit = 0; for (i=0; iImportantMessage, &buf[4]); } + icalmemory_free_ring (); icalcomponent_free(encaps); } - /* Or, check attendee availability if the user asked for that. */ - if ( (encaps != NULL) && (!strcasecmp(bstr("sc"), "Check attendee availability")) ) { + /** Or, check attendee availability if the user asked for that. */ + if ( (encaps != NULL) && (!IsEmptyStr(bstr("check_button"))) ) { - /* Call this function, which does the real work */ + /** Call this function, which does the real work */ check_attendee_availability(encaps); - /* This displays the form again, with our annotations */ - display_edit_individual_event(encaps, msgnum); + /** This displays the form again, with our annotations */ + display_edit_individual_event(encaps, msgnum, from, unread); icalcomponent_free(encaps); } } - /* + /** * If the user clicked 'Delete' then delete it. */ - lprintf(9, "Checking to see if we have to delete an old event\n"); - if ( (!strcasecmp(bstr("sc"), "Delete")) && (msgnum > 0L) ) { + if ( (!IsEmptyStr(bstr("delete_button"))) && (msgnum > 0L) ) { serv_printf("DELE %ld", atol(bstr("msgnum"))); - serv_gets(buf); + serv_getln(buf, sizeof buf); } if (created_new_vevent) { icalcomponent_free(vevent); } - /* If this was a save or deelete, go back to the calendar view. */ - if (strcasecmp(bstr("sc"), "Check attendee availability")) { + /** If this was a save or delete, go back to the calendar view. */ + if (IsEmptyStr(bstr("check_button"))) { readloop("readfwd"); } } -#endif /* WEBCIT_WITH_CALENDAR_SERVICE */