X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fcalendar.c;h=d705046d2e30a877e26761fc339fe1b15052fe25;hb=8d8c5af38e5026933ea3b9d5eb1b75f276df1d99;hp=751d387f3ad987336e428575206dabf6895d3a44;hpb=80ef607866a31ea094b49657d660ea13c037e14b;p=citadel.git diff --git a/webcit/calendar.c b/webcit/calendar.c index 751d387f3..d705046d2 100644 --- a/webcit/calendar.c +++ b/webcit/calendar.c @@ -1,64 +1,59 @@ /* * $Id$ - * - * Functions which handle calendar objects and their processing/display. - * */ +/** + * \defgroup calav Functions which handle calendar objects and their processing/display. + * \ingroup Calendaring + */ +/* @{ */ -#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" #ifndef WEBCIT_WITH_CALENDAR_SERVICE -/* +/** + * \brief get around non existing types * Handler stubs for builds with no calendar library available + * \param part_source dummy pointer to the source + * \param msgnum number of the mesage in the db + * \param cal_partnum number of the calendar part */ void cal_process_attachment(char *part_source, long msgnum, char *cal_partnum) { - wprintf("This message contains calendaring/scheduling information," + wprintf(_("This message contains calendaring/scheduling information," " but support for calendars is not available on this " "particular system. Please ask your system administrator to " "install a new version of the Citadel web service with " - "calendaring enabled.
\n" + "calendaring enabled.

\n") ); } +/** + * \brief say we can't display calendar items + * \param msgnum number of the mesage in our db + */ void display_calendar(long msgnum) { - wprintf("" + wprintf(_("" "Cannot display calendar item. You are seeing this error " "because your WebCit service has not been installed with " "calendar support. Please contact your system administrator." - "
\n"); + "

\n")); } +/** + * \brief say we can't display task items + * \param msgnum number of the mesage in our db + */ void display_task(long msgnum) { - wprintf("" + wprintf(_("" "Cannot display to-do item. You are seeing this error " "because your WebCit service has not been installed with " "calendar support. Please contact your system administrator." - "
\n"); + "

