summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Fleischer <calcurse@cryptocrack.de>2014-08-18 12:16:42 +0200
committerLukas Fleischer <calcurse@cryptocrack.de>2014-08-18 12:20:09 +0200
commitf3fe3c818cf277a547024492abd90c155dab1cd4 (patch)
tree8799d48a8bacc56fefae14b771a12a9a27f770f8
parentbcc820ea743e0448b26a8fee5e8e0a9f85bc3c70 (diff)
downloadcalcurse-f3fe3c818cf277a547024492abd90c155dab1cd4.zip
Gracefully handle all day events in iCal imports
Do not create two events when importing an event that lasts an entire day. Reported-by: Jörn Tillmanns <tillmanns@tuxzone.org> Reported-by: Håkan Jerning <jerning@home.se> Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
-rw-r--r--src/ical.c35
-rw-r--r--test/data/ical-005.ical23
-rwxr-xr-xtest/ical-005.sh26
3 files changed, 73 insertions, 11 deletions
diff --git a/src/ical.c b/src/ical.c
index 264348b..16281e6 100644
--- a/src/ical.c
+++ b/src/ical.c
@@ -302,19 +302,32 @@ ical_store_event(char *mesg, char *note, long day, long end,
recur_event_new(mesg, note, day, EVENTID, rpt->type,
rpt->freq, rpt->until, exc);
mem_free(rpt);
- } else if (end && end != day) {
- /* Here we have an event that spans over several days. */
- rpt = mem_malloc(sizeof(ical_rpt_t));
- rpt->type = RECUR_DAILY;
- rpt->freq = 1;
- rpt->count = 0;
- rpt->until = end;
- recur_event_new(mesg, note, day, EVENTID, rpt->type,
- rpt->freq, rpt->until, exc);
- mem_free(rpt);
- } else {
+ goto cleanup;
+ }
+
+ if (end == 0 || end - day <= DAYINSEC) {
event_new(mesg, note, day, EVENTID);
+ goto cleanup;
}
+
+ /*
+ * Here we have an event that spans over several days.
+ *
+ * In iCal, the end specifies when the event is supposed to end, in
+ * calcurse, the end specifies the time that the last occurrence of the
+ * event starts, so we need to do some conversion here.
+ */
+ end = day + ((end - day - 1) / DAYINSEC) * DAYINSEC;
+ rpt = mem_malloc(sizeof(ical_rpt_t));
+ rpt->type = RECUR_DAILY;
+ rpt->freq = 1;
+ rpt->count = 0;
+ rpt->until = end;
+ recur_event_new(mesg, note, day, EVENTID, rpt->type,
+ rpt->freq, rpt->until, exc);
+ mem_free(rpt);
+
+cleanup:
mem_free(mesg);
erase_note(&note);
}
diff --git a/test/data/ical-005.ical b/test/data/ical-005.ical
new file mode 100644
index 0000000..5f20f48
--- /dev/null
+++ b/test/data/ical-005.ical
@@ -0,0 +1,23 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+SUMMARY:All day
+DTSTART;VALUE=DATE:20131003
+DTEND;VALUE=DATE:20131004
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Two days
+DTSTART;VALUE=DATE:20131003
+DTEND;VALUE=DATE:20131005
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:On day 1
+DTSTART;VALUE=DATE:20131003
+DTEND;VALUE=DATE:20131004
+TRANSP:TRANSPARENT
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:On day 2
+DTSTART;VALUE=DATE:20131003
+END:VEVENT
+END:VCALENDAR
diff --git a/test/ical-005.sh b/test/ical-005.sh
new file mode 100755
index 0000000..59c08c8
--- /dev/null
+++ b/test/ical-005.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+. "${TEST_INIT:-./test-init.sh}"
+
+if [ "$1" = 'actual' ]; then
+ mkdir .calcurse || exit 1
+ cp "$DATA_DIR/conf" .calcurse || exit 1
+ "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-005.ical"
+ "$CALCURSE" -D "$PWD/.calcurse" -s10/03/2013 -r3
+ rm -rf .calcurse || exit 1
+elif [ "$1" = 'expected' ]; then
+ cat <<EOD
+Import process report: 0030 lines read
+0 apps / 4 events / 0 todos / 0 skipped
+10/03/13:
+ * Two days
+ * All day
+ * On day 1
+ * On day 2
+
+10/04/13:
+ * Two days
+EOD
+else
+ ./run-test "$0"
+fi