[evolution-data-server/gnome-3-26] Bug 788686 - Google Tasks not shown in To Do-list after restart of Evolution
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server/gnome-3-26] Bug 788686 - Google Tasks not shown in To Do-list after restart of Evolution
- Date: Mon, 9 Oct 2017 17:05:58 +0000 (UTC)
commit 7ac62a2987fa79ef748a6df59ecb1a8463cfdd8f
Author: Milan Crha <mcrha redhat com>
Date: Mon Oct 9 19:03:10 2017 +0200
Bug 788686 - Google Tasks not shown in To Do-list after restart of Evolution
.../backends/gtasks/e-cal-backend-gtasks.c | 1 +
src/calendar/libedata-cal/e-cal-cache.c | 97 ++++++++++++++++++--
2 files changed, 91 insertions(+), 7 deletions(-)
---
diff --git a/src/calendar/backends/gtasks/e-cal-backend-gtasks.c
b/src/calendar/backends/gtasks/e-cal-backend-gtasks.c
index 8c8d88c..b700d63 100644
--- a/src/calendar/backends/gtasks/e-cal-backend-gtasks.c
+++ b/src/calendar/backends/gtasks/e-cal-backend-gtasks.c
@@ -386,6 +386,7 @@ ecb_gtasks_get_backend_property (ECalBackend *cal_backend,
return g_strjoin (",",
CAL_STATIC_CAPABILITY_NO_THISANDFUTURE,
CAL_STATIC_CAPABILITY_NO_THISANDPRIOR,
+ CAL_STATIC_CAPABILITY_TASK_DATE_ONLY,
e_cal_meta_backend_get_capabilities (E_CAL_META_BACKEND (cal_backend)),
NULL);
} else if (g_str_equal (prop_name, CAL_BACKEND_PROPERTY_CAL_EMAIL_ADDRESS) ||
diff --git a/src/calendar/libedata-cal/e-cal-cache.c b/src/calendar/libedata-cal/e-cal-cache.c
index 9a2a40d..c8ae546 100644
--- a/src/calendar/libedata-cal/e-cal-cache.c
+++ b/src/calendar/libedata-cal/e-cal-cache.c
@@ -42,7 +42,7 @@
#include "e-cal-cache.h"
-#define E_CAL_CACHE_VERSION 1
+#define E_CAL_CACHE_VERSION 2
#define ECC_TABLE_TIMEZONES "timezones"
@@ -542,11 +542,13 @@ ecc_encode_time_to_sql (ECalCache *cal_cache,
struct icaltimetype itt;
icaltimezone *zone = NULL;
- if (!dt || !dt->value || (!icaltime_is_utc (*dt->value) && (!dt->tzid || !*dt->tzid)))
+ if (!dt || !dt->value)
return NULL;
itt = *dt->value;
- zone = ecc_resolve_tzid_cb (dt->tzid, cal_cache);
+
+ if (!itt.is_date && !icaltime_is_utc (itt) && dt->tzid && *dt->tzid)
+ zone = ecc_resolve_tzid_cb (dt->tzid, cal_cache);
icaltimezone_convert_time (&itt, zone, icaltimezone_get_utc_timezone ());
@@ -1745,18 +1747,99 @@ ecc_init_sqlite_functions (ECalCache *cal_cache,
return TRUE;
}
+typedef struct _ComponentInfo {
+ GSList *online_comps; /* ECalComponent * */
+ GSList *online_extras; /* gchar * */
+ GSList *offline_comps; /* ECalComponent * */
+ GSList *offline_extras; /* gchar * */
+} ComponentInfo;
+
+static void
+component_info_clear (ComponentInfo *ci)
+{
+ if (ci) {
+ g_slist_free_full (ci->online_comps, g_object_unref);
+ g_slist_free_full (ci->online_extras, g_free);
+ g_slist_free_full (ci->offline_comps, g_object_unref);
+ g_slist_free_full (ci->offline_extras, g_free);
+ }
+}
+
+static gboolean
+cal_cache_gather_v1_affected_cb (ECalCache *cal_cache,
+ const gchar *uid,
+ const gchar *rid,
+ const gchar *revision,
+ const gchar *object,
+ const gchar *extra,
+ EOfflineState offline_state,
+ gpointer user_data)
+{
+ ComponentInfo *ci = user_data;
+ ECalComponent *comp;
+ ECalComponentDateTime dt;
+
+ g_return_val_if_fail (object != NULL, FALSE);
+ g_return_val_if_fail (ci != NULL, FALSE);
+
+ if (offline_state == E_OFFLINE_STATE_LOCALLY_DELETED)
+ return TRUE;
+
+ comp = e_cal_component_new_from_string (object);
+ if (!comp)
+ return TRUE;
+
+ e_cal_component_get_due (comp, &dt);
+
+ if (dt.value && !icaltime_is_utc (*dt.value) && (!dt.tzid || !*dt.tzid)) {
+ GSList **pcomps, **pextras;
+
+ if (offline_state == E_OFFLINE_STATE_SYNCED) {
+ pcomps = &ci->online_comps;
+ pextras = &ci->online_extras;
+ } else {
+ pcomps = &ci->offline_comps;
+ pextras = &ci->offline_extras;
+ }
+
+ *pcomps = g_slist_prepend (*pcomps, g_object_ref (comp));
+ *pextras = g_slist_prepend (*pextras, g_strdup (extra));
+ }
+
+ e_cal_component_free_datetime (&dt);
+ g_object_unref (comp);
+
+ return TRUE;
+}
+
static gboolean
e_cal_cache_migrate (ECache *cache,
gint from_version,
GCancellable *cancellable,
GError **error)
{
- /* ECalCache *cal_cache = E_CAL_CACHE (cache); */
+ ECalCache *cal_cache = E_CAL_CACHE (cache);
gboolean success = TRUE;
- /* Add any version-related changes here */
- /*if (from_version < E_CAL_CACHE_VERSION) {
- }*/
+ /* Add any version-related changes here (E_CAL_CACHE_VERSION) */
+ if (from_version == 1) {
+ /* Version 1 incorrectly stored DATE-only DUE values */
+ ComponentInfo ci;
+
+ memset (&ci, 0, sizeof (ComponentInfo));
+
+ if (e_cal_cache_search_with_callback (cal_cache, NULL, cal_cache_gather_v1_affected_cb, &ci,
cancellable, NULL)) {
+ gboolean success = TRUE;
+
+ if (ci.online_comps)
+ success = e_cal_cache_put_components (cal_cache, ci.online_comps,
ci.online_extras, E_CACHE_IS_ONLINE, cancellable, NULL);
+
+ if (success && ci.offline_comps)
+ e_cal_cache_put_components (cal_cache, ci.offline_comps, ci.offline_extras,
E_CACHE_IS_OFFLINE, cancellable, NULL);
+ }
+
+ component_info_clear (&ci);
+ }
return success;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]