summaryrefslogtreecommitdiff
path: root/src
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 /src
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>
Diffstat (limited to 'src')
-rw-r--r--src/ical.c35
1 files changed, 24 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);
}