Export the device state as part of the D-Bus interface

This commit is contained in:
Richard Hughes 2020-04-07 14:15:49 +01:00
parent 949af578ea
commit 0bc65b5e97
5 changed files with 75 additions and 24 deletions

View File

@ -59,6 +59,7 @@ typedef struct {
FwupdUpdateState update_state;
gchar *update_error;
gchar *update_message;
FwupdStatus status;
GPtrArray *releases;
FwupdDevice *parent;
} FwupdDevicePrivate;
@ -68,6 +69,7 @@ enum {
PROP_VERSION_FORMAT,
PROP_FLAGS,
PROP_PROTOCOL,
PROP_STATUS,
PROP_LAST
};
@ -1397,6 +1399,11 @@ fwupd_device_to_variant_full (FwupdDevice *device, FwupdDeviceFlags flags)
FWUPD_RESULT_KEY_UPDATE_STATE,
g_variant_new_uint32 (priv->update_state));
}
if (priv->status != FWUPD_STATUS_UNKNOWN) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_STATUS,
g_variant_new_uint32 (priv->status));
}
if (priv->version_format != FWUPD_VERSION_FORMAT_UNKNOWN) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_VERSION_FORMAT,
@ -1575,6 +1582,10 @@ fwupd_device_from_key_value (FwupdDevice *device, const gchar *key, GVariant *va
fwupd_device_set_update_state (device, g_variant_get_uint32 (value));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_STATUS) == 0) {
fwupd_device_set_status (device, g_variant_get_uint32 (value));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_VERSION_FORMAT) == 0) {
fwupd_device_set_version_format (device, g_variant_get_uint32 (value));
return;
@ -1881,6 +1892,43 @@ fwupd_device_add_release (FwupdDevice *device, FwupdRelease *release)
g_return_if_fail (FWUPD_IS_DEVICE (device));
g_ptr_array_add (priv->releases, g_object_ref (release));
}
/**
* fwupd_device_get_status:
* @self: A #FwupdDevice
*
* Returns what the device is currently doing.
*
* Returns: the status value, e.g. %FWUPD_STATUS_DEVICE_WRITE
*
* Since: 1.4.0
**/
FwupdStatus
fwupd_device_get_status (FwupdDevice *self)
{
FwupdDevicePrivate *priv = GET_PRIVATE (self);
g_return_val_if_fail (FWUPD_IS_DEVICE (self), 0);
return priv->status;
}
/**
* fwupd_device_set_status:
* @self: A #FwupdDevice
* @status: the status value, e.g. %FWUPD_STATUS_DEVICE_WRITE
*
* Sets what the device is currently doing.
*
* Since: 1.4.0
**/
void
fwupd_device_set_status (FwupdDevice *self, FwupdStatus status)
{
FwupdDevicePrivate *priv = GET_PRIVATE (self);
g_return_if_fail (FWUPD_IS_DEVICE (self));
if (priv->status == status)
return;
priv->status = status;
g_object_notify (G_OBJECT (self), "status");
}
static void
fwupd_pad_kv_ups (GString *str, const gchar *key, FwupdUpdateState value)
@ -1991,6 +2039,7 @@ fwupd_device_to_json (FwupdDevice *device, JsonBuilder *builder)
fwupd_device_json_add_int (builder, FWUPD_RESULT_KEY_CREATED, priv->created);
fwupd_device_json_add_int (builder, FWUPD_RESULT_KEY_MODIFIED, priv->modified);
fwupd_device_json_add_int (builder, FWUPD_RESULT_KEY_UPDATE_STATE, priv->update_state);
fwupd_device_json_add_int (builder, FWUPD_RESULT_KEY_STATUS, priv->status);
fwupd_device_json_add_string (builder, FWUPD_RESULT_KEY_UPDATE_ERROR, priv->update_error);
fwupd_device_json_add_string (builder, FWUPD_RESULT_KEY_UPDATE_MESSAGE, priv->update_message);
if (priv->releases->len > 0) {
@ -2042,6 +2091,10 @@ fwupd_device_to_string (FwupdDevice *device)
str = g_string_append (str, "Unknown Device\n");
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_DEVICE_ID, priv->id);
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_PARENT_DEVICE_ID, priv->parent_id);
if (priv->status != FWUPD_STATUS_UNKNOWN) {
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_STATUS,
fwupd_status_to_string (priv->status));
}
if (priv->guids->len > 0) {
g_autoptr(GHashTable) ids = NULL;
ids = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
@ -2142,6 +2195,9 @@ fwupd_device_get_property (GObject *object, guint prop_id,
case PROP_PROTOCOL:
g_value_set_string (value, priv->protocol);
break;
case PROP_STATUS:
g_value_set_uint (value, priv->status);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -2163,6 +2219,9 @@ fwupd_device_set_property (GObject *object, guint prop_id,
case PROP_PROTOCOL:
fwupd_device_set_protocol (self, g_value_get_string (value));
break;
case PROP_STATUS:
fwupd_device_set_status (self, g_value_get_uint (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -2199,6 +2258,14 @@ fwupd_device_class_init (FwupdDeviceClass *klass)
G_PARAM_READWRITE |
G_PARAM_STATIC_NAME);
g_object_class_install_property (object_class, PROP_PROTOCOL, pspec);
pspec = g_param_spec_uint ("status", NULL, NULL,
FWUPD_STATUS_UNKNOWN,
FWUPD_STATUS_LAST,
FWUPD_STATUS_UNKNOWN,
G_PARAM_READWRITE |
G_PARAM_STATIC_NAME);
g_object_class_install_property (object_class, PROP_STATUS, pspec);
}
static void

View File

@ -135,6 +135,9 @@ void fwupd_device_set_update_error (FwupdDevice *device,
const gchar *fwupd_device_get_update_message (FwupdDevice *device);
void fwupd_device_set_update_message (FwupdDevice *device,
const gchar *update_message);
FwupdStatus fwupd_device_get_status (FwupdDevice *self);
void fwupd_device_set_status (FwupdDevice *self,
FwupdStatus status);
void fwupd_device_add_release (FwupdDevice *device,
FwupdRelease *release);
GPtrArray *fwupd_device_get_releases (FwupdDevice *device);

View File

@ -41,6 +41,7 @@ G_BEGIN_DECLS
#define FWUPD_RESULT_KEY_REMOTE_ID "RemoteId" /* s */
#define FWUPD_RESULT_KEY_SERIAL "Serial" /* s */
#define FWUPD_RESULT_KEY_SIZE "Size" /* t */
#define FWUPD_RESULT_KEY_STATUS "Status" /* u */
#define FWUPD_RESULT_KEY_SUMMARY "Summary" /* s */
#define FWUPD_RESULT_KEY_TRUST_FLAGS "TrustFlags" /* t */
#define FWUPD_RESULT_KEY_UPDATE_MESSAGE "UpdateMessage" /* s */

View File

@ -424,8 +424,10 @@ LIBFWUPD_1.3.7 {
LIBFWUPD_1.4.0 {
global:
fwupd_device_get_status;
fwupd_device_get_version_bootloader_raw;
fwupd_device_get_version_lowest_raw;
fwupd_device_set_status;
fwupd_device_set_version_bootloader_raw;
fwupd_device_set_version_lowest_raw;
fwupd_release_get_created;

View File

@ -45,7 +45,6 @@ typedef struct {
GRWLock parent_guids_mutex;
GPtrArray *children;
guint remove_delay; /* ms */
FwupdStatus status;
guint progress;
guint order;
guint priority;
@ -69,7 +68,6 @@ typedef struct {
enum {
PROP_0,
PROP_STATUS,
PROP_PROGRESS,
PROP_PHYSICAL_ID,
PROP_LOGICAL_ID,
@ -88,9 +86,6 @@ fu_device_get_property (GObject *object, guint prop_id,
FuDevice *self = FU_DEVICE (object);
FuDevicePrivate *priv = GET_PRIVATE (self);
switch (prop_id) {
case PROP_STATUS:
g_value_set_uint (value, priv->status);
break;
case PROP_PROGRESS:
g_value_set_uint (value, priv->progress);
break;
@ -118,9 +113,6 @@ fu_device_set_property (GObject *object, guint prop_id,
{
FuDevice *self = FU_DEVICE (object);
switch (prop_id) {
case PROP_STATUS:
fu_device_set_status (self, g_value_get_uint (value));
break;
case PROP_PROGRESS:
fu_device_set_progress (self, g_value_get_uint (value));
break;
@ -2027,9 +2019,8 @@ fu_device_set_remove_delay (FuDevice *self, guint remove_delay)
FwupdStatus
fu_device_get_status (FuDevice *self)
{
FuDevicePrivate *priv = GET_PRIVATE (self);
g_return_val_if_fail (FU_IS_DEVICE (self), 0);
return priv->status;
return fwupd_device_get_status (FWUPD_DEVICE (self));
}
/**
@ -2044,12 +2035,8 @@ fu_device_get_status (FuDevice *self)
void
fu_device_set_status (FuDevice *self, FwupdStatus status)
{
FuDevicePrivate *priv = GET_PRIVATE (self);
g_return_if_fail (FU_IS_DEVICE (self));
if (priv->status == status)
return;
priv->status = status;
g_object_notify (G_OBJECT (self), "status");
fwupd_device_set_status (FWUPD_DEVICE (self), status);
}
/**
@ -2946,14 +2933,6 @@ fu_device_class_init (FuDeviceClass *klass)
object_class->get_property = fu_device_get_property;
object_class->set_property = fu_device_set_property;
pspec = g_param_spec_uint ("status", NULL, NULL,
FWUPD_STATUS_UNKNOWN,
FWUPD_STATUS_LAST,
FWUPD_STATUS_UNKNOWN,
G_PARAM_READWRITE |
G_PARAM_STATIC_NAME);
g_object_class_install_property (object_class, PROP_STATUS, pspec);
pspec = g_param_spec_string ("physical-id", NULL, NULL, NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_NAME);
@ -2988,7 +2967,6 @@ static void
fu_device_init (FuDevice *self)
{
FuDevicePrivate *priv = GET_PRIVATE (self);
priv->status = FWUPD_STATUS_IDLE;
priv->children = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
priv->parent_guids = g_ptr_array_new_with_free_func (g_free);
priv->possible_plugins = g_ptr_array_new_with_free_func (g_free);