summary refs log tree commit diff
path: root/libnm/nm-vpn-connection.c
diff options
context:
space:
mode:
Diffstat (limited to 'libnm/nm-vpn-connection.c')
-rw-r--r--libnm/nm-vpn-connection.c203
1 files changed, 103 insertions, 100 deletions
diff --git a/libnm/nm-vpn-connection.c b/libnm/nm-vpn-connection.c
index 15e0e645..26980229 100644
--- a/libnm/nm-vpn-connection.c
+++ b/libnm/nm-vpn-connection.c
@@ -1,21 +1,7 @@
+// SPDX-License-Identifier: LGPL-2.1+
 /*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301 USA.
- *
- * Copyright 2007 - 2008 Novell, Inc.
- * Copyright 2007 - 2012 Red Hat, Inc.
+ * Copyright (C) 2007 - 2008 Novell, Inc.
+ * Copyright (C) 2007 - 2012 Red Hat, Inc.
  */
 
 #include "nm-default.h"
@@ -28,34 +14,43 @@
 #include "nm-active-connection.h"
 #include "nm-dbus-helpers.h"
 
-#include "introspection/org.freedesktop.NetworkManager.VPN.Connection.h"
+/*****************************************************************************/
 
-G_DEFINE_TYPE (NMVpnConnection, nm_vpn_connection, NM_TYPE_ACTIVE_CONNECTION)
+NM_GOBJECT_PROPERTIES_DEFINE (NMVpnConnection,
+	PROP_VPN_STATE,
+	PROP_BANNER,
+);
 
