Add fu_firmware_set_version_raw()

A few plugins need this now, so move it into the base class.
This commit is contained in:
Richard Hughes 2021-02-15 10:54:37 +00:00
parent a862473928
commit 86c6c2d4a3
9 changed files with 64 additions and 0 deletions

View File

@ -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 `<version_raw>0x123456</version_raw>` 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)

View File

@ -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,

View File

@ -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;
}

View File

@ -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;

View File

@ -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 */

View File

@ -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 */

View File

@ -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,

View File

@ -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)) {

View File

@ -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 */