mirror of
https://git.proxmox.com/git/fwupd
synced 2025-05-24 04:48:51 +00:00
Connect the progress and status callbacks on the new FuDevice on replug
This ensures we get progress events when replugging a device. Also, remove the callbacks on the 'old' device to avoid causing multiple events on a 2nd-replug.
This commit is contained in:
parent
9934fb514c
commit
fbcebe096b
@ -161,6 +161,26 @@ fu_device_list_find_by_device (FuDeviceList *self, FuDevice *device)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fu_device_list_get_old:
|
||||||
|
* @self: A #FuDeviceList
|
||||||
|
* @device: A #FuDevice
|
||||||
|
*
|
||||||
|
* Returns the old device associated with the currently active device.
|
||||||
|
*
|
||||||
|
* Returns: (transfer none): the device, or %NULL if not found
|
||||||
|
*
|
||||||
|
* Since: 1.0.3
|
||||||
|
**/
|
||||||
|
FuDevice *
|
||||||
|
fu_device_list_get_old (FuDeviceList *self, FuDevice *device)
|
||||||
|
{
|
||||||
|
FuDeviceItem *item = fu_device_list_find_by_device (self, device);
|
||||||
|
if (item == NULL)
|
||||||
|
return NULL;
|
||||||
|
return item->device_old;
|
||||||
|
}
|
||||||
|
|
||||||
static FuDeviceItem *
|
static FuDeviceItem *
|
||||||
fu_device_list_find_by_guids (FuDeviceList *self, GPtrArray *guids)
|
fu_device_list_find_by_guids (FuDeviceList *self, GPtrArray *guids)
|
||||||
{
|
{
|
||||||
|
@ -38,6 +38,8 @@ void fu_device_list_remove (FuDeviceList *self,
|
|||||||
FuDevice *device);
|
FuDevice *device);
|
||||||
GPtrArray *fu_device_list_get_all (FuDeviceList *self);
|
GPtrArray *fu_device_list_get_all (FuDeviceList *self);
|
||||||
GPtrArray *fu_device_list_get_active (FuDeviceList *self);
|
GPtrArray *fu_device_list_get_active (FuDeviceList *self);
|
||||||
|
FuDevice *fu_device_list_get_old (FuDeviceList *self,
|
||||||
|
FuDevice *device);
|
||||||
FuDevice *fu_device_list_find_by_id (FuDeviceList *self,
|
FuDevice *fu_device_list_find_by_id (FuDeviceList *self,
|
||||||
const gchar *device_id,
|
const gchar *device_id,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
@ -176,12 +176,27 @@ fu_engine_status_notify_cb (FuDevice *device, GParamSpec *pspec, FuEngine *self)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fu_engine_device_added_cb (FuDeviceList *device_list, FuDevice *device, FuEngine *self)
|
fu_engine_watch_device (FuEngine *self, FuDevice *device)
|
||||||
{
|
{
|
||||||
|
FuDevice *device_old = fu_device_list_get_old (self->device_list, device);
|
||||||
|
if (device_old != NULL) {
|
||||||
|
g_signal_handlers_disconnect_by_func (device_old,
|
||||||
|
fu_engine_progress_notify_cb,
|
||||||
|
self);
|
||||||
|
g_signal_handlers_disconnect_by_func (device_old,
|
||||||
|
fu_engine_status_notify_cb,
|
||||||
|
self);
|
||||||
|
}
|
||||||
g_signal_connect (device, "notify::progress",
|
g_signal_connect (device, "notify::progress",
|
||||||
G_CALLBACK (fu_engine_progress_notify_cb), self);
|
G_CALLBACK (fu_engine_progress_notify_cb), self);
|
||||||
g_signal_connect (device, "notify::status",
|
g_signal_connect (device, "notify::status",
|
||||||
G_CALLBACK (fu_engine_status_notify_cb), self);
|
G_CALLBACK (fu_engine_status_notify_cb), self);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fu_engine_device_added_cb (FuDeviceList *device_list, FuDevice *device, FuEngine *self)
|
||||||
|
{
|
||||||
|
fu_engine_watch_device (self, device);
|
||||||
g_signal_emit (self, signals[SIGNAL_DEVICE_ADDED], 0, device);
|
g_signal_emit (self, signals[SIGNAL_DEVICE_ADDED], 0, device);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,6 +210,7 @@ fu_engine_device_removed_cb (FuDeviceList *device_list, FuDevice *device, FuEngi
|
|||||||
static void
|
static void
|
||||||
fu_engine_device_changed_cb (FuDeviceList *device_list, FuDevice *device, FuEngine *self)
|
fu_engine_device_changed_cb (FuDeviceList *device_list, FuDevice *device, FuEngine *self)
|
||||||
{
|
{
|
||||||
|
fu_engine_watch_device (self, device);
|
||||||
fu_engine_emit_device_changed (self, device);
|
fu_engine_emit_device_changed (self, device);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -422,6 +422,10 @@ fu_device_list_compatible_func (void)
|
|||||||
device = g_ptr_array_index (devices_all, 1);
|
device = g_ptr_array_index (devices_all, 1);
|
||||||
g_assert_cmpstr (fu_device_get_id (device), ==,
|
g_assert_cmpstr (fu_device_get_id (device), ==,
|
||||||
"99249eb1bd9ef0b6e192b271a8cb6a3090cfec7a");
|
"99249eb1bd9ef0b6e192b271a8cb6a3090cfec7a");
|
||||||
|
|
||||||
|
/* verify we can get the old device from the new device */
|
||||||
|
device = fu_device_list_get_old (device_list, device2);
|
||||||
|
g_assert (device == device1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
Reference in New Issue
Block a user