\n")); } - +/** ok, we have calendaring available */ #else /* WEBCIT_WITH_CALENDAR_SERVICE */ @@ -67,12 +62,13 @@ void display_task(long msgnum) { -/* - * Process a calendar object +/** + * \brief Process a calendar object * ...at this point it's already been deserialized by cal_process_attachment() - * - * ok for complete vcalendar objects - * + * \param cal teh calendar object + * \param recursion_level call stack depth ?????? + * \param msgnum number of the mesage in our db + * \param cal_partnum of the calendar object ???? */ void cal_process_object(icalcomponent *cal, int recursion_level, @@ -85,72 +81,77 @@ void cal_process_object(icalcomponent *cal, icalproperty *p; struct icaltimetype t; time_t tt; - char buf[SIZ]; - char conflict_name[SIZ]; + char buf[256]; + char conflict_name[256]; + char conflict_message[256]; int is_update = 0; - /* Leading HTML for the display of this object */ + /** Leading HTML for the display of this object */ if (recursion_level == 0) { wprintf("
\n"); } - /* Look for a method */ + /** Look for a method */ method = icalcomponent_get_first_property(cal, ICAL_METHOD_PROPERTY); - /* See what we need to do with this */ + /** See what we need to do with this */ if (method != NULL) { the_method = icalproperty_get_method(method); switch(the_method) { case ICAL_METHOD_REQUEST: - wprintf("\n" - ); + ""); + wprintf(_("Meeting invitation")); + wprintf("\n"); break; case ICAL_METHOD_REPLY: wprintf("\n" - ); + ""); + wprintf(_("Attendee's reply to your invitation")); + wprintf("\n"); break; case ICAL_METHOD_PUBLISH: wprintf("\n" - ); + ""); + wprintf(_("Published event")); + wprintf("\n"); break; default: - wprintf("" - "\n"); + wprintf("\n"); break; } } p = icalcomponent_get_first_property(cal, ICAL_SUMMARY_PROPERTY); if (p != NULL) { - wprintf("\n"); } p = icalcomponent_get_first_property(cal, ICAL_LOCATION_PROPERTY); if (p != NULL) { - wprintf("\n"); } - /* + /** * Only show start/end times if we're actually looking at the VEVENT * component. Otherwise it shows bogus dates for things like timezone. */ @@ -162,20 +163,23 @@ void cal_process_object(icalcomponent *cal, t = icalproperty_get_dtstart(p); if (t.is_date) { - wprintf("", - months[t.month - 1], - t.day, t.year - ); + struct tm d_tm; + char d_str[32]; + memset(&d_tm, 0, sizeof d_tm); + d_tm.tm_year = t.year - 1900; + d_tm.tm_mon = t.month - 1; + d_tm.tm_mday = t.day; + wc_strftime(d_str, sizeof d_str, "%x", &d_tm); + wprintf("", d_str); } else { tt = icaltime_as_timet(t); - fmt_date(buf, tt); - wprintf("", buf - ); + fmt_date(buf, tt, 0); + wprintf("", buf); } } @@ -183,41 +187,45 @@ void cal_process_object(icalcomponent *cal, if (p != NULL) { t = icalproperty_get_dtend(p); tt = icaltime_as_timet(t); - fmt_date(buf, tt); - wprintf("", buf - ); + fmt_date(buf, tt, 0); + wprintf("", buf); } } p = icalcomponent_get_first_property(cal, ICAL_DESCRIPTION_PROPERTY); if (p != NULL) { - wprintf("\n"); } - /* If the component has attendees, iterate through them. */ + /** 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)) { - wprintf("\n"); } - /* If the component has subcomponents, recurse through them. */ + /** 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)) { @@ -225,98 +233,83 @@ void cal_process_object(icalcomponent *cal, cal_process_object(c, recursion_level+1, msgnum, cal_partnum); } - /* If this is a REQUEST, display conflicts and buttons */ + /** If this is a REQUEST, display conflicts and buttons */ if (the_method == ICAL_METHOD_REQUEST) { /* Check for conflicts */ lprintf(9, "Checking server calendar for conflicts...\n"); serv_printf("ICAL conflicts|%ld|%s|", msgnum, cal_partnum); - serv_gets(buf); + serv_getln(buf, sizeof buf); if (buf[0] == '1') { - while (serv_gets(buf), strcmp(buf, "000")) { - extract(conflict_name, buf, 3); + while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { + extract_token(conflict_name, buf, 3, '|', sizeof conflict_name); is_update = extract_int(buf, 4); - wprintf("" - "\n"); + escputs(conflict_message); + wprintf("\n"); } } lprintf(9, "...done.\n"); - /* Display the Accept/Decline buttons */ - wprintf("\n", - msgnum, cal_partnum + /** Display the Accept/Decline buttons */ + wprintf("" + "\n", + _("How would you like to respond to this invitation?"), + msgnum, cal_partnum, _("Accept"), + msgnum, cal_partnum, _("Tentative"), + msgnum, cal_partnum, _("Decline") ); } - /* If this is a REPLY, display update button */ + /** If this is a REPLY, display update button */ if (the_method == ICAL_METHOD_REPLY) { - /*********** - * In the future, if we want to validate this object before + /** \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_gets(buf); + serv_getln(buf, sizeof buf); } ***********/ - /* Display the update buttons */ - wprintf("\n", - msgnum, cal_partnum + _("Click Update to accept this reply and update your calendar."), + msgnum, cal_partnum, _("Update"), + msgnum, cal_partnum, _("Ignore") ); } - /* Trailing HTML for the display of this object */ + /** Trailing HTML for the display of this object */ if (recursion_level == 0) { wprintf("
\n" - "" + wprintf("
\n" + "" "  " - "Meeting invitation -
\n" "" + "src=\"static/calarea_48x.gif\">" "  " - "Attendee's reply to your invitation -
\n" "" + "src=\"static/calarea_48x.gif\">" "  " - "Published event -
" - "I don't know what to do with this.
"); + wprintf(_("This is an unknown type of calendar item.")); + wprintf("
Summary:"); + wprintf("
"); + wprintf(_("Summary:")); + wprintf(""); escputs((char *)icalproperty_get_comment(p)); wprintf("
Location:"); + wprintf("
"); + wprintf(_("Location:")); + wprintf(""); escputs((char *)icalproperty_get_comment(p)); wprintf("
Date:" - "" - "%s %d, %d
"); + wprintf(_("Date:")); + wprintf("%s
Starting date/time:" - "" - "%s
"); + wprintf(_("Starting date/time:")); + wprintf("%s
Ending date/time:" - "%s
"); + wprintf(_("Ending date/time:")); + wprintf("%s
Description:"); + wprintf("
"); + wprintf(_("Description:")); + wprintf(""); escputs((char *)icalproperty_get_comment(p)); wprintf("
Attendee:"); - strcpy(buf, icalproperty_get_attendee(p)); + wprintf("
"); + wprintf(_("Attendee:")); + wprintf(""); + safestrncpy(buf, icalproperty_get_attendee(p), sizeof buf); if (!strncasecmp(buf, "MAILTO:", 7)) { - /* screen name or email address */ + /** screen name or email address */ strcpy(buf, &buf[7]); striplt(buf); escputs(buf); wprintf(" "); - /* participant status */ + /** participant status */ partstat_as_string(buf, p); escputs(buf); } wprintf("
%s" - "%s " - """, - (is_update ? - "Update:" : - "CONFLICT:" - ), + if (is_update) { + snprintf(conflict_message, sizeof conflict_message, + _("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); + } + wprintf("
%s", (is_update ? - "This is an update of" : - "This event would conflict with" + _("Update:") : + _("CONFLICT:") ) - ); - escputs(conflict_name); - wprintf("" " - "which is already in your calendar." - "
" - "
\n" - "\n" - "  " - "\n" - "  " - "\n" - "" - "" - "
" - "
%s" + "%s" + " | " + "%s" + " | " + "%s" + "
" - "Click Update to accept this reply and " - "update your calendar." - "
\n" - "\n" - "  " - "\n" - "" - "" - "
" + /** Display the update buttons */ + wprintf("
" + "%s" + "" + "%s" + " | " + "%s" + "" "
\n"); @@ -324,10 +317,13 @@ void cal_process_object(icalcomponent *cal, } -/* +/** + * \brief process calendar mail atachment * Deserialize a calendar object in a message so it can be processed. * (This is the main entry point for these things) - * ok for complete vcalendar objects + * \param part_source the part of the message we want to parse + * \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) { icalcomponent *cal; @@ -335,7 +331,8 @@ void cal_process_attachment(char *part_source, long msgnum, char *cal_partnum) { cal = icalcomponent_new_from_string(part_source); if (cal == NULL) { - wprintf("Error parsing calendar object
\n"); + wprintf(_("There was an error parsing this calendar item.")); + wprintf("
\n"); return; } @@ -349,73 +346,83 @@ 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) { char buf[SIZ]; - output_headers(3); + output_headers(1, 1, 2, 0, 0, 0); - wprintf("
" - "Respond to meeting request" - "

\n" + wprintf("
\n"); + wprintf("
" + ""); + wprintf(_("Respond to meeting request")); + wprintf("" + "
\n" ); + wprintf("
\n
\n"); serv_printf("ICAL respond|%s|%s|%s|", bstr("msgnum"), bstr("cal_partnum"), bstr("sc") ); - serv_gets(buf); + serv_getln(buf, sizeof buf); if (buf[0] == '2') { wprintf("
" - "" + "" "" ); if (!strcasecmp(bstr("sc"), "accept")) { - wprintf("You have accepted this meeting invitation. " - "It has been entered into your calendar, " + wprintf(_("You have accepted this meeting invitation. " + "It has been entered into your calendar.") ); } else if (!strcasecmp(bstr("sc"), "tentative")) { - wprintf("You have tentatively accepted this meeting invitation. " - "It has been 'pencilled in' to your calendar, " + wprintf(_("You have tentatively accepted this meeting invitation. " + "It has been 'pencilled in' to your calendar.") ); } else if (!strcasecmp(bstr("sc"), "decline")) { - wprintf("You have declined this meeting invitation. " - "It has not been entered into your calendar, " + wprintf(_("You have declined this meeting invitation. " + "It has not been entered into your calendar.") ); } - wprintf("and a reply has been sent to the meeting organizer." - "
\n" - ); + wprintf(" "); + wprintf(_("A reply has been sent to the meeting organizer.")); + wprintf("\n"); } else { - wprintf("" + wprintf("" "%s\n", &buf[4]); } - wprintf("wc_roomname); - wprintf("\">
Return to messages

\n"); + wprintf("\">
"); + wprintf(_("Return to messages")); + wprintf("
\n"); wDumpContent(1); } -/* - * Handle an incoming RSVP +/** + * \brief Handle an incoming RSVP */ void handle_rsvp(void) { char buf[SIZ]; - output_headers(3); + output_headers(1, 1, 2, 0, 0, 0); - wprintf("
" - "" - "Update your calendar with this RSVP" - "

\n" + wprintf("
\n"); + wprintf("
" + ""); + wprintf(_("Update your calendar with this RSVP")); + wprintf("" + "
\n" + "
\n
\n" ); serv_printf("ICAL handle_rsvp|%s|%s|%s|", @@ -423,89 +430,77 @@ void handle_rsvp(void) { bstr("cal_partnum"), bstr("sc") ); - serv_gets(buf); + serv_getln(buf, sizeof buf); if (buf[0] == '2') { wprintf("
" - "" + "" "" ); if (!strcasecmp(bstr("sc"), "update")) { - wprintf("Your calendar has been updated " - "to reflect this RSVP." - ); + 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." + wprintf(_("You have chosen to ignore this RSVP. " + "Your calendar has not been updated.") ); } wprintf("
\n" ); } else { - wprintf("" + wprintf("" "%s\n", &buf[4]); } - wprintf("wc_roomname); - wprintf("\">
Return to messages

\n"); + wprintf("\">
"); + wprintf(_("Return to messages")); + wprintf("
\n"); wDumpContent(1); } - -/*****************************************************************************/ +/*@}*/ +/*-----------------------------------------------------------------------**/ -/* - * Display handlers for message reading +/** + * \defgroup MsgDisplayHandlers Display handlers for message reading + * \ingroup Calendaring */ +/*@{*/ -/* + +/** + * \brief get items, keep them. * If we're reading calendar items, just store them for now. We have to * sort and re-output them later when we draw the calendar. + * \param cal Our calendar to process + * \param msgnum number of the mesage in our db */ void display_individual_cal(icalcomponent *cal, long msgnum) { WC->num_cal += 1; WC->disp_cal = realloc(WC->disp_cal, - (sizeof(icalcomponent *) * WC->num_cal) ); - WC->disp_cal[WC->num_cal - 1] = icalcomponent_new_clone(cal); + (sizeof(struct disp_cal) * WC->num_cal) ); + WC->disp_cal[WC->num_cal - 1].cal = icalcomponent_new_clone(cal); - WC->cal_msgnum = realloc(WC->cal_msgnum, - (sizeof(long) * WC->num_cal) ); - WC->cal_msgnum[WC->num_cal - 1] = msgnum; + WC->disp_cal[WC->num_cal - 1].cal_msgnum = msgnum; } /* - * Display a task in the task list - */ -void display_individual_task(icalcomponent *vtodo, long msgnum) { - icalproperty *p; - - p = icalcomponent_get_first_property(vtodo, ICAL_SUMMARY_PROPERTY); - wprintf("wc_roomname); - wprintf("\">"); - if (p != NULL) { - escputs((char *)icalproperty_get_comment(p)); - } - wprintf("
\n"); -} - - -/* + * \brief edit a task * Display a task by itself (for editing) - * - * ok for complete vcalendar objects + * \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) { icalcomponent *vtodo; @@ -519,7 +514,8 @@ void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum) { if (supplied_vtodo != NULL) { vtodo = supplied_vtodo; - /* If we're looking at a fully encapsulated VCALENDAR + /** + * If we're looking at a fully encapsulated VCALENDAR * rather than a VTODO component, attempt to use the first * relevant VTODO subcomponent. If there is none, the * NULL returned by icalcomponent_get_first_component() will @@ -540,26 +536,40 @@ void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum) { created_new_vtodo = 1; } - output_headers(3); - wprintf("
" - "Edit task" - "

\n" + output_headers(1, 1, 2, 0, 0, 0); + wprintf("
\n" + "" + "" + "
"); + wprintf(_("Edit task")); + wprintf("" + "
\n" + "
\n
\n" ); - wprintf("
\n"); + wprintf("
" + "
"); + + wprintf("\n"); wprintf("\n", msgnum); - wprintf("Summary: " + wprintf("\n"); + + wprintf("\n"); - wprintf("Start date: "); + wprintf("\n"); - wprintf("Due date: "); + wprintf("
"); + wprintf(_("Summary:")); + wprintf("" "
\n"); + wprintf("\">
"); + wprintf(_("Start date:")); + wprintf(""); p = icalcomponent_get_first_property(vtodo, ICAL_DTSTART_PROPERTY); if (p != NULL) { t = icalproperty_get_dtstart(p); @@ -568,9 +578,11 @@ void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum) { t = icaltime_from_timet(now, 0); } display_icaltimetype_as_webform(&t, "dtstart"); - wprintf("
\n"); + wprintf("
"); + wprintf(_("Due date:")); + wprintf(""); p = icalcomponent_get_first_property(vtodo, ICAL_DUE_PROPERTY); if (p != NULL) { t = icalproperty_get_due(p); @@ -579,27 +591,34 @@ void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum) { t = icaltime_from_timet(now, 0); } display_icaltimetype_as_webform(&t, "due"); - wprintf("
\n"); - - wprintf("

\n"); + wprintf("
\n"); - wprintf("" + wprintf("
" + "" "  " - "\n" + "\n" "  " - "\n" - "
\n" + "\n" + "\n", + _("Save"), + _("Delete"), + _("Cancel") ); wprintf("\n"); + wprintf("
\n"); wDumpContent(1); if (created_new_vtodo) { @@ -608,20 +627,24 @@ void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum) { } /* - * Save an edited task - * - * ok + * \brief Save an edited task + * \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 buf[SIZ]; int delete_existing = 0; icalproperty *prop; - icalcomponent *vtodo; + icalcomponent *vtodo, *encaps; int created_new_vtodo = 0; + int i; + int sequence = 0; + struct icaltimetype t; if (supplied_vtodo != NULL) { vtodo = supplied_vtodo; - /* If we're looking at a fully encapsulated VCALENDAR + /** + * If we're looking at a fully encapsulated VCALENDAR * rather than a VTODO component, attempt to use the first * relevant VTODO subcomponent. If there is none, the * NULL returned by icalcomponent_get_first_component() will @@ -642,9 +665,9 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum) { created_new_vtodo = 1; } - if (!strcasecmp(bstr("sc"), "Save")) { + if (strlen(bstr("save_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(vtodo, ICAL_SUMMARY_PROPERTY), prop != NULL) { @@ -667,10 +690,9 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum) { icalcomponent_remove_property(vtodo, prop); icalproperty_free(prop); } + icaltime_from_webform(&t, "dtstart"); icalcomponent_add_property(vtodo, - icalproperty_new_dtstart( - icaltime_from_webform("dtstart") - ) + icalproperty_new_dtstart(t) ); while (prop = icalcomponent_get_first_property(vtodo, @@ -678,58 +700,99 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum) { icalcomponent_remove_property(vtodo, prop); icalproperty_free(prop); } + icaltime_from_webform(&t, "due"); icalcomponent_add_property(vtodo, - icalproperty_new_due( - icaltime_from_webform("due") - ) + 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) { + generate_uuid(buf); + icalcomponent_add_property(vtodo, + 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) ) { + i = icalproperty_get_sequence(prop); + lprintf(9, "Sequence was %d\n", i); + if (i > sequence) sequence = i; + icalcomponent_remove_property(vtodo, prop); + icalproperty_free(prop); + } + ++sequence; + lprintf(9, "New sequence is %d. Adding...\n", sequence); + icalcomponent_add_property(vtodo, + icalproperty_new_sequence(sequence) + ); + + /** + * 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 + * can't encapsulate something that may already be encapsulated + * somewhere else. + */ + lprintf(9, "Encapsulating into full VCALENDAR component\n"); + encaps = ical_encapsulate_subcomponent(icalcomponent_new_clone(vtodo)); + /* Serialize it and save it to the message base */ serv_puts("ENT0 1|||4"); - serv_gets(buf); + serv_getln(buf, sizeof buf); if (buf[0] == '4') { serv_puts("Content-type: text/calendar"); serv_puts(""); - serv_puts(icalcomponent_as_ical_string(vtodo)); + serv_puts(icalcomponent_as_ical_string(encaps)); serv_puts("000"); - /* Probably not necessary; the server will see the UID + /** + * Probably not necessary; the server will see the UID * of the object and delete the old one anyway, but * just in case... */ delete_existing = 1; } + icalcomponent_free(encaps); } - /* + /** * If the user clicked 'Delete' then explicitly delete the message. */ - if (!strcasecmp(bstr("sc"), "Delete")) { + if (strlen(bstr("delete_button")) > 0) { delete_existing = 1; } if ( (delete_existing) && (msgnum > 0L) ) { serv_printf("DELE %ld", atol(bstr("msgnum"))); - serv_gets(buf); + serv_getln(buf, sizeof buf); } if (created_new_vtodo) { icalcomponent_free(vtodo); } - /* Go back to the task list */ + /** Go back to the task list */ readloop("readfwd"); } -/* +/** + * \brief generic item handler * Code common to all display handlers. Given a message number and a MIME * type, we load the message and hunt for that MIME type. If found, we load * the relevant part, deserialize it into a libical component, filter it for * the requested object type, and feed it to the specified handler. + * \param mimetype mimetyp of our object + * \param which_kind sort of ical type + * \param msgnum number of the mesage in our db + * \param callback a funcion \todo * - * ok */ void display_using_handler(long msgnum, char *mimetype, @@ -748,15 +811,15 @@ void display_using_handler(long msgnum, sprintf(buf, "MSG0 %ld|1", msgnum); /* ask for headers only */ serv_puts(buf); - serv_gets(buf); + serv_getln(buf, sizeof buf); if (buf[0] != '1') return; - while (serv_gets(buf), strcmp(buf, "000")) { + while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { if (!strncasecmp(buf, "part=", 5)) { - extract(mime_filename, &buf[5], 1); - extract(mime_partnum, &buf[5], 2); - extract(mime_disposition, &buf[5], 3); - extract(mime_content_type, &buf[5], 4); + extract_token(mime_filename, &buf[5], 1, '|', sizeof mime_filename); + extract_token(mime_partnum, &buf[5], 2, '|', sizeof mime_partnum); + extract_token(mime_disposition, &buf[5], 3, '|', sizeof mime_disposition); + extract_token(mime_content_type, &buf[5], 4, '|', sizeof mime_content_type); mime_length = extract_int(&buf[5], 5); if (!strcasecmp(mime_content_type, "text/calendar")) { @@ -775,12 +838,12 @@ void display_using_handler(long msgnum, ical_dezonify(cal); - /* Simple components of desired type */ + /** Simple components of desired type */ if (icalcomponent_isa(cal) == which_kind) { callback(cal, msgnum); } - /* Subcomponents of desired type */ + /** Subcomponents of desired type */ for (c = icalcomponent_get_first_component(cal, which_kind); (c != 0); @@ -796,39 +859,53 @@ void display_using_handler(long msgnum, } +/** + * \brief display whole calendar + * \param msgnum number of the mesage in our db + */ void display_calendar(long msgnum) { display_using_handler(msgnum, "text/calendar", ICAL_VEVENT_COMPONENT, display_individual_cal); } +/** + * \brief display whole taksview + * \param msgnum number of the mesage in our db + */ void display_task(long msgnum) { display_using_handler(msgnum, "text/calendar", ICAL_VTODO_COMPONENT, - display_individual_task); + display_individual_cal); } +/** + * \brief display the editor component for a task + */ void display_edit_task(void) { long msgnum = 0L; - /* Force change the room if we have to */ + /** Force change the room if we have to */ if (strlen(bstr("taskrm")) > 0) { - gotoroom(bstr("taskrm"), 0); + gotoroom(bstr("taskrm")); } msgnum = atol(bstr("msgnum")); if (msgnum > 0L) { - /* existing task */ + /** existing task */ display_using_handler(msgnum, "text/calendar", ICAL_VTODO_COMPONENT, display_edit_individual_task); } else { - /* new task */ + /** new task */ display_edit_individual_task(NULL, 0L); } } +/** + *\brief save an edited task + */ void save_task(void) { long msgnum = 0L; @@ -843,6 +920,9 @@ void save_task(void) { } } +/** + * \brief display the editor component for an event + */ void display_edit_event(void) { long msgnum = 0L; @@ -859,6 +939,9 @@ void display_edit_event(void) { } } +/** + * \brief save an edited event + */ void save_event(void) { long msgnum = 0L; @@ -874,4 +957,52 @@ void save_event(void) { } } + + + + +/** + * \brief freebusy display (for client software) + * \param req dunno. ????? + */ +void do_freebusy(char *req) { + char who[SIZ]; + char buf[SIZ]; + char *fb; + + extract_token(who, req, 1, ' ', sizeof who); + if (!strncasecmp(who, "/freebusy/", 10)) { + strcpy(who, &who[10]); + } + unescape_input(who); + + if ( (!strcasecmp(&who[strlen(who)-4], ".vcf")) + || (!strcasecmp(&who[strlen(who)-4], ".ifb")) + || (!strcasecmp(&who[strlen(who)-4], ".vfb")) ) { + who[strlen(who)-4] = 0; + } + + lprintf(9, "freebusy requested for <%s>\n", who); + serv_printf("ICAL freebusy|%s", who); + serv_getln(buf, sizeof buf); + + if (buf[0] != '1') { + wprintf("HTTP/1.1 404 %s\n", &buf[4]); + output_headers(0, 0, 0, 0, 0, 0); + wprintf("Content-Type: text/plain\r\n"); + wprintf("\r\n"); + wprintf("%s\n", &buf[4]); + return; + } + + fb = read_server_text(); + http_transmit_thing(fb, strlen(fb), "text/calendar", 0); + free(fb); +} + + + #endif /* WEBCIT_WITH_CALENDAR_SERVICE */ + + +/*@}*/