diff options
author | Teemu Ikonen <tpikonen@mailbox.org> | 2024-03-22 13:16:40 +0200 |
---|---|---|
committer | Teemu Ikonen <tpikonen@mailbox.org> | 2024-04-07 18:52:00 +0300 |
commit | 92cd8cde30757d77022ef038cf13b1d117bcf91d (patch) | |
tree | 464133ae64b607f6603cdc07e1f50d51b04f93bb /src | |
parent | 008ba03bca3b00223ee3283203268afd45871aa1 (diff) |
modem-manager: Read GPS locations from non-enabled modem
This is allowed in ModemManager versions >= 1.23.2. A version check
is not necessary, on older versions MM will simply not give a
MMModemLocation object if the modem is not enabled.
Diffstat (limited to 'src')
-rw-r--r-- | src/gclue-modem-manager.c | 55 |
1 files changed, 36 insertions, 19 deletions
diff --git a/src/gclue-modem-manager.c b/src/gclue-modem-manager.c index 54d80e4..0ae3e7d 100644 --- a/src/gclue-modem-manager.c +++ b/src/gclue-modem-manager.c @@ -711,9 +711,9 @@ on_mm_modem_state_notify (GObject *gobject, 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) { + if (priv->mm_object != NULL && priv->modem != NULL + && g_strcmp0 (path, mm_modem_get_path (priv->modem)) != 0) { // In the meantime another modem with location caps was found. g_signal_handlers_disconnect_by_func (mm_modem, on_mm_modem_state_notify, @@ -732,8 +732,15 @@ on_mm_modem_state_notify (GObject *gobject, 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); + if (priv->mm_object == NULL) { + on_mm_object_added (obj_manager, + g_dbus_object_manager_get_object (obj_manager, path), + user_data); + } else { + g_debug ("Enabling 3G and CDMA location on modem '%s'", path); + g_object_notify_by_pspec (G_OBJECT (manager), gParamSpecs[PROP_IS_3G_AVAILABLE]); + g_object_notify_by_pspec (G_OBJECT (manager), gParamSpecs[PROP_IS_CDMA_AVAILABLE]); + } g_object_unref (mm_modem); } @@ -761,31 +768,33 @@ on_mm_object_added (GDBusObjectManager *object_manager, GClueModemManager *manager = GCLUE_MODEM_MANAGER (user_data); MMModem *mm_modem; MMModemLocation *modem_location; + const char *path; + gboolean modem_is_enabled; if (manager->priv->mm_object != NULL) return; - g_debug ("New modem '%s'", mm_object_get_path (mm_object)); + path = mm_object_get_path (mm_object); + g_debug ("New modem '%s'", path); 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)); + modem_is_enabled = mm_modem_get_state (mm_modem) >= MM_MODEM_STATE_ENABLED; + if (!modem_is_enabled) { + g_debug ("Modem '%s' not enabled", path); 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) + if (modem_location == NULL) { + g_debug ("Modem '%s' does not have location capabilities", path); return; + } - g_debug ("Modem '%s' has location capabilities", - mm_object_get_path (mm_object)); + g_debug ("Modem '%s' has location capabilities", path); manager->priv->mm_object = g_object_ref (mm_object); manager->priv->modem = mm_modem; @@ -802,9 +811,13 @@ on_mm_object_added (GDBusObjectManager *object_manager, G_CALLBACK (on_location_changed), manager); - g_object_notify_by_pspec (G_OBJECT (manager), gParamSpecs[PROP_IS_3G_AVAILABLE]); - g_object_notify_by_pspec (G_OBJECT (manager), gParamSpecs[PROP_IS_CDMA_AVAILABLE]); g_object_notify_by_pspec (G_OBJECT (manager), gParamSpecs[PROP_IS_GPS_AVAILABLE]); + if (modem_is_enabled) { + g_object_notify_by_pspec (G_OBJECT (manager), gParamSpecs[PROP_IS_3G_AVAILABLE]); + g_object_notify_by_pspec (G_OBJECT (manager), gParamSpecs[PROP_IS_CDMA_AVAILABLE]); + } else { + g_debug ("3G or CDMA are not available on non-enabled modem '%s'", path); + } } static void @@ -969,18 +982,22 @@ static gboolean gclue_modem_manager_get_is_3g_available (GClueModem *modem) { g_return_val_if_fail (GCLUE_IS_MODEM_MANAGER (modem), FALSE); + GClueModemManager *manager = GCLUE_MODEM_MANAGER (modem); - return modem_has_caps (GCLUE_MODEM_MANAGER (modem), - MM_MODEM_LOCATION_SOURCE_3GPP_LAC_CI); + return manager->priv->modem != NULL + && mm_modem_get_state (manager->priv->modem) >= MM_MODEM_STATE_ENABLED + && modem_has_caps (manager, MM_MODEM_LOCATION_SOURCE_3GPP_LAC_CI); } static gboolean gclue_modem_manager_get_is_cdma_available (GClueModem *modem) { g_return_val_if_fail (GCLUE_IS_MODEM_MANAGER (modem), FALSE); + GClueModemManager *manager = GCLUE_MODEM_MANAGER (modem); - return modem_has_caps (GCLUE_MODEM_MANAGER (modem), - MM_MODEM_LOCATION_SOURCE_CDMA_BS); + return manager->priv->modem != NULL + && mm_modem_get_state (manager->priv->modem) >= MM_MODEM_STATE_ENABLED + && modem_has_caps (manager, MM_MODEM_LOCATION_SOURCE_CDMA_BS); } static gboolean |