gboolean nm_vpn_service_activate (NMVpnService *service, NMVpnConnection *vpn, GError **error) { NMVpnServicePrivate *priv; g_return_val_if_fail (NM_IS_VPN_SERVICE (service), FALSE); g_return_val_if_fail (NM_IS_VPN_CONNECTION (vpn), FALSE); g_return_val_if_fail (error != NULL, FALSE); g_return_val_if_fail (*error == NULL, FALSE); priv = NM_VPN_SERVICE_GET_PRIVATE (service); g_signal_connect (vpn, NM_VPN_CONNECTION_INTERNAL_STATE_CHANGED, G_CALLBACK (connection_vpn_state_changed), service); /* Queue up the new VPN connection */ priv->pending = g_slist_append (priv->pending, g_object_ref (vpn)); /* Tell the active VPN to deactivate and wait for it to quit before we * start the next VPN. The just-queued VPN will then be started from * connection_vpn_state_changed(). */ if (priv->active) { nm_vpn_connection_deactivate (priv->active, NM_VPN_CONNECTION_STATE_REASON_USER_DISCONNECTED, FALSE); return TRUE; } /* Otherwise start the next VPN */ return start_pending_vpn (service, error); }
gboolean nm_vpn_manager_deactivate_connection (NMVpnManager *self, NMVpnConnection *connection, NMVpnConnectionStateReason reason) { return nm_vpn_connection_deactivate (connection, reason, FALSE); }
void nm_vpn_service_stop_connections (NMVpnService *service, gboolean quitting, NMVpnConnectionStateReason reason) { NMVpnServicePrivate *priv = NM_VPN_SERVICE_GET_PRIVATE (service); GSList *iter; /* Just add priv->active to the beginning of priv->pending, * since we're going to clear priv->pending immediately anyway. */ if (priv->active) { priv->pending = g_slist_prepend (priv->pending, priv->active); priv->active = NULL; } for (iter = priv->pending; iter; iter = iter->next) { NMVpnConnection *vpn = NM_VPN_CONNECTION (iter->data); g_signal_handlers_disconnect_by_func (vpn, G_CALLBACK (connection_vpn_state_changed), service); if (quitting) { /* Deactivate to allow pre-down before disconnecting */ nm_vpn_connection_deactivate (vpn, reason, quitting); } nm_vpn_connection_disconnect (vpn, reason, quitting); g_object_unref (vpn); } g_clear_pointer (&priv->pending, g_slist_free); }