X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fcalendar.c;h=b919f001a5c6595de4c7de430e18ac206bd4956f;hb=fb6f6fa4ec4e3277e30d84326d48e6850822d318;hp=9c9a02cc724a5d3845b0633be90a4ef5923516cf;hpb=b01abd51a7cbd766c7347a14f7a642532d590f17;p=citadel.git diff --git a/webcit/calendar.c b/webcit/calendar.c index 9c9a02cc7..b919f001a 100644 --- a/webcit/calendar.c +++ b/webcit/calendar.c @@ -1,21 +1,15 @@ /* * Functions which handle calendar objects and their processing/display. * - * Copyright (c) 1996-2010 by the citadel.org team + * Copyright (c) 1996-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 as - * published by the Free Software Foundation; either version 3 of the - * License, or (at your option) any later version. + * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "webcit.h" @@ -48,6 +42,7 @@ void cal_process_object(StrBuf *Target, int is_update = 0; char divname[32]; static int divcount = 0; + const char *ch; sprintf(divname, "rsvp%04x", ++divcount); @@ -74,7 +69,7 @@ void cal_process_object(StrBuf *Target, the_method = icalproperty_get_method(method); StrBufAppendPrintf(Target, "
", divname); - StrBufAppendPrintf(Target, ""); + StrBufAppendPrintf(Target, ""); StrBufAppendPrintf(Target, ""); switch(the_method) { case ICAL_METHOD_REQUEST: @@ -182,11 +177,11 @@ void cal_process_object(StrBuf *Target, StrBufAppendPrintf(Target, "
"); StrBufAppendPrintf(Target, _("Attendee:")); StrBufAppendPrintf(Target, "
"); - safestrncpy(buf, icalproperty_get_attendee(p), sizeof buf); - if (!strncasecmp(buf, "MAILTO:", 7)) { + ch = icalproperty_get_attendee(p); + if ((ch != NULL) && !strncasecmp(buf, "MAILTO:", 7)) { /** screen name or email address */ - strcpy(buf, &buf[7]); + safestrncpy(buf, ch + 7, sizeof(buf)); striplt(buf); StrEscAppend(Target, NULL, buf, 0, 0); StrBufAppendPrintf(Target, " "); @@ -328,7 +323,7 @@ void respond_to_request(void) serv_getln(buf, sizeof buf); if (buf[0] == '2') { - wc_printf(""); + wc_printf(""); if (!strcasecmp(bstr("sc"), "accept")) { wc_printf(_("You have accepted this meeting invitation. " "It has been entered into your calendar.") @@ -346,7 +341,7 @@ void respond_to_request(void) wc_printf(_("A reply has been sent to the meeting organizer.")); wc_printf(""); } else { - wc_printf(""); + wc_printf(""); wc_printf("%s\n", &buf[4]); wc_printf(""); } @@ -373,11 +368,11 @@ void handle_rsvp(void) serv_getln(buf, sizeof buf); if (buf[0] == '2') { - wc_printf(""); + wc_printf(""); if (!strcasecmp(bstr("sc"), "update")) { - /* Translators: RSVP aka Répondez s'il-vous-plaît Is the term - that the recipient of an ical-invitation should please - answer this request. */ + /// Translators: RSVP aka Répondez s'il-vous-plaît Is the term + /// that the recipient of an ical-invitation should please + /// answer this request. wc_printf(_("Your calendar has been updated to reflect this RSVP.")); } else if (!strcasecmp(bstr("sc"), "ignore")) { wc_printf(_("You have chosen to ignore this RSVP. " @@ -386,7 +381,7 @@ void handle_rsvp(void) } wc_printf(""); } else { - wc_printf(" %s\n", &buf[4]); + wc_printf(" %s\n", &buf[4]); wc_printf(""); } @@ -413,7 +408,7 @@ void delete_cal(void *vCal) * any iCalendar objects and store them in a hash table. Later on, the second phase will * use this hash table to render the calendar for display. */ -void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unread, calview *calv) +void display_individual_cal(icalcomponent *event, long msgnum, char *from, int unread, calview *calv) { icalproperty *ps = NULL; struct icaltimetype dtstart, dtend; @@ -435,7 +430,7 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr /* first and foremost, check for bogosity. bail if we see no DTSTART property */ if (icalcomponent_get_first_property(icalcomponent_get_first_component( - cal, ICAL_VEVENT_COMPONENT), ICAL_DTSTART_PROPERTY) == NULL) + event, ICAL_VEVENT_COMPONENT), ICAL_DTSTART_PROPERTY) == NULL) { return; } @@ -452,7 +447,7 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr /* Note: anything we do here, we also have to do below for the recurrences. */ Cal = (disp_cal*) malloc(sizeof(disp_cal)); memset(Cal, 0, sizeof(disp_cal)); - Cal->cal = icalcomponent_new_clone(cal); + Cal->cal = icalcomponent_new_clone(event); /* Dezonify and decapsulate at the very last moment */ ical_dezonify(Cal->cal); @@ -489,7 +484,7 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr } /* Store it in the hash list. */ - /* syslog(LOG_DEBUG, "\033[32mINITIAL: %s\033[0m", ctime(&Cal->event_start)); */ + /* syslog(LOG_DEBUG, "INITIAL: %s", ctime(&Cal->event_start)); */ Put(WCC->disp_cal_items, (char*) &Cal->event_start, sizeof(Cal->event_start), @@ -503,13 +498,16 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr if (!icaltime_is_null_time(dtend)) { /* Need duration for recurrences */ dur = icaltime_subtract(dtend, dtstart); } + else { + dur = icaltime_subtract(dtstart, dtstart); + } /* * Just let libical iterate the recurrence, and keep looping back to the top of this function, * adding new hash entries that all point back to the same msgnum, until either the iteration * stops or some outer bound is reached. The display code will automatically do the Right Thing. */ - cptr = cal; + cptr = event; if (icalcomponent_isa(cptr) != ICAL_VEVENT_COMPONENT) { cptr = icalcomponent_get_first_component(cptr, ICAL_VEVENT_COMPONENT); } @@ -531,7 +529,7 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr /* Note: anything we do here, we also have to do above for the root event. */ Cal = (disp_cal*) malloc(sizeof(disp_cal)); memset(Cal, 0, sizeof(disp_cal)); - Cal->cal = icalcomponent_new_clone(cal); + Cal->cal = icalcomponent_new_clone(event); Cal->unread = unread; len = strlen(from); Cal->from = (char*)malloc(len+ 1); @@ -545,27 +543,31 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr cptr = icalcomponent_get_first_component(Cal->cal, ICAL_VEVENT_COMPONENT); } if (cptr) { - ps = icalcomponent_get_first_property(cptr, ICAL_DTSTART_PROPERTY); - if (ps != NULL) { + + /* Remove any existing DTSTART properties */ + while ( ps = icalcomponent_get_first_property(cptr, ICAL_DTSTART_PROPERTY), + ps != NULL + ) { icalcomponent_remove_property(cptr, ps); - ps = icalproperty_new_dtstart(next); - icalcomponent_add_property(cptr, ps); - - Cal->event_start = icaltime_as_timet(next); - final_recurrence = Cal->event_start; } - ps = icalcomponent_get_first_property(cptr, ICAL_DTEND_PROPERTY); - if (ps != NULL) { + /* Add our shiny new DTSTART property from the iteration */ + ps = icalproperty_new_dtstart(next); + icalcomponent_add_property(cptr, ps); + Cal->event_start = icaltime_as_timet(next); + final_recurrence = Cal->event_start; + + /* Remove any existing DTEND properties */ + while ( ps = icalcomponent_get_first_property(cptr, ICAL_DTEND_PROPERTY), + (ps != NULL) + ) { icalcomponent_remove_property(cptr, ps); - - /* Make a new dtend */ - ps = icalproperty_new_dtend(icaltime_add(next, dur)); - - /* and stick it somewhere */ - icalcomponent_add_property(cptr, ps); } + /* Add our shiny new DTEND property from the iteration */ + ps = icalproperty_new_dtend(icaltime_add(next, dur)); + icalcomponent_add_property(cptr, ps); + } /* Dezonify and decapsulate at the very last moment */ @@ -579,9 +581,10 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr } } - if ( (Cal->event_start > calv->lower_bound) - && (Cal->event_start < calv->upper_bound) ) { - /* syslog(LOG_DEBUG, "\033[31mREPEATS: %s\033[0m", ctime(&Cal->event_start)); */ + if ( (Cal->event_start > calv->lower_bound) + && (Cal->event_start < calv->upper_bound) + ) { + /* syslog(LOG_DEBUG, "REPEATS: %s", ctime(&Cal->event_start)); */ Put(WCC->disp_cal_items, (char*) &Cal->event_start, sizeof(Cal->event_start), @@ -598,10 +601,7 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr } } icalrecur_iterator_free(ritr); - /* syslog(9, "\033[34mPerformed %d recurrences; final one is %s\033[0m", - num_recur, ctime(&final_recurrence) - ); */ - + /* syslog(9, "Performed %d recurrences; final one is %s", num_recur, ctime(&final_recurrence)); */ } @@ -670,7 +670,6 @@ void load_ical_object(long msgnum, int unread, char mime_filename[256]; char mime_content_type[256]; char mime_disposition[256]; - int mime_length; char relevant_partnum[256]; char *relevant_source = NULL; int phase = 0; /* 0 = citadel headers, 1 = mime headers, 2 = body */ @@ -700,7 +699,7 @@ void load_ical_object(long msgnum, int unread, extract_token(mime_partnum, &bptr[5], 2, '|', sizeof mime_partnum); extract_token(mime_disposition, &bptr[5], 3, '|', sizeof mime_disposition); extract_token(mime_content_type, &bptr[5], 4, '|', sizeof mime_content_type); - mime_length = extract_int(&bptr[5], 5); + /* do we care? mime_length = */extract_int(&bptr[5], 5); if ( (!strcasecmp(mime_content_type, "text/calendar")) || (!strcasecmp(mime_content_type, "application/ics")) @@ -913,6 +912,7 @@ InitModule_CALENDAR calendar_GetParamsGetServerCall, NULL, NULL, + NULL, calendar_LoadMsgFromServer, calendar_RenderView_or_Tail, calendar_Cleanup); @@ -922,6 +922,7 @@ InitModule_CALENDAR calendar_GetParamsGetServerCall, NULL, NULL, + NULL, calendar_LoadMsgFromServer, calendar_RenderView_or_Tail, calendar_Cleanup);