diff options
Diffstat (limited to 'src/nm-manager.c')
| -rw-r--r-- | src/nm-manager.c | 67 |
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); |