diff --git a/libfwupdplugin/fu-firmware.c b/libfwupdplugin/fu-firmware.c index 6f4bbe625..f8c0979f5 100644 --- a/libfwupdplugin/fu-firmware.c +++ b/libfwupdplugin/fu-firmware.c @@ -24,6 +24,7 @@ typedef struct { FuFirmwareFlags flags; GPtrArray *images; /* FuFirmwareImage */ gchar *version; + guint64 version_raw; } FuFirmwarePrivate; G_DEFINE_TYPE_WITH_PRIVATE (FuFirmware, fu_firmware, G_TYPE_OBJECT) @@ -157,6 +158,45 @@ fu_firmware_set_version (FuFirmware *self, const gchar *version) priv->version = g_strdup (version); } +/** + * fu_firmware_get_version_raw: + * @self: A #FuFirmware + * + * Gets an raw version that represents the firmware. This is most frequently + * used when building firmware with `0x123456` in a + * `firmware.builder.xml` file to avoid string splitting and sanity checks. + * + * Returns: an integer, or %G_MAXUINT64 for invalid + * + * Since: 1.5.7 + **/ +guint64 +fu_firmware_get_version_raw (FuFirmware *self) +{ + FuFirmwarePrivate *priv = GET_PRIVATE (self); + g_return_val_if_fail (FU_IS_FIRMWARE (self), G_MAXUINT64); + return priv->version_raw; +} + +/** + * fu_firmware_set_version_raw: + * @self: A #FuFirmware + * @version: A raw version, or %G_MAXUINT64 for invalid + * + * Sets an raw version that represents the firmware. + * + * This is optional, and is typically only used for debugging. + * + * Since: 1.5.7 + **/ +void +fu_firmware_set_version_raw (FuFirmware *self, guint64 version_raw) +{ + FuFirmwarePrivate *priv = GET_PRIVATE (self); + g_return_if_fail (FU_IS_FIRMWARE (self)); + priv->version_raw = version_raw; +} + /** * fu_firmware_tokenize: * @self: A #FuFirmware @@ -316,6 +356,7 @@ fu_firmware_build (FuFirmware *self, XbNode *n, GError **error) { FuFirmwareClass *klass = FU_FIRMWARE_GET_CLASS (self); const gchar *tmp; + guint64 version_raw; g_autoptr(GPtrArray) xb_images = NULL; g_return_val_if_fail (FU_IS_FIRMWARE (self), FALSE); @@ -326,6 +367,9 @@ fu_firmware_build (FuFirmware *self, XbNode *n, GError **error) tmp = xb_node_query_text (n, "version", NULL); if (tmp != NULL) fu_firmware_set_version (self, tmp); + version_raw = xb_node_query_text_as_uint (n, "version_raw", NULL); + if (version_raw != G_MAXUINT64) + fu_firmware_set_version_raw (self, version_raw); /* parse images */ xb_images = xb_node_query (n, "image", 0, NULL); @@ -847,6 +891,8 @@ fu_firmware_to_string (FuFirmware *self) } if (priv->version != NULL) fu_common_string_append_kv (str, 0, "Version", priv->version); + if (priv->version_raw != 0x0) + fu_common_string_append_kx (str, 0, "VersionRaw", priv->version_raw); /* vfunc */ if (klass->to_string != NULL) diff --git a/libfwupdplugin/fu-firmware.h b/libfwupdplugin/fu-firmware.h index d2224d31b..4bf02c4ba 100644 --- a/libfwupdplugin/fu-firmware.h +++ b/libfwupdplugin/fu-firmware.h @@ -73,6 +73,9 @@ gchar *fu_firmware_to_string (FuFirmware *self); const gchar *fu_firmware_get_version (FuFirmware *self); void fu_firmware_set_version (FuFirmware *self, const gchar *version); +guint64 fu_firmware_get_version_raw (FuFirmware *self); +void fu_firmware_set_version_raw (FuFirmware *self, + guint64 version_raw); void fu_firmware_add_flag (FuFirmware *firmware, FuFirmwareFlags flag); gboolean fu_firmware_has_flag (FuFirmware *firmware, diff --git a/libfwupdplugin/fu-smbios.c b/libfwupdplugin/fu-smbios.c index 359abbc56..576a2c3b2 100644 --- a/libfwupdplugin/fu-smbios.c +++ b/libfwupdplugin/fu-smbios.c @@ -288,6 +288,9 @@ fu_smbios_parse_ep32 (FuSmbios *self, const gchar *buf, gsize sz, GError **error ep->smbios_major_ver, ep->smbios_minor_ver); fu_firmware_set_version (FU_FIRMWARE (self), version_str); + fu_firmware_set_version_raw (FU_FIRMWARE (self), + (((guint16) ep->smbios_major_ver) << 8) + + ep->smbios_minor_ver); return TRUE; } diff --git a/libfwupdplugin/fwupdplugin.map b/libfwupdplugin/fwupdplugin.map index bef200512..b8dd39dd9 100644 --- a/libfwupdplugin/fwupdplugin.map +++ b/libfwupdplugin/fwupdplugin.map @@ -759,3 +759,10 @@ LIBFWUPDPLUGIN_1.5.6 { fu_plugin_runner_backend_device_changed; local: *; } LIBFWUPDPLUGIN_1.5.5; + +LIBFWUPDPLUGIN_1.5.7 { + global: + fu_firmware_get_version_raw; + fu_firmware_set_version_raw; + local: *; +} LIBFWUPDPLUGIN_1.5.6; diff --git a/plugins/ccgx/fu-ccgx-dmc-firmware.c b/plugins/ccgx/fu-ccgx-dmc-firmware.c index 22a3d8b99..059d4e1a3 100644 --- a/plugins/ccgx/fu-ccgx-dmc-firmware.c +++ b/plugins/ccgx/fu-ccgx-dmc-firmware.c @@ -298,6 +298,7 @@ fu_ccgx_dmc_firmware_parse (FuFirmware *firmware, ver = fu_common_version_from_uint32 (self->fwct_info.composite_version, FWUPD_VERSION_FORMAT_QUAD); fu_firmware_set_version (firmware, ver); + fu_firmware_set_version_raw (firmware, self->fwct_info.composite_version); } /* read fwct data */ diff --git a/plugins/ccgx/fu-ccgx-firmware.c b/plugins/ccgx/fu-ccgx-firmware.c index 96ed713d4..bd8340bba 100644 --- a/plugins/ccgx/fu-ccgx-firmware.c +++ b/plugins/ccgx/fu-ccgx-firmware.c @@ -249,6 +249,7 @@ fu_ccgx_firmware_parse_md_block (FuCcgxFirmware *self, FuFirmwareImage *img, GEr self->app_type = version & 0xffff; version_str = fu_ccgx_version_to_string (version); fu_firmware_set_version (FU_FIRMWARE (self), version_str); + fu_firmware_set_version_raw (FU_FIRMWARE (self), version); } /* work out the FWMode */ diff --git a/plugins/ebitdo/fu-ebitdo-firmware.c b/plugins/ebitdo/fu-ebitdo-firmware.c index 1a0286a40..5f0feb13c 100644 --- a/plugins/ebitdo/fu-ebitdo-firmware.c +++ b/plugins/ebitdo/fu-ebitdo-firmware.c @@ -76,6 +76,7 @@ fu_ebitdo_firmware_parse (FuFirmware *firmware, /* parse version */ version = g_strdup_printf ("%.2f", GUINT32_FROM_LE(hdr->version) / 100.f); fu_firmware_set_version (firmware, version); + fu_firmware_set_version_raw (firmware, GUINT32_FROM_LE(hdr->version)); /* add header */ fw_hdr = fu_common_bytes_new_offset (fw, 0x0, diff --git a/plugins/vli/fu-vli-pd-firmware.c b/plugins/vli/fu-vli-pd-firmware.c index 36a327e55..209912464 100644 --- a/plugins/vli/fu-vli-pd-firmware.c +++ b/plugins/vli/fu-vli-pd-firmware.c @@ -119,6 +119,7 @@ fu_vli_pd_firmware_parse (FuFirmware *firmware, } fwver_str = fu_common_version_from_uint32 (fwver, FWUPD_VERSION_FORMAT_QUAD); fu_firmware_set_version (firmware, fwver_str); + fu_firmware_set_version_raw (firmware, fwver); /* check size */ if (bufsz != fu_vli_common_device_kind_get_size (self->device_kind)) { diff --git a/plugins/vli/fu-vli-usbhub-firmware.c b/plugins/vli/fu-vli-usbhub-firmware.c index e6cdf0bd2..6cb9d701e 100644 --- a/plugins/vli/fu-vli-usbhub-firmware.c +++ b/plugins/vli/fu-vli-usbhub-firmware.c @@ -115,6 +115,7 @@ fu_vli_usbhub_firmware_parse (FuFirmware *firmware, g_autofree gchar *version_str = NULL; version_str = fu_common_version_from_uint16 (version, FWUPD_VERSION_FORMAT_BCD); fu_firmware_set_version (firmware, version_str); + fu_firmware_set_version_raw (firmware, version); } /* get device type from firmware image */