diff options
author | Lubomir Rintel <lkundrak@v3.sk> | 2017-03-05 17:20:27 +0100 |
---|---|---|
committer | Lubomir Rintel <lkundrak@v3.sk> | 2017-03-17 10:21:19 +0100 |
commit | 40ffb962bec3700e447254d4a1cc93f21b8a25dd (patch) | |
tree | aec9023a54187928196e0cc5dfddb232e8016790 | |
parent | 8b649a8c84c0d46c1d4108da34567ee37765acd8 (diff) | |
download | NetworkManager-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.ver | 1 | ||||
-rw-r--r-- | libnm/nm-active-connection.c | 64 | ||||
-rw-r--r-- | libnm/nm-active-connection.h | 32 | ||||
-rw-r--r-- | libnm/nm-client.c | 3 | ||||
-rw-r--r-- | src/nm-active-connection.c | 2 |
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); |