summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2023-02-01 10:10:17 +0000
committerRichard Hughes <richard@hughsie.com>2023-02-01 13:14:30 +0000
commit1c864690b40cc686f1c948d0a5b388e0e0f785be (patch)
treefadbe887964e958f6012e788f3e96fd37244f0c7
parent2930df1e0f1bf97d7c8e6633cd8b2031c21d2fd2 (diff)
downloadgusb-1c864690b40cc686f1c948d0a5b388e0e0f785be.tar.gz
Add g_usb_device_get_created() to better detect emulated replug
-rw-r--r--gusb/gusb-device.c37
-rw-r--r--gusb/gusb-device.h2
-rw-r--r--gusb/libgusb.ver6
3 files changed, 45 insertions, 0 deletions
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);
@@ -451,6 +467,27 @@ _g_usb_device_save(GUsbDevice *self, JsonBuilder *json_builder, GError **error)
}
/**
+ * 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;