mirror of
https://git.proxmox.com/git/fwupd
synced 2025-08-07 23:37:53 +00:00
Fix FuCfuOffer XML roundtrip
This commit is contained in:
parent
5cf63a0741
commit
95f7d23d58
@ -12,6 +12,7 @@
|
|||||||
#include "fu-cfu-offer.h"
|
#include "fu-cfu-offer.h"
|
||||||
#include "fu-common.h"
|
#include "fu-common.h"
|
||||||
#include "fu-mem.h"
|
#include "fu-mem.h"
|
||||||
|
#include "fu-string.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FuCfuOffer:
|
* FuCfuOffer:
|
||||||
@ -495,17 +496,22 @@ fu_cfu_offer_build(FuFirmware *firmware, XbNode *n, GError **error)
|
|||||||
FuCfuOffer *self = FU_CFU_OFFER(firmware);
|
FuCfuOffer *self = FU_CFU_OFFER(firmware);
|
||||||
FuCfuOfferPrivate *priv = GET_PRIVATE(self);
|
FuCfuOfferPrivate *priv = GET_PRIVATE(self);
|
||||||
guint64 tmp;
|
guint64 tmp;
|
||||||
|
const gchar *tmpb;
|
||||||
|
|
||||||
/* optional properties */
|
/* optional properties */
|
||||||
tmp = xb_node_query_text_as_uint(n, "segment_number", NULL);
|
tmp = xb_node_query_text_as_uint(n, "segment_number", NULL);
|
||||||
if (tmp != G_MAXUINT64 && tmp <= G_MAXUINT8)
|
if (tmp != G_MAXUINT64 && tmp <= G_MAXUINT8)
|
||||||
priv->segment_number = tmp;
|
priv->segment_number = tmp;
|
||||||
tmp = xb_node_query_text_as_uint(n, "force_immediate_reset", NULL);
|
tmpb = xb_node_query_text(n, "force_immediate_reset", NULL);
|
||||||
if (tmp != G_MAXUINT64 && tmp <= G_MAXUINT8)
|
if (tmpb != NULL) {
|
||||||
priv->force_immediate_reset = tmp;
|
if (!fu_strtobool(tmpb, &priv->force_immediate_reset, error))
|
||||||
tmp = xb_node_query_text_as_uint(n, "force_ignore_version", NULL);
|
return FALSE;
|
||||||
if (tmp != G_MAXUINT64 && tmp <= G_MAXUINT8)
|
}
|
||||||
priv->force_ignore_version = tmp;
|
tmpb = xb_node_query_text(n, "force_ignore_version", NULL);
|
||||||
|
if (tmpb != NULL) {
|
||||||
|
if (!fu_strtobool(tmpb, &priv->force_ignore_version, error))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
tmp = xb_node_query_text_as_uint(n, "component_id", NULL);
|
tmp = xb_node_query_text_as_uint(n, "component_id", NULL);
|
||||||
if (tmp != G_MAXUINT64 && tmp <= G_MAXUINT8)
|
if (tmp != G_MAXUINT64 && tmp <= G_MAXUINT8)
|
||||||
priv->component_id = tmp;
|
priv->component_id = tmp;
|
||||||
|
@ -90,6 +90,51 @@ fu_strtoull(const gchar *str, guint64 *value, guint64 min, guint64 max, GError *
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fu_strtobool:
|
||||||
|
* @str: a string, e.g. `true`
|
||||||
|
* @value: (out) (nullable): parsed value
|
||||||
|
* @error: (nullable): optional return location for an error
|
||||||
|
*
|
||||||
|
* Converts a string value to a boolean. Only `true` and `false` are accepted values.
|
||||||
|
*
|
||||||
|
* Returns: %TRUE if the value was parsed correctly, or %FALSE for error
|
||||||
|
*
|
||||||
|
* Since: 1.8.2
|
||||||
|
**/
|
||||||
|
gboolean
|
||||||
|
fu_strtobool(const gchar *str, gboolean *value, GError **error)
|
||||||
|
{
|
||||||
|
/* sanity check */
|
||||||
|
if (str == NULL) {
|
||||||
|
g_set_error_literal(error,
|
||||||
|
G_IO_ERROR,
|
||||||
|
G_IO_ERROR_INVALID_DATA,
|
||||||
|
"cannot parse NULL");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* be super strict */
|
||||||
|
if (g_strcmp0(str, "true") == 0) {
|
||||||
|
if (value != NULL)
|
||||||
|
*value = TRUE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
if (g_strcmp0(str, "false") == 0) {
|
||||||
|
if (value != NULL)
|
||||||
|
*value = FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* invalid */
|
||||||
|
g_set_error(error,
|
||||||
|
G_IO_ERROR,
|
||||||
|
G_IO_ERROR_INVALID_DATA,
|
||||||
|
"cannot parse %s as boolean, expected true|false",
|
||||||
|
str);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fu_strstrip:
|
* fu_strstrip:
|
||||||
* @str: a string, e.g. ` test `
|
* @str: a string, e.g. ` test `
|
||||||
|
@ -23,6 +23,8 @@ gchar *
|
|||||||
fu_strsafe(const gchar *str, gsize maxsz);
|
fu_strsafe(const gchar *str, gsize maxsz);
|
||||||
gboolean
|
gboolean
|
||||||
fu_strtoull(const gchar *str, guint64 *value, guint64 min, guint64 max, GError **error);
|
fu_strtoull(const gchar *str, guint64 *value, guint64 min, guint64 max, GError **error);
|
||||||
|
gboolean
|
||||||
|
fu_strtobool(const gchar *str, gboolean *value, GError **error);
|
||||||
gchar *
|
gchar *
|
||||||
fu_strstrip(const gchar *str);
|
fu_strstrip(const gchar *str);
|
||||||
gsize
|
gsize
|
||||||
|
@ -1002,6 +1002,7 @@ LIBFWUPDPLUGIN_1.8.2 {
|
|||||||
fu_strsplit;
|
fu_strsplit;
|
||||||
fu_strsplit_full;
|
fu_strsplit_full;
|
||||||
fu_strstrip;
|
fu_strstrip;
|
||||||
|
fu_strtobool;
|
||||||
fu_strtoull;
|
fu_strtoull;
|
||||||
fu_strwidth;
|
fu_strwidth;
|
||||||
fu_sum16;
|
fu_sum16;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<firmware gtype="FuCfuOffer">
|
<firmware gtype="FuCfuOffer">
|
||||||
<segment_number>0x42</segment_number>
|
<segment_number>0x42</segment_number>
|
||||||
<force_immediate_reset>1</force_immediate_reset>
|
<force_immediate_reset>true</force_immediate_reset>
|
||||||
<force_ignore_version>1</force_ignore_version>
|
<force_ignore_version>true</force_ignore_version>
|
||||||
<component_id>0xAB</component_id>
|
<component_id>0xAB</component_id>
|
||||||
<token>0xCD</token>
|
<token>0xCD</token>
|
||||||
<version_raw>0x4567</version_raw>
|
<version_raw>0x4567</version_raw>
|
||||||
|
Loading…
Reference in New Issue
Block a user