diff options
author | Carlos Garcia Campos <cgarcia@igalia.com> | 2021-03-23 13:00:00 +0100 |
---|---|---|
committer | Maciej S. Szmigiero <mail@maciej.szmigiero.name> | 2022-11-13 20:02:25 +0100 |
commit | 66dbd6decf607ade17bc845c84e8cf5c5ceb8a53 (patch) | |
tree | 4e8445655564a21de642f2b112af7af391352c94 | |
parent | 919990f28aa05af089cfdc921a9254b59e00cf31 (diff) | |
download | geoclue-66dbd6decf607ade17bc845c84e8cf5c5ceb8a53.tar.gz |
Add support for building with libsoup3
Remove soup2 build option, based on
https://gitlab.freedesktop.org/geoclue/geoclue/-/merge_requests/83
Original commit message:
Add soup2 build option, enabled by default. When disabled, libsoup3 will
be used instead.
-rw-r--r-- | HACKING.md | 2 | ||||
-rw-r--r-- | src/gclue-mozilla.c | 20 | ||||
-rw-r--r-- | src/gclue-web-source.c | 118 | ||||
-rw-r--r-- | src/meson.build | 2 |
4 files changed, 74 insertions, 68 deletions
@@ -7,7 +7,7 @@ * gio (>= 2.44.0) * gobject-introspection * json-glib - * libsoup2.4 (>= 2.42) + * libsoup3.0 * pkg-config Fedora: diff --git a/src/gclue-mozilla.c b/src/gclue-mozilla.c index 8d17cb3..ba60ca9 100644 --- a/src/gclue-mozilla.c +++ b/src/gclue-mozilla.c @@ -193,6 +193,7 @@ gclue_mozilla_create_query (GClueMozilla *mozilla, guint n_non_ignored_bsss; GList *iter; gint64 mcc, mnc; + g_autoptr(GBytes) body = NULL; builder = json_builder_new (); json_builder_begin_object (builder); @@ -285,11 +286,8 @@ gclue_mozilla_create_query (GClueMozilla *mozilla, uri = gclue_mozilla_get_locate_url (mozilla); ret = soup_message_new ("POST", uri); - soup_message_set_request (ret, - "application/json", - SOUP_MEMORY_TAKE, - data, - data_len); + body = g_bytes_new_take (data, data_len); + soup_message_set_request_body_from_bytes (ret, "application/json", body); g_debug ("Sending following request to '%s':\n%s", uri, data); if (query_data_description) { @@ -391,6 +389,7 @@ gclue_mozilla_create_submit_query (GClueMozilla *mozilla, GError **error) { SoupMessage *ret = NULL; + SoupMessageHeaders *request_headers; JsonBuilder *builder; JsonGenerator *generator; JsonNode *root_node; @@ -403,6 +402,7 @@ gclue_mozilla_create_submit_query (GClueMozilla *mozilla, guint64 time_ms; gint64 mcc, mnc; GClueConfig *config; + g_autoptr(GBytes) body = NULL; if (mozilla->priv->bss_submitted && (!mozilla->priv->tower_valid || @@ -537,15 +537,13 @@ gclue_mozilla_create_submit_query (GClueMozilla *mozilla, g_object_unref (generator); ret = soup_message_new ("POST", url); + request_headers = soup_message_get_request_headers (ret); if (nick != NULL && nick[0] != '\0') - soup_message_headers_append (ret->request_headers, + soup_message_headers_append (request_headers, "X-Nickname", nick); - soup_message_set_request (ret, - "application/json", - SOUP_MEMORY_TAKE, - data, - data_len); + body = g_bytes_new_take (data, data_len); + soup_message_set_request_body_from_bytes (ret, "application/json", body); g_debug ("Sending following request to '%s':\n%s", url, data); mozilla->priv->bss_submitted = TRUE; diff --git a/src/gclue-web-source.c b/src/gclue-web-source.c index 56e3a0c..1da01dd 100644 --- a/src/gclue-web-source.c +++ b/src/gclue-web-source.c @@ -74,9 +74,9 @@ G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GClueWebSource, GCLUE_TYPE_LOCATION_SOURCE, G_ADD_PRIVATE (GClueWebSource)) -static void refresh_callback (SoupSession *session, - SoupMessage *query, - gpointer user_data); +static void refresh_callback (SoupSession *session, + GAsyncResult *result, + gpointer user_data); static void gclue_web_source_real_refresh_async (GClueWebSource *source, @@ -117,45 +117,48 @@ gclue_web_source_real_refresh_async (GClueWebSource *source, return; } - /* TODO handle cancellation */ - soup_session_queue_message (source->priv->soup_session, - source->priv->query, - refresh_callback, - g_steal_pointer (&task)); + soup_session_send_and_read_async (source->priv->soup_session, + source->priv->query, + G_PRIORITY_DEFAULT, + cancellable, + (GAsyncReadyCallback)refresh_callback, + g_steal_pointer (&task)); } static void -refresh_callback (SoupSession *session, - SoupMessage *query, - gpointer user_data) +refresh_callback (SoupSession *session, + GAsyncResult *result, + gpointer user_data) { g_autoptr(GTask) task = g_steal_pointer (&user_data); GClueWebSource *web; + g_autoptr(SoupMessage) query = NULL; + g_autoptr(GBytes) body = NULL; g_autoptr(GError) local_error = NULL; g_autofree char *contents = NULL; g_autofree char *str = NULL; g_autoptr(GClueLocation) location = NULL; - SoupURI *uri; + GUri *uri; - if (query->status_code == SOUP_STATUS_CANCELLED) { - g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_CANCELLED, - "Operation cancelled"); + web = GCLUE_WEB_SOURCE (g_task_get_source_object (task)); + query = g_steal_pointer (&web->priv->query); + + body = soup_session_send_and_read_finish (session, result, &local_error); + if (!body) { + g_task_return_error (task, g_steal_pointer (&local_error)); return; } - web = GCLUE_WEB_SOURCE (g_task_get_source_object (task)); - web->priv->query = NULL; - - if (query->status_code != SOUP_STATUS_OK) { + if (soup_message_get_status (query) != SOUP_STATUS_OK) { g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, "Query location SOUP error: %s", - query->reason_phrase); + soup_message_get_reason_phrase (query)); return; } - contents = g_strndup (query->response_body->data, query->response_body->length); + contents = g_strndup (g_bytes_get_data (body, NULL), g_bytes_get_size (body)); uri = soup_message_get_uri (query); - str = soup_uri_to_string (uri, FALSE); + str = g_uri_to_string (uri); g_debug ("Got following response from '%s':\n%s", str, contents); location = gclue_mozilla_parse_response (contents, web->priv->query_data_description, @@ -356,15 +359,12 @@ gclue_web_source_finalize (GObject *gsource) priv->connectivity_changed_id = 0; } - if (priv->query != NULL) { - g_debug ("Cancelling web source query"); - soup_session_cancel_message (priv->soup_session, - priv->query, - SOUP_STATUS_CANCELLED); - priv->query = NULL; + if (priv->soup_session) { + soup_session_abort (priv->soup_session); + g_clear_object (&priv->soup_session); } - g_clear_object (&priv->soup_session); + g_clear_object (&priv->query); g_clear_object (&priv->cancellable); G_OBJECT_CLASS (gclue_web_source_parent_class)->finalize (gsource); @@ -378,10 +378,8 @@ gclue_web_source_constructed (GObject *object) G_OBJECT_CLASS (gclue_web_source_parent_class)->constructed (object); - priv->soup_session = soup_session_new_with_options - (SOUP_SESSION_REMOVE_FEATURE_BY_TYPE, - SOUP_TYPE_PROXY_RESOLVER_DEFAULT, - NULL); + priv->soup_session = soup_session_new (); + soup_session_remove_feature_by_type (priv->soup_session, G_TYPE_PROXY_RESOLVER); monitor = g_network_monitor_get_default (); priv->network_changed_id = @@ -484,25 +482,34 @@ gclue_web_source_refresh (GClueWebSource *source) } static void -submit_query_callback (SoupSession *session, - SoupMessage *query, - gpointer user_data) +submit_query_callback (SoupSession *session, + GAsyncResult *result, + gpointer user_data) { - SoupURI *uri; - g_autofree char *str = NULL; + g_autoptr(GBytes) body = NULL; + g_autoptr(GError) local_error = NULL; + SoupMessage *query; + g_autofree char *uri_str = NULL; + gint status_code; - uri = soup_message_get_uri (query); - str = soup_uri_to_string (uri, FALSE); - if (query->status_code != SOUP_STATUS_OK && - query->status_code != SOUP_STATUS_NO_CONTENT) { + query = soup_session_get_async_result_message (session, result); + uri_str = g_uri_to_string (soup_message_get_uri (query)); + + body = soup_session_send_and_read_finish (session, result, &local_error); + if (!body) { + g_warning ("Failed to submit location data to '%s': %s", + uri_str, local_error->message); + return; + } + + status_code = soup_message_get_status (query); + if (status_code != SOUP_STATUS_OK && status_code != SOUP_STATUS_NO_CONTENT) { g_warning ("Failed to submit location data to '%s': %s", - str, - query->reason_phrase); - return; - } + uri_str, soup_message_get_reason_phrase (query)); + return; + } - g_debug ("Successfully submitted location data to '%s'", - str); + g_debug ("Successfully submitted location data to '%s'", uri_str); } #define SUBMISSION_ACCURACY_THRESHOLD 100 @@ -516,8 +523,8 @@ on_submit_source_location_notify (GObject *source_object, GClueLocationSource *source = GCLUE_LOCATION_SOURCE (source_object); GClueWebSource *web = GCLUE_WEB_SOURCE (user_data); GClueLocation *location; - SoupMessage *query; - GError *error = NULL; + g_autoptr(SoupMessage) query = NULL; + g_autoptr(GError) error = NULL; location = gclue_location_source_get_location (source); if (location == NULL || @@ -540,16 +547,17 @@ on_submit_source_location_notify (GObject *source_object, if (error != NULL) { g_warning ("Failed to create submission query: %s", error->message); - g_error_free (error); } return; } - soup_session_queue_message (web->priv->soup_session, - query, - submit_query_callback, - web); + soup_session_send_and_read_async (web->priv->soup_session, + query, + G_PRIORITY_DEFAULT, + NULL, + (GAsyncReadyCallback)submit_query_callback, + web); } /** diff --git a/src/meson.build b/src/meson.build index 6053732..ca6c91f 100644 --- a/src/meson.build +++ b/src/meson.build @@ -1,5 +1,5 @@ geoclue_deps = base_deps + [ dependency('json-glib-1.0', version: '>= 0.14.0'), - dependency('libsoup-2.4', version: '>= 2.42.0') ] + dependency('libsoup-3.0', version: '>= 3.0.0') ] sources = [ libgeoclue_public_api_gen_sources[1], geoclue_iface_sources, |