summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2017-05-17 15:23:56 +0200
committerMilan Crha <mcrha@redhat.com>2017-05-17 15:23:56 +0200
commitc00861413563799cf2119f5c2a26efcc44e8ac9d (patch)
tree467e330d18806526c538716252578dadad983835
parent0658fc6536dc13fba419b10ea54a22bbeee58a0d (diff)
downloadevolution-data-server-wip/offline-cache.tar.gz
Correct ECalCache time-related issueswip/offline-cache
Different libical behaves differently, and the previous code had been tested on a "broken" libical (their issue #287 fixes it).
-rw-r--r--src/calendar/libecal/e-cal-util.c18
-rw-r--r--src/calendar/libedata-cal/e-cal-cache.c69
-rw-r--r--tests/libedata-cal/components/event-9.ics4
-rw-r--r--tests/libedata-cal/test-cal-cache-search.c14
4 files changed, 63 insertions, 42 deletions
diff --git a/src/calendar/libecal/e-cal-util.c b/src/calendar/libecal/e-cal-util.c
index 653f03b42..a9426f8f1 100644
--- a/src/calendar/libecal/e-cal-util.c
+++ b/src/calendar/libecal/e-cal-util.c
@@ -1496,7 +1496,6 @@ componenttime_to_utc_timet (const ECalComponentDateTime *dt_time,
if (dt_time->tzid)
zone = tz_cb (dt_time->tzid, tz_cb_data);
- // zone = icaltimezone_get_utc_timezone ();
timet = icaltime_as_timet_with_zone (
*dt_time->value, zone ? zone : default_zone);
}
@@ -1530,6 +1529,7 @@ e_cal_util_get_component_occur_times (ECalComponent *comp,
{
struct icalrecurrencetype ir;
ECalComponentDateTime dt_start, dt_end;
+ time_t duration;
g_return_if_fail (comp != NULL);
g_return_if_fail (start != NULL);
@@ -1545,6 +1545,14 @@ e_cal_util_get_component_occur_times (ECalComponent *comp,
e_cal_component_free_datetime (&dt_start);
+ e_cal_component_get_dtend (comp, &dt_end);
+ duration = componenttime_to_utc_timet (&dt_end, tz_cb, tz_cb_data, default_timezone);
+ if (duration <= 0 || *start == _TIME_MIN || *start > duration)
+ duration = 0;
+ else
+ duration = duration - *start;
+ e_cal_component_free_datetime (&dt_end);
+
/* find out end date of component */
*end = _TIME_MAX;
@@ -1603,8 +1611,8 @@ e_cal_util_get_component_occur_times (ECalComponent *comp,
if (rule_end == -1) /* repeats forever */
may_end = _TIME_MAX;
- else if (rule_end > may_end) /* new maximum */
- may_end = rule_end;
+ else if (rule_end + duration > may_end) /* new maximum */
+ may_end = rule_end + duration;
}
/* Do the EXRULEs. */
@@ -1620,8 +1628,8 @@ e_cal_util_get_component_occur_times (ECalComponent *comp,
if (rule_end == -1) /* repeats forever */
may_end = _TIME_MAX;
- else if (rule_end > may_end)
- may_end = rule_end;
+ else if (rule_end + duration > may_end)
+ may_end = rule_end + duration;
}
/* Do the RDATEs */
diff --git a/src/calendar/libedata-cal/e-cal-cache.c b/src/calendar/libedata-cal/e-cal-cache.c
index 24783bfaf..fd97743da 100644
--- a/src/calendar/libedata-cal/e-cal-cache.c
+++ b/src/calendar/libedata-cal/e-cal-cache.c
@@ -476,6 +476,32 @@ ecc_decode_id_sql (const gchar *id,
return TRUE;
}
+static icaltimezone *
+ecc_resolve_tzid_cb (const gchar *tzid,
+ gpointer user_data)
+{
+ ECalCache *cal_cache = user_data;
+ icaltimezone *zone = NULL;
+
+ g_return_val_if_fail (E_IS_CAL_CACHE (cal_cache), NULL);
+
+ if (e_cal_cache_get_timezone (cal_cache, tzid, &zone, NULL, NULL) && zone)
+ return zone;
+
+ zone = icaltimezone_get_builtin_timezone (tzid);
+ if (!zone)
+ zone = icaltimezone_get_builtin_timezone_from_tzid (tzid);
+ if (!zone) {
+ tzid = e_cal_match_tzid (tzid);
+ zone = icaltimezone_get_builtin_timezone (tzid);
+ }
+
+ if (!zone)
+ zone = icaltimezone_get_builtin_timezone_from_tzid (tzid);
+
+ return zone;
+}
+
static gchar *
ecc_encode_itt_to_sql (struct icaltimetype itt)
{
@@ -491,13 +517,11 @@ ecc_encode_time_to_sql (ECalCache *cal_cache,
struct icaltimetype itt;
icaltimezone *zone = NULL;
- if (!dt || !dt->value)
+ if (!dt || !dt->value || (!dt->value->is_utc && (!dt->tzid || !*dt->tzid)))
return NULL;
itt = *dt->value;
-
- if (!e_cal_cache_get_timezone (cal_cache, dt->tzid, &zone, NULL, NULL))
- zone = NULL;
+ zone = ecc_resolve_tzid_cb (dt->tzid, cal_cache);
icaltimezone_convert_time (&itt, zone, icaltimezone_get_utc_timezone ());
@@ -513,26 +537,11 @@ ecc_encode_timet_to_sql (ECalCache *cal_cache,
if (tt <= 0)
return NULL;
- itt = icaltime_from_timet_with_zone (tt, FALSE, NULL);
+ itt = icaltime_from_timet_with_zone (tt, FALSE, icaltimezone_get_utc_timezone ());
return ecc_encode_itt_to_sql (itt);
}
-static icaltimezone *
-ecc_resolve_tzid_cb (const gchar *tzid,
- gpointer user_data)
-{
- ECalCache *cal_cache = user_data;
- icaltimezone *zone = NULL;
-
- g_return_val_if_fail (E_IS_CAL_CACHE (cal_cache), NULL);
-
- if (!e_cal_cache_get_timezone (cal_cache, tzid, &zone, NULL, NULL))
- return NULL;
-
- return zone;
-}
-
static gchar *
ecc_extract_text_list (const GSList *list)
{
@@ -810,8 +819,16 @@ ecc_fill_other_columns (ECalCache *cal_cache,
ecc_resolve_tzid_cb, cal_cache, icaltimezone_get_utc_timezone (),
icalcomponent_isa (icalcomp));
- add_value (ECC_COLUMN_OCCUR_START, ecc_encode_timet_to_sql (cal_cache, occur_start));
- add_value (ECC_COLUMN_OCCUR_END, ecc_encode_timet_to_sql (cal_cache, occur_end));
+ e_cal_component_get_dtstart (comp, &dt);
+ add_value (ECC_COLUMN_OCCUR_START, dt.value && ((dt.tzid && *dt.tzid) || dt.value->is_utc) ? ecc_encode_timet_to_sql (cal_cache, occur_start) : NULL);
+
+ has = dt.value != NULL;
+ add_value (ECC_COLUMN_HAS_START, g_strdup (has ? "1" : "0"));
+ e_cal_component_free_datetime (&dt);
+
+ e_cal_component_get_dtend (comp, &dt);
+ add_value (ECC_COLUMN_OCCUR_END, dt.value && ((dt.tzid && *dt.tzid) || dt.value->is_utc) ? ecc_encode_timet_to_sql (cal_cache, occur_end) : NULL);
+ e_cal_component_free_datetime (&dt);
e_cal_component_get_due (comp, &dt);
add_value (ECC_COLUMN_DUE, ecc_encode_time_to_sql (cal_cache, &dt));
@@ -852,11 +869,6 @@ ecc_fill_other_columns (ECalCache *cal_cache,
has = e_cal_component_has_attachments (comp);
add_value (ECC_COLUMN_HAS_ATTACHMENT, g_strdup (has ? "1" : "0"));
- e_cal_component_get_dtstart (comp, &dt);
- has = dt.value != NULL;
- add_value (ECC_COLUMN_HAS_START, g_strdup (has ? "1" : "0"));
- e_cal_component_free_datetime (&dt);
-
has = e_cal_component_has_recurrences (comp) ||
e_cal_component_is_instance (comp);
add_value (ECC_COLUMN_HAS_RECURRENCES, g_strdup (has ? "1" : "0"));
@@ -3067,7 +3079,8 @@ e_cal_cache_dup_timezone_as_string (ECalCache *cal_cache,
"SELECT zone FROM " ECC_TABLE_TIMEZONES " WHERE tzid=%Q",
tzid);
- success = e_cache_sqlite_select (E_CACHE (cal_cache), stmt, e_cal_cache_get_string, out_zone_string, cancellable, error);
+ success = e_cache_sqlite_select (E_CACHE (cal_cache), stmt, e_cal_cache_get_string, out_zone_string, cancellable, error) &&
+ *out_zone_string != NULL;
e_cache_sqlite_stmt_free (stmt);
diff --git a/tests/libedata-cal/components/event-9.ics b/tests/libedata-cal/components/event-9.ics
index 70b96f75e..f0edf3c63 100644
--- a/tests/libedata-cal/components/event-9.ics
+++ b/tests/libedata-cal/components/event-9.ics
@@ -1,8 +1,8 @@
BEGIN:VEVENT
UID:event-9
DTSTAMP:20170221T121736Z
-DTSTART;TZID=America/new_York:20170225T160000
-DTEND;TZID=America/new_York:20170225T170000
+DTSTART;TZID=America/New_York:20170225T160000
+DTEND;TZID=America/New_York:20170225T170000
SEQUENCE:2
ORGANIZER;CN=Alice:MAILTO:alice@no.where
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
diff --git a/tests/libedata-cal/test-cal-cache-search.c b/tests/libedata-cal/test-cal-cache-search.c
index 7373fa409..ac662b709 100644
--- a/tests/libedata-cal/test-cal-cache-search.c
+++ b/tests/libedata-cal/test-cal-cache-search.c
@@ -260,15 +260,15 @@ test_search_occur_in_time_range (TCUFixture *fixture,
test_search (fixture, "(occur-in-time-range? (make-time \"20170209T000000Z\") (make-time \"20170210T000000Z\"))", "event-1");
test_search (fixture, "(occur-in-time-range? (make-time \"20170209T020000Z\") (make-time \"20170209T023000Z\"))", "event-1");
test_search (fixture, "(occur-in-time-range? (make-time \"20111231T000000Z\") (make-time \"20111231T595959Z\"))", "event-5");
- test_search (fixture, "(occur-in-time-range? (make-time \"20170225T160100Z\") (make-time \"20170225T160200Z\") \"America/New_York\")", "event-8");
- test_search (fixture, "(occur-in-time-range? (make-time \"20170225T160100Z\") (make-time \"20170225T160200Z\") \"Europe/Berlin\")", "event-8");
+ test_search (fixture, "(occur-in-time-range? (make-time \"20170225T210100Z\") (make-time \"20170225T210200Z\") \"America/New_York\")", "event-8");
+ test_search (fixture, "(occur-in-time-range? (make-time \"20170225T150100Z\") (make-time \"20170225T150200Z\") \"Europe/Berlin\")", "event-8");
test_search (fixture, "(occur-in-time-range? (make-time \"20170225T160100Z\") (make-time \"20170225T160200Z\") \"UTC\")", "event-8");
- /* the second instance of event-6 */
- test_search (fixture, "(occur-in-time-range? (make-time \"20170221T130000Z\") (make-time \"20170221T140000Z\"))", "event-6");
- test_search (fixture, "(occur-in-time-range? (make-time \"20170221T130000Z\") (make-time \"20170221T140000Z\") \"America/New_York\")", "event-6");
- test_search (fixture, "(occur-in-time-range? (make-time \"20170221T190000Z\") (make-time \"20170221T200000Z\") \"Europe/Berlin\")", "!event-6");
- test_search (fixture, "(occur-in-time-range? (make-time \"20170221T130000Z\") (make-time \"20170221T140000Z\") \"Europe/Berlin\")", "event-6");
+ /* event-6 */
+ test_search (fixture, "(occur-in-time-range? (make-time \"20170221T180000Z\") (make-time \"20170221T190000Z\"))", "event-6");
+ test_search (fixture, "(occur-in-time-range? (make-time \"20170221T180000Z\") (make-time \"20170221T190000Z\") \"America/New_York\")", "event-6");
+ test_search (fixture, "(occur-in-time-range? (make-time \"20170221T200000Z\") (make-time \"20170221T210000Z\") \"Europe/Berlin\")", "!event-6");
+ test_search (fixture, "(occur-in-time-range? (make-time \"20170221T180000Z\") (make-time \"20170221T190000Z\") \"Europe/Berlin\")", "event-6");
}
static void