From 1c864690b40cc686f1c948d0a5b388e0e0f785be Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Wed, 1 Feb 2023 10:10:17 +0000 Subject: Add g_usb_device_get_created() to better detect emulated replug --- gusb/gusb-device.c | 37 +++++++++++++++++++++++++++++++++++++ gusb/gusb-device.h | 2 ++ gusb/libgusb.ver | 6 ++++++ 3 files changed, 45 insertions(+) diff --git a/gusb/gusb-device.c b/gusb/gusb-device.c index b94409c..817c5f2 100644 --- a/gusb/gusb-device.c +++ b/gusb/gusb-device.c @@ -239,6 +239,22 @@ _g_usb_device_load(GUsbDevice *self, JsonObject *json_object, GError **error) g_free(priv->platform_id); priv->platform_id = g_strdup(tmp); } + tmp = json_object_get_string_member_with_default(json_object, "Created", NULL); + if (tmp != NULL) { + g_autoptr(GDateTime) created_new = g_date_time_new_from_iso8601(tmp, NULL); + if (created_new == NULL) { + g_set_error(error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Cannot parse ISO8601 date: %s", + tmp); + return FALSE; + } + if (!g_date_time_equal(priv->created, created_new)) { + g_date_time_unref(priv->created); + priv->created = g_steal_pointer(&created_new); + } + } priv->desc.idVendor = json_object_get_int_member_with_default(json_object, "IdVendor", 0x0); priv->desc.idProduct = json_object_get_int_member_with_default(json_object, "IdProduct", 0x0); @@ -450,6 +466,27 @@ _g_usb_device_save(GUsbDevice *self, JsonBuilder *json_builder, GError **error) return TRUE; } +/** + * g_usb_device_get_created: + * @self: a #GUsbDevice + * + * Gets the date and time that the #GUsbDevice was created. + * + * This can be used as an indicator if the device replugged, as the vendor and product IDs may not + * change for some devices. Use `g_date_time_equal()` to verify equality. + * + * Returns: (transfer none): a #GDateTime + * + * Since: 0.4.5 + **/ +GDateTime * +g_usb_device_get_created(GUsbDevice *self) +{ + GUsbDevicePrivate *priv = GET_PRIVATE(self); + g_return_val_if_fail(G_USB_IS_DEVICE(self), NULL); + return priv->created; +} + /** * g_usb_device_get_tags: * @self: a #GUsbDevice diff --git a/gusb/gusb-device.h b/gusb/gusb-device.h index 7d034a1..32df1b2 100644 --- a/gusb/gusb-device.h +++ b/gusb/gusb-device.h @@ -141,6 +141,8 @@ const gchar * g_usb_device_get_platform_id(GUsbDevice *self); gboolean g_usb_device_is_emulated(GUsbDevice *self); +GDateTime * +g_usb_device_get_created(GUsbDevice *self); GUsbDevice * g_usb_device_get_parent(GUsbDevice *self); GPtrArray * diff --git a/gusb/libgusb.ver b/gusb/libgusb.ver index 2e85f0b..50165b1 100644 --- a/gusb/libgusb.ver +++ b/gusb/libgusb.ver @@ -208,3 +208,9 @@ LIBGUSB_0.4.4 { g_usb_device_remove_tag; local: *; } LIBGUSB_0.4.3; + +LIBGUSB_0.4.5 { + global: + g_usb_device_get_created; + local: *; +} LIBGUSB_0.4.4; -- cgit v1.2.1