summaryrefslogtreecommitdiff
path: root/src/gclue-modem-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gclue-modem-manager.c')
-rw-r--r--src/gclue-modem-manager.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/src/gclue-modem-manager.c b/src/gclue-modem-manager.c
index 3aec411..b81f553 100644
--- a/src/gclue-modem-manager.c
+++ b/src/gclue-modem-manager.c
@@ -45,6 +45,7 @@ struct _GClueModemManagerPrivate {
MMModem *modem;
MMModemLocation *modem_location;
MMLocation3gpp *location_3gpp;
+ gboolean location_3gpp_ignore_previous;
MMLocationGpsNmea *location_nmea;
GCancellable *cancellable;
@@ -295,7 +296,7 @@ is_location_3gpp_same (GClueModemManager *manager,
gchar opc_buf[GCLUE_3G_TOWER_OPERATOR_CODE_STR_LEN + 1];
#endif
- if (priv->location_3gpp == NULL)
+ if (priv->location_3gpp == NULL || priv->location_3gpp_ignore_previous)
return FALSE;
#if MM_CHECK_VERSION(1, 18, 0)
@@ -321,6 +322,18 @@ is_location_3gpp_same (GClueModemManager *manager,
cell_id == new_cell_id);
}
+static void clear_3gpp_location (GClueModemManager *manager)
+{
+ GClueModemManagerPrivate *priv = manager->priv;
+
+ if (!priv->location_3gpp && !priv->location_3gpp_ignore_previous) {
+ return;
+ }
+
+ g_clear_object (&priv->location_3gpp);
+ g_signal_emit (manager, signals[FIX_3G], 0, NULL, 0, 0, GCLUE_TOWER_TEC_NO_FIX);
+}
+
static void
on_get_3gpp_ready (GObject *source_object,
GAsyncResult *res,
@@ -353,6 +366,8 @@ on_get_3gpp_ready (GObject *source_object,
if (location_3gpp == NULL) {
g_debug ("No 3GPP");
+ clear_3gpp_location (manager);
+ priv->location_3gpp_ignore_previous = FALSE;
return;
}
@@ -384,6 +399,7 @@ on_get_3gpp_ready (GObject *source_object,
}
g_clear_object (&priv->location_3gpp);
priv->location_3gpp = g_steal_pointer (&location_3gpp);
+ priv->location_3gpp_ignore_previous = FALSE;
g_signal_emit (manager, signals[FIX_3G], 0, opc, lac, cell_id, tec);
}
@@ -574,6 +590,8 @@ on_modem_location_setup (GObject *modem_object,
priv = manager->priv;
g_debug ("Modem '%s' setup.", mm_object_get_path (priv->mm_object));
+ /* Make sure that we actually emit that signal */
+ priv->location_3gpp_ignore_previous = TRUE;
on_location_changed (modem_object, NULL, manager);
g_task_return_boolean (task, TRUE);
@@ -779,6 +797,8 @@ on_mm_object_removed (GDBusObjectManager *object_manager,
return;
g_debug ("Modem '%s' removed.", mm_object_get_path (priv->mm_object));
+ clear_3gpp_location (manager);
+
g_signal_handlers_disconnect_by_func (G_OBJECT (priv->modem_location),
G_CALLBACK (on_location_changed),
user_data);
@@ -1086,7 +1106,7 @@ gclue_modem_manager_disable_3g (GClueModem *modem,
g_return_val_if_fail (gclue_modem_manager_get_is_3g_available (modem), FALSE);
manager = GCLUE_MODEM_MANAGER (modem);
- g_clear_object (&manager->priv->location_3gpp);
+ clear_3gpp_location (manager);
g_debug ("Clearing 3GPP location caps from modem");
return clear_caps (manager,
MM_MODEM_LOCATION_SOURCE_3GPP_LAC_CI,
@@ -1105,7 +1125,7 @@ gclue_modem_manager_disable_cdma (GClueModem *modem,
g_return_val_if_fail (gclue_modem_manager_get_is_cdma_available (modem), FALSE);
manager = GCLUE_MODEM_MANAGER (modem);
- g_clear_object (&manager->priv->location_3gpp);
+ clear_3gpp_location (manager);
g_debug ("Clearing CDMA location caps from modem");
return clear_caps (manager,
MM_MODEM_LOCATION_SOURCE_CDMA_BS,