/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 | } |