diff options
author | Milan Crha <mcrha@redhat.com> | 2023-03-24 10:07:53 +0100 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2023-03-24 10:07:53 +0100 |
commit | 892ce97b7b5e139934565422c355340b543d2595 (patch) | |
tree | c5a3909aa859792518664430e23aa03fd69b4dea | |
parent | 444286d82116038d0b1d511d977144fbae1283ab (diff) | |
download | evolution-data-server-892ce97b7b5e139934565422c355340b543d2595.tar.gz |
I#461 - backends: React to destination URI changes
Closes https://gitlab.gnome.org/GNOME/evolution-data-server/-/issues/461
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); |