From f17db477eb2f8e12c3b269c142e505b2e35e4e4f Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Fri, 18 Sep 2020 14:09:45 +0100 Subject: [PATCH] Tag the FuFirmwareImage objects with the filename For containers with multiple images it is sometimes very helpful to know what file they've been loaded from. This would also allow us to 'explode' the firmware container into seporate image files on disk. --- libfwupdplugin/fu-firmware-image.c | 40 ++++++++++++++++++++++++++++++ libfwupdplugin/fu-firmware-image.h | 3 +++ libfwupdplugin/fu-self-test.c | 2 ++ libfwupdplugin/fwupdplugin.map | 2 ++ 4 files changed, 47 insertions(+) diff --git a/libfwupdplugin/fu-firmware-image.c b/libfwupdplugin/fu-firmware-image.c index 5cd6fc528..63a28df39 100644 --- a/libfwupdplugin/fu-firmware-image.c +++ b/libfwupdplugin/fu-firmware-image.c @@ -24,6 +24,7 @@ typedef struct { guint64 addr; guint64 idx; gchar *version; + gchar *filename; } FuFirmwareImagePrivate; G_DEFINE_TYPE_WITH_PRIVATE (FuFirmwareImage, fu_firmware_image, G_TYPE_OBJECT) @@ -65,6 +66,42 @@ fu_firmware_image_set_version (FuFirmwareImage *self, const gchar *version) priv->version = g_strdup (version); } +/** + * fu_firmware_image_get_filename: + * @self: A #FuFirmwareImage + * + * Gets an optional filename that represents the image source or destination. + * + * Returns: a string, or %NULL + * + * Since: 1.5.0 + **/ +const gchar * +fu_firmware_image_get_filename (FuFirmwareImage *self) +{ + FuFirmwareImagePrivate *priv = GET_PRIVATE (self); + g_return_val_if_fail (FU_IS_FIRMWARE_IMAGE (self), NULL); + return priv->filename; +} + +/** + * fu_firmware_image_set_filename: + * @self: A #FuFirmwareImage + * @filename: (nullable): A string filename, or %NULL + * + * Sets an optional filename that represents the image source or destination. + * + * Since: 1.5.0 + **/ +void +fu_firmware_image_set_filename (FuFirmwareImage *self, const gchar *filename) +{ + FuFirmwareImagePrivate *priv = GET_PRIVATE (self); + g_return_if_fail (FU_IS_FIRMWARE_IMAGE (self)); + g_free (priv->filename); + priv->filename = g_strdup (filename); +} + /** * fu_firmware_image_set_id: * @self: a #FuPlugin @@ -333,6 +370,8 @@ fu_firmware_image_add_string (FuFirmwareImage *self, guint idt, GString *str) fu_common_string_append_kx (str, idt, "Address", priv->addr); if (priv->version != NULL) fu_common_string_append_kv (str, idt, "Version", priv->version); + if (priv->filename != NULL) + fu_common_string_append_kv (str, idt, "Filename", priv->filename); if (priv->bytes != NULL) { fu_common_string_append_kx (str, idt, "Data", g_bytes_get_size (priv->bytes)); @@ -373,6 +412,7 @@ fu_firmware_image_finalize (GObject *object) FuFirmwareImagePrivate *priv = GET_PRIVATE (self); g_free (priv->id); g_free (priv->version); + g_free (priv->filename); if (priv->bytes != NULL) g_bytes_unref (priv->bytes); G_OBJECT_CLASS (fu_firmware_image_parent_class)->finalize (object); diff --git a/libfwupdplugin/fu-firmware-image.h b/libfwupdplugin/fu-firmware-image.h index 8049e422c..97be313d1 100644 --- a/libfwupdplugin/fu-firmware-image.h +++ b/libfwupdplugin/fu-firmware-image.h @@ -38,6 +38,9 @@ gchar *fu_firmware_image_to_string (FuFirmwareImage *self); const gchar *fu_firmware_image_get_version (FuFirmwareImage *self); void fu_firmware_image_set_version (FuFirmwareImage *self, const gchar *version); +const gchar *fu_firmware_image_get_filename (FuFirmwareImage *self); +void fu_firmware_image_set_filename (FuFirmwareImage *self, + const gchar *filename); const gchar *fu_firmware_image_get_id (FuFirmwareImage *self); void fu_firmware_image_set_id (FuFirmwareImage *self, const gchar *id); diff --git a/libfwupdplugin/fu-self-test.c b/libfwupdplugin/fu-self-test.c index 900142aa2..7db112b8e 100644 --- a/libfwupdplugin/fu-self-test.c +++ b/libfwupdplugin/fu-self-test.c @@ -1594,6 +1594,7 @@ fu_firmware_func (void) fu_firmware_image_set_addr (img1, 0x200); fu_firmware_image_set_idx (img1, 13); fu_firmware_image_set_id (img1, "primary"); + fu_firmware_image_set_filename (img1, "BIOS.bin"); fu_firmware_add_image (firmware, img1); fu_firmware_image_set_addr (img2, 0x400); fu_firmware_image_set_idx (img2, 23); @@ -1628,6 +1629,7 @@ fu_firmware_func (void) " ID: primary\n" " Index: 0xd\n" " Address: 0x200\n" + " Filename: BIOS.bin\n" " FuFirmwareImage:\n" " ID: secondary\n" " Index: 0x17\n" diff --git a/libfwupdplugin/fwupdplugin.map b/libfwupdplugin/fwupdplugin.map index 50d245cdc..f79829e75 100644 --- a/libfwupdplugin/fwupdplugin.map +++ b/libfwupdplugin/fwupdplugin.map @@ -621,7 +621,9 @@ LIBFWUPDPLUGIN_1.5.0 { fu_firmware_flag_from_string; fu_firmware_flag_to_string; fu_firmware_has_flag; + fu_firmware_image_get_filename; fu_firmware_image_parse; + fu_firmware_image_set_filename; fu_fmap_firmware_get_type; fu_fmap_firmware_new; fu_plugin_runner_add_security_attrs;