[Xfce4-commits] r25375 - xfcalendar/trunk/src

Juha Kautto juha at xfce.org
Tue Apr 3 23:34:11 CEST 2007


Author: juha
Date: 2007-04-03 21:34:10 +0000 (Tue, 03 Apr 2007)
New Revision: 25375

Modified:
   xfcalendar/trunk/src/ical-code.c
Log:
Bug 3058 - Bug when adding All day event from iCal.
Orage interpreted full day end date wrongly. 


Modified: xfcalendar/trunk/src/ical-code.c
===================================================================
--- xfcalendar/trunk/src/ical-code.c	2007-04-03 17:37:45 UTC (rev 25374)
+++ xfcalendar/trunk/src/ical-code.c	2007-04-03 21:34:10 UTC (rev 25375)
@@ -783,6 +783,8 @@
     icalproperty *p = NULL, *p2 = NULL;
     xfical_period per;
     icalcomponent_kind ikind = ICAL_VEVENT_COMPONENT;
+    struct icaldurationtype duration_tmp;
+    gint dur_int;
 
     /* Exactly one start time must be there */
     p = icalcomponent_get_first_property(c, ICAL_DTSTART_PROPERTY);
@@ -821,6 +823,17 @@
             per.etime = icalproperty_get_due(p);
         per.etime = convert_to_local_timezone(per.etime, p);
         per.duration = icaltime_subtract(per.etime, per.stime);
+        if (icaltime_is_date(per.stime) 
+            && icaldurationtype_as_int(per.duration) != 0) {
+        /* need to subtract 1 day.
+         * read explanation from appt_add_internal: appt->endtime processing */
+            duration_tmp = icaldurationtype_from_int(60*60*24);
+            dur_int = icaldurationtype_as_int(per.duration);
+            dur_int -= icaldurationtype_as_int(duration_tmp);
+            per.duration = icaldurationtype_from_int(dur_int);
+            per.etime = icaltime_add(per.stime, per.duration);
+        }
+
     }
     else {
         p = icalcomponent_get_first_property(c, ICAL_DURATION_PROPERTY);
@@ -1427,7 +1440,11 @@
 
     if ORAGE_STR_EXISTS(appt->starttime) {
         wtime=icaltime_from_string(appt->starttime);
-        if ORAGE_STR_EXISTS(appt->start_tz_loc) {
+        if (appt->allDay) { /* date */
+            icalcomponent_add_property(icmp
+                    , icalproperty_new_dtstart(wtime));
+        }
+        else if ORAGE_STR_EXISTS(appt->start_tz_loc) {
             if (strcmp(appt->start_tz_loc, "UTC") == 0) {
                 wtime=icaltime_convert_to_zone(wtime, utc_icaltimezone);
                 icalcomponent_add_property(icmp
@@ -1461,7 +1478,14 @@
         else if ORAGE_STR_EXISTS(appt->endtime) {
             end_time_done = FALSE;
             wtime = icaltime_from_string(appt->endtime);
-            if ORAGE_STR_EXISTS(appt->end_tz_loc) {
+            if (appt->allDay) { 
+                /* need to add 1 day. For example:
+                 * DTSTART=20070221 & DTEND=20070223
+                 * means only 21 and 22 February */
+                duration = icaldurationtype_from_int(60*60*24);
+                wtime = icaltime_add(wtime, duration);
+            }
+            else if ORAGE_STR_EXISTS(appt->end_tz_loc) {
             /* Null == floating => no special action needed */
                 if (strcmp(appt->end_tz_loc, "UTC") == 0)
                     wtime = icaltime_convert_to_zone(wtime, utc_icaltimezone);
@@ -1729,8 +1753,9 @@
     text  = icaltime_as_ical_string(*itime);
     */
     g_strlcpy(appt->endtime, text, 17);
-    if (icaltime_is_date(*itime))
+    if (icaltime_is_date(*itime)) {
         appt->allDay = TRUE;
+    }
     else if (icaltime_is_utc(*itime))
         appt->end_tz_loc = "UTC";
     else { /* let's check timezone */
@@ -1786,7 +1811,7 @@
     icalparameter *itime_tz;
     icalproperty_transp xf_transp;
     struct icalrecurrencetype rrule;
-    struct icaldurationtype duration;
+    struct icaldurationtype duration, duration_tmp;
     int i, cnt, day;
     gboolean stime_found = FALSE, etime_found = FALSE, valid_comp = FALSE;
 
@@ -2037,6 +2062,16 @@
         else {
             duration = icaltime_subtract(eltime, sltime);
             appt.duration = icaldurationtype_as_int(duration);
+            if (appt.allDay && appt.duration) {
+        /* need to subtract 1 day.
+         * read explanation from appt_add_internal: appt->endtime processing */
+                duration_tmp = icaldurationtype_from_int(60*60*24);
+                appt.duration -= icaldurationtype_as_int(duration_tmp);
+                duration = icaldurationtype_from_int(appt.duration);
+                etime = icaltime_add(stime, duration);
+                text  = icaltime_as_ical_string(etime);
+                g_strlcpy(appt.endtime, text, 17);
+            }
         }
         return(&appt);
     }



More information about the Xfce4-commits mailing list