diff --git a/src/fu-device-list.c b/src/fu-device-list.c index e13b4f146..0d5dd308a 100644 --- a/src/fu-device-list.c +++ b/src/fu-device-list.c @@ -131,6 +131,32 @@ fu_device_list_get_active (FuDeviceList *self) return devices; } +/** + * fu_device_list_get_by_platform_id: + * @self: A #FuDeviceList + * + * Returns all the active devices that have been added to the device list + * that match a specific platform ID. + * + * Returns: (transfer container) (element-type FuDevice): the devices + * + * Since: 1.1.2 + **/ +GPtrArray * +fu_device_list_get_by_platform_id (FuDeviceList *self, const gchar *platform_id) +{ + GPtrArray *devices; + g_return_val_if_fail (FU_IS_DEVICE_LIST (self), NULL); + devices = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); + for (guint i = 0; i < self->devices->len; i++) { + FuDeviceItem *item = g_ptr_array_index (self->devices, i); + if (g_strcmp0 (fu_device_get_platform_id (item->device), platform_id) != 0) + continue; + g_ptr_array_add (devices, g_object_ref (item->device)); + } + return devices; +} + static FuDeviceItem * fu_device_list_find_by_device (FuDeviceList *self, FuDevice *device) { diff --git a/src/fu-device-list.h b/src/fu-device-list.h index 69388cee8..04e635bcf 100644 --- a/src/fu-device-list.h +++ b/src/fu-device-list.h @@ -23,6 +23,8 @@ void fu_device_list_remove (FuDeviceList *self, FuDevice *device); GPtrArray *fu_device_list_get_all (FuDeviceList *self); GPtrArray *fu_device_list_get_active (FuDeviceList *self); +GPtrArray *fu_device_list_get_by_platform_id (FuDeviceList *self, + const gchar *platform_id); FuDevice *fu_device_list_get_old (FuDeviceList *self, FuDevice *device); FuDevice *fu_device_list_get_by_id (FuDeviceList *self, diff --git a/src/fu-engine.c b/src/fu-engine.c index 4b2dae842..b03039d58 100644 --- a/src/fu-engine.c +++ b/src/fu-engine.c @@ -3212,16 +3212,11 @@ fu_engine_usb_device_removed_cb (GUsbContext *ctx, g_autoptr(GPtrArray) devices = NULL; /* go through each device and remove any that match */ - devices = fu_device_list_get_all (self->device_list); + devices = fu_device_list_get_by_platform_id (self->device_list, + g_usb_device_get_platform_id (usb_device)); for (guint i = 0; i < devices->len; i++) { FuDevice *device = g_ptr_array_index (devices, i); - if (!FU_IS_USB_DEVICE (device)) - continue; - if (g_strcmp0 (fu_device_get_platform_id (device), - g_usb_device_get_platform_id (usb_device)) == 0) { - g_debug ("auto-removing FuUsbDevice"); - fu_device_list_remove (self->device_list, device); - } + fu_device_list_remove (self->device_list, device); } }