From a5397c6836fe4bd88bdf45fd201af84d056d9a09 Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Thu, 25 Aug 2022 14:50:40 +0100 Subject: [PATCH] Add a new vfunc to check if two firmwares are compatible For future use. --- libfwupdplugin/fu-firmware.c | 31 +++++++++++++++++++++++++++++++ libfwupdplugin/fu-firmware.h | 11 ++++++++++- libfwupdplugin/fwupdplugin.map | 1 + 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/libfwupdplugin/fu-firmware.c b/libfwupdplugin/fu-firmware.c index 323da9a2e..fd901425e 100644 --- a/libfwupdplugin/fu-firmware.c +++ b/libfwupdplugin/fu-firmware.c @@ -772,6 +772,37 @@ fu_firmware_tokenize(FuFirmware *self, GBytes *fw, FwupdInstallFlags flags, GErr return TRUE; } +/** + * fu_firmware_check_compatible: + * @self: a #FuFirmware + * @other: a #FuFirmware + * @flags: install flags, e.g. %FWUPD_INSTALL_FLAG_FORCE + * @error: (nullable): optional return location for an error + * + * Check a new firmware is compatible with the existing firmware. + * + * Returns: %TRUE for success + * + * Since: 1.8.4 + **/ +gboolean +fu_firmware_check_compatible(FuFirmware *self, + FuFirmware *other, + FwupdInstallFlags flags, + GError **error) +{ + FuFirmwareClass *klass = FU_FIRMWARE_GET_CLASS(self); + + g_return_val_if_fail(FU_IS_FIRMWARE(self), FALSE); + g_return_val_if_fail(FU_IS_FIRMWARE(other), FALSE); + g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + + /* optionally subclassed */ + if (klass->check_compatible == NULL) + return TRUE; + return klass->check_compatible(self, other, flags, error); +} + static gboolean fu_firmware_check_magic_for_offset(FuFirmware *self, GBytes *fw, diff --git a/libfwupdplugin/fu-firmware.h b/libfwupdplugin/fu-firmware.h index 9263c0f1f..33c9644ac 100644 --- a/libfwupdplugin/fu-firmware.h +++ b/libfwupdplugin/fu-firmware.h @@ -63,8 +63,12 @@ struct _FuFirmwareClass { GChecksumType csum_kind, GError **error)G_GNUC_WARN_UNUSED_RESULT; gboolean (*check_magic)(FuFirmware *self, GBytes *fw, gsize offset, GError **error); + gboolean (*check_compatible)(FuFirmware *self, + FuFirmware *other, + FwupdInstallFlags flags, + GError **error); /*< private >*/ - gpointer padding[25]; + gpointer padding[24]; }; /** @@ -292,6 +296,11 @@ gboolean fu_firmware_write_file(FuFirmware *self, GFile *file, GError **error) G_GNUC_WARN_UNUSED_RESULT; gchar * fu_firmware_get_checksum(FuFirmware *self, GChecksumType csum_kind, GError **error); +gboolean +fu_firmware_check_compatible(FuFirmware *self, + FuFirmware *other, + FwupdInstallFlags flags, + GError **error); void fu_firmware_add_image(FuFirmware *self, FuFirmware *img); diff --git a/libfwupdplugin/fwupdplugin.map b/libfwupdplugin/fwupdplugin.map index 6c9b30592..0b68056ee 100644 --- a/libfwupdplugin/fwupdplugin.map +++ b/libfwupdplugin/fwupdplugin.map @@ -1086,6 +1086,7 @@ LIBFWUPDPLUGIN_1.8.4 { fu_context_get_bios_settings; fu_context_reload_bios_settings; fu_device_security_attr_new; + fu_firmware_check_compatible; fu_plugin_add_string; fu_plugin_security_attr_new; fu_plugin_to_string;