From addc5b8eb236c6c0fd9c3de03190bd3b78aa7ddd Mon Sep 17 00:00:00 2001 From: Zeeshan Ali (Khattak) Date: Apr 17 2015 15:50:00 +0000 Subject: Backport fixes from 2.2.0 --- diff --git a/geoclue2.spec b/geoclue2.spec index 860b57f..c0c51e2 100644 --- a/geoclue2.spec +++ b/geoclue2.spec @@ -1,12 +1,21 @@ Name: geoclue2 Version: 2.1.10 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Geolocation service License: GPLv2+ URL: http://www.freedesktop.org/wiki/Software/GeoClue/ Source0: http://www.freedesktop.org/software/geoclue/releases/2.1/geoclue-%{version}.tar.xz +# Fixes from 2.2.0 +Patch01: locator-Correct-source-accuracy-comparison.patch +Patch02: service-client-Delay-unrefing-ServiceLocation.patch +Patch03: modem-gps-Fix-GPS-coordinates-parsing.patch +Patch04: service-client-Gracefully-handle-NULL-agent.patch +Patch05: modem-manager-Don-t-enable-the-modem.patch +Patch06: wifi-Remove-a-redundant-condition.patch +Patch07: modem-manager-Wait-for-modem-to-be-enabled.patch + BuildRequires: glib2-devel BuildRequires: intltool BuildRequires: itstool @@ -41,6 +50,13 @@ use %{name}. %prep %setup -q -n geoclue-%{version} +%patch01 -p1 -b .locator-Correct-source-accuracy-comparison +%patch02 -p1 -b .service-client-Delay-unrefing-ServiceLocation +%patch03 -p1 -b .modem-gps-Fix-GPS-coordinates-parsing +%patch04 -p1 -b .service-client-Gracefully-handle-NULL-agent +%patch05 -p1 -b .modem-manager-Don-t-enable-the-modem +%patch06 -p1 -b .wifi-Remove-a-redundant-condition +%patch07 -p1 -b .modem-manager-Wait-for-modem-to-be-enabled %build %configure --with-dbus-service-user=geoclue @@ -96,6 +112,9 @@ exit 0 %changelog +* Fri Apr 17 2015 Zeeshan Ali 2.1.10-2 +- Backport fixes from 2.2.0. + * Wed Apr 1 2015 Zeeshan Ali 2.1.10-1 - Update to 2.1.10 diff --git a/locator-Correct-source-accuracy-comparison.patch b/locator-Correct-source-accuracy-comparison.patch new file mode 100644 index 0000000..b8d752b --- /dev/null +++ b/locator-Correct-source-accuracy-comparison.patch @@ -0,0 +1,29 @@ +From 76ba63f3cc55912e7d7886c0806640c5c6b726db Mon Sep 17 00:00:00 2001 +From: Fabrice Bellet +Date: Wed, 25 Mar 2015 16:08:34 +0100 +Subject: [PATCH 4/7] locator: Correct source accuracy comparison + +We now stop sources whose accuracy level becomes higher, rather than +lower, than the requested level. + +https://bugs.freedesktop.org/show_bug.cgi?id=89716 +--- + src/gclue-locator.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/gclue-locator.c b/src/gclue-locator.c +index 42ce395..91df67e 100644 +--- a/src/gclue-locator.c ++++ b/src/gclue-locator.c +@@ -184,7 +184,7 @@ on_avail_accuracy_level_changed (GObject *gobject, + !is_source_active (locator, src)) { + start_source (locator, src); + } else if ((level == GCLUE_ACCURACY_LEVEL_NONE || +- priv->accuracy_level > level) && ++ priv->accuracy_level < level) && + is_source_active (locator, src)) { + g_signal_handlers_disconnect_by_func (G_OBJECT (src), + G_CALLBACK (on_location_changed), +-- +2.1.0 + diff --git a/modem-gps-Fix-GPS-coordinates-parsing.patch b/modem-gps-Fix-GPS-coordinates-parsing.patch new file mode 100644 index 0000000..be007ef --- /dev/null +++ b/modem-gps-Fix-GPS-coordinates-parsing.patch @@ -0,0 +1,48 @@ +From fea6f1844d2c8dc13f94da5af1aea10430ad8ede Mon Sep 17 00:00:00 2001 +From: Fabrice Bellet +Date: Wed, 25 Mar 2015 14:52:30 +0100 +Subject: [PATCH 3/7] modem-gps: Fix GPS coordinates parsing + +Latitude and longitude don't have the same number of digits +on the left side of the decimal point in the GGA NMEA sentence. + +https://bugs.freedesktop.org/show_bug.cgi?id=89715 +--- + src/gclue-modem-gps.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +diff --git a/src/gclue-modem-gps.c b/src/gclue-modem-gps.c +index 7f1338f..5295fe3 100644 +--- a/src/gclue-modem-gps.c ++++ b/src/gclue-modem-gps.c +@@ -215,6 +215,8 @@ parse_coordinate_string (const char *coordinate, + { + gdouble minutes, degrees, out; + gchar *degrees_str; ++ gchar *dot_str; ++ gint dot_offset; + + if (coordinate[0] == '\0' || + direction[0] == '\0' || +@@ -230,11 +232,16 @@ parse_coordinate_string (const char *coordinate, + return INVALID_COORDINATE; + } + +- degrees_str = g_strndup (coordinate, 2); ++ dot_str = g_strstr_len (coordinate, 6, "."); ++ if (dot_str == NULL) ++ return INVALID_COORDINATE; ++ dot_offset = dot_str - coordinate; ++ ++ degrees_str = g_strndup (coordinate, dot_offset - 2); + degrees = g_ascii_strtod (degrees_str, NULL); + g_free (degrees_str); + +- minutes = g_ascii_strtod (coordinate + 2, NULL); ++ minutes = g_ascii_strtod (coordinate + dot_offset - 2, NULL); + + /* Include the minutes as part of the degrees */ + out = degrees + (minutes / 60.0); +-- +2.1.0 + diff --git a/modem-manager-Don-t-enable-the-modem.patch b/modem-manager-Don-t-enable-the-modem.patch new file mode 100644 index 0000000..642772e --- /dev/null +++ b/modem-manager-Don-t-enable-the-modem.patch @@ -0,0 +1,79 @@ +From 4492e5066e786acc9e9ba86079ccce352a27df81 Mon Sep 17 00:00:00 2001 +From: "Zeeshan Ali (Khattak)" +Date: Thu, 2 Apr 2015 18:40:29 +0100 +Subject: [PATCH 6/7] modem-manager: Don't enable the modem + +Seems at least GNOME takes care of modem enabling for us and besides +this shouldn't be done by geoclue anyway (see bug#85040). + +https://bugs.freedesktop.org/show_bug.cgi?id=85305 +--- + src/gclue-modem-manager.c | 45 +++++++++------------------------------------ + 1 file changed, 9 insertions(+), 36 deletions(-) + +diff --git a/src/gclue-modem-manager.c b/src/gclue-modem-manager.c +index cce3065..71ab96d 100644 +--- a/src/gclue-modem-manager.c ++++ b/src/gclue-modem-manager.c +@@ -410,38 +410,6 @@ out: + } + + static void +-on_modem_enabled (GObject *modem_object, +- GAsyncResult *res, +- gpointer user_data) +-{ +- GTask *task = G_TASK (user_data); +- GClueModemManagerPrivate *priv; +- MMModemLocationSource caps; +- GError *error = NULL; +- +- if (!mm_modem_enable_finish (MM_MODEM (modem_object), res, &error)) { +- if (error->code == MM_CORE_ERROR_IN_PROGRESS) +- /* Seems a previous async call hasn't returned yet. */ +- g_task_return_boolean (task, TRUE); +- else +- g_task_return_error (task, error); +- g_object_unref (task); +- +- return; +- } +- priv = GCLUE_MODEM_MANAGER (g_task_get_source_object (task))->priv; +- g_debug ("manager '%s' enabled.", mm_object_get_path (priv->mm_object)); +- +- caps = mm_modem_location_get_enabled (priv->modem_location) | priv->caps; +- mm_modem_location_setup (priv->modem_location, +- caps, +- TRUE, +- g_task_get_cancellable (task), +- on_modem_location_setup, +- task); +-} +- +-static void + enable_caps (GClueModemManager *manager, + MMModemLocationSource caps, + GCancellable *cancellable, +@@ -454,10 +422,15 @@ enable_caps (GClueModemManager *manager, + priv->caps |= caps; + task = g_task_new (manager, cancellable, callback, user_data); + +- mm_modem_enable (priv->modem, +- cancellable, +- on_modem_enabled, +- task); ++ priv = GCLUE_MODEM_MANAGER (g_task_get_source_object (task))->priv; ++ ++ caps = mm_modem_location_get_enabled (priv->modem_location) | priv->caps; ++ mm_modem_location_setup (priv->modem_location, ++ caps, ++ TRUE, ++ g_task_get_cancellable (task), ++ on_modem_location_setup, ++ task); + } + + static gboolean +-- +2.1.0 + diff --git a/modem-manager-Wait-for-modem-to-be-enabled.patch b/modem-manager-Wait-for-modem-to-be-enabled.patch new file mode 100644 index 0000000..a0149c8 --- /dev/null +++ b/modem-manager-Wait-for-modem-to-be-enabled.patch @@ -0,0 +1,101 @@ +From 428063526f6bf032c2ecba28cd41865d9a5661fa Mon Sep 17 00:00:00 2001 +From: "Zeeshan Ali (Khattak)" +Date: Wed, 1 Apr 2015 20:22:20 +0100 +Subject: [PATCH 7/7] modem-manager: Wait for modem to be enabled + +Modem's location capabilities won't be known until its enabled. + +https://bugs.freedesktop.org/show_bug.cgi?id=85305 +--- + src/gclue-modem-manager.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 57 insertions(+), 1 deletion(-) + +diff --git a/src/gclue-modem-manager.c b/src/gclue-modem-manager.c +index 71ab96d..d48c0cb 100644 +--- a/src/gclue-modem-manager.c ++++ b/src/gclue-modem-manager.c +@@ -484,16 +484,72 @@ modem_has_caps (GClueModemManager *manager, + static void + on_mm_object_added (GDBusObjectManager *object_manager, + GDBusObject *object, ++ gpointer user_data); ++ ++static void ++on_mm_modem_state_notify (GObject *gobject, ++ GParamSpec *pspec, ++ gpointer user_data) ++{ ++ MMModem *mm_modem = MM_MODEM (gobject); ++ GClueModemManager *manager = GCLUE_MODEM_MANAGER (user_data); ++ GClueModemManagerPrivate *priv = manager->priv; ++ GDBusObjectManager *obj_manager = G_DBUS_OBJECT_MANAGER (priv->manager); ++ const char *path = mm_modem_get_path (mm_modem); ++ GDBusObject *object; ++ ++ if (priv->mm_object != NULL) { ++ // In the meantime another modem with location caps was found. ++ g_signal_handlers_disconnect_by_func (mm_modem, ++ on_mm_modem_state_notify, ++ user_data); ++ g_object_unref (gobject); ++ ++ return; ++ } ++ ++ if (mm_modem_get_state (mm_modem) < MM_MODEM_STATE_ENABLED) ++ return; ++ ++ g_debug ("Modem '%s' now enabled", path); ++ ++ g_signal_handlers_disconnect_by_func (mm_modem, ++ on_mm_modem_state_notify, ++ user_data); ++ ++ object = g_dbus_object_manager_get_object (obj_manager, path); ++ on_mm_object_added (obj_manager, object, user_data); ++ g_object_unref (mm_modem); ++} ++ ++static void ++on_mm_object_added (GDBusObjectManager *object_manager, ++ GDBusObject *object, + gpointer user_data) + { + MMObject *mm_object = MM_OBJECT (object); + GClueModemManager *manager = GCLUE_MODEM_MANAGER (user_data); ++ MMModem *mm_modem; + MMModemLocation *modem_location; + + if (manager->priv->mm_object != NULL) + return; + + g_debug ("New modem '%s'", mm_object_get_path (mm_object)); ++ mm_modem = mm_object_get_modem (mm_object); ++ if (mm_modem_get_state (mm_modem) < MM_MODEM_STATE_ENABLED) { ++ g_debug ("Modem '%s' not enabled", ++ mm_object_get_path (mm_object)); ++ ++ g_signal_connect_object (mm_modem, ++ "notify::state", ++ G_CALLBACK (on_mm_modem_state_notify), ++ manager, ++ 0); ++ ++ return; ++ } ++ + modem_location = mm_object_peek_modem_location (mm_object); + if (modem_location == NULL) + return; +@@ -502,7 +558,7 @@ on_mm_object_added (GDBusObjectManager *object_manager, + mm_object_get_path (mm_object)); + + manager->priv->mm_object = g_object_ref (mm_object); +- manager->priv->modem = mm_object_get_modem (mm_object); ++ manager->priv->modem = mm_modem; + manager->priv->modem_location = mm_object_get_modem_location (mm_object); + + g_signal_connect (G_OBJECT (manager->priv->modem_location), +-- +2.1.0 + diff --git a/service-client-Delay-unrefing-ServiceLocation.patch b/service-client-Delay-unrefing-ServiceLocation.patch new file mode 100644 index 0000000..e494ca8 --- /dev/null +++ b/service-client-Delay-unrefing-ServiceLocation.patch @@ -0,0 +1,48 @@ +From 775211c190a01269aa731922f31b54b0451c7ce1 Mon Sep 17 00:00:00 2001 +From: "Zeeshan Ali (Khattak)" +Date: Wed, 1 Apr 2015 18:24:32 +0100 +Subject: [PATCH 5/7] service-client: Delay unrefing ServiceLocation + +Lets try to ensure that apps are not still accessing the last location +before unrefing (and therefore destroying) it by delaying the unref +operation by 5 seconds after a ServiceLocation object becomes obsolete. + +https://bugs.freedesktop.org/show_bug.cgi?id=89782 +--- + src/gclue-service-client.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +diff --git a/src/gclue-service-client.c b/src/gclue-service-client.c +index 0ff3e85..ae22601 100644 +--- a/src/gclue-service-client.c ++++ b/src/gclue-service-client.c +@@ -138,6 +138,14 @@ below_threshold (GClueServiceClient *client, + return FALSE; + } + ++static gboolean ++on_prev_location_timeout (gpointer user_data) ++{ ++ g_object_unref (user_data); ++ ++ return FALSE; ++} ++ + static void + on_locator_location_changed (GObject *gobject, + GParamSpec *pspec, +@@ -163,7 +171,10 @@ on_locator_location_changed (GObject *gobject, + return; + } + +- g_clear_object (&priv->prev_location); ++ if (priv->prev_location != NULL) ++ // Lets try to ensure that apps are not still accessing the ++ // last location before unrefing (and therefore destroying) it. ++ g_timeout_add_seconds (5, on_prev_location_timeout, priv->prev_location); + priv->prev_location = priv->location; + + path = next_location_path (client); +-- +2.1.0 + diff --git a/service-client-Gracefully-handle-NULL-agent.patch b/service-client-Gracefully-handle-NULL-agent.patch new file mode 100644 index 0000000..c090af3 --- /dev/null +++ b/service-client-Gracefully-handle-NULL-agent.patch @@ -0,0 +1,62 @@ +From 07a4f0c0c2e252f8975039a4320d69d04200ac31 Mon Sep 17 00:00:00 2001 +From: "Zeeshan Ali (Khattak)" +Date: Thu, 6 Nov 2014 18:32:28 +0000 +Subject: [PATCH 1/7] service-client: Gracefully handle NULL agent + +Don't connect to signals on agent if its NULL. Agent is currently +entirely optional. +--- + src/gclue-service-client.c | 23 +++++++++++++++-------- + 1 file changed, 15 insertions(+), 8 deletions(-) + +diff --git a/src/gclue-service-client.c b/src/gclue-service-client.c +index c27faac..0ff3e85 100644 +--- a/src/gclue-service-client.c ++++ b/src/gclue-service-client.c +@@ -385,7 +385,11 @@ gclue_service_client_handle_start (GClueClient *client, + return TRUE; + } + +- max_accuracy = gclue_agent_get_max_accuracy_level (priv->agent_proxy); ++ if (priv->agent_proxy != NULL) ++ max_accuracy = gclue_agent_get_max_accuracy_level (priv->agent_proxy); ++ else ++ max_accuracy = GCLUE_ACCURACY_LEVEL_EXACT; ++ + if (max_accuracy == 0) { + g_dbus_method_invocation_return_error (invocation, + G_DBUS_ERROR, +@@ -429,9 +433,11 @@ gclue_service_client_finalize (GObject *object) + + g_clear_pointer (&priv->path, g_free); + g_clear_object (&priv->connection); +- g_signal_handlers_disconnect_by_func (priv->agent_proxy, +- G_CALLBACK (on_agent_props_changed), +- object); ++ if (priv->agent_proxy != NULL) ++ g_signal_handlers_disconnect_by_func ++ (priv->agent_proxy, ++ G_CALLBACK (on_agent_props_changed), ++ object); + g_clear_object (&priv->agent_proxy); + g_clear_object (&priv->locator); + g_clear_object (&priv->location); +@@ -495,10 +501,11 @@ gclue_service_client_set_property (GObject *object, + + case PROP_AGENT_PROXY: + client->priv->agent_proxy = g_value_dup_object (value); +- g_signal_connect (client->priv->agent_proxy, +- "g-properties-changed", +- G_CALLBACK (on_agent_props_changed), +- object); ++ if (client->priv->agent_proxy != NULL) ++ g_signal_connect (client->priv->agent_proxy, ++ "g-properties-changed", ++ G_CALLBACK (on_agent_props_changed), ++ object); + break; + + default: +-- +2.1.0 + diff --git a/wifi-Remove-a-redundant-condition.patch b/wifi-Remove-a-redundant-condition.patch new file mode 100644 index 0000000..f33b33f --- /dev/null +++ b/wifi-Remove-a-redundant-condition.patch @@ -0,0 +1,32 @@ +From b5f71cefda98277272d483dd4a31c71208dafd5f Mon Sep 17 00:00:00 2001 +From: "Zeeshan Ali (Khattak)" +Date: Thu, 6 Nov 2014 20:21:50 +0000 +Subject: [PATCH 2/7] wifi: Remove a redundant condition + +We were only refreshing the location on starting of wifi source if +requested accuracy level was 'city'. This resulted in clients requesting +accuracy level other than 'city' to not get any location on machines +without a wifi card (e.g VMs). + +This patches fixes the issue by removing the redundant condition. +--- + src/gclue-wifi.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/src/gclue-wifi.c b/src/gclue-wifi.c +index cf2c455..e94ef04 100644 +--- a/src/gclue-wifi.c ++++ b/src/gclue-wifi.c +@@ -377,8 +377,7 @@ connect_bss_signals (GClueWifi *wifi) + if (priv->bss_added_id != 0) + return; + if (priv->interface == NULL) { +- if (wifi->priv->accuracy_level == GCLUE_ACCURACY_LEVEL_CITY) +- gclue_web_source_refresh (GCLUE_WEB_SOURCE (wifi)); ++ gclue_web_source_refresh (GCLUE_WEB_SOURCE (wifi)); + + return; + } +-- +2.1.0 +