Sophie

Sophie

distrib > Mageia > 9 > armv7hl > by-pkgid > d568c5ee56d919240dfa8617dc603464 > files > 1

geoclue-2.6.0-3.mga9.src.rpm

From 9c46c38096193988103bf4c2fa63d76b55e5b1d0 Mon Sep 17 00:00:00 2001
From: Carlos Garcia Campos <cgarcia@igalia.com>
Date: Tue, 23 Mar 2021 13:00:00 +0100
Subject: [PATCH] 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.
---
 src/gclue-mozilla.c    |  20 ++++---
 src/gclue-web-source.c | 120 ++++++++++++++++++++++-------------------
 src/meson.build        |   2 +-
 3 files changed, 74 insertions(+), 68 deletions(-)

diff --git a/src/gclue-mozilla.c b/src/gclue-mozilla.c
index 8e602c1..3ee02c8 100644
--- a/src/gclue-mozilla.c
+++ b/src/gclue-mozilla.c
@@ -151,6 +151,7 @@ gclue_mozilla_create_query (GList        *bss_list, /* As in Access Points */
         guint n_non_ignored_bsss;
         GList *iter;
         gint64 mcc, mnc;
+        g_autoptr(GBytes) body = NULL;
 
         builder = json_builder_new ();
         json_builder_begin_object (builder);
@@ -238,11 +239,8 @@ gclue_mozilla_create_query (GList        *bss_list, /* As in Access Points */
 
         uri = get_url ();
         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);
 
         return ret;
@@ -322,6 +320,7 @@ gclue_mozilla_create_submit_query (GClueLocation   *location,
                                    GError         **error)
 {
         SoupMessage *ret = NULL;
+        SoupMessageHeaders *request_headers;
         JsonBuilder *builder;
         JsonGenerator *generator;
         JsonNode *root_node;
@@ -332,6 +331,7 @@ gclue_mozilla_create_submit_query (GClueLocation   *location,
         gdouble lat, lon, accuracy, altitude;
         GDateTime *datetime;
         gint64 mcc, mnc;
+        g_autoptr(GBytes) body = NULL;
 
         url = get_submit_config (&nick);
         if (url == NULL)
@@ -448,15 +448,13 @@ gclue_mozilla_create_submit_query (GClueLocation   *location,
         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);
 
 out:
diff --git a/src/gclue-web-source.c b/src/gclue-web-source.c
index bfd70f7..2c98f99 100644
--- a/src/gclue-web-source.c
+++ b/src/gclue-web-source.c
@@ -59,9 +59,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,
@@ -103,44 +103,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,
-                                         "Failed to query location: %s", query->reason_phrase);
+                                         "Failed to query location: %s",
+                                         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_WEB_SOURCE_GET_CLASS (web)->parse_response (web, contents, &local_error);
         if (local_error != NULL) {
@@ -253,15 +257,12 @@ gclue_web_source_finalize (GObject *gsource)
                 priv->connectivity_changed_id = 0;
         }
 
-        if (priv->query != NULL) {
-                g_debug ("Cancelling query");
-                soup_session_cancel_message (priv->soup_session,
-                                             priv->query,
-                                             SOUP_STATUS_CANCELLED);
-                priv->query = NULL;
-        }
+        g_clear_object (&priv->query);
 
-        g_clear_object (&priv->soup_session);
+        if (priv->soup_session) {
+                soup_session_abort (priv->soup_session);
+                g_object_unref (priv->soup_session);
+        }
 
         G_OBJECT_CLASS (gclue_web_source_parent_class)->finalize (gsource);
 }
@@ -274,10 +275,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 =
@@ -330,25 +329,33 @@ 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)
 {
-        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",
-                           str,
-                           query->reason_phrase);
-		return;
-	}
+                           uri_str, local_error->message);
+                return;
+        }
 
-        g_debug ("Successfully submitted location data to '%s'",
-                 str);
+        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",
+                           uri_str, soup_message_get_reason_phrase (query));
+                return;
+        }
+
+        g_debug ("Successfully submitted location data to '%s'", uri_str);
 }
 
 #define SUBMISSION_ACCURACY_THRESHOLD 100
@@ -362,8 +369,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 ||
@@ -386,16 +393,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 13eb1ba..1c55b3b 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,
-- 
2.37.3