summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLubomir Rintel <lkundrak@v3.sk>2017-03-05 17:20:27 +0100
committerLubomir Rintel <lkundrak@v3.sk>2017-03-17 10:21:19 +0100
commit40ffb962bec3700e447254d4a1cc93f21b8a25dd (patch)
treeaec9023a54187928196e0cc5dfddb232e8016790
parent8b649a8c84c0d46c1d4108da34567ee37765acd8 (diff)
downloadNetworkManager-40ffb962bec3700e447254d4a1cc93f21b8a25dd.tar.gz
libnm/active-connection: track reason for state changes
Note that the reason tracking starts as soon as the object exists (which is immediately after GDBusObject is created), not when the asynchronous NMObject initialization finishes. That is so that we the reason changes in between are not lost. The vpn-connection should probably be doing the same.
-rw-r--r--libnm/libnm.ver1
-rw-r--r--libnm/nm-active-connection.c64
-rw-r--r--libnm/nm-active-connection.h32
-rw-r--r--libnm/nm-client.c3
-rw-r--r--src/nm-active-connection.c2
5 files changed, 86 insertions, 16 deletions
diff --git a/libnm/libnm.ver b/libnm/libnm.ver
index cfa52e25bc..96b77d4dc9 100644
--- a/libnm/libnm.ver
+++ b/libnm/libnm.ver
@@ -1147,6 +1147,7 @@ global:
libnm_1_8_0 {
global:
nm_active_connection_state_reason_get_type;
+ nm_active_connection_get_state_reason;
nm_connection_get_setting_dummy;
nm_device_dummy_get_type;
nm_ip_route_get_variant_attribute_spec;
diff --git a/libnm/nm-active-connection.c b/libnm/nm-active-connection.c
index 6a823403c4..3cd87b0356 100644
--- a/libnm/nm-active-connection.c
+++ b/libnm/nm-active-connection.c
@@ -37,6 +37,8 @@
#include "nm-ip6-config.h"
#include "nm-remote-connection.h"
+#include "introspection/org.freedesktop.NetworkManager.Connection.Active.h"
+
G_DEFINE_TYPE (NMActiveConnection, nm_active_connection, NM_TYPE_OBJECT);
#define NM_ACTIVE_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_ACTIVE_CONNECTION, NMActiveConnectionPrivate))
@@ -57,6 +59,7 @@ typedef struct {
NMDhcpConfig *dhcp6_config;
gboolean is_vpn;
NMDevice *master;
+ NMActiveConnectionStateReason reason;
} NMActiveConnectionPrivate;
enum {
@@ -80,6 +83,14 @@ enum {
LAST_PROP
};
+enum {
+ STATE_CHANGED,
+
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
/**
* nm_active_connection_get_connection:
* @connection: a #NMActiveConnection
@@ -205,6 +216,24 @@ nm_active_connection_get_state (NMActiveConnection *connection)
}
/**
+ * nm_active_connection_get_state_reason:
+ * @connection: a #NMActiveConnection
+ *
+ * Gets the reason for active connection's state.
+ *
+ * Returns: the reason
+ *
+ * Since: 1.8
+ **/
+NMActiveConnectionStateReason
+nm_active_connection_get_state_reason (NMActiveConnection *connection)
+{
+ g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NM_ACTIVE_CONNECTION_STATE_REASON_UNKNOWN);
+
+ return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->reason;
+}
+
+/**
* nm_active_connection_get_default:
* @connection: a #NMActiveConnection
*
@@ -351,6 +380,31 @@ nm_active_connection_init (NMActiveConnection *connection)
}
static void
+state_changed_proxy (NMDBusActiveConnectionProxy *proxy,
+ NMActiveConnectionState state,
+ NMActiveConnectionStateReason reason,
+ gpointer user_data)
+{
+ NMActiveConnection *connection = NM_ACTIVE_CONNECTION (user_data);
+ NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (connection);
+
+ priv->state = state;
+ priv->reason = reason;
+ g_signal_emit (connection, signals[STATE_CHANGED], 0, state, reason);
+}
+
+static void
+constructed (GObject *object)
+{
+ GDBusProxy *proxy;
+
+ proxy = _nm_object_get_proxy (NM_OBJECT (object), NM_DBUS_INTERFACE_ACTIVE_CONNECTION);
+ g_signal_connect (proxy, "state-changed",
+ G_CALLBACK (state_changed_proxy), object);
+ g_object_unref (proxy);
+}
+
+static void
dispose (GObject *object)
{
NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (object);
@@ -503,6 +557,7 @@ nm_active_connection_class_init (NMActiveConnectionClass *ap_class)
/* virtual methods */
object_class->get_property = get_property;
+ object_class->constructed = constructed;
object_class->dispose = dispose;
object_class->finalize = finalize;
@@ -693,4 +748,13 @@ nm_active_connection_class_init (NMActiveConnectionClass *ap_class)
NM_TYPE_DEVICE,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS));
+
+ /* signals */
+ signals[STATE_CHANGED] =
+ g_signal_new ("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);
}
diff --git a/libnm/nm-active-connection.h b/libnm/nm-active-connection.h
index 8478b3dd7c..23cd737246 100644
--- a/libnm/nm-active-connection.h
+++ b/libnm/nm-active-connection.h
@@ -69,21 +69,23 @@ typedef struct {
GType nm_active_connection_get_type (void);
-NMRemoteConnection *nm_active_connection_get_connection (NMActiveConnection *connection);
-const char *nm_active_connection_get_id (NMActiveConnection *connection);
-const char *nm_active_connection_get_uuid (NMActiveConnection *connection);
-const char *nm_active_connection_get_connection_type (NMActiveConnection *connection);
-const char *nm_active_connection_get_specific_object_path (NMActiveConnection *connection);
-const GPtrArray *nm_active_connection_get_devices (NMActiveConnection *connection);
-NMActiveConnectionState nm_active_connection_get_state (NMActiveConnection *connection);
-NMDevice *nm_active_connection_get_master (NMActiveConnection *connection);
-gboolean nm_active_connection_get_default (NMActiveConnection *connection);
-NMIPConfig *nm_active_connection_get_ip4_config (NMActiveConnection *connection);
-NMDhcpConfig *nm_active_connection_get_dhcp4_config (NMActiveConnection *connection);
-gboolean nm_active_connection_get_default6 (NMActiveConnection *connection);
-NMIPConfig *nm_active_connection_get_ip6_config (NMActiveConnection *connection);
-NMDhcpConfig *nm_active_connection_get_dhcp6_config (NMActiveConnection *connection);
-gboolean nm_active_connection_get_vpn (NMActiveConnection *connection);
+NMRemoteConnection *nm_active_connection_get_connection (NMActiveConnection *connection);
+const char *nm_active_connection_get_id (NMActiveConnection *connection);
+const char *nm_active_connection_get_uuid (NMActiveConnection *connection);
+const char *nm_active_connection_get_connection_type (NMActiveConnection *connection);
+const char *nm_active_connection_get_specific_object_path (NMActiveConnection *connection);
+const GPtrArray *nm_active_connection_get_devices (NMActiveConnection *connection);
+NMActiveConnectionState nm_active_connection_get_state (NMActiveConnection *connection);
+NM_AVAILABLE_IN_1_8
+NMActiveConnectionStateReason nm_active_connection_get_state_reason (NMActiveConnection *connection);
+NMDevice *nm_active_connection_get_master (NMActiveConnection *connection);
+gboolean nm_active_connection_get_default (NMActiveConnection *connection);
+NMIPConfig *nm_active_connection_get_ip4_config (NMActiveConnection *connection);
+NMDhcpConfig *nm_active_connection_get_dhcp4_config (NMActiveConnection *connection);
+gboolean nm_active_connection_get_default6 (NMActiveConnection *connection);
+NMIPConfig *nm_active_connection_get_ip6_config (NMActiveConnection *connection);
+NMDhcpConfig *nm_active_connection_get_dhcp6_config (NMActiveConnection *connection);
+gboolean nm_active_connection_get_vpn (NMActiveConnection *connection);
G_END_DECLS
diff --git a/libnm/nm-client.c b/libnm/nm-client.c
index ccc96e947e..308402ee51 100644
--- a/libnm/nm-client.c
+++ b/libnm/nm-client.c
@@ -45,6 +45,7 @@
#include "introspection/org.freedesktop.NetworkManager.Settings.h"
#include "introspection/org.freedesktop.NetworkManager.Settings.Connection.h"
#include "introspection/org.freedesktop.NetworkManager.VPN.Connection.h"
+#include "introspection/org.freedesktop.NetworkManager.Connection.Active.h"
#include "nm-access-point.h"
#include "nm-active-connection.h"
@@ -2008,6 +2009,8 @@ proxy_type (GDBusObjectManagerClient *manager,
return NMDBUS_TYPE_DNS_MANAGER_PROXY;
else if (strcmp (interface_name, NM_DBUS_INTERFACE_VPN_CONNECTION) == 0)
return NMDBUS_TYPE_VPN_CONNECTION_PROXY;
+ else if (strcmp (interface_name, NM_DBUS_INTERFACE_ACTIVE_CONNECTION) == 0)
+ return NMDBUS_TYPE_ACTIVE_CONNECTION_PROXY;
/* Use a generic D-Bus Proxy whenever we can. The typed GDBusProxy
* subclasses actually use quite some memory, so they're better avoided. */
diff --git a/src/nm-active-connection.c b/src/nm-active-connection.c
index eb528da8c3..ee28f0f255 100644
--- a/src/nm-active-connection.c
+++ b/src/nm-active-connection.c
@@ -238,7 +238,7 @@ nm_active_connection_set_state (NMActiveConnection *self,
old_state = priv->state;
priv->state = new_state;
priv->state_set = TRUE;
- g_signal_emit (self, signals[STATE_CHANGED], 0, new_state, reason);
+ g_signal_emit (self, signals[STATE_CHANGED], 0, (guint) new_state, (guint) reason);
_notify (self, PROP_STATE);
check_master_ready (self);