about summary refs log tree commit diff
path: root/src/nm-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nm-manager.c')
-rw-r--r--src/nm-manager.c67
1 files changed, 49 insertions, 18 deletions
diff --git a/src/nm-manager.c b/src/nm-manager.c
index f5782254..475344a5 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -196,7 +196,6 @@ typedef struct {
 } RadioState;
 
 typedef struct {
-	char *config_file;
 	char *state_file;
 
 	GSList *devices;
@@ -214,7 +213,8 @@ typedef struct {
 	gboolean net_enabled;
 
 	NMVPNManager *vpn_manager;
-	guint vpn_manager_id;
+	gulong vpn_manager_activated_id;
+	gulong vpn_manager_deactivated_id;
 
 	NMModemManager *modem_manager;
 	guint modem_added_id;
@@ -377,6 +377,18 @@ manager_sleeping (NMManager *self)
 }
 
 static void
+vpn_manager_connection_activated_cb (NMVPNManager *manager,
+                                     NMVPNConnection *vpn,
+                                     NMVPNConnectionState state,
+                                     NMVPNConnectionStateReason reason,
+                                     gpointer user_data)
+{
+	/* Update timestamp for the VPN connection */
+	nm_settings_connection_update_timestamp (NM_SETTINGS_CONNECTION (nm_vpn_connection_get_connection (vpn)),
+	                                         (guint64) time (NULL));
+}
+
+static void
 vpn_manager_connection_deactivated_cb (NMVPNManager *manager,
                                        NMVPNConnection *vpn,
                                        NMVPNConnectionState state,
@@ -1980,6 +1992,7 @@ nm_manager_activate_connection (NMManager *manager,
 		vpn_connection = nm_vpn_manager_activate_connection (priv->vpn_manager,
 		                                                     connection,
 		                                                     device,
+		                                                     nm_act_request_get_active_connection_path (parent_req),
 		                                                     TRUE,
 		                                                     sender_uid,
 		                                                     error);
@@ -3029,10 +3042,17 @@ out:
 	return DBUS_HANDLER_RESULT_HANDLED;
 }
 
+static NMManager *singleton = NULL;
+
+NMManager *
+nm_manager_get (void)
+{
+	g_assert (singleton);
+	return g_object_ref (singleton);
+}
+
 NMManager *
-nm_manager_get (NMSettings *settings,
-                const char *config_file,
-                const char *plugins,
+nm_manager_new (NMSettings *settings,
                 const char *state_file,
                 gboolean initial_net_enabled,
                 gboolean initial_wifi_enabled,
@@ -3040,16 +3060,14 @@ nm_manager_get (NMSettings *settings,
                 gboolean initial_wimax_enabled,
                 GError **error)
 {
-	static NMManager *singleton = NULL;
 	NMManagerPrivate *priv;
 	DBusGConnection *bus;
 	DBusConnection *dbus_connection;
 
-	if (singleton)
-		return g_object_ref (singleton);
-
 	g_assert (settings);
 
+	/* Can only be called once */
+	g_assert (singleton == NULL);
 	singleton = (NMManager *) g_object_new (NM_TYPE_MANAGER, NULL);
 	g_assert (singleton);
 
@@ -3068,7 +3086,6 @@ nm_manager_get (NMSettings *settings,
 
 	priv->settings = g_object_ref (settings);
 
-	priv->config_file = g_strdup (config_file);
 	priv->state_file = g_strdup (state_file);
 
 	priv->net_enabled = initial_net_enabled;
@@ -3155,13 +3172,16 @@ dispose (GObject *object)
 	}
 
 	g_free (priv->hostname);
-	g_free (priv->config_file);
 
 	g_object_unref (priv->settings);
 
-	if (priv->vpn_manager_id) {
-		g_source_remove (priv->vpn_manager_id);
-		priv->vpn_manager_id = 0;
+	if (priv->vpn_manager_activated_id) {
+		g_source_remove (priv->vpn_manager_activated_id);
+		priv->vpn_manager_activated_id = 0;
+	}
+	if (priv->vpn_manager_deactivated_id) {
+		g_source_remove (priv->vpn_manager_deactivated_id);
+		priv->vpn_manager_deactivated_id = 0;
 	}
 	g_object_unref (priv->vpn_manager);
 
@@ -3402,6 +3422,7 @@ static gboolean
 periodic_update_active_connection_timestamps (gpointer user_data)
 {
 	NMManager *manager = NM_MANAGER (user_data);
+	NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
 	GPtrArray *active;
 	int i;
 
@@ -3416,6 +3437,15 @@ periodic_update_active_connection_timestamps (gpointer user_data)
 		if (device && nm_device_get_state (device) == NM_DEVICE_STATE_ACTIVATED)
 			nm_settings_connection_update_timestamp (NM_SETTINGS_CONNECTION (nm_act_request_get_connection (req)),
 			                                         (guint64) time (NULL));
+		else {
+			/* The connection is probably VPN */
+			NMVPNConnection *vpn_con;
+
+			vpn_con = nm_vpn_manager_get_vpn_connection_for_active (priv->vpn_manager, active_path);
+			if (vpn_con && nm_vpn_connection_get_vpn_state (vpn_con) == NM_VPN_CONNECTION_STATE_ACTIVATED)
+				nm_settings_connection_update_timestamp (NM_SETTINGS_CONNECTION (nm_vpn_connection_get_connection (vpn_con)),
+				                                         (guint64) time (NULL));
+		}
 	}
 
 	return TRUE;
@@ -3426,7 +3456,7 @@ nm_manager_init (NMManager *manager)
 {
 	NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
 	DBusGConnection *g_connection;
-	guint id, i;
+	guint i;
 	GFile *file;
 
 	/* Initialize rfkill structures and states */
@@ -3471,9 +3501,10 @@ nm_manager_init (NMManager *manager)
 	                                           G_CALLBACK (modem_removed), manager);
 
 	priv->vpn_manager = nm_vpn_manager_get ();
-	id = g_signal_connect (G_OBJECT (priv->vpn_manager), "connection-deactivated",
-	                       G_CALLBACK (vpn_manager_connection_deactivated_cb), manager);
-	priv->vpn_manager_id = id;
+	priv->vpn_manager_activated_id = g_signal_connect (G_OBJECT (priv->vpn_manager), "connection-activated",
+	                                                   G_CALLBACK (vpn_manager_connection_activated_cb), manager);
+	priv->vpn_manager_deactivated_id = g_signal_connect (G_OBJECT (priv->vpn_manager), "connection-deactivated",
+	                                                   G_CALLBACK (vpn_manager_connection_deactivated_cb), manager);
 
 	g_connection = nm_dbus_manager_get_connection (priv->dbus_mgr);