Coverage Report

Created: 2025-08-29 06:48

/src/fwupd/plugins/acpi-phat/fu-acpi-phat-version-element.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 2021 Richard Hughes <richard@hughsie.com>
3
 *
4
 * SPDX-License-Identifier: LGPL-2.1-or-later
5
 */
6
7
#include "config.h"
8
9
#include "fu-acpi-phat-struct.h"
10
#include "fu-acpi-phat-version-element.h"
11
12
struct _FuAcpiPhatVersionElement {
13
  FuFirmware parent_instance;
14
  gchar *guid;
15
  gchar *producer_id;
16
};
17
18
G_DEFINE_TYPE(FuAcpiPhatVersionElement, fu_acpi_phat_version_element, FU_TYPE_FIRMWARE)
19
20
static void
21
fu_acpi_phat_version_element_export(FuFirmware *firmware,
22
            FuFirmwareExportFlags flags,
23
            XbBuilderNode *bn)
24
0
{
25
0
  FuAcpiPhatVersionElement *self = FU_ACPI_PHAT_VERSION_ELEMENT(firmware);
26
0
  if (self->guid != NULL)
27
0
    fu_xmlb_builder_insert_kv(bn, "guid", self->guid);
28
0
  if (self->producer_id != NULL)
29
0
    fu_xmlb_builder_insert_kv(bn, "producer_id", self->producer_id);
30
0
}
31
32
static gboolean
33
fu_acpi_phat_version_element_parse(FuFirmware *firmware,
34
           GInputStream *stream,
35
           FuFirmwareParseFlags flags,
36
           GError **error)
37
32.3k
{
38
32.3k
  FuAcpiPhatVersionElement *self = FU_ACPI_PHAT_VERSION_ELEMENT(firmware);
39
32.3k
  g_autoptr(GByteArray) st = NULL;
40
41
  /* unpack */
42
32.3k
  st = fu_struct_acpi_phat_version_element_parse_stream(stream, 0x0, error);
43
32.3k
  if (st == NULL)
44
0
    return FALSE;
45
32.3k
  fu_firmware_set_size(firmware, st->len);
46
32.3k
  self->guid = fwupd_guid_to_string(fu_struct_acpi_phat_version_element_get_component_id(st),
47
32.3k
            FWUPD_GUID_FLAG_MIXED_ENDIAN);
48
32.3k
  self->producer_id = fu_struct_acpi_phat_version_element_get_producer_id(st);
49
32.3k
  fu_firmware_set_version_raw(firmware,
50
32.3k
            fu_struct_acpi_phat_version_element_get_version_value(st));
51
32.3k
  return TRUE;
52
32.3k
}
53
54
static GByteArray *
55
fu_acpi_phat_version_element_write(FuFirmware *firmware, GError **error)
56
6.83k
{
57
6.83k
  FuAcpiPhatVersionElement *self = FU_ACPI_PHAT_VERSION_ELEMENT(firmware);
58
6.83k
  g_autoptr(GByteArray) st = fu_struct_acpi_phat_version_element_new();
59
60
  /* pack */
61
6.83k
  if (self->guid != NULL) {
62
6.83k
    fwupd_guid_t guid = {0x0};
63
6.83k
    if (!fwupd_guid_from_string(self->guid, &guid, FWUPD_GUID_FLAG_MIXED_ENDIAN, error))
64
0
      return NULL;
65
6.83k
    fu_struct_acpi_phat_version_element_set_component_id(st, &guid);
66
6.83k
  }
67
6.83k
  fu_struct_acpi_phat_version_element_set_version_value(
68
6.83k
      st,
69
6.83k
      fu_firmware_get_version_raw(firmware));
70
6.83k
  if (!fu_struct_acpi_phat_version_element_set_producer_id(st, self->producer_id, error))
71
0
    return NULL;
72
73
  /* success */
74
6.83k
  return g_steal_pointer(&st);
75
6.83k
}
76
77
static void
78
fu_acpi_phat_version_element_set_guid(FuAcpiPhatVersionElement *self, const gchar *guid)
79
0
{
80
0
  g_free(self->guid);
81
0
  self->guid = g_strdup(guid);
82
0
}
83
84
static void
85
fu_acpi_phat_version_element_set_producer_id(FuAcpiPhatVersionElement *self,
86
               const gchar *producer_id)
87
0
{
88
0
  g_free(self->producer_id);
89
0
  self->producer_id = g_strdup(producer_id);
90
0
}
91
92
static gboolean
93
fu_acpi_phat_version_element_build(FuFirmware *firmware, XbNode *n, GError **error)
94
0
{
95
0
  FuAcpiPhatVersionElement *self = FU_ACPI_PHAT_VERSION_ELEMENT(firmware);
96
0
  const gchar *tmp;
97
98
  /* optional properties */
99
0
  tmp = xb_node_query_text(n, "producer_id", NULL);
100
0
  if (tmp != NULL)
101
0
    fu_acpi_phat_version_element_set_producer_id(self, tmp);
102
0
  tmp = xb_node_query_text(n, "guid", NULL);
103
0
  if (tmp != NULL)
104
0
    fu_acpi_phat_version_element_set_guid(self, tmp);
105
106
  /* success */
107
0
  return TRUE;
108
0
}
109
110
static void
111
fu_acpi_phat_version_element_init(FuAcpiPhatVersionElement *self)
112
32.5k
{
113
32.5k
  fu_firmware_set_images_max(FU_FIRMWARE(self), 2000);
114
32.5k
  fu_firmware_add_flag(FU_FIRMWARE(self), FU_FIRMWARE_FLAG_NO_AUTO_DETECTION);
115
32.5k
}
116
117
static void
118
fu_acpi_phat_version_element_finalize(GObject *object)
119
32.5k
{
120
32.5k
  FuAcpiPhatVersionElement *self = FU_ACPI_PHAT_VERSION_ELEMENT(object);
121
32.5k
  g_free(self->guid);
122
32.5k
  g_free(self->producer_id);
123
32.5k
  G_OBJECT_CLASS(fu_acpi_phat_version_element_parent_class)->finalize(object);
124
32.5k
}
125
126
static void
127
fu_acpi_phat_version_element_class_init(FuAcpiPhatVersionElementClass *klass)
128
1
{
129
1
  GObjectClass *object_class = G_OBJECT_CLASS(klass);
130
1
  FuFirmwareClass *firmware_class = FU_FIRMWARE_CLASS(klass);
131
1
  object_class->finalize = fu_acpi_phat_version_element_finalize;
132
1
  firmware_class->parse = fu_acpi_phat_version_element_parse;
133
1
  firmware_class->write = fu_acpi_phat_version_element_write;
134
1
  firmware_class->export = fu_acpi_phat_version_element_export;
135
1
  firmware_class->build = fu_acpi_phat_version_element_build;
136
1
}
137
138
FuFirmware *
139
fu_acpi_phat_version_element_new(void)
140
32.5k
{
141
32.5k
  return FU_FIRMWARE(g_object_new(FU_TYPE_ACPI_PHAT_VERSION_ELEMENT, NULL));
142
32.5k
}