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()
dtstart.zone = get_default_icaltimezone();
}
}
- // FIXME do more here
dtend = icalcomponent_get_dtend(cal);
if (!icaltime_is_null_time(dtend)) {
}
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));
*/
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);
}
}
*/
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);
}
}
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;