summary refs log tree commit diff
path: root/libnm-glib/nm-remote-settings.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2013-02-03 14:49:22 +0100
committerMichael Biebl <biebl@debian.org>2013-02-03 14:49:22 +0100
commit9c202e3e860b3be9e1f8882630b69affbb130102 (patch)
tree8202bf39f2129486971fa7d5ae0dee61a561aa53 /libnm-glib/nm-remote-settings.c
parent36cb2f364a821e1be50b23e03a18891ec55adb06 (diff)
Imported Upstream version 0.9.7.995 upstream/0.9.7.995
Diffstat (limited to 'libnm-glib/nm-remote-settings.c')
-rw-r--r--libnm-glib/nm-remote-settings.c101
1 files changed, 72 insertions, 29 deletions
diff --git a/libnm-glib/nm-remote-settings.c b/libnm-glib/nm-remote-settings.c
index 7748f4f0..0e95ef0a 100644
--- a/libnm-glib/nm-remote-settings.c
+++ b/libnm-glib/nm-remote-settings.c
@@ -61,6 +61,7 @@ typedef struct {
 	DBusGProxy *dbus_proxy;
 
 	guint fetch_id;
+	gboolean fetching;
 } NMRemoteSettingsPrivate;
 
 enum {
@@ -381,8 +382,10 @@ connection_inited (GObject *source, GAsyncResult *result, gpointer user_data)
 
 	/* Let listeners know that all connections have been found */
 	priv->init_left--;
-	if (priv->init_left == 0)
+	if (priv->init_left == 0) {
+		priv->fetching = FALSE;
 		g_signal_emit (self, signals[CONNECTIONS_READ], 0);
+	}
 }
 
 static NMRemoteConnection *
@@ -442,14 +445,16 @@ fetch_connections_done (DBusGProxy *proxy,
 		g_clear_error (&error);
 
 		/* We tried to read connections and failed */
+		priv->fetching = FALSE;
 		g_signal_emit (self, signals[CONNECTIONS_READ], 0);
 		return;
 	}
 
 	/* Let listeners know we are done getting connections */
-	if (connections->len == 0)
+	if (connections->len == 0) {
+		priv->fetching = FALSE;
 		g_signal_emit (self, signals[CONNECTIONS_READ], 0);
-	else {
+	} else {
 		priv->init_left = connections->len;
 		for (i = 0; i < connections->len; i++) {
 			char *path = g_ptr_array_index (connections, i);
@@ -682,6 +687,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 +746,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);
 	}
 }
 
@@ -881,6 +914,7 @@ constructed (GObject *object)
 	                             object,
 	                             NULL);
 
+	priv->fetching = TRUE;
 	priv->fetch_id = g_idle_add (fetch_connections, object);
 
 
@@ -921,6 +955,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 +971,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;
 }
 
@@ -944,6 +982,10 @@ typedef struct {
 static void
 init_async_complete (NMRemoteSettingsInitData *init_data)
 {
+	NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (init_data->settings);
+
+	priv->inited = TRUE;
+
 	g_simple_async_result_complete (init_data->result);
 	g_object_unref (init_data->result);
 	g_slice_free (NMRemoteSettingsInitData, init_data);
@@ -955,6 +997,7 @@ init_read_connections (NMRemoteSettings *settings, gpointer user_data)
 	NMRemoteSettingsInitData *init_data = user_data;
 
 	g_signal_handlers_disconnect_by_func (settings, G_CALLBACK (init_read_connections), user_data);
+
 	init_async_complete (init_data);
 }
 
@@ -976,7 +1019,7 @@ init_async_got_properties (DBusGProxy *proxy, DBusGProxyCall *call,
 	} else
 		g_simple_async_result_take_error (init_data->result, error);
 
-	if (priv->init_left) {
+	if (priv->fetching) {
 		/* Still creating initial connections; wait for that to complete */
 		g_signal_connect (init_data->settings, "connections-read",
 		                  G_CALLBACK (init_read_connections), init_data);