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