X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fcalendar.c;h=2897ba20188d9a007eeb1623af1fee2709f5e3e7;hb=4b4dc864ede7c5d8d956febe4a0afb422b78e7c4;hp=e60635ebb271e7d6a40e1675254de081caac74f5;hpb=8a4a8eab545839c18cb8ad44f3510f9e51062acb;p=citadel.git diff --git a/webcit/calendar.c b/webcit/calendar.c index e60635ebb..2897ba201 100644 --- a/webcit/calendar.c +++ b/webcit/calendar.c @@ -1,12 +1,26 @@ /* - * $Id$ - * * Functions which handle calendar objects and their processing/display. + * + * 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 + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * 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" #include "webserver.h" - +#include "calendar.h" /* * Process a calendar object. At this point it's already been deserialized by cal_process_attachment() @@ -34,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); @@ -56,11 +71,11 @@ void cal_process_object(StrBuf *Target, /* See what we need to do with this */ if (method != NULL) { - the_method = icalproperty_get_method(method); char *title; + the_method = icalproperty_get_method(method); StrBufAppendPrintf(Target, "
"
"%s "
@@ -274,17 +290,16 @@ void cal_process_object(StrBuf *Target,
/*
* Deserialize a calendar object in a message so it can be displayed.
- *
*/
void cal_process_attachment(wc_mime_attachment *Mime)
{
icalcomponent *cal;
-
+
cal = icalcomponent_new_from_string(ChrPtr(Mime->Data));
FlushStrBuf(Mime->Data);
if (cal == NULL) {
StrBufAppendPrintf(Mime->Data, _("There was an error parsing this calendar item."));
- StrBufAppendPrintf(Mime->Data, "
\n");
+ StrBufAppendPrintf(Mime->Data, "
\n");
return;
}
@@ -297,9 +312,8 @@ void cal_process_attachment(wc_mime_attachment *Mime)
-/**
- * \brief accept/decline meeting
- * Respond to a meeting request
+/*
+ * Respond to a meeting request - accept/decline meeting
*/
void respond_to_request(void)
{
@@ -315,27 +329,27 @@ void respond_to_request(void)
serv_getln(buf, sizeof buf);
if (buf[0] == '2') {
- wprintf("");
+ wc_printf("");
if (!strcasecmp(bstr("sc"), "accept")) {
- wprintf(_("You have accepted this meeting invitation. "
+ wc_printf(_("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. "
+ wc_printf(_("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. "
+ wc_printf(_("You have declined this meeting invitation. "
"It has not been entered into your calendar.")
);
}
- wprintf(" ");
- wprintf(_("A reply has been sent to the meeting organizer."));
- wprintf("");
+ wc_printf(" ");
+ wc_printf(_("A reply has been sent to the meeting organizer."));
+ wc_printf("");
} else {
- wprintf("");
- wprintf("%s\n", &buf[4]);
- wprintf("");
+ wc_printf("");
+ wc_printf("%s\n", &buf[4]);
+ wc_printf("");
}
end_ajax_response();
@@ -343,8 +357,8 @@ void respond_to_request(void)
-/**
- * \brief Handle an incoming RSVP
+/*
+ * Handle an incoming RSVP
*/
void handle_rsvp(void)
{
@@ -360,18 +374,21 @@ void handle_rsvp(void)
serv_getln(buf, sizeof buf);
if (buf[0] == '2') {
- wprintf("");
+ wc_printf("");
if (!strcasecmp(bstr("sc"), "update")) {
- wprintf(_("Your calendar has been updated to reflect this RSVP."));
+ /* 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")) {
- wprintf(_("You have chosen to ignore this RSVP. "
+ wc_printf(_("You have chosen to ignore this RSVP. "
"Your calendar has not been updated.")
);
}
- wprintf("");
+ wc_printf("");
} else {
- wprintf(" %s\n", &buf[4]);
- wprintf("");
+ wc_printf(" %s\n", &buf[4]);
+ wc_printf("");
}
end_ajax_response();
@@ -397,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, struct calview *calv)
+void display_individual_cal(icalcomponent *event, long msgnum, char *from, int unread, calview *calv)
{
icalproperty *ps = NULL;
struct icaltimetype dtstart, dtend;
@@ -414,23 +431,31 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr
icalrecur_iterator *ritr = NULL;
struct icaltimetype next;
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);
@@ -465,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),
@@ -484,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);
}
@@ -498,23 +524,21 @@ void display_individual_cal(icalcomponent *cal, long msgnum, char *from, int unr
ritr = icalrecur_iterator_new(recur, dtstart);
if (!ritr) return;
- int stop_rr = 0;
while (next = icalrecur_iterator_next(ritr), ((!icaltime_is_null_time(next))&&(!stop_rr)) ) {
++num_recur;
if (num_recur > 1) { /* Skip the first one. We already did it at the root. */
- /* lprintf(9, "REPEATS: %s\n", icaltime_as_ical_string(next)); */
+ icalcomponent *cptr;
/* 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);
memcpy(Cal->from, from, len + 1);
Cal->cal_msgnum = msgnum;
- icalcomponent *cptr;
if (icalcomponent_isa(Cal->cal) == ICAL_VEVENT_COMPONENT) {
cptr = Cal->cal;
}
@@ -522,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 */
@@ -556,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),
@@ -574,374 +604,53 @@ 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)); */
}
-/*
- * Display a task by itself (for editing)
- */
-void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum, char *from,
- int unread, struct calview *calv)
-{
- icalcomponent *vtodo;
- icalproperty *p;
- struct icaltimetype IcalTime;
- time_t now;
- int created_new_vtodo = 0;
- icalproperty_status todoStatus;
-
- now = time(NULL);
-
- if (supplied_vtodo != NULL) {
- vtodo = supplied_vtodo;
-
- /**
- * 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
- * tell the next iteration of this function to create a
- * new one.
- */
- if (icalcomponent_isa(vtodo) == ICAL_VCALENDAR_COMPONENT) {
- display_edit_individual_task(
- icalcomponent_get_first_component(
- vtodo, ICAL_VTODO_COMPONENT
- ),
- msgnum, from, unread, calv
- );
- return;
- }
- }
- else {
- vtodo = icalcomponent_new(ICAL_VTODO_COMPONENT);
- created_new_vtodo = 1;
- }
-
- // TODO: Can we take all this and move it into a template?
- output_headers(1, 1, 1, 0, 0, 0);
- wprintf("");
- p = icalcomponent_get_first_property(vtodo, ICAL_SUMMARY_PROPERTY);
- // Get summary early for title
- wprintf("