X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fevent.c;h=94fac68dbc9d4188cfea0eb40d42ff7728083431;hb=694a3ea878536e2deda1c0168e51837a31b81af7;hp=fef2275ab4440e28e4afd12fa682889b7de84ef9;hpb=a66490f6bbe038bf7bbe2e007ee156bd4495612b;p=citadel.git diff --git a/webcit/event.c b/webcit/event.c index fef2275ab..94fac68db 100644 --- a/webcit/event.c +++ b/webcit/event.c @@ -1,37 +1,21 @@ /* * $Id$ - * - * Editing calendar events. - * */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +/** + * \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; @@ -46,17 +30,18 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) icalproperty *attendee = NULL; char attendee_string[SIZ]; char buf[SIZ]; - int i; int organizer_is_me = 0; + int i; int sequence = 0; - now = time(NULL) % 60; /* mod 60 to force :00 seconds */ + 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 @@ -77,17 +62,54 @@ 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(3); - do_template("beginbox_nt"); - wprintf("

 " - " Add or edit an event

\n"); + /** Begin output */ + output_headers(1, 1, 2, 0, 0, 0); + wprintf("
\n" + "
" + ""); + wprintf(_("Add or edit an event")); + wprintf("" + "
\n" + "
\n
\n" + ); + + wprintf("\n" + ); + + + wprintf("
" + "
\n"); /************************************************************ * Uncomment this to see the UID in calendar events for debugging @@ -96,11 +118,11 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) if (p != NULL) { escputs((char *)icalproperty_get_comment(p)); } - wprintf("
\n"); - wprintf("SEQUENCE == %d
\n", sequence); + wprintf("
\n"); + wprintf("SEQUENCE == %d
\n", sequence); *************************************************************/ - wprintf("
\n"); + wprintf("\n"); 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) @@ -253,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); @@ -145,10 +173,12 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) } } else { - memcpy(&tm_now, localtime(&now), sizeof(struct tm)); - tm_now.tm_year = atoi(bstr("year")) - 1900; - tm_now.tm_mon = atoi(bstr("month")) - 1; - tm_now.tm_mday = atoi(bstr("day")); + localtime_r(&now, &tm_now); + if (strlen(bstr("year")) > 0) { + 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) { tm_now.tm_hour = atoi(bstr("hour")); tm_now.tm_min = atoi(bstr("minute")); @@ -171,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; } @@ -218,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. */ @@ -232,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 @@ -292,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); @@ -313,19 +329,25 @@ 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)" - "
" + /** Attendees */ + wprintf("
"); + wprintf(_("Attendees")); + wprintf("
" + ""); + wprintf(_("(One per line)")); + wprintf("
" "
\n
" - "" + "" "  " - "\n" + "\n" "  " - "\n" + "\n" "  " - "\n" - "
\n" + "\n" + "\n", + _("Save"), + _("Delete"), + _("Check attendee availability"), + _("Cancel") ); wprintf("
\n"); - wprintf("\n" + wprintf("
\n"); + wprintf("\n" ); - - do_template("endbox"); wDumpContent(1); if (created_new_vevent) { @@ -402,9 +404,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 +415,7 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { 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; @@ -424,7 +427,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 @@ -445,10 +449,10 @@ 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 ( (strlen(bstr("save_button")) > 0) + || (strlen(bstr("check_button")) > 0) ) { - /* 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) { @@ -487,16 +491,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 @@ -525,14 +528,14 @@ 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 */ + /** See if transparency is indicated */ if (strlen(bstr("transp")) > 0) { if (!strcasecmp(bstr("transp"), "opaque")) { formtransp = ICAL_TRANSP_OPAQUE; @@ -552,17 +555,17 @@ 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) { - generate_new_uid(buf); + generate_uuid(buf); icalcomponent_add_property(vevent, icalproperty_new_uid(buf) ); } - /* 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) ) { @@ -578,7 +581,8 @@ 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"); @@ -587,7 +591,7 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { ICAL_ORGANIZER_PROPERTY) == NULL) && (strlen(buf) > 0) ) { - /* set new organizer */ + /** set new organizer */ sprintf(organizer_string, "MAILTO:%s", buf); icalcomponent_add_property(vevent, icalproperty_new_organizer(organizer_string) @@ -595,7 +599,7 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { } - /* + /** * Add any new attendees listed in the web form */ lprintf(9, "Add any new attendees\n"); @@ -604,9 +608,9 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum) { strcpy(form_attendees, bstr("attendees")); stripout(form_attendees, '(', ')'); - /* Now iterate! */ + /** Now iterate! */ for (i=0; i 0) { lprintf(9, "Attendee: <%s>\n", buf); @@ -628,7 +632,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"); @@ -639,7 +643,7 @@ STARTOVER: lprintf(9, "Remove unlisted attendees\n"); striplt(attendee_string); foundit = 0; for (i=0; i 0) ) { + serv_puts("ENT0 1|||4|||1|"); + serv_getln(buf, sizeof buf); + if (buf[0] == '8') { serv_puts("Content-type: text/calendar"); serv_puts(""); 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); + } 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) && (strlen(bstr("check_button")) > 0) ) { - /* 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); @@ -689,24 +696,26 @@ 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 ( (!strcasecmp(bstr("sc"), "Delete")) && (msgnum > 0L) ) { + if ( (strlen(bstr("delete_button")) > 0) && (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 deelete, go back to the calendar view. */ + if (strlen(bstr("check_button")) == 0) { readloop("readfwd"); } } #endif /* WEBCIT_WITH_CALENDAR_SERVICE */ + +/*@}*/