diff options
author | Dan Williams <dcbw@redhat.com> | 2012-10-02 22:12:37 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2012-10-05 08:54:35 -0500 |
commit | 30db13ae5a480992c383ed0f818fd273089a9ab5 (patch) | |
tree | 1560100969e9aa60219bdfae5838760ee4f91a7f /libnm-glib/nm-remote-settings.c | |
parent | 50712597ae89f47a3cd838f4041bb8821c0fdfcc (diff) | |
download | NetworkManager-30db13ae5a480992c383ed0f818fd273089a9ab5.tar.gz |
libnm-glib: don't try to query for connections synchronously when NM isn't running (bgo #685345)
And ensure we clear out properties when NM quits, and that we request them
when NM starts up again.
Diffstat (limited to 'libnm-glib/nm-remote-settings.c')
-rw-r--r-- | libnm-glib/nm-remote-settings.c | 82 |
1 files changed, 57 insertions, 25 deletions
diff --git a/libnm-glib/nm-remote-settings.c b/libnm-glib/nm-remote-settings.c index 7748f4f091..54a497366b 100644 --- a/libnm-glib/nm-remote-settings.c +++ b/libnm-glib/nm-remote-settings.c @@ -682,6 +682,48 @@ nm_remote_settings_save_hostname (NMRemoteSettings *settings, } static void +properties_changed_cb (DBusGProxy *proxy, + GHashTable *properties, + gpointer user_data) +{ + NMRemoteSettings *self = NM_REMOTE_SETTINGS (user_data); + NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (self); + GHashTableIter iter; + gpointer key, tmp; + + g_hash_table_iter_init (&iter, properties); + while (g_hash_table_iter_next (&iter, &key, &tmp)) { + GValue *value = tmp; + + if (!strcmp ((const char *) key, "Hostname")) { + g_free (priv->hostname); + priv->hostname = g_value_dup_string (value); + g_object_notify (G_OBJECT (self), NM_REMOTE_SETTINGS_HOSTNAME); + } + + if (!strcmp ((const char *) key, "CanModify")) { + priv->can_modify = g_value_get_boolean (value); + g_object_notify (G_OBJECT (self), NM_REMOTE_SETTINGS_CAN_MODIFY); + } + } +} + +static void +nm_appeared_got_properties (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data) +{ + NMRemoteSettings *self = NM_REMOTE_SETTINGS (user_data); + NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (self); + GHashTable *props = NULL; + + if (dbus_g_proxy_end_call (proxy, call, NULL, + DBUS_TYPE_G_MAP_OF_VARIANT, &props, + G_TYPE_INVALID)) { + properties_changed_cb (priv->props_proxy, props, self); + g_hash_table_destroy (props); + } +} + +static void name_owner_changed (DBusGProxy *proxy, const char *name, const char *old_owner, @@ -699,38 +741,24 @@ name_owner_changed (DBusGProxy *proxy, if (new_owner && strlen (new_owner) > 0) { priv->fetch_id = g_idle_add (fetch_connections, self); priv->service_running = TRUE; + + dbus_g_proxy_begin_call (priv->props_proxy, "GetAll", + nm_appeared_got_properties, self, NULL, + G_TYPE_STRING, NM_DBUS_IFACE_SETTINGS, + G_TYPE_INVALID); } else { priv->fetch_id = g_idle_add (remove_connections, self); priv->service_running = FALSE; - } - g_object_notify (G_OBJECT (self), NM_REMOTE_SETTINGS_SERVICE_RUNNING); - } -} -static void -properties_changed_cb (DBusGProxy *proxy, - GHashTable *properties, - gpointer user_data) -{ - NMRemoteSettings *self = NM_REMOTE_SETTINGS (user_data); - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (self); - GHashTableIter iter; - gpointer key, tmp; - - g_hash_table_iter_init (&iter, properties); - while (g_hash_table_iter_next (&iter, &key, &tmp)) { - GValue *value = tmp; - - if (!strcmp ((const char *) key, "Hostname")) { + /* Clear properties */ g_free (priv->hostname); - priv->hostname = g_value_dup_string (value); + priv->hostname = NULL; g_object_notify (G_OBJECT (self), NM_REMOTE_SETTINGS_HOSTNAME); - } - if (!strcmp ((const char *) key, "CanModify")) { - priv->can_modify = g_value_get_boolean (value); + priv->can_modify = FALSE; g_object_notify (G_OBJECT (self), NM_REMOTE_SETTINGS_CAN_MODIFY); } + g_object_notify (G_OBJECT (self), NM_REMOTE_SETTINGS_SERVICE_RUNNING); } } @@ -921,6 +949,12 @@ init_sync (GInitable *initable, GCancellable *cancellable, GError **error) return FALSE; } + /* If NM isn't running we'll grab properties from name_owner_changed() + * when it starts. + */ + if (!priv->service_running) + return TRUE; + /* Get properties */ if (!dbus_g_proxy_call (priv->props_proxy, "GetAll", error, G_TYPE_STRING, NM_DBUS_IFACE_SETTINGS, @@ -931,8 +965,6 @@ init_sync (GInitable *initable, GCancellable *cancellable, GError **error) properties_changed_cb (priv->props_proxy, props, settings); g_hash_table_destroy (props); - /* FIXME: need a synchronous fetch_connections too */ - return TRUE; } |