summaryrefslogtreecommitdiff
path: root/libnm-glib/nm-remote-settings.c
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2012-10-02 22:12:37 -0500
committerDan Williams <dcbw@redhat.com>2012-10-05 08:54:35 -0500
commit30db13ae5a480992c383ed0f818fd273089a9ab5 (patch)
tree1560100969e9aa60219bdfae5838760ee4f91a7f /libnm-glib/nm-remote-settings.c
parent50712597ae89f47a3cd838f4041bb8821c0fdfcc (diff)
downloadNetworkManager-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.c82
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;
}