Remember the NMDeviceStateReason for a NMDeviceState in NMDevicePrivate. This allows everybody to get a NMDevice StateReason without listen to nm_device_state_changed signals. --- introspection/nm-device.xml | 17 +++++++++++++++++ src/nm-device.c | 21 +++++++++++++++++++++ src/nm-device.h | 1 + 3 files changed, 39 insertions(+), 0 deletions(-)
diff --git a/introspection/nm-device.xml b/introspection/nm-device.xml index 2f3aa8f..4f88d27 100644 --- a/introspection/nm-device.xml +++ b/introspection/nm-device.xml @@ -51,6 +51,11 @@ The current state of the device. </tp:docstring> </property> + <property name="StateReason" type="(uu)" access="read" tp:type="NM_DEVICE_STATE_REASON_STRUCT"> + <tp:docstring> + The current state and state-reason of the device. + </tp:docstring> + </property> <property name="ActiveConnection" type="o" access="read"> <tp:docstring> Object path of an ActiveConnection object that "owns" this device during @@ -498,5 +503,17 @@ </tp:enumvalue> </tp:enum> + <tp:struct name="NM_DEVICE_STATE_REASON_STRUCT"> + <tp:member type="u" name="State" tp:type="NM_DEVICE_STATE"> + <tp:docstring> + The Device state. + </tp:docstring> + </tp:member> + <tp:member type="u" name="StateReason" tp:type="NM_DEVICE_STATE_REASON"> + <tp:docstring> + The Device state reason. + </tp:docstring> + </tp:member> + </tp:struct> </interface> </node> diff --git a/src/nm-device.c b/src/nm-device.c index e0c8d01..d535f78 100644 --- a/src/nm-device.c +++ b/src/nm-device.c @@ -66,6 +66,8 @@ static void impl_device_disconnect (NMDevice *device, DBusGMethodInvocation *con #define PENDING_IP4_CONFIG "pending-ip4-config" #define PENDING_IP6_CONFIG "pending-ip6-config" +#define DBUS_G_TYPE_UINT_STRUCT (dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID)) + /***********************************************************/ typedef enum { NM_DEVICE_ERROR_CONNECTION_ACTIVATING = 0, @@ -131,6 +133,7 @@ enum { PROP_IP6_CONFIG, PROP_DHCP6_CONFIG, PROP_STATE, + PROP_STATE_REASON, PROP_ACTIVE_CONNECTION, PROP_DEVICE_TYPE, PROP_MANAGED, @@ -164,6 +167,7 @@ typedef struct { gboolean initialized; NMDeviceState state; + NMDeviceStateReason state_reason; QueuedState queued_state; char * udi; @@ -273,6 +277,7 @@ nm_device_init (NMDevice *self) priv->type = NM_DEVICE_TYPE_UNKNOWN; priv->capabilities = NM_DEVICE_CAP_NONE; priv->state = NM_DEVICE_STATE_UNMANAGED; + priv->state_reason = NM_DEVICE_STATE_REASON_NONE; priv->dhcp_timeout = 0; priv->rfkill_type = RFKILL_TYPE_UNKNOWN; } @@ -3693,6 +3698,14 @@ get_property (GObject *object, guint prop_id, case PROP_STATE: g_value_set_uint (value, priv->state); break; + case PROP_STATE_REASON: + g_value_set_boxed (value, + dbus_g_type_specialized_construct (DBUS_G_TYPE_UINT_STRUCT)); + dbus_g_type_struct_set (value, + 0, priv->state, + 1, priv->state_reason, + G_MAXUINT); + break; case PROP_ACTIVE_CONNECTION: if (priv->act_request) ac_path = nm_act_request_get_active_connection_path (priv->act_request); @@ -3832,6 +3845,13 @@ nm_device_class_init (NMDeviceClass *klass) "State", 0, G_MAXUINT32, NM_DEVICE_STATE_UNKNOWN, G_PARAM_READABLE)); + g_object_class_install_property + (object_class, PROP_STATE_REASON, + g_param_spec_boxed (NM_DEVICE_STATE_REASON, + "StateReason", + "StateReason", + DBUS_G_TYPE_UINT_STRUCT, + G_PARAM_READABLE)); g_object_class_install_property (object_class, PROP_ACTIVE_CONNECTION, @@ -4109,6 +4129,7 @@ nm_device_state_changed (NMDevice *device, old_state = priv->state; priv->state = state; + priv->state_reason = reason; nm_log_info (LOGD_DEVICE, "(%s): device state change: %s -> %s (reason '%s') [%d %d %d]", nm_device_get_iface (device), diff --git a/src/nm-device.h b/src/nm-device.h index 9d3f74b..e69b989 100644 --- a/src/nm-device.h +++ b/src/nm-device.h @@ -47,6 +47,7 @@ #define NM_DEVICE_IP6_CONFIG "ip6-config" #define NM_DEVICE_DHCP6_CONFIG "dhcp6-config" #define NM_DEVICE_STATE "state" +#define NM_DEVICE_STATE_REASON "state-reason" #define NM_DEVICE_ACTIVE_CONNECTION "active-connection" #define NM_DEVICE_DEVICE_TYPE "device-type" /* ugh */ #define NM_DEVICE_MANAGED "managed" -- 1.7.8.3 _______________________________________________ networkmanager-list mailing list networkmanager-list@gnome.org http://mail.gnome.org/mailman/listinfo/networkmanager-list