-#define NM_VPN_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_VPN_CONNECTION, NMVpnConnectionPrivate))
+enum {
+	VPN_STATE_CHANGED,
 
-G_STATIC_ASSERT (sizeof (NMVpnConnectionStateReason) == sizeof (NMActiveConnectionStateReason));
+	LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
 
 typedef struct {
 	char *banner;
-	NMVpnConnectionState vpn_state;
+	guint32 vpn_state;
+	guint32 reason;
 } NMVpnConnectionPrivate;
 
-enum {
-	PROP_0,
-	PROP_VPN_STATE,
-	PROP_BANNER,
+struct _NMVpnConnection {
+	NMActiveConnection parent;
+	NMVpnConnectionPrivate _priv;
+};
 
-	LAST_PROP
+struct _NMVpnConnectionClass {
+	NMActiveConnectionClass parent;
 };
 
-enum {
-	VPN_STATE_CHANGED,
+G_DEFINE_TYPE (NMVpnConnection, nm_vpn_connection, NM_TYPE_ACTIVE_CONNECTION)
 
-	LAST_SIGNAL
-};
+#define NM_VPN_CONNECTION_GET_PRIVATE(self) _NM_GET_PRIVATE(self, NMVpnConnection, NM_IS_VPN_CONNECTION, NMObject, NMActiveConnection)
 
-static guint signals[LAST_SIGNAL] = { 0 };
+G_STATIC_ASSERT (sizeof (NMVpnConnectionStateReason) == sizeof (NMActiveConnectionStateReason));
+
+/*****************************************************************************/
 
 /**
  * nm_vpn_connection_get_banner:
@@ -71,7 +66,7 @@ nm_vpn_connection_get_banner (NMVpnConnection *vpn)
 {
 	g_return_val_if_fail (NM_IS_VPN_CONNECTION (vpn), NULL);
 
-	return nm_str_not_empty (NM_VPN_CONNECTION_GET_PRIVATE (vpn)->banner);
+	return _nml_coerce_property_str_not_empty (NM_VPN_CONNECTION_GET_PRIVATE (vpn)->banner);
 }
 
 /**
@@ -90,20 +85,48 @@ nm_vpn_connection_get_vpn_state (NMVpnConnection *vpn)
 	return NM_VPN_CONNECTION_GET_PRIVATE (vpn)->vpn_state;
 }
 
+/*****************************************************************************/
+
 static void
-vpn_state_changed_proxy (NMDBusVpnConnection *proxy,
-                         guint vpn_state,
-                         guint reason,
-                         gpointer user_data)
+_notify_event_state_changed (NMClient *client,
+                             NMClientNotifyEventWithPtr *notify_event)
+{
+	gs_unref_object NMVpnConnection *self = notify_event->user_data;
+	NMVpnConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (self);
+
+	/* we expose here the value cache in @priv. In practice, this is the same
+	 * value as we received from the signal. In the unexpected case where they
+	 * differ, the cached value of the current instance would still be more correct. */
+	g_signal_emit (self,
+	               signals[VPN_STATE_CHANGED],
+	               0,
+	               (guint) priv->vpn_state,
+	               (guint) priv->reason);
+}
+
+void
+_nm_vpn_connection_state_changed_commit (NMVpnConnection *self,
+                                         guint32 state,
+                                         guint32 reason)
 {
-	NMVpnConnection *connection = NM_VPN_CONNECTION (user_data);
-	NMVpnConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (connection);
+	NMClient *client;
+	NMVpnConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (self);
+
+	client = _nm_object_get_client (self);
 
-	if (priv->vpn_state != vpn_state) {
-		priv->vpn_state = vpn_state;
-		g_signal_emit (connection, signals[VPN_STATE_CHANGED], 0, vpn_state, reason);
-		g_object_notify (G_OBJECT (connection), NM_VPN_CONNECTION_VPN_STATE);
+	if (priv->vpn_state != state) {
+		priv->vpn_state = state;
+		_nm_client_queue_notify_object (client,
+		                                self,
+		                                obj_properties[PROP_VPN_STATE]);
 	}
+
+	priv->reason = reason;
+
+	_nm_client_notify_event_queue_with_ptr (client,
+	                                        NM_CLIENT_NOTIFY_EVENT_PRIO_GPROP + 1,
+	                                        _notify_event_state_changed,
+	                                        g_object_ref (self));
 }
 
 /*****************************************************************************/
@@ -111,32 +134,6 @@ vpn_state_changed_proxy (NMDBusVpnConnection *proxy,
 static void
 nm_vpn_connection_init (NMVpnConnection *connection)
 {
-	NMVpnConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (connection);
-
-	priv->vpn_state = NM_VPN_CONNECTION_STATE_UNKNOWN;
-}
-
-static void
-init_dbus (NMObject *object)
-{
-	NMVpnConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (object);
-	const NMPropertiesInfo property_info[] = {
-		{ NM_VPN_CONNECTION_BANNER,    &priv->banner },
-		{ NM_VPN_CONNECTION_VPN_STATE, &priv->vpn_state },
-		{ NULL },
-	};
-	GDBusProxy *proxy;
-
-	NM_OBJECT_CLASS (nm_vpn_connection_parent_class)->init_dbus (object);
-
-	_nm_object_register_properties (object,
-	                                NM_DBUS_INTERFACE_VPN_CONNECTION,
-	                                property_info);
-
-	proxy = _nm_object_get_proxy (object, NM_DBUS_INTERFACE_VPN_CONNECTION);
-	g_signal_connect_object (proxy, "vpn-state-changed",
-	                         G_CALLBACK (vpn_state_changed_proxy), object, 0);
-	g_object_unref (proxy);
 }
 
 static void
@@ -170,56 +167,62 @@ get_property (GObject *object,
 	}
 }
 
+const NMLDBusMetaIface _nml_dbus_meta_iface_nm_vpn_connection = NML_DBUS_META_IFACE_INIT_PROP (
+	NM_DBUS_INTERFACE_VPN_CONNECTION,
+	nm_vpn_connection_get_type,
+	NML_DBUS_META_INTERFACE_PRIO_INSTANTIATE_HIGH,
+	NML_DBUS_META_IFACE_DBUS_PROPERTIES (
+		NML_DBUS_META_PROPERTY_INIT_S ("Banner",   PROP_BANNER,    NMVpnConnection, _priv.banner    ),
+		NML_DBUS_META_PROPERTY_INIT_U ("VpnState", PROP_VPN_STATE, NMVpnConnection, _priv.vpn_state ),
+	),
+);
+
 static void
 nm_vpn_connection_class_init (NMVpnConnectionClass *connection_class)
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (connection_class);
-	NMObjectClass *nm_object_class = NM_OBJECT_CLASS (connection_class);
-
-	g_type_class_add_private (connection_class, sizeof (NMVpnConnectionPrivate));
 
-	/* virtual methods */
 	object_class->get_property = get_property;
-	object_class->finalize = finalize;
-
-	nm_object_class->init_dbus = init_dbus;
-
-	/* properties */
+	object_class->finalize     = finalize;
 
 	/**
 	 * NMVpnConnection:vpn-state:
 	 *
 	 * The VPN state of the active VPN connection.
 	 **/
-	g_object_class_install_property
-		(object_class, PROP_VPN_STATE,
-		 g_param_spec_enum (NM_VPN_CONNECTION_VPN_STATE, "", "",
-		                    NM_TYPE_VPN_CONNECTION_STATE,
-		                    NM_VPN_CONNECTION_STATE_UNKNOWN,
-		                    G_PARAM_READABLE |
-		                    G_PARAM_STATIC_STRINGS));
+	obj_properties[PROP_VPN_STATE] =
+	    g_param_spec_enum (NM_VPN_CONNECTION_VPN_STATE, "", "",
+	                       NM_TYPE_VPN_CONNECTION_STATE,
+	                       NM_VPN_CONNECTION_STATE_UNKNOWN,
+	                       G_PARAM_READABLE |
+	                       G_PARAM_STATIC_STRINGS);
 
 	/**
 	 * NMVpnConnection:banner:
 	 *
 	 * The VPN login banner of the active VPN connection.
 	 **/
-	g_object_class_install_property
-		(object_class, PROP_BANNER,
-		 g_param_spec_string (NM_VPN_CONNECTION_BANNER, "", "",
-		                      NULL,
-		                      G_PARAM_READABLE |
-		                      G_PARAM_STATIC_STRINGS));
-
-	/* signals */
+	obj_properties[PROP_BANNER] =
+	    g_param_spec_string (NM_VPN_CONNECTION_BANNER, "", "",
+	                         NULL,
+	                         G_PARAM_READABLE |
+	                         G_PARAM_STATIC_STRINGS);
+
+	_nml_dbus_meta_class_init_with_properties (object_class, &_nml_dbus_meta_iface_nm_vpn_connection);
+
+	/* TODO: the state reason should also be exposed as a property in libnm's NMVpnConnection,
+	 * like done for NMDevice's state reason. */
+
+	/* TODO: the D-Bus API should also expose the state-reason as a property instead of
+	 * a "VpnStateChanged" signal. Like done for Device's "StateReason".  */
+
 	G_GNUC_BEGIN_IGNORE_DEPRECATIONS
 	signals[VPN_STATE_CHANGED] =
-		g_signal_new ("vpn-state-changed",
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST,
-		              G_STRUCT_OFFSET (NMVpnConnectionClass, vpn_state_changed),
-		              NULL, NULL, NULL,
-		              G_TYPE_NONE, 2,
-		              G_TYPE_UINT, G_TYPE_UINT);
+	    g_signal_new ("vpn-state-changed",
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0, NULL, NULL, NULL,
+	                  G_TYPE_NONE, 2,
+	                  G_TYPE_UINT, G_TYPE_UINT);
 	G_GNUC_END_IGNORE_DEPRECATIONS
 }