* give all commands their own function
[citadel.git] / citadel / modules / calendar / serv_calendar.c
index 66a4c7c93e2fb10b50fbe8bc8d7b96662d5062e9..094ab130809a73167e56a0990a5e4414d8926706 100644 (file)
@@ -808,51 +808,64 @@ int ical_ctdl_is_overlap(
                        struct icaltimetype t2start,
                        struct icaltimetype t2end
 ) {
-
        if (icaltime_is_null_time(t1start)) return(0);
        if (icaltime_is_null_time(t2start)) return(0);
 
-       /* First, check for all-day events */
-       if (t1start.is_date) {
-               if (!icaltime_compare_date_only(t1start, t2start)) {
-                       return(1);
-               }
-               if (!icaltime_is_null_time(t2end)) {
-                       if (!icaltime_compare_date_only(t1start, t2end)) {
-                               return(1);
-                       }
+       /* if either event lacks end time, assume end = start */
+       if (icaltime_is_null_time(t1end))
+               memcpy(&t1end, &t1start, sizeof(struct icaltimetype));
+       else {
+               if (t1end.is_date && icaltime_compare(t1start, t1end)) {
+                        /*
+                         * the end date is non-inclusive so adjust it by one
+                         * day because our test is inclusive, note that a day is
+                         * not too much because we are talking about all day
+                         * events
+                        * if start = end we assume that nevertheless the whole
+                        * day is meant
+                         */
+                       icaltime_adjust(&t1end, -1, 0, 0, 0);   
                }
        }
 
-       if (t2start.is_date) {
-               if (!icaltime_compare_date_only(t2start, t1start)) {
-                       return(1);
-               }
-               if (!icaltime_is_null_time(t1end)) {
-                       if (!icaltime_compare_date_only(t2start, t1end)) {
-                               return(1);
-                       }
+       if (icaltime_is_null_time(t2end))
+               memcpy(&t2end, &t2start, sizeof(struct icaltimetype));
+       else {
+               if (t2end.is_date && icaltime_compare(t2start, t2end)) {
+                       icaltime_adjust(&t2end, -1, 0, 0, 0);   
                }
        }
 
-       /* Now check for overlaps using date *and* time. */
+       /* First, check for all-day events */
+       if (t1start.is_date || t2start.is_date) {
+               /* If event 1 ends before event 2 starts, we're in the clear. */
+               if (icaltime_compare_date_only(t1end, t2start) < 0) return(0);
+
+               /* If event 2 ends before event 1 starts, we're also ok. */
+               if (icaltime_compare_date_only(t2end, t1start) < 0) return(0);
+
+               return(1);
+       }
+
+       /* lprintf (9, "Comparing t1start %d:%d t1end %d:%d t2start %d:%d t2end %d:%d \n",
+               t1start.hour, t1start.minute, t1end.hour, t1end.minute,
+               t2start.hour, t2start.minute, t2end.hour, t2end.minute);
+       */
 
-       /* First, bail out if either event 1 or event 2 is missing end time. */
-       if (icaltime_is_null_time(t1end)) return(0);
-       if (icaltime_is_null_time(t2end)) return(0);
+       /* Now check for overlaps using date *and* time. */
 
        /* If event 1 ends before event 2 starts, we're in the clear. */
        if (icaltime_compare(t1end, t2start) <= 0) return(0);
+       /* lprintf(9, "first passed\n"); */
 
        /* If event 2 ends before event 1 starts, we're also ok. */
        if (icaltime_compare(t2end, t1start) <= 0) return(0);
+       /* lprintf(9, "second passed\n"); */
 
        /* Otherwise, they overlap. */
        return(1);
 }
 
-
-
 /* 
  * Phase 6 of "hunt for conflicts"
  * called by ical_conflicts_phase5()
@@ -1280,7 +1293,6 @@ void ical_add_to_freebusy(icalcomponent *fb, icalcomponent *top_level_cal) {
                        dtstart.zone = get_default_icaltimezone();
                }
        }
-       // FIXME do more here
 
        dtend = icalcomponent_get_dtend(cal);
        if (!icaltime_is_null_time(dtend)) {
@@ -1295,23 +1307,24 @@ void ical_add_to_freebusy(icalcomponent *fb, icalcomponent *top_level_cal) {
        }
 
        do {
-
-
-               // FIXME add timezone conversion, we are currently outputting floating times
-
-               CtdlLogPrintf(CTDL_DEBUG, "Start, utc=%d, %s\n",
-                       dtstart.is_utc,
-                       icaltime_as_ical_string(dtstart)
-               );
-
-
-
                /* Convert the DTSTART and DTEND properties to an icalperiod. */
                this_event_period.start = dtstart;
        
                if (!icaltime_is_null_time(dtend)) {
                        this_event_period.end = dtend;
                }
+
+               /* Convert the timestamps to UTC.  It's ok to do this because we've already expanded
+                * recurrences and this data is never going to get used again.
+                */
+               this_event_period.start = icaltime_convert_to_zone(
+                       this_event_period.start,
+                       icaltimezone_get_utc_timezone()
+               );
+               this_event_period.end = icaltime_convert_to_zone(
+                       this_event_period.end,
+                       icaltimezone_get_utc_timezone()
+               );
        
                /* Now add it. */
                icalcomponent_add_property(fb, icalproperty_new_freebusy(this_event_period));
@@ -1321,11 +1334,11 @@ void ical_add_to_freebusy(icalcomponent *fb, icalcomponent *top_level_cal) {
                 */
                p = icalcomponent_get_first_property(fb, ICAL_DTSTART_PROPERTY);
                if (p == NULL) {
-                       icalcomponent_set_dtstart(fb, dtstart);
+                       icalcomponent_set_dtstart(fb, this_event_period.start);
                }
                else {
-                       if (icaltime_compare(dtstart, icalcomponent_get_dtstart(fb)) < 0) {
-                               icalcomponent_set_dtstart(fb, dtstart);
+                       if (icaltime_compare(this_event_period.start, icalcomponent_get_dtstart(fb)) < 0) {
+                               icalcomponent_set_dtstart(fb, this_event_period.start);
                        }
                }
        
@@ -1334,11 +1347,11 @@ void ical_add_to_freebusy(icalcomponent *fb, icalcomponent *top_level_cal) {
                 */
                p = icalcomponent_get_first_property(fb, ICAL_DTEND_PROPERTY);
                if (p == NULL) {
-                       icalcomponent_set_dtend(fb, dtend);
+                       icalcomponent_set_dtend(fb, this_event_period.end);
                }
                else {
-                       if (icaltime_compare(dtend, icalcomponent_get_dtend(fb)) > 0) {
-                               icalcomponent_set_dtend(fb, dtend);
+                       if (icaltime_compare(this_event_period.end, icalcomponent_get_dtend(fb)) > 0) {
+                               icalcomponent_set_dtend(fb, this_event_period.end);
                        }
                }
 
@@ -1975,9 +1988,9 @@ void ical_send_out_invitations(icalcomponent *top_level_cal, icalcomponent *cal)
        size_t reqsize;
        icalproperty *p;
        struct icaltimetype t;
-       icaltimezone *attached_zones[5] = { NULL, NULL, NULL, NULL, NULL };
+       const icaltimezone *attached_zones[5] = { NULL, NULL, NULL, NULL, NULL };
        int i;
-       icaltimezone *z;
+       const icaltimezone *z;
        int num_zones_attached = 0;
        int zone_already_attached;