X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fevent.c;h=d786998ab8ef818c0d5bebf7e15b291c1b04b7e1;hb=HEAD;hp=041e5b83301084961117802b288a7fccd0ad1cfb;hpb=fcb236e86a29d12b6500456ac8852c611a97d36c;p=citadel.git
diff --git a/webcit/event.c b/webcit/event.c
index 041e5b833..ffe0688ab 100644
--- a/webcit/event.c
+++ b/webcit/event.c
@@ -1,11 +1,20 @@
/*
- * $Id$
- *
* Editing calendar events.
+ *
+ * Copyright (c) 2002-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, 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.
*/
#include "webcit.h"
-#include "webserver.h"
+
+#include "calendar.h"
/*
* Display an event by itself (for editing)
@@ -13,8 +22,9 @@
* msgnum reference on the citserver
*/
void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum, char *from,
- int unread, struct calview *calv)
+ int unread, calview *calv)
{
+ wcsession *WCC = WC;
icalcomponent *vevent;
icalproperty *p;
icalvalue *v;
@@ -29,15 +39,61 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum,
char buf[SIZ];
int organizer_is_me = 0;
int i, j = 0;
+ /************************************************************
+ * Uncomment this to see the UID in calendar events for debugging
int sequence = 0;
+ */
char weekday_labels[7][32];
char month_labels[12][32];
long weekstart = 0;
+ icalproperty *rrule = NULL;
+ struct icalrecurrencetype recur;
+ char weekday_is_selected[7];
+ int which_rrmonthtype_is_preselected = 0;
+
+ int rrmday;
+ int rrmweekday;
+
+ icaltimetype day1;
+ int weekbase;
+ int rrmweek;
+ int rrymweek;
+ int rrymweekday;
+ int rrymonth;
+ int which_rrend_is_preselected;
+ int which_rryeartype_is_preselected;
+
+ const char *ch;
+ const char *tabnames[3];
+ const char *frequency_units[8];
+ const char *ordinals[6];
+
+ frequency_units[0] = _("seconds");
+ frequency_units[1] = _("minutes");
+ frequency_units[2] = _("hours");
+ frequency_units[3] = _("days");
+ frequency_units[4] = _("weeks");
+ frequency_units[5] = _("months");
+ frequency_units[6] = _("years");
+ frequency_units[7] = _("never");
+
+
+ ordinals[0] = "0";
+ ordinals[1] = _("first");
+ ordinals[2] = _("second");
+ ordinals[3] = _("third");
+ ordinals[4] = _("fourth");
+ ordinals[5] = _("fifth");
+
+
+ tabnames[0] = _("Event");
+ tabnames[1] = _("Attendees");
+ tabnames[2] = _("Recurrence");
get_pref_long("weekstart", &weekstart, 17);
if (weekstart > 6) weekstart = 0;
- lprintf(9, "display_edit_individual_event(%ld) calview=%s year=%s month=%s day=%s\n",
+ syslog(LOG_DEBUG, "display_edit_individual_event(%ld) calview=%s year=%s month=%s day=%s\n",
msgnum, bstr("calview"), bstr("year"), bstr("month"), bstr("day")
);
@@ -71,6 +127,10 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum,
if (supplied_vevent != NULL) {
vevent = supplied_vevent;
+
+ /* Convert all timestamps to UTC to make them easier to process. */
+ ical_dezonify(vevent);
+
/*
* If we're looking at a fully encapsulated VCALENDAR
* rather than a VEVENT component, attempt to use the first
@@ -95,84 +155,83 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum,
/* Learn the sequence */
p = icalcomponent_get_first_property(vevent, ICAL_SEQUENCE_PROPERTY);
+ /************************************************************
+ * Uncomment this to see the UID in calendar events for debugging
if (p != NULL) {
sequence = icalproperty_get_sequence(p);
}
-
+ */
/* Begin output */
- output_headers(1, 1, 2, 0, 0, 0);
- wprintf("
\n");
+ output_headers(1, 1, 1, 0, 0, 0);
+ wc_printf("
\n");
+ wc_printf("
");
+ wc_printf(_("Add or edit an event"));
+ wc_printf("
");
+ wc_printf("\n");
- wprintf("
");
+ wc_printf("
\n");
/************************************************************
* Uncomment this to see the UID in calendar events for debugging
- wprintf("UID == ");
+ wc_printf("UID == ");
p = icalcomponent_get_first_property(vevent, ICAL_UID_PROPERTY);
if (p != NULL) {
escputs((char *)icalproperty_get_comment(p));
}
- wprintf("
\n");
- wprintf("SEQUENCE == %d
\n", sequence);
+ wc_printf("
\n");
+ wc_printf("SEQUENCE == %d
\n", sequence);
*************************************************************/
- wprintf("
\n");
end_tab(3, 3);
-
- wprintf("
\n"); /* end 'fix_scrollbar_bug' div */
+ wc_printf("\n");
StrBufAppendPrintf(WC->trailing_javascript,
- "eventEditAllDay(); \n"
- "RecurrenceShowHide(); \n"
+ "eventEditAllDay(); \n"
+ "RecurrenceShowHide(); \n"
+ "EnableOrDisableCheckButton(); \n"
);
- address_book_popup();
+ do_template("addressbook_popup");
+
wDumpContent(1);
if (created_new_vevent) {
@@ -750,7 +793,8 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum,
* msgnum: the index on the citserver
*/
void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *from,
- int unread, struct calview *calv) {
+ int unread, calview *calv) {
+ StrBuf *Buf;
char buf[SIZ];
icalproperty *prop;
icalcomponent *vevent, *encaps;
@@ -765,9 +809,14 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *fr
char organizer_string[SIZ];
int sequence = 0;
enum icalproperty_transp formtransp = ICAL_TRANSP_NONE;
+ const char *ch;
if (supplied_vevent != NULL) {
vevent = supplied_vevent;
+
+ /* Convert all timestamps to UTC to make them easier to process. */
+ ical_dezonify(vevent);
+
/*
* If we're looking at a fully encapsulated VCALENDAR
* rather than a VEVENT component, attempt to use the first
@@ -779,7 +828,7 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *fr
if (icalcomponent_isa(vevent) == ICAL_VCALENDAR_COMPONENT) {
save_individual_event(
icalcomponent_get_first_component(
- vevent, ICAL_VEVENT_COMPONENT),
+ vevent, ICAL_VEVENT_COMPONENT),
msgnum, from, unread, NULL
);
return;
@@ -801,15 +850,19 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *fr
icalproperty_free(prop);
}
+ /* Add NOW() to the calendar object... */
+ icalcomponent_set_dtstamp(vevent,
+ icaltime_from_timet_with_zone(
+ time(NULL), 0, icaltimezone_get_utc_timezone()));
+
if (havebstr("summary")) {
-
icalcomponent_add_property(vevent,
icalproperty_new_summary(bstr("summary")));
} else {
icalcomponent_add_property(vevent,
- icalproperty_new_summary("Untitled Event"));
+ icalproperty_new_summary(_("Untitled Event")));
}
-
+
while (prop = icalcomponent_get_first_property(vevent,
ICAL_LOCATION_PROPERTY), prop != NULL) {
icalcomponent_remove_property(vevent, prop);
@@ -849,16 +902,10 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *fr
icaltime_from_webform(&event_start, "dtstart");
}
- /*
- * 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
- * instead of just date) unless icalvalue_new_date() is used.
- * So we force it, if this is an all day event.
- */
prop = icalproperty_new_dtstart(event_start);
+
if (all_day_event) {
+ /* Force it to serialize as a date-only rather than date/time */
icalproperty_set_value(prop, icalvalue_new_date(event_start));
}
@@ -876,14 +923,21 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *fr
icalproperty_free(prop);
}
- if (all_day_event == 0) {
- icaltime_from_webform(&t, "dtend");
- icalcomponent_add_property(vevent,
- icalproperty_new_dtend(icaltime_normalize(t)
- )
- );
+ if (all_day_event) {
+ icaltime_from_webform_dateonly(&t, "dtend");
+
+ /* with this field supposed to be non-inclusive we have to add one day */
+ icaltime_adjust(&t, 1, 0, 0, 0);
+ }
+ else {
+ icaltime_from_webform(&t, "dtend");
}
+ icalcomponent_add_property(vevent,
+ icalproperty_new_dtend(icaltime_normalize(t)
+ )
+ );
+
/* recurrence rules -- begin */
/* remove any existing rule */
@@ -931,13 +985,23 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *fr
recur.by_month_day[1] = ICAL_RECURRENCE_ARRAY_MAX;
}
else if (!strcasecmp(bstr("rrmonthtype"), "rrmonthtype_wday")) {
- lprintf(9, "MONTHLY BY WDAY\n");
- /* FIXME implement this */
+ recur.by_day[0] = (atoi(bstr("rrmweek")) * 8)
+ + atoi(bstr("rrmweekday")) + 1;
+ recur.by_day[1] = ICAL_RECURRENCE_ARRAY_MAX;
}
break;
case ICAL_YEARLY_RECURRENCE:
- /* FIXME implement this */
+ if (!strcasecmp(bstr("rryeartype"), "rryeartype_ymday")) {
+ /* no further action is needed here */
+ }
+ else if (!strcasecmp(bstr("rryeartype"), "rryeartype_ywday")) {
+ recur.by_month[0] = atoi(bstr("rrymonth"));
+ recur.by_month[1] = ICAL_RECURRENCE_ARRAY_MAX;
+ recur.by_day[0] = (atoi(bstr("rrymweek")) * 8)
+ + atoi(bstr("rrymweekday")) + 1;
+ recur.by_day[1] = ICAL_RECURRENCE_ARRAY_MAX;
+ }
break;
/* This one can't happen either. */
@@ -994,14 +1058,14 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *fr
icalcomponent_add_property(vevent,
icalproperty_new_sequence(sequence)
);
-
+
/*
* Set the organizer, only if one does not already exist *and*
* the form is supplying one
*/
strcpy(buf, bstr("organizer"));
if ( (icalcomponent_get_first_property(vevent,
- ICAL_ORGANIZER_PROPERTY) == NULL)
+ ICAL_ORGANIZER_PROPERTY) == NULL)
&& (!IsEmptyStr(buf)) ) {
/* set new organizer */
@@ -1018,7 +1082,7 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *fr
/* First, strip out the parenthesized partstats. */
strcpy(form_attendees, bstr("attendees"));
- stripout(form_attendees, '(', ')');
+ while ( stripout(form_attendees, '(', ')') != 0);
/* Next, change any commas to newlines, because we want newline-separated attendees. */
j = strlen(form_attendees);
@@ -1034,21 +1098,21 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *fr
/* Now iterate! */
for (i=0; i
ImportantMessage, &buf[4]);
+ case '4':
+ while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {}
+ break;
+ case '2':
+ AppendImportantMessage(buf + 4, - 1);
+ break;
+ default:
+ break;
}
icalmemory_free_ring ();
icalcomponent_free(encaps);
@@ -1141,8 +1211,13 @@ STARTOVER: for (attendee = icalcomponent_get_first_property(vevent, ICAL_ATTENDE
icalcomponent_free(vevent);
}
- /* If this was a save or delete, go back to the calendar view. */
+ /* If this was a save or delete, go back to the calendar or summary view. */
if (!havebstr("check_button")) {
- readloop("readfwd");
+ if (!strcasecmp(bstr("calview"), "summary")) {
+ display_summary_page();
+ }
+ else {
+ readloop(readfwd, eUseDefault);
+ }
}
}