X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fcalendar.c;h=98fc8260c426eaa2ef052356f866b1555913c7f5;hb=7e6ecf64e51b1b9377e701c7380a038360e1ac8c;hp=d4832070bd0eaa8e34772ca18a66db27f807d248;hpb=fcb8c4169baa629eb3c1a4979c7c8c32f1560389;p=citadel.git diff --git a/webcit/calendar.c b/webcit/calendar.c index d4832070b..98fc8260c 100644 --- a/webcit/calendar.c +++ b/webcit/calendar.c @@ -1,7 +1,7 @@ /* * Functions which handle calendar objects and their processing/display. * - * Copyright (c) 1996-2010 by the citadel.org team + * Copyright (c) 1996-2011 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 @@ -48,6 +48,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); @@ -182,11 +183,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, " "); @@ -210,7 +211,7 @@ void cal_process_object(StrBuf *Target, if (the_method == ICAL_METHOD_REQUEST) { /* Check for conflicts */ - lprintf(9, "Checking server calendar for conflicts...\n"); + syslog(9, "Checking server calendar for conflicts...\n"); serv_printf("ICAL conflicts|%ld|%s|", msgnum, cal_partnum); serv_getln(buf, sizeof buf); if (buf[0] == '1') { @@ -238,7 +239,7 @@ void cal_process_object(StrBuf *Target, StrBufAppendPrintf(Target, "
\n"); } } - lprintf(9, "...done.\n"); + syslog(9, "...done.\n"); StrBufAppendPrintf(Target, ""); @@ -413,7 +414,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; @@ -432,22 +433,29 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr int num_recur = 0; int stop_rr = 0; + /* first and foremost, check for bogosity. bail if we see no DTSTART property */ + + if (icalcomponent_get_first_property(icalcomponent_get_first_component( + event, ICAL_VEVENT_COMPONENT), ICAL_DTSTART_PROPERTY) == NULL) + { + return; + } + + /* ok, chances are we've got a live one here. let's try to figure out where it goes. */ + dtstart = icaltime_null_time(); dtend = icaltime_null_time(); - if (WCC->disp_cal_items == NULL) + if (WCC->disp_cal_items == NULL) { WCC->disp_cal_items = NewHash(0, Flathash); + } /* 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 */ - /* lprintf(9, "INITIAL: %s\n", icaltime_as_ical_string(icalproperty_get_dtstart( - icalcomponent_get_first_property(icalcomponent_get_first_component( - Cal->cal, ICAL_VEVENT_COMPONENT), ICAL_DTSTART_PROPERTY))) - ); */ ical_dezonify(Cal->cal); if (icalcomponent_isa(Cal->cal) != ICAL_VEVENT_COMPONENT) { cptr = icalcomponent_get_first_component(Cal->cal, ICAL_VEVENT_COMPONENT); @@ -482,6 +490,7 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr } /* Store it in the hash list. */ + /* syslog(LOG_DEBUG, "INITIAL: %s", ctime(&Cal->event_start)); */ Put(WCC->disp_cal_items, (char*) &Cal->event_start, sizeof(Cal->event_start), @@ -501,7 +510,7 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr * 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); } @@ -519,12 +528,11 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr ++num_recur; if (num_recur > 1) { /* Skip the first one. We already did it at the root. */ icalcomponent *cptr; - /* lprintf(9, "REPEATS: %s\n", icaltime_as_ical_string(next)); */ /* 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); @@ -538,27 +546,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 */ @@ -572,8 +584,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) ) { + 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), @@ -590,8 +604,7 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr } } icalrecur_iterator_free(ritr); - /* lprintf(9, "Performed %d recurrences; final one is %s", num_recur, ctime(&final_recurrence)); */ - + /* syslog(9, "Performed %d recurrences; final one is %s", num_recur, ctime(&final_recurrence)); */ } @@ -849,7 +862,7 @@ void do_freebusy(void) who[len-4] = 0; } - lprintf(9, "freebusy requested for <%s>\n", who); + syslog(9, "freebusy requested for <%s>\n", who); serv_printf("ICAL freebusy|%s", who); serv_getln(buf, sizeof buf);