summaryrefslogtreecommitdiff
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.c100
1 files changed, 57 insertions, 43 deletions
diff --git a/libnm/nm-vpn-connection.c b/libnm/nm-vpn-connection.c
index a0d673e913..26980229f3 100644
--- a/libnm/nm-vpn-connection.c
+++ b/libnm/nm-vpn-connection.c
@@ -14,8 +14,6 @@
#include "nm-active-connection.h"
#include "nm-dbus-helpers.h"
-#include "introspection/org.freedesktop.NetworkManager.VPN.Connection.h"
-
/*****************************************************************************/
NM_GOBJECT_PROPERTIES_DEFINE (NMVpnConnection,
@@ -33,7 +31,8 @@ static guint signals[LAST_SIGNAL] = { 0 };
typedef struct {
char *banner;
- NMVpnConnectionState vpn_state;
+ guint32 vpn_state;
+ guint32 reason;
} NMVpnConnectionPrivate;
struct _NMVpnConnection {
@@ -86,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);
- _notify (connection, PROP_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));
}
/*****************************************************************************/
@@ -107,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
@@ -166,17 +167,24 @@ 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);
object_class->get_property = get_property;
object_class->finalize = finalize;
- nm_object_class->init_dbus = init_dbus;
-
/**
* NMVpnConnection:vpn-state:
*
@@ -200,7 +208,13 @@ nm_vpn_connection_class_init (NMVpnConnectionClass *connection_class)
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS);
- g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
+ _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] =