diff --git a/libdfu/dfu-device.c b/libdfu/dfu-device.c index 4cba76a1e..91b717371 100644 --- a/libdfu/dfu-device.c +++ b/libdfu/dfu-device.c @@ -59,6 +59,7 @@ typedef struct { gboolean done_upload_or_download; gboolean claimed_interface; gchar *display_name; + gchar *serial_number; gchar *platform_id; guint16 version; guint16 runtime_pid; @@ -235,6 +236,7 @@ dfu_device_finalize (GObject *object) g_usb_device_close (priv->dev, NULL); g_free (priv->display_name); + g_free (priv->serial_number); g_free (priv->platform_id); g_ptr_array_unref (priv->targets); @@ -869,6 +871,24 @@ dfu_device_get_display_name (DfuDevice *device) return priv->display_name; } +/** + * dfu_device_get_serial_number: + * @device: a #DfuDevice + * + * Gets the serial number for the device. + * + * Return value: string or %NULL for unset + * + * Since: 0.7.3 + **/ +const gchar * +dfu_device_get_serial_number (DfuDevice *device) +{ + DfuDevicePrivate *priv = GET_PRIVATE (device); + g_return_val_if_fail (DFU_IS_DEVICE (device), NULL); + return priv->serial_number; +} + static void dfu_device_set_state (DfuDevice *device, DfuState state) { @@ -1314,6 +1334,11 @@ dfu_device_open (DfuDevice *device, DfuDeviceOpenFlags flags, if (idx != 0x00) priv->display_name = g_usb_device_get_string_descriptor (priv->dev, idx, NULL); + /* get serial number if it exists */ + idx = g_usb_device_get_serial_number_index (priv->dev); + if (idx != 0x00) + priv->serial_number = g_usb_device_get_string_descriptor (priv->dev, idx, NULL); + /* the device has no DFU runtime, so cheat */ if (priv->quirks & DFU_DEVICE_QUIRK_NO_DFU_RUNTIME) { priv->state = DFU_STATE_APP_IDLE; diff --git a/libdfu/dfu-device.h b/libdfu/dfu-device.h index c79b8cf07..4d8fa973d 100644 --- a/libdfu/dfu-device.h +++ b/libdfu/dfu-device.h @@ -139,6 +139,7 @@ DfuTarget *dfu_device_get_target_by_alt_name (DfuDevice *device, const gchar *alt_name, GError **error); const gchar *dfu_device_get_display_name (DfuDevice *device); +const gchar *dfu_device_get_serial_number (DfuDevice *device); guint16 dfu_device_get_runtime_vid (DfuDevice *device); guint16 dfu_device_get_runtime_pid (DfuDevice *device); guint16 dfu_device_get_runtime_release (DfuDevice *device); diff --git a/libdfu/dfu-tool.c b/libdfu/dfu-tool.c index 7ff22988f..e1ddd00a2 100644 --- a/libdfu/dfu-tool.c +++ b/libdfu/dfu-tool.c @@ -1863,6 +1863,12 @@ dfu_tool_list (DfuToolPrivate *priv, gchar **values, GError **error) dfu_tool_print_indent (_("Name"), tmp, 1); } + tmp = dfu_device_get_serial_number (device); + if (tmp != NULL) { + /* TRANSLATORS: serial number, e.g. '00012345' */ + dfu_tool_print_indent (_("Serial"), tmp, 1); + } + tmp = dfu_mode_to_string (dfu_device_get_mode (device)); /* TRANSLATORS: device mode, e.g. runtime or DFU */ dfu_tool_print_indent (_("Mode"), tmp, 1);