X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fevent.c;h=4aa7f9ef1e7bc1a67f7453bf51809e1e63d0468b;hb=c477d6a73cf3afdc47913e2c775ceb5938b6a469;hp=dfd3478d4b9f9542d17fc119305d48ac19b89de2;hpb=83a596532ec7b9b8da83137ea18425bd525ba9ac;p=citadel.git diff --git a/webcit/event.c b/webcit/event.c index dfd3478d4..4aa7f9ef1 100644 --- a/webcit/event.c +++ b/webcit/event.c @@ -1,18 +1,21 @@ /* * $Id$ - * - * Editing calendar events. - * */ - +/** + * \defgroup EditCal Editing calendar events. + * \ingroup Calendaring + */ +/*@{*/ #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) { icalcomponent *vevent; @@ -37,7 +40,8 @@ void display_edit_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 @@ -58,16 +62,16 @@ 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, 2, 0, 0, 0, 0); + /** Begin output */ + output_headers(1, 1, 2, 0, 0, 0); wprintf("
\n" - "
" + "
" ""); wprintf(_("Add or edit an event")); wprintf("" @@ -104,8 +108,8 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) ); - wprintf("
" - "
\n"); + wprintf("
" + "
\n"); /************************************************************ * Uncomment this to see the UID in calendar events for debugging @@ -118,7 +122,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); @@ -131,7 +136,7 @@ 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"); - /* 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. */ @@ -222,7 +228,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. */ @@ -248,7 +255,8 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) } 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) @@ -259,20 +267,18 @@ 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_getln(buf, sizeof buf); - lprintf(9, "%s\n", buf); if (buf[0] == '2') { organizer_is_me = 1; } @@ -289,7 +295,7 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) 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 @@ -301,14 +307,14 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) wprintf("\n"); - /* Transparency */ + /** Transparency */ wprintf("\n"); - /* Attendees */ + /** Attendees */ wprintf("\n"); - /* Done with properties. */ + /** Done with properties. */ wprintf("
"); @@ -170,12 +175,12 @@ 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; @@ -205,7 +210,8 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) 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); @@ -336,14 +342,27 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) wprintf("
"); wprintf(_("Attendees")); wprintf("
" - ""); + ""); wprintf(_("(One per line)")); - wprintf("
" - "
\n
" "" "  " @@ -392,6 +411,8 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) "grey_all_day();" "\n" ); + + address_book_popup(); wDumpContent(1); if (created_new_vevent) { @@ -399,9 +420,10 @@ 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) { char buf[SIZ]; @@ -412,7 +434,7 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { 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]; @@ -421,7 +443,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 @@ -442,35 +465,45 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { created_new_vevent = 1; } - if ( (strlen(bstr("save_button")) > 0) - || (strlen(bstr("check_button")) > 0) ) { + 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); @@ -491,7 +524,8 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { 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 @@ -527,8 +561,8 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { ); } - /* 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; } @@ -547,7 +581,7 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { lprintf(9, "...added it.\n"); } - /* Give this event a UID if it doesn't have one. */ + /** 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"); if (icalcomponent_get_first_property(vevent, ICAL_UID_PROPERTY) == NULL) { @@ -557,7 +591,7 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { ); } - /* Increment the sequence ID */ + /** Increment the sequence ID */ lprintf(9, "Increment the sequence ID\n"); while (prop = icalcomponent_get_first_property(vevent, ICAL_SEQUENCE_PROPERTY), (prop != NULL) ) { @@ -573,24 +607,25 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { 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"); @@ -599,11 +634,22 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { 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) { + if (!IsEmptyStr(buf)) { lprintf(9, "Attendee: <%s>\n", buf); sprintf(attendee_string, "MAILTO:%s", buf); foundit = 0; @@ -623,7 +669,7 @@ 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"); @@ -646,7 +692,7 @@ STARTOVER: lprintf(9, "Remove unlisted attendees\n"); } } - /* + /** * 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 @@ -656,9 +702,12 @@ STARTOVER: lprintf(9, "Remove unlisted attendees\n"); lprintf(9, "Encapsulating into full VCALENDAR component\n"); encaps = ical_encapsulate_subcomponent(icalcomponent_new_clone(vevent)); - /* If the user clicked 'Save' then save it to the server. */ + /* Set the method to PUBLISH */ + icalcomponent_set_method(encaps, ICAL_METHOD_PUBLISH); + + /** If the user clicked 'Save' then save it to the server. */ lprintf(9, "Serializing it for saving\n"); - if ( (encaps != NULL) && (strlen(bstr("save_button")) > 0) ) { + if ( (encaps != NULL) && (!IsEmptyStr(bstr("save_button"))) ) { serv_puts("ENT0 1|||4|||1|"); serv_getln(buf, sizeof buf); if (buf[0] == '8') { @@ -667,19 +716,24 @@ STARTOVER: lprintf(9, "Remove unlisted attendees\n"); serv_puts(icalcomponent_as_ical_string(encaps)); serv_puts("000"); } - while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { - lprintf(9, "ENT0 REPLY: %s\n", buf); + if ( (buf[0] == '8') || (buf[0] == '4') ) { + while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { + lprintf(9, "ENT0 REPLY: %s\n", buf); + } + } + if (buf[0] == '2') { + strcpy(WC->ImportantMessage, &buf[4]); } icalcomponent_free(encaps); } - /* Or, check attendee availability if the user asked for that. */ - if ( (encaps != NULL) && (strlen(bstr("check_button")) > 0) ) { + /** 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 */ + /** This displays the form again, with our annotations */ display_edit_individual_event(encaps, msgnum); icalcomponent_free(encaps); @@ -687,11 +741,11 @@ STARTOVER: lprintf(9, "Remove unlisted attendees\n"); } - /* + /** * If the user clicked 'Delete' then delete it. */ lprintf(9, "Checking to see if we have to delete an old event\n"); - if ( (strlen(bstr("delete_button")) > 0) && (msgnum > 0L) ) { + if ( (!IsEmptyStr(bstr("delete_button"))) && (msgnum > 0L) ) { serv_printf("DELE %ld", atol(bstr("msgnum"))); serv_getln(buf, sizeof buf); } @@ -700,11 +754,13 @@ STARTOVER: lprintf(9, "Remove unlisted attendees\n"); icalcomponent_free(vevent); } - /* If this was a save or deelete, go back to the calendar view. */ - if (strlen(bstr("check_button")) == 0) { + /** 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 */ + +/*@}*/