From a1882f8c4b131be78291a5d4d0f4e54c2ec66f7e Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Thu, 26 Mar 2020 19:36:36 +0000 Subject: [PATCH] Add fu_device_locker_close() This allows us to manually close the locker, allowing proper error handling. --- libfwupdplugin/fu-device-locker.c | 26 ++++++++++++++++++++++++++ libfwupdplugin/fu-device-locker.h | 2 ++ libfwupdplugin/fwupdplugin.map | 1 + 3 files changed, 29 insertions(+) diff --git a/libfwupdplugin/fu-device-locker.c b/libfwupdplugin/fu-device-locker.c index 5e54dec7a..75decb363 100644 --- a/libfwupdplugin/fu-device-locker.c +++ b/libfwupdplugin/fu-device-locker.c @@ -63,6 +63,32 @@ fu_device_locker_init (FuDeviceLocker *self) { } +/** + * fu_device_locker_close: + * @self: A #FuDeviceLocker + * @error: A #GError, or %NULL + * + * Closes the locker before it gets cleaned up. + * + * This function can be used to manually close a device managed by a locker, + * and allows the caller to properly handle the error. + * + * Returns: %TRUE for success + * + * Since: 1.4.0 + **/ +gboolean +fu_device_locker_close (FuDeviceLocker *self, GError **error) +{ + g_return_val_if_fail (FU_IS_DEVICE_LOCKER (self), NULL); + if (!self->device_open) + return TRUE; + if (!self->close_func (self->device, error)) + return FALSE; + self->device_open = FALSE; + return TRUE; +} + /** * fu_device_locker_new: * @device: A #GObject diff --git a/libfwupdplugin/fu-device-locker.h b/libfwupdplugin/fu-device-locker.h index f0504fd91..182511834 100644 --- a/libfwupdplugin/fu-device-locker.h +++ b/libfwupdplugin/fu-device-locker.h @@ -21,3 +21,5 @@ FuDeviceLocker *fu_device_locker_new_full (gpointer device, FuDeviceLockerFunc open_func, FuDeviceLockerFunc close_func, GError **error); +gboolean fu_device_locker_close (FuDeviceLocker *self, + GError **error); diff --git a/libfwupdplugin/fwupdplugin.map b/libfwupdplugin/fwupdplugin.map index c07c419e2..6bee6b89e 100644 --- a/libfwupdplugin/fwupdplugin.map +++ b/libfwupdplugin/fwupdplugin.map @@ -547,6 +547,7 @@ LIBFWUPDPLUGIN_1.4.0 { fu_cabinet_set_jcat_context; fu_cabinet_set_size_max; fu_device_get_root; + fu_device_locker_close; fu_device_set_version_bootloader; fu_device_set_version_format; fu_device_set_version_lowest;