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:
Richard Hughes 2017-12-11 16:37:19 +00:00
parent 9934fb514c
commit fbcebe096b
4 changed files with 43 additions and 1 deletions

View File

@ -161,6 +161,26 @@ fu_device_list_find_by_device (FuDeviceList *self, FuDevice *device)
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 *
fu_device_list_find_by_guids (FuDeviceList *self, GPtrArray *guids)
{

View File

@ -38,6 +38,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);
FuDevice *fu_device_list_get_old (FuDeviceList *self,
FuDevice *device);
FuDevice *fu_device_list_find_by_id (FuDeviceList *self,
const gchar *device_id,
GError **error);

View File

@ -176,12 +176,27 @@ fu_engine_status_notify_cb (FuDevice *device, GParamSpec *pspec, FuEngine *self)
}
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_CALLBACK (fu_engine_progress_notify_cb), self);
g_signal_connect (device, "notify::status",
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);
}
@ -195,6 +210,7 @@ fu_engine_device_removed_cb (FuDeviceList *device_list, FuDevice *device, FuEngi
static void
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);
}

View File

@ -422,6 +422,10 @@ fu_device_list_compatible_func (void)
device = g_ptr_array_index (devices_all, 1);
g_assert_cmpstr (fu_device_get_id (device), ==,
"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