NetworkManager r3293 - in trunk: . src



Author: dcbw
Date: Wed Feb  6 16:50:43 2008
New Revision: 3293
URL: http://svn.gnome.org/viewvc/NetworkManager?rev=3293&view=rev

Log:
2008-02-06  Dan Williams  <dcbw redhat com>

	* src/nm-manager.c
		- (finalize): remove devices a bit earlier; clean up system settings
			poke
		- (nm_manager_name_owner_changed): clean up system settings poke when
			the service appears, and try to restart it if it fails
		- (poke_system_settings_daemon_cb): try to get the system settings
			service started through D-Bus service activation
		- (initial_get_connections): start the system settings daemon if it's
			not already running



Modified:
   trunk/ChangeLog
   trunk/src/nm-manager.c

Modified: trunk/src/nm-manager.c
==============================================================================
--- trunk/src/nm-manager.c	(original)
+++ trunk/src/nm-manager.c	Wed Feb  6 16:50:43 2008
@@ -31,6 +31,8 @@
 static const char * nm_manager_get_connection_dbus_path (NMManager *manager,
                                                          NMConnection *connection);
 
+static gboolean poke_system_settings_daemon_cb (gpointer user_data);
+
 /* Legacy 0.6 compatibility interface */
 
 static gboolean impl_manager_legacy_sleep (NMManager *manager, GError **err);
@@ -46,6 +48,7 @@
 									 NMConnection *connection,
 									 NMConnectionType connection_type);
 
+#define SSD_POKE_INTERVAL 120000
 
 typedef struct {
 	DBusGMethodInvocation *context;
@@ -72,6 +75,8 @@
 	gboolean wireless_enabled;
 	gboolean wireless_hw_enabled;
 	gboolean sleeping;
+
+	guint poke_id;
 } NMManagerPrivate;
 
 #define NM_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_MANAGER, NMManagerPrivate))
@@ -241,6 +246,9 @@
 	pending_connection_info_destroy (priv->pending_connection_info);
 	priv->pending_connection_info = NULL;
 
+	while (g_slist_length (priv->devices))
+		nm_manager_remove_device (manager, NM_DEVICE (priv->devices->data), TRUE);
+
 	nm_manager_connections_destroy (manager, NM_CONNECTION_TYPE_USER);
 	g_hash_table_destroy (priv->user_connections);
 	priv->user_connections = NULL;
@@ -249,8 +257,10 @@
 	g_hash_table_destroy (priv->system_connections);
 	priv->system_connections = NULL;
 
-	while (g_slist_length (priv->devices))
-		nm_manager_remove_device (manager, NM_DEVICE (priv->devices->data), TRUE);
+	if (priv->poke_id) {
+		g_source_remove (priv->poke_id);
+		priv->poke_id = 0;
+	}
 
 	if (priv->dbus_mgr)
 		g_object_unref (priv->dbus_mgr);
@@ -821,7 +831,8 @@
                                const char *new,
                                gpointer user_data)
 {
-	NMManager * manager = NM_MANAGER (user_data);
+	NMManager *manager = NM_MANAGER (user_data);
+	NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
 	gboolean old_owner_good = (old && (strlen (old) > 0));
 	gboolean new_owner_good = (new && (strlen (new) > 0));
 
@@ -835,23 +846,70 @@
 		}
 	} else if (strcmp (name, NM_DBUS_SERVICE_SYSTEM_SETTINGS) == 0) {
 		if (!old_owner_good && new_owner_good) {
+			if (priv->poke_id) {
+				g_source_remove (priv->poke_id);
+				priv->poke_id = 0;
+			}
+
 			/* System Settings service appeared, update stuff */
 			query_connections (manager, NM_CONNECTION_TYPE_SYSTEM);
 		} else {
 			/* System Settings service disappeared, throw them away (?) */
 			nm_manager_connections_destroy (manager, NM_CONNECTION_TYPE_SYSTEM);
+
+			if (priv->poke_id)
+				g_source_remove (priv->poke_id);
+
+			/* Poke the system settings daemon so that it gets activated by dbus
+			 * system bus activation.
+			 */
+			priv->poke_id = g_idle_add (poke_system_settings_daemon_cb, (gpointer) manager);
 		}
 	}
 }
 
 static gboolean
+poke_system_settings_daemon_cb (gpointer user_data)
+{
+	NMManager *manager = NM_MANAGER (user_data);
+	NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
+	DBusGConnection *g_connection;
+	DBusGProxy *proxy;
+
+	g_connection = nm_dbus_manager_get_connection (priv->dbus_mgr);
+	proxy = dbus_g_proxy_new_for_name (g_connection,
+	                                   NM_DBUS_SERVICE_SYSTEM_SETTINGS,
+	                                   NM_DBUS_PATH_SETTINGS,
+	                                   NM_DBUS_IFACE_SETTINGS);
+	if (!proxy) {
+		nm_warning ("Error: could not init system settings daemon proxy");
+		goto out;
+	}
+
+	nm_info ("Trying to start the system settings daemon...");
+	dbus_g_proxy_call_no_reply (proxy, "ListConnections", G_TYPE_INVALID);
+	g_object_unref (proxy);
+
+out:
+	/* Reschedule the poke */
+	priv->poke_id = g_timeout_add (SSD_POKE_INTERVAL, poke_system_settings_daemon_cb, (gpointer) manager);
+
+	return FALSE;
+}
+
+static gboolean
 initial_get_connections (gpointer user_data)
 {
-	NMManager * manager = NM_MANAGER (user_data);
+	NMManager *manager = NM_MANAGER (user_data);
+	NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
 
 	if (nm_dbus_manager_name_has_owner (nm_dbus_manager_get (),
-	                                    NM_DBUS_SERVICE_SYSTEM_SETTINGS))
+	                                    NM_DBUS_SERVICE_SYSTEM_SETTINGS)) {
 		query_connections (manager, NM_CONNECTION_TYPE_SYSTEM);
+	} else {
+		/* Try to activate the system settings daemon */
+		priv->poke_id = g_idle_add (poke_system_settings_daemon_cb, (gpointer) manager);
+	}
 
 	if (nm_dbus_manager_name_has_owner (nm_dbus_manager_get (),
 	                                    NM_DBUS_SERVICE_USER_SETTINGS))



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]