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

Reply via email to