summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2023-03-24 10:07:53 +0100
committerMilan Crha <mcrha@redhat.com>2023-03-24 10:07:53 +0100
commit892ce97b7b5e139934565422c355340b543d2595 (patch)
treec5a3909aa859792518664430e23aa03fd69b4dea
parent444286d82116038d0b1d511d977144fbae1283ab (diff)
downloadevolution-data-server-892ce97b7b5e139934565422c355340b543d2595.tar.gz
I#461 - backends: React to destination URI changes
Closes https://gitlab.gnome.org/GNOME/evolution-data-server/-/issues/461
-rw-r--r--docs/reference/evolution-data-server/evolution-data-server-docs.sgml.in4
-rw-r--r--src/addressbook/backends/carddav/e-book-backend-carddav.c39
-rw-r--r--src/addressbook/libedata-book/e-book-meta-backend.c26
-rw-r--r--src/addressbook/libedata-book/e-book-meta-backend.h2
-rw-r--r--src/calendar/backends/caldav/e-cal-backend-caldav.c39
-rw-r--r--src/calendar/backends/http/e-cal-backend-http.c15
-rw-r--r--src/calendar/backends/webdav-notes/e-cal-backend-webdav-notes.c39
-rw-r--r--src/calendar/libedata-cal/e-cal-meta-backend.c26
-rw-r--r--src/calendar/libedata-cal/e-cal-meta-backend.h2
9 files changed, 185 insertions, 7 deletions
diff --git a/docs/reference/evolution-data-server/evolution-data-server-docs.sgml.in b/docs/reference/evolution-data-server/evolution-data-server-docs.sgml.in
index 6ccbdd31d..563530f6a 100644
--- a/docs/reference/evolution-data-server/evolution-data-server-docs.sgml.in
+++ b/docs/reference/evolution-data-server/evolution-data-server-docs.sgml.in
@@ -364,6 +364,10 @@
<title>Index of deprecated symbols</title>
<xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
</index>
+ <index id="api-index-3-50" role="3.50">
+ <title>Index of new symbols in 3.50</title>
+ <xi:include href="xml/api-index-3.50.xml"><xi:fallback /></xi:include>
+ </index>
<index id="api-index-3-48" role="3.48">
<title>Index of new symbols in 3.48</title>
<xi:include href="xml/api-index-3.48.xml"><xi:fallback /></xi:include>
diff --git a/src/addressbook/backends/carddav/e-book-backend-carddav.c b/src/addressbook/backends/carddav/e-book-backend-carddav.c
index 398e670d0..1030543f8 100644
--- a/src/addressbook/backends/carddav/e-book-backend-carddav.c
+++ b/src/addressbook/backends/carddav/e-book-backend-carddav.c
@@ -39,6 +39,7 @@
struct _EBookBackendCardDAVPrivate {
/* The main WebDAV session */
EWebDAVSession *webdav;
+ GUri *last_uri;
GMutex webdav_lock;
/* If already been connected, then the connect_sync() will relax server checks,
@@ -84,7 +85,7 @@ ebb_carddav_connect_sync (EBookMetaBackend *meta_backend,
EWebDAVSession *webdav;
GHashTable *capabilities = NULL, *allows = NULL;
ESource *source;
- gboolean success, is_writable = FALSE;
+ gboolean success, is_writable = FALSE, uri_changed = FALSE;
GError *local_error = NULL;
g_return_val_if_fail (E_IS_BOOK_BACKEND_CARDDAV (meta_backend), FALSE);
@@ -93,15 +94,48 @@ ebb_carddav_connect_sync (EBookMetaBackend *meta_backend,
*out_auth_result = E_SOURCE_AUTHENTICATION_ACCEPTED;
bbdav = E_BOOK_BACKEND_CARDDAV (meta_backend);
+ source = e_backend_get_source (E_BACKEND (meta_backend));
g_mutex_lock (&bbdav->priv->webdav_lock);
if (bbdav->priv->webdav) {
g_mutex_unlock (&bbdav->priv->webdav_lock);
return TRUE;
}
+
+ if (e_source_has_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND)) {
+ ESourceWebdav *webdav_extension;
+ GUri *current_uri;
+
+ webdav_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND);
+ current_uri = e_source_webdav_dup_uri (webdav_extension);
+
+ #define uri_str_equal(_func) (g_strcmp0 (_func (bbdav->priv->last_uri), _func (current_uri)) == 0)
+
+ uri_changed = bbdav->priv->last_uri && current_uri && (
+ g_uri_get_port (bbdav->priv->last_uri) != g_uri_get_port (current_uri) ||
+ !uri_str_equal (g_uri_get_auth_params) ||
+ !uri_str_equal (g_uri_get_host) ||
+ !uri_str_equal (g_uri_get_path) ||
+ !uri_str_equal (g_uri_get_query) ||
+ !uri_str_equal (g_uri_get_fragment) ||
+ !uri_str_equal (g_uri_get_scheme) ||
+ !uri_str_equal (g_uri_get_userinfo) ||
+ !uri_str_equal (g_uri_get_user) ||
+ !uri_str_equal (g_uri_get_password));
+
+ #undef uri_str_equal
+
+ if (!bbdav->priv->last_uri || uri_changed) {
+ g_clear_pointer (&bbdav->priv->last_uri, g_uri_unref);
+ bbdav->priv->last_uri = current_uri;
+ } else if (current_uri) {
+ g_uri_unref (current_uri);
+ }
+ }
g_mutex_unlock (&bbdav->priv->webdav_lock);
- source = e_backend_get_source (E_BACKEND (meta_backend));
+ if (uri_changed)
+ e_book_meta_backend_set_sync_tag (meta_backend, NULL);
webdav = e_webdav_session_new (source);
@@ -1465,6 +1499,7 @@ e_book_backend_carddav_dispose (GObject *object)
g_mutex_lock (&bbdav->priv->webdav_lock);
g_clear_object (&bbdav->priv->webdav);
+ g_clear_pointer (&bbdav->priv->last_uri, g_uri_unref);
g_mutex_unlock (&bbdav->priv->webdav_lock);
/* Chain up to parent's method. */
diff --git a/src/addressbook/libedata-book/e-book-meta-backend.c b/src/addressbook/libedata-book/e-book-meta-backend.c
index 127dcd11d..e1d0d39d2 100644
--- a/src/addressbook/libedata-book/e-book-meta-backend.c
+++ b/src/addressbook/libedata-book/e-book-meta-backend.c
@@ -2848,6 +2848,32 @@ e_book_meta_backend_dup_sync_tag (EBookMetaBackend *meta_backend)
return sync_tag;
}
+/**
+ * e_book_meta_backend_set_sync_tag:
+ * @meta_backend: an #EBookMetaBackend
+ * @sync_tag: (nullable): a sync tag to set, or %NULL to unset the old one
+ *
+ * Sets the @sync_tag for the @meta_backend.
+ *
+ * Since: 3.50
+ **/
+void
+e_book_meta_backend_set_sync_tag (EBookMetaBackend *meta_backend,
+ const gchar *sync_tag)
+{
+ EBookCache *book_cache;
+
+ g_return_if_fail (E_IS_BOOK_META_BACKEND (meta_backend));
+
+ book_cache = e_book_meta_backend_ref_cache (meta_backend);
+ if (!book_cache)
+ return;
+
+ e_cache_set_key (E_CACHE (book_cache), EBMB_KEY_SYNC_TAG, sync_tag, NULL);
+
+ g_clear_object (&book_cache);
+}
+
static void
ebmb_cache_revision_changed_cb (ECache *cache,
gpointer user_data)
diff --git a/src/addressbook/libedata-book/e-book-meta-backend.h b/src/addressbook/libedata-book/e-book-meta-backend.h
index 15592e7a5..c3ad9990e 100644
--- a/src/addressbook/libedata-book/e-book-meta-backend.h
+++ b/src/addressbook/libedata-book/e-book-meta-backend.h
@@ -197,6 +197,8 @@ void e_book_meta_backend_set_connected_writable
gboolean e_book_meta_backend_get_connected_writable
(EBookMetaBackend *meta_backend);
gchar * e_book_meta_backend_dup_sync_tag(EBookMetaBackend *meta_backend);
+void e_book_meta_backend_set_sync_tag(EBookMetaBackend *meta_backend,
+ const gchar *sync_tag);
void e_book_meta_backend_set_cache (EBookMetaBackend *meta_backend,
EBookCache *cache);
EBookCache * e_book_meta_backend_ref_cache (EBookMetaBackend *meta_backend);
diff --git a/src/calendar/backends/caldav/e-cal-backend-caldav.c b/src/calendar/backends/caldav/e-cal-backend-caldav.c
index 764b6f5c1..b3ab76257 100644
--- a/src/calendar/backends/caldav/e-cal-backend-caldav.c
+++ b/src/calendar/backends/caldav/e-cal-backend-caldav.c
@@ -37,6 +37,7 @@
struct _ECalBackendCalDAVPrivate {
/* The main WebDAV session */
EWebDAVSession *webdav;
+ GUri *last_uri;
GMutex webdav_lock;
/* If already been connected, then the connect_sync() will relax server checks,
@@ -121,7 +122,7 @@ ecb_caldav_connect_sync (ECalMetaBackend *meta_backend,
EWebDAVSession *webdav;
GHashTable *capabilities = NULL, *allows = NULL;
ESource *source;
- gboolean success, is_writable = FALSE;
+ gboolean success, is_writable = FALSE, uri_changed = FALSE;
GError *local_error = NULL;
g_return_val_if_fail (E_IS_CAL_BACKEND_CALDAV (meta_backend), FALSE);
@@ -130,15 +131,48 @@ ecb_caldav_connect_sync (ECalMetaBackend *meta_backend,
*out_auth_result = E_SOURCE_AUTHENTICATION_ACCEPTED;
cbdav = E_CAL_BACKEND_CALDAV (meta_backend);
+ source = e_backend_get_source (E_BACKEND (meta_backend));
g_mutex_lock (&cbdav->priv->webdav_lock);
if (cbdav->priv->webdav) {
g_mutex_unlock (&cbdav->priv->webdav_lock);
return TRUE;
}
+
+ if (e_source_has_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND)) {
+ ESourceWebdav *webdav_extension;
+ GUri *current_uri;
+
+ webdav_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND);
+ current_uri = e_source_webdav_dup_uri (webdav_extension);
+
+ #define uri_str_equal(_func) (g_strcmp0 (_func (cbdav->priv->last_uri), _func (current_uri)) == 0)
+
+ uri_changed = cbdav->priv->last_uri && current_uri && (
+ g_uri_get_port (cbdav->priv->last_uri) != g_uri_get_port (current_uri) ||
+ !uri_str_equal (g_uri_get_auth_params) ||
+ !uri_str_equal (g_uri_get_host) ||
+ !uri_str_equal (g_uri_get_path) ||
+ !uri_str_equal (g_uri_get_query) ||
+ !uri_str_equal (g_uri_get_fragment) ||
+ !uri_str_equal (g_uri_get_scheme) ||
+ !uri_str_equal (g_uri_get_userinfo) ||
+ !uri_str_equal (g_uri_get_user) ||
+ !uri_str_equal (g_uri_get_password));
+
+ #undef uri_str_equal
+
+ if (!cbdav->priv->last_uri || uri_changed) {
+ g_clear_pointer (&cbdav->priv->last_uri, g_uri_unref);
+ cbdav->priv->last_uri = current_uri;
+ } else if (current_uri) {
+ g_uri_unref (current_uri);
+ }
+ }
g_mutex_unlock (&cbdav->priv->webdav_lock);
- source = e_backend_get_source (E_BACKEND (meta_backend));
+ if (uri_changed)
+ e_cal_meta_backend_set_sync_tag (meta_backend, NULL);
webdav = e_webdav_session_new (source);
@@ -2411,6 +2445,7 @@ e_cal_backend_caldav_dispose (GObject *object)
g_mutex_lock (&cbdav->priv->webdav_lock);
g_clear_object (&cbdav->priv->webdav);
+ g_clear_pointer (&cbdav->priv->last_uri, g_uri_unref);
g_mutex_unlock (&cbdav->priv->webdav_lock);
/* Chain up to parent's method. */
diff --git a/src/calendar/backends/http/e-cal-backend-http.c b/src/calendar/backends/http/e-cal-backend-http.c
index e11de10b3..755431ec0 100644
--- a/src/calendar/backends/http/e-cal-backend-http.c
+++ b/src/calendar/backends/http/e-cal-backend-http.c
@@ -38,6 +38,7 @@ struct _ECalBackendHttpPrivate {
SoupMessage *message;
gchar *icalstring;
+ gchar *last_uri;
GRecMutex conn_lock;
GHashTable *components; /* gchar *uid ~> ICalComponent * */
gint64 hsts_until_time;
@@ -230,11 +231,22 @@ ecb_http_connect_sync (ECalMetaBackend *meta_backend,
success = message != NULL;
if (success) {
+ gboolean uri_changed;
gchar *last_etag;
+ uri_changed = cbhttp->priv->last_uri && g_strcmp0 (cbhttp->priv->last_uri, uri) != 0;
+
+ if (!cbhttp->priv->last_uri || uri_changed) {
+ g_clear_pointer (&cbhttp->priv->last_uri, g_free);
+ cbhttp->priv->last_uri = g_strdup (uri);
+ }
+
+ if (uri_changed)
+ e_cal_meta_backend_set_sync_tag (meta_backend, NULL);
+
last_etag = e_cal_meta_backend_dup_sync_tag (meta_backend);
- if (last_etag && *last_etag)
+ if (last_etag && *last_etag && !uri_changed)
soup_message_headers_append (soup_message_get_request_headers (message), "If-None-Match", last_etag);
g_free (last_etag);
@@ -675,6 +687,7 @@ e_cal_backend_http_dispose (GObject *object)
g_clear_object (&cbhttp->priv->message);
g_clear_pointer (&cbhttp->priv->icalstring, g_free);
+ g_clear_pointer (&cbhttp->priv->last_uri, g_free);
if (cbhttp->priv->session)
soup_session_abort (SOUP_SESSION (cbhttp->priv->session));
diff --git a/src/calendar/backends/webdav-notes/e-cal-backend-webdav-notes.c b/src/calendar/backends/webdav-notes/e-cal-backend-webdav-notes.c
index 1220e6bac..581422d10 100644
--- a/src/calendar/backends/webdav-notes/e-cal-backend-webdav-notes.c
+++ b/src/calendar/backends/webdav-notes/e-cal-backend-webdav-notes.c
@@ -32,6 +32,7 @@
struct _ECalBackendWebDAVNotesPrivate {
/* The main WebDAV session */
EWebDAVSession *webdav;
+ GUri *last_uri;
GMutex webdav_lock;
/* If already been connected, then the connect_sync() will relax server checks,
@@ -112,7 +113,7 @@ ecb_webdav_notes_connect_sync (ECalMetaBackend *meta_backend,
EWebDAVSession *webdav;
GHashTable *capabilities = NULL, *allows = NULL;
ESource *source;
- gboolean success, is_writable = FALSE;
+ gboolean success, is_writable = FALSE, uri_changed = FALSE;
GError *local_error = NULL;
g_return_val_if_fail (E_IS_CAL_BACKEND_WEBDAV_NOTES (meta_backend), FALSE);
@@ -121,15 +122,48 @@ ecb_webdav_notes_connect_sync (ECalMetaBackend *meta_backend,
*out_auth_result = E_SOURCE_AUTHENTICATION_ACCEPTED;
cbnotes = E_CAL_BACKEND_WEBDAV_NOTES (meta_backend);
+ source = e_backend_get_source (E_BACKEND (meta_backend));
g_mutex_lock (&cbnotes->priv->webdav_lock);
if (cbnotes->priv->webdav) {
g_mutex_unlock (&cbnotes->priv->webdav_lock);
return TRUE;
}
+
+ if (e_source_has_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND)) {
+ ESourceWebdav *webdav_extension;
+ GUri *current_uri;
+
+ webdav_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND);
+ current_uri = e_source_webdav_dup_uri (webdav_extension);
+
+ #define uri_str_equal(_func) (g_strcmp0 (_func (cbnotes->priv->last_uri), _func (current_uri)) == 0)
+
+ uri_changed = cbnotes->priv->last_uri && current_uri && (
+ g_uri_get_port (cbnotes->priv->last_uri) != g_uri_get_port (current_uri) ||
+ !uri_str_equal (g_uri_get_auth_params) ||
+ !uri_str_equal (g_uri_get_host) ||
+ !uri_str_equal (g_uri_get_path) ||
+ !uri_str_equal (g_uri_get_query) ||
+ !uri_str_equal (g_uri_get_fragment) ||
+ !uri_str_equal (g_uri_get_scheme) ||
+ !uri_str_equal (g_uri_get_userinfo) ||
+ !uri_str_equal (g_uri_get_user) ||
+ !uri_str_equal (g_uri_get_password));
+
+ #undef uri_str_equal
+
+ if (!cbnotes->priv->last_uri || uri_changed) {
+ g_clear_pointer (&cbnotes->priv->last_uri, g_uri_unref);
+ cbnotes->priv->last_uri = current_uri;
+ } else if (current_uri) {
+ g_uri_unref (current_uri);
+ }
+ }
g_mutex_unlock (&cbnotes->priv->webdav_lock);
- source = e_backend_get_source (E_BACKEND (meta_backend));
+ if (uri_changed)
+ e_cal_meta_backend_set_sync_tag (meta_backend, NULL);
webdav = e_webdav_session_new (source);
@@ -1476,6 +1510,7 @@ e_cal_backend_webdav_notes_dispose (GObject *object)
g_mutex_lock (&cbnotes->priv->webdav_lock);
g_clear_object (&cbnotes->priv->webdav);
+ g_clear_pointer (&cbnotes->priv->last_uri, g_uri_unref);
g_mutex_unlock (&cbnotes->priv->webdav_lock);
/* Chain up to parent's method. */
diff --git a/src/calendar/libedata-cal/e-cal-meta-backend.c b/src/calendar/libedata-cal/e-cal-meta-backend.c
index 94a875f91..7e8afd34c 100644
--- a/src/calendar/libedata-cal/e-cal-meta-backend.c
+++ b/src/calendar/libedata-cal/e-cal-meta-backend.c
@@ -3770,6 +3770,32 @@ e_cal_meta_backend_dup_sync_tag (ECalMetaBackend *meta_backend)
return sync_tag;
}
+/**
+ * e_cal_meta_backend_set_sync_tag:
+ * @meta_backend: an #ECalMetaBackend
+ * @sync_tag: (nullable): a sync tag to set, or %NULL to unset the old one
+ *
+ * Sets the @sync_tag for the @meta_backend.
+ *
+ * Since: 3.50
+ **/
+void
+e_cal_meta_backend_set_sync_tag (ECalMetaBackend *meta_backend,
+ const gchar *sync_tag)
+{
+ ECalCache *cal_cache;
+
+ g_return_if_fail (E_IS_CAL_META_BACKEND (meta_backend));
+
+ cal_cache = e_cal_meta_backend_ref_cache (meta_backend);
+ if (!cal_cache)
+ return;
+
+ e_cache_set_key (E_CACHE (cal_cache), ECMB_KEY_SYNC_TAG, sync_tag, NULL);
+
+ g_clear_object (&cal_cache);
+}
+
static void
ecmb_cache_revision_changed_cb (ECache *cache,
gpointer user_data)
diff --git a/src/calendar/libedata-cal/e-cal-meta-backend.h b/src/calendar/libedata-cal/e-cal-meta-backend.h
index 60746d4be..e1a91ea83 100644
--- a/src/calendar/libedata-cal/e-cal-meta-backend.h
+++ b/src/calendar/libedata-cal/e-cal-meta-backend.h
@@ -189,6 +189,8 @@ void e_cal_meta_backend_set_connected_writable
gboolean e_cal_meta_backend_get_connected_writable
(ECalMetaBackend *meta_backend);
gchar * e_cal_meta_backend_dup_sync_tag (ECalMetaBackend *meta_backend);
+void e_cal_meta_backend_set_sync_tag (ECalMetaBackend *meta_backend,
+ const gchar *sync_tag);
void e_cal_meta_backend_set_cache (ECalMetaBackend *meta_backend,
ECalCache *cache);
ECalCache * e_cal_meta_backend_ref_cache (ECalMetaBackend *meta_backend);