Line | Count | Source |
1 | | /* |
2 | | * This file is auto-generated, do not modify! |
3 | | * |
4 | | * SPDX-License-Identifier: LGPL-2.1-or-later |
5 | | */ |
6 | | |
7 | | #include "config.h" |
8 | | |
9 | | #include <glib.h> |
10 | | |
11 | | #include "fu-cab-struct.h" |
12 | | #include "fu-byte-array.h" |
13 | | #include "fu-bytes.h" |
14 | | #include "fu-mem-private.h" |
15 | | #include "fu-string.h" |
16 | | |
17 | | #ifdef G_LOG_DOMAIN |
18 | | #undef G_LOG_DOMAIN |
19 | | #endif |
20 | 0 | #define G_LOG_DOMAIN "FuStruct" |
21 | | |
22 | | /** |
23 | | * fu_cab_compression_to_string: |
24 | | * @val: value, e.g. %FU_CAB_COMPRESSION_MSZIP |
25 | | * |
26 | | * Converts an enumerated value to a string. |
27 | | * |
28 | | * Returns: identifier string |
29 | | **/ |
30 | | const gchar * |
31 | | fu_cab_compression_to_string(FuCabCompression val) |
32 | 40 | { |
33 | 40 | if (val == FU_CAB_COMPRESSION_NONE) |
34 | 0 | return "none"; |
35 | 40 | if (val == FU_CAB_COMPRESSION_MSZIP) |
36 | 0 | return "mszip"; |
37 | 40 | if (val == FU_CAB_COMPRESSION_QUANTUM) |
38 | 1 | return "quantum"; |
39 | 39 | if (val == FU_CAB_COMPRESSION_LZX) |
40 | 1 | return "lzx"; |
41 | 38 | return NULL; |
42 | 39 | } |
43 | | |
44 | | /** |
45 | | * fu_cab_file_attribute_to_string: |
46 | | * @val: value, e.g. %FU_CAB_FILE_ATTRIBUTE_READONLY |
47 | | * |
48 | | * Converts an enumerated value to a string. |
49 | | * |
50 | | * Returns: identifier string |
51 | | **/ |
52 | | static const gchar * |
53 | | fu_cab_file_attribute_to_string(FuCabFileAttribute val) |
54 | 0 | { |
55 | 0 | if (val == FU_CAB_FILE_ATTRIBUTE_NONE) |
56 | 0 | return "none"; |
57 | 0 | if (val == FU_CAB_FILE_ATTRIBUTE_READONLY) |
58 | 0 | return "readonly"; |
59 | 0 | if (val == FU_CAB_FILE_ATTRIBUTE_HIDDEN) |
60 | 0 | return "hidden"; |
61 | 0 | if (val == FU_CAB_FILE_ATTRIBUTE_SYSTEM) |
62 | 0 | return "system"; |
63 | 0 | if (val == FU_CAB_FILE_ATTRIBUTE_ARCH) |
64 | 0 | return "arch"; |
65 | 0 | if (val == FU_CAB_FILE_ATTRIBUTE_EXEC) |
66 | 0 | return "exec"; |
67 | 0 | if (val == FU_CAB_FILE_ATTRIBUTE_NAME_UTF8) |
68 | 0 | return "name-utf8"; |
69 | 0 | return NULL; |
70 | 0 | } |
71 | | /** |
72 | | * fu_struct_cab_data_ref: (skip): |
73 | | **/ |
74 | | FuStructCabData * |
75 | | fu_struct_cab_data_ref(FuStructCabData *st) |
76 | 0 | { |
77 | 0 | g_return_val_if_fail(st != NULL, NULL); |
78 | 0 | st->refcount++; |
79 | 0 | return st; |
80 | 0 | } |
81 | | /** |
82 | | * fu_struct_cab_data_unref: (skip): |
83 | | **/ |
84 | | void |
85 | | fu_struct_cab_data_unref(FuStructCabData *st) |
86 | 10.3k | { |
87 | 10.3k | g_return_if_fail(st != NULL); |
88 | 10.3k | if (st->refcount == 0) { |
89 | 0 | g_critical("FuStructCabData refcount already zero"); |
90 | 0 | return; |
91 | 0 | } |
92 | 10.3k | if (--st->refcount > 0) |
93 | 0 | return; |
94 | 10.3k | if (st->buf != NULL) |
95 | 10.2k | g_byte_array_unref(st->buf); |
96 | 10.3k | g_free(st); |
97 | 10.3k | } |
98 | | /** |
99 | | * fu_struct_cab_data_new_internal: (skip): |
100 | | **/ |
101 | | static FuStructCabData * |
102 | | fu_struct_cab_data_new_internal(void) |
103 | 10.3k | { |
104 | 10.3k | FuStructCabData *st = g_new0(FuStructCabData, 1); |
105 | 10.3k | st->refcount = 1; |
106 | 10.3k | return st; |
107 | 10.3k | } |
108 | | |
109 | | /* getters */ |
110 | | /** |
111 | | * fu_struct_cab_data_get_checksum: (skip): |
112 | | **/ |
113 | | guint32 |
114 | | fu_struct_cab_data_get_checksum(const FuStructCabData *st) |
115 | 0 | { |
116 | 0 | g_return_val_if_fail(st != NULL, 0x0); |
117 | 0 | return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN); |
118 | 0 | } |
119 | | /** |
120 | | * fu_struct_cab_data_get_comp: (skip): |
121 | | **/ |
122 | | guint16 |
123 | | fu_struct_cab_data_get_comp(const FuStructCabData *st) |
124 | 10.2k | { |
125 | 10.2k | g_return_val_if_fail(st != NULL, 0x0); |
126 | 10.2k | return fu_memread_uint16(st->buf->data + 4, G_LITTLE_ENDIAN); |
127 | 10.2k | } |
128 | | /** |
129 | | * fu_struct_cab_data_get_uncomp: (skip): |
130 | | **/ |
131 | | guint16 |
132 | | fu_struct_cab_data_get_uncomp(const FuStructCabData *st) |
133 | 10.2k | { |
134 | 10.2k | g_return_val_if_fail(st != NULL, 0x0); |
135 | 10.2k | return fu_memread_uint16(st->buf->data + 6, G_LITTLE_ENDIAN); |
136 | 10.2k | } |
137 | | |
138 | | /* setters */ |
139 | | /** |
140 | | * fu_struct_cab_data_set_checksum: (skip): |
141 | | **/ |
142 | | void |
143 | | fu_struct_cab_data_set_checksum(FuStructCabData *st, guint32 value) |
144 | 0 | { |
145 | 0 | g_return_if_fail(st != NULL); |
146 | 0 | fu_memwrite_uint32(st->buf->data + 0, value, G_LITTLE_ENDIAN); |
147 | 0 | } |
148 | | /** |
149 | | * fu_struct_cab_data_set_comp: (skip): |
150 | | **/ |
151 | | void |
152 | | fu_struct_cab_data_set_comp(FuStructCabData *st, guint16 value) |
153 | 0 | { |
154 | 0 | g_return_if_fail(st != NULL); |
155 | 0 | fu_memwrite_uint16(st->buf->data + 4, value, G_LITTLE_ENDIAN); |
156 | 0 | } |
157 | | /** |
158 | | * fu_struct_cab_data_set_uncomp: (skip): |
159 | | **/ |
160 | | void |
161 | | fu_struct_cab_data_set_uncomp(FuStructCabData *st, guint16 value) |
162 | 0 | { |
163 | 0 | g_return_if_fail(st != NULL); |
164 | 0 | fu_memwrite_uint16(st->buf->data + 6, value, G_LITTLE_ENDIAN); |
165 | 0 | } |
166 | | /** |
167 | | * fu_struct_cab_data_new: (skip): |
168 | | **/ |
169 | | FuStructCabData * |
170 | | fu_struct_cab_data_new(void) |
171 | 0 | { |
172 | 0 | FuStructCabData *st = fu_struct_cab_data_new_internal(); |
173 | 0 | st->buf = g_byte_array_sized_new(8); |
174 | 0 | fu_byte_array_set_size(st->buf, 8, 0x0); |
175 | 0 | return st; |
176 | 0 | } |
177 | | /** |
178 | | * fu_struct_cab_data_to_string: (skip): |
179 | | **/ |
180 | | static gchar * |
181 | | fu_struct_cab_data_to_string(const FuStructCabData *st) |
182 | 0 | { |
183 | 0 | g_autoptr(GString) str = g_string_new("FuStructCabData:\n"); |
184 | 0 | g_return_val_if_fail(st != NULL, NULL); |
185 | 0 | g_string_append_printf(str, " checksum: 0x%x\n", |
186 | 0 | (guint) fu_struct_cab_data_get_checksum(st)); |
187 | 0 | g_string_append_printf(str, " comp: 0x%x\n", |
188 | 0 | (guint) fu_struct_cab_data_get_comp(st)); |
189 | 0 | g_string_append_printf(str, " uncomp: 0x%x\n", |
190 | 0 | (guint) fu_struct_cab_data_get_uncomp(st)); |
191 | 0 | if (str->len > 0) |
192 | 0 | g_string_set_size(str, str->len - 1); |
193 | 0 | return g_string_free(g_steal_pointer(&str), FALSE); |
194 | 0 | } |
195 | | static gboolean |
196 | | fu_struct_cab_data_parse_internal(FuStructCabData *st, GError **error) |
197 | 10.2k | { |
198 | 10.2k | if (g_log_get_debug_enabled()) { |
199 | 0 | g_autofree gchar *str = fu_struct_cab_data_to_string(st); |
200 | 0 | g_debug("%s", str); |
201 | 0 | } |
202 | 10.2k | return TRUE; |
203 | 10.2k | } |
204 | | /** |
205 | | * fu_struct_cab_data_parse_stream: (skip): |
206 | | **/ |
207 | | FuStructCabData * |
208 | | fu_struct_cab_data_parse_stream(GInputStream *stream, gsize offset, GError **error) |
209 | 10.3k | { |
210 | 10.3k | g_autoptr(FuStructCabData) st = fu_struct_cab_data_new_internal(); |
211 | 10.3k | st->buf = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error); |
212 | 10.3k | if (st->buf == NULL) { |
213 | 90 | g_prefix_error(error, "FuStructCabData failed read of 0x%x: ", (guint) 8); |
214 | 90 | return NULL; |
215 | 90 | } |
216 | 10.2k | if (st->buf->len != 8) { |
217 | 31 | g_set_error(error, |
218 | 31 | FWUPD_ERROR, |
219 | 31 | FWUPD_ERROR_INVALID_DATA, |
220 | 31 | "FuStructCabData requested 0x%x and got 0x%x", |
221 | 31 | (guint) 8, |
222 | 31 | (guint) st->buf->len); |
223 | 31 | return NULL; |
224 | 31 | } |
225 | 10.2k | if (!fu_struct_cab_data_parse_internal(st, error)) |
226 | 0 | return NULL; |
227 | 10.2k | return g_steal_pointer(&st); |
228 | 10.2k | } |
229 | | /** |
230 | | * fu_struct_cab_file_ref: (skip): |
231 | | **/ |
232 | | FuStructCabFile * |
233 | | fu_struct_cab_file_ref(FuStructCabFile *st) |
234 | 0 | { |
235 | 0 | g_return_val_if_fail(st != NULL, NULL); |
236 | 0 | st->refcount++; |
237 | 0 | return st; |
238 | 0 | } |
239 | | /** |
240 | | * fu_struct_cab_file_unref: (skip): |
241 | | **/ |
242 | | void |
243 | | fu_struct_cab_file_unref(FuStructCabFile *st) |
244 | 11.7k | { |
245 | 11.7k | g_return_if_fail(st != NULL); |
246 | 11.7k | if (st->refcount == 0) { |
247 | 0 | g_critical("FuStructCabFile refcount already zero"); |
248 | 0 | return; |
249 | 0 | } |
250 | 11.7k | if (--st->refcount > 0) |
251 | 0 | return; |
252 | 11.7k | if (st->buf != NULL) |
253 | 11.4k | g_byte_array_unref(st->buf); |
254 | 11.7k | g_free(st); |
255 | 11.7k | } |
256 | | /** |
257 | | * fu_struct_cab_file_new_internal: (skip): |
258 | | **/ |
259 | | static FuStructCabFile * |
260 | | fu_struct_cab_file_new_internal(void) |
261 | 11.7k | { |
262 | 11.7k | FuStructCabFile *st = g_new0(FuStructCabFile, 1); |
263 | 11.7k | st->refcount = 1; |
264 | 11.7k | return st; |
265 | 11.7k | } |
266 | | |
267 | | /* getters */ |
268 | | /** |
269 | | * fu_struct_cab_file_get_usize: (skip): |
270 | | **/ |
271 | | guint32 |
272 | | fu_struct_cab_file_get_usize(const FuStructCabFile *st) |
273 | 22.6k | { |
274 | 22.6k | g_return_val_if_fail(st != NULL, 0x0); |
275 | 22.6k | return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN); |
276 | 22.6k | } |
277 | | /** |
278 | | * fu_struct_cab_file_get_uoffset: (skip): |
279 | | **/ |
280 | | guint32 |
281 | | fu_struct_cab_file_get_uoffset(const FuStructCabFile *st) |
282 | 22.6k | { |
283 | 22.6k | g_return_val_if_fail(st != NULL, 0x0); |
284 | 22.6k | return fu_memread_uint32(st->buf->data + 4, G_LITTLE_ENDIAN); |
285 | 22.6k | } |
286 | | /** |
287 | | * fu_struct_cab_file_get_index: (skip): |
288 | | **/ |
289 | | guint16 |
290 | | fu_struct_cab_file_get_index(const FuStructCabFile *st) |
291 | 11.3k | { |
292 | 11.3k | g_return_val_if_fail(st != NULL, 0x0); |
293 | 11.3k | return fu_memread_uint16(st->buf->data + 8, G_LITTLE_ENDIAN); |
294 | 11.3k | } |
295 | | /** |
296 | | * fu_struct_cab_file_get_date: (skip): |
297 | | **/ |
298 | | guint16 |
299 | | fu_struct_cab_file_get_date(const FuStructCabFile *st) |
300 | 11.1k | { |
301 | 11.1k | g_return_val_if_fail(st != NULL, 0x0); |
302 | 11.1k | return fu_memread_uint16(st->buf->data + 10, G_LITTLE_ENDIAN); |
303 | 11.1k | } |
304 | | /** |
305 | | * fu_struct_cab_file_get_time: (skip): |
306 | | **/ |
307 | | guint16 |
308 | | fu_struct_cab_file_get_time(const FuStructCabFile *st) |
309 | 11.1k | { |
310 | 11.1k | g_return_val_if_fail(st != NULL, 0x0); |
311 | 11.1k | return fu_memread_uint16(st->buf->data + 12, G_LITTLE_ENDIAN); |
312 | 11.1k | } |
313 | | /** |
314 | | * fu_struct_cab_file_get_fattr: (skip): |
315 | | **/ |
316 | | FuCabFileAttribute |
317 | | fu_struct_cab_file_get_fattr(const FuStructCabFile *st) |
318 | 0 | { |
319 | 0 | g_return_val_if_fail(st != NULL, 0x0); |
320 | 0 | return fu_memread_uint16(st->buf->data + 14, G_LITTLE_ENDIAN); |
321 | 0 | } |
322 | | |
323 | | /* setters */ |
324 | | /** |
325 | | * fu_struct_cab_file_set_usize: (skip): |
326 | | **/ |
327 | | void |
328 | | fu_struct_cab_file_set_usize(FuStructCabFile *st, guint32 value) |
329 | 0 | { |
330 | 0 | g_return_if_fail(st != NULL); |
331 | 0 | fu_memwrite_uint32(st->buf->data + 0, value, G_LITTLE_ENDIAN); |
332 | 0 | } |
333 | | /** |
334 | | * fu_struct_cab_file_set_uoffset: (skip): |
335 | | **/ |
336 | | void |
337 | | fu_struct_cab_file_set_uoffset(FuStructCabFile *st, guint32 value) |
338 | 0 | { |
339 | 0 | g_return_if_fail(st != NULL); |
340 | 0 | fu_memwrite_uint32(st->buf->data + 4, value, G_LITTLE_ENDIAN); |
341 | 0 | } |
342 | | /** |
343 | | * fu_struct_cab_file_set_index: (skip): |
344 | | **/ |
345 | | void |
346 | | fu_struct_cab_file_set_index(FuStructCabFile *st, guint16 value) |
347 | 0 | { |
348 | 0 | g_return_if_fail(st != NULL); |
349 | 0 | fu_memwrite_uint16(st->buf->data + 8, value, G_LITTLE_ENDIAN); |
350 | 0 | } |
351 | | /** |
352 | | * fu_struct_cab_file_set_date: (skip): |
353 | | **/ |
354 | | void |
355 | | fu_struct_cab_file_set_date(FuStructCabFile *st, guint16 value) |
356 | 0 | { |
357 | 0 | g_return_if_fail(st != NULL); |
358 | 0 | fu_memwrite_uint16(st->buf->data + 10, value, G_LITTLE_ENDIAN); |
359 | 0 | } |
360 | | /** |
361 | | * fu_struct_cab_file_set_time: (skip): |
362 | | **/ |
363 | | void |
364 | | fu_struct_cab_file_set_time(FuStructCabFile *st, guint16 value) |
365 | 0 | { |
366 | 0 | g_return_if_fail(st != NULL); |
367 | 0 | fu_memwrite_uint16(st->buf->data + 12, value, G_LITTLE_ENDIAN); |
368 | 0 | } |
369 | | /** |
370 | | * fu_struct_cab_file_set_fattr: (skip): |
371 | | **/ |
372 | | void |
373 | | fu_struct_cab_file_set_fattr(FuStructCabFile *st, FuCabFileAttribute value) |
374 | 0 | { |
375 | 0 | g_return_if_fail(st != NULL); |
376 | 0 | fu_memwrite_uint16(st->buf->data + 14, value, G_LITTLE_ENDIAN); |
377 | 0 | } |
378 | | /** |
379 | | * fu_struct_cab_file_new: (skip): |
380 | | **/ |
381 | | FuStructCabFile * |
382 | | fu_struct_cab_file_new(void) |
383 | 0 | { |
384 | 0 | FuStructCabFile *st = fu_struct_cab_file_new_internal(); |
385 | 0 | st->buf = g_byte_array_sized_new(16); |
386 | 0 | fu_byte_array_set_size(st->buf, 16, 0x0); |
387 | 0 | return st; |
388 | 0 | } |
389 | | /** |
390 | | * fu_struct_cab_file_to_string: (skip): |
391 | | **/ |
392 | | static gchar * |
393 | | fu_struct_cab_file_to_string(const FuStructCabFile *st) |
394 | 0 | { |
395 | 0 | g_autoptr(GString) str = g_string_new("FuStructCabFile:\n"); |
396 | 0 | g_return_val_if_fail(st != NULL, NULL); |
397 | 0 | g_string_append_printf(str, " usize: 0x%x\n", |
398 | 0 | (guint) fu_struct_cab_file_get_usize(st)); |
399 | 0 | g_string_append_printf(str, " uoffset: 0x%x\n", |
400 | 0 | (guint) fu_struct_cab_file_get_uoffset(st)); |
401 | 0 | g_string_append_printf(str, " index: 0x%x\n", |
402 | 0 | (guint) fu_struct_cab_file_get_index(st)); |
403 | 0 | g_string_append_printf(str, " date: 0x%x\n", |
404 | 0 | (guint) fu_struct_cab_file_get_date(st)); |
405 | 0 | g_string_append_printf(str, " time: 0x%x\n", |
406 | 0 | (guint) fu_struct_cab_file_get_time(st)); |
407 | 0 | { |
408 | 0 | const gchar *tmp = fu_cab_file_attribute_to_string(fu_struct_cab_file_get_fattr(st)); |
409 | 0 | if (tmp != NULL) { |
410 | 0 | g_string_append_printf(str, " fattr: 0x%x [%s]\n", (guint) fu_struct_cab_file_get_fattr(st), tmp); |
411 | 0 | } else { |
412 | 0 | g_string_append_printf(str, " fattr: 0x%x\n", (guint) fu_struct_cab_file_get_fattr(st)); |
413 | 0 | } |
414 | 0 | } |
415 | 0 | if (str->len > 0) |
416 | 0 | g_string_set_size(str, str->len - 1); |
417 | 0 | return g_string_free(g_steal_pointer(&str), FALSE); |
418 | 0 | } |
419 | | static gboolean |
420 | | fu_struct_cab_file_parse_internal(FuStructCabFile *st, GError **error) |
421 | 11.3k | { |
422 | 11.3k | if (g_log_get_debug_enabled()) { |
423 | 0 | g_autofree gchar *str = fu_struct_cab_file_to_string(st); |
424 | 0 | g_debug("%s", str); |
425 | 0 | } |
426 | 11.3k | return TRUE; |
427 | 11.3k | } |
428 | | /** |
429 | | * fu_struct_cab_file_parse_stream: (skip): |
430 | | **/ |
431 | | FuStructCabFile * |
432 | | fu_struct_cab_file_parse_stream(GInputStream *stream, gsize offset, GError **error) |
433 | 11.7k | { |
434 | 11.7k | g_autoptr(FuStructCabFile) st = fu_struct_cab_file_new_internal(); |
435 | 11.7k | st->buf = fu_input_stream_read_byte_array(stream, offset, 16, NULL, error); |
436 | 11.7k | if (st->buf == NULL) { |
437 | 313 | g_prefix_error(error, "FuStructCabFile failed read of 0x%x: ", (guint) 16); |
438 | 313 | return NULL; |
439 | 313 | } |
440 | 11.4k | if (st->buf->len != 16) { |
441 | 81 | g_set_error(error, |
442 | 81 | FWUPD_ERROR, |
443 | 81 | FWUPD_ERROR_INVALID_DATA, |
444 | 81 | "FuStructCabFile requested 0x%x and got 0x%x", |
445 | 81 | (guint) 16, |
446 | 81 | (guint) st->buf->len); |
447 | 81 | return NULL; |
448 | 81 | } |
449 | 11.3k | if (!fu_struct_cab_file_parse_internal(st, error)) |
450 | 0 | return NULL; |
451 | 11.3k | return g_steal_pointer(&st); |
452 | 11.3k | } |
453 | | /** |
454 | | * fu_struct_cab_folder_ref: (skip): |
455 | | **/ |
456 | | FuStructCabFolder * |
457 | | fu_struct_cab_folder_ref(FuStructCabFolder *st) |
458 | 0 | { |
459 | 0 | g_return_val_if_fail(st != NULL, NULL); |
460 | 0 | st->refcount++; |
461 | 0 | return st; |
462 | 0 | } |
463 | | /** |
464 | | * fu_struct_cab_folder_unref: (skip): |
465 | | **/ |
466 | | void |
467 | | fu_struct_cab_folder_unref(FuStructCabFolder *st) |
468 | 2.92k | { |
469 | 2.92k | g_return_if_fail(st != NULL); |
470 | 2.92k | if (st->refcount == 0) { |
471 | 0 | g_critical("FuStructCabFolder refcount already zero"); |
472 | 0 | return; |
473 | 0 | } |
474 | 2.92k | if (--st->refcount > 0) |
475 | 0 | return; |
476 | 2.92k | if (st->buf != NULL) |
477 | 2.86k | g_byte_array_unref(st->buf); |
478 | 2.92k | g_free(st); |
479 | 2.92k | } |
480 | | /** |
481 | | * fu_struct_cab_folder_new_internal: (skip): |
482 | | **/ |
483 | | static FuStructCabFolder * |
484 | | fu_struct_cab_folder_new_internal(void) |
485 | 2.92k | { |
486 | 2.92k | FuStructCabFolder *st = g_new0(FuStructCabFolder, 1); |
487 | 2.92k | st->refcount = 1; |
488 | 2.92k | return st; |
489 | 2.92k | } |
490 | | |
491 | | /* getters */ |
492 | | /** |
493 | | * fu_struct_cab_folder_get_offset: (skip): |
494 | | **/ |
495 | | guint32 |
496 | | fu_struct_cab_folder_get_offset(const FuStructCabFolder *st) |
497 | 2.71k | { |
498 | 2.71k | g_return_val_if_fail(st != NULL, 0x0); |
499 | 2.71k | return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN); |
500 | 2.71k | } |
501 | | /** |
502 | | * fu_struct_cab_folder_get_ndatab: (skip): |
503 | | **/ |
504 | | guint16 |
505 | | fu_struct_cab_folder_get_ndatab(const FuStructCabFolder *st) |
506 | 15.4k | { |
507 | 15.4k | g_return_val_if_fail(st != NULL, 0x0); |
508 | 15.4k | return fu_memread_uint16(st->buf->data + 4, G_LITTLE_ENDIAN); |
509 | 15.4k | } |
510 | | /** |
511 | | * fu_struct_cab_folder_get_compression: (skip): |
512 | | **/ |
513 | | FuCabCompression |
514 | | fu_struct_cab_folder_get_compression(const FuStructCabFolder *st) |
515 | 2.75k | { |
516 | 2.75k | g_return_val_if_fail(st != NULL, 0x0); |
517 | 2.75k | return fu_memread_uint16(st->buf->data + 6, G_LITTLE_ENDIAN); |
518 | 2.75k | } |
519 | | |
520 | | /* setters */ |
521 | | /** |
522 | | * fu_struct_cab_folder_set_offset: (skip): |
523 | | **/ |
524 | | void |
525 | | fu_struct_cab_folder_set_offset(FuStructCabFolder *st, guint32 value) |
526 | 0 | { |
527 | 0 | g_return_if_fail(st != NULL); |
528 | 0 | fu_memwrite_uint32(st->buf->data + 0, value, G_LITTLE_ENDIAN); |
529 | 0 | } |
530 | | /** |
531 | | * fu_struct_cab_folder_set_ndatab: (skip): |
532 | | **/ |
533 | | void |
534 | | fu_struct_cab_folder_set_ndatab(FuStructCabFolder *st, guint16 value) |
535 | 0 | { |
536 | 0 | g_return_if_fail(st != NULL); |
537 | 0 | fu_memwrite_uint16(st->buf->data + 4, value, G_LITTLE_ENDIAN); |
538 | 0 | } |
539 | | /** |
540 | | * fu_struct_cab_folder_set_compression: (skip): |
541 | | **/ |
542 | | void |
543 | | fu_struct_cab_folder_set_compression(FuStructCabFolder *st, FuCabCompression value) |
544 | 0 | { |
545 | 0 | g_return_if_fail(st != NULL); |
546 | 0 | fu_memwrite_uint16(st->buf->data + 6, value, G_LITTLE_ENDIAN); |
547 | 0 | } |
548 | | /** |
549 | | * fu_struct_cab_folder_new: (skip): |
550 | | **/ |
551 | | FuStructCabFolder * |
552 | | fu_struct_cab_folder_new(void) |
553 | 102 | { |
554 | 102 | FuStructCabFolder *st = fu_struct_cab_folder_new_internal(); |
555 | 102 | st->buf = g_byte_array_sized_new(8); |
556 | 102 | fu_byte_array_set_size(st->buf, 8, 0x0); |
557 | 102 | return st; |
558 | 102 | } |
559 | | /** |
560 | | * fu_struct_cab_folder_to_string: (skip): |
561 | | **/ |
562 | | static gchar * |
563 | | fu_struct_cab_folder_to_string(const FuStructCabFolder *st) |
564 | 0 | { |
565 | 0 | g_autoptr(GString) str = g_string_new("FuStructCabFolder:\n"); |
566 | 0 | g_return_val_if_fail(st != NULL, NULL); |
567 | 0 | g_string_append_printf(str, " offset: 0x%x\n", |
568 | 0 | (guint) fu_struct_cab_folder_get_offset(st)); |
569 | 0 | g_string_append_printf(str, " ndatab: 0x%x\n", |
570 | 0 | (guint) fu_struct_cab_folder_get_ndatab(st)); |
571 | 0 | { |
572 | 0 | const gchar *tmp = fu_cab_compression_to_string(fu_struct_cab_folder_get_compression(st)); |
573 | 0 | if (tmp != NULL) { |
574 | 0 | g_string_append_printf(str, " compression: 0x%x [%s]\n", (guint) fu_struct_cab_folder_get_compression(st), tmp); |
575 | 0 | } else { |
576 | 0 | g_string_append_printf(str, " compression: 0x%x\n", (guint) fu_struct_cab_folder_get_compression(st)); |
577 | 0 | } |
578 | 0 | } |
579 | 0 | if (str->len > 0) |
580 | 0 | g_string_set_size(str, str->len - 1); |
581 | 0 | return g_string_free(g_steal_pointer(&str), FALSE); |
582 | 0 | } |
583 | | static gboolean |
584 | | fu_struct_cab_folder_parse_internal(FuStructCabFolder *st, GError **error) |
585 | 2.75k | { |
586 | 2.75k | if (g_log_get_debug_enabled()) { |
587 | 0 | g_autofree gchar *str = fu_struct_cab_folder_to_string(st); |
588 | 0 | g_debug("%s", str); |
589 | 0 | } |
590 | 2.75k | return TRUE; |
591 | 2.75k | } |
592 | | /** |
593 | | * fu_struct_cab_folder_parse_stream: (skip): |
594 | | **/ |
595 | | FuStructCabFolder * |
596 | | fu_struct_cab_folder_parse_stream(GInputStream *stream, gsize offset, GError **error) |
597 | 2.82k | { |
598 | 2.82k | g_autoptr(FuStructCabFolder) st = fu_struct_cab_folder_new_internal(); |
599 | 2.82k | st->buf = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error); |
600 | 2.82k | if (st->buf == NULL) { |
601 | 57 | g_prefix_error(error, "FuStructCabFolder failed read of 0x%x: ", (guint) 8); |
602 | 57 | return NULL; |
603 | 57 | } |
604 | 2.76k | if (st->buf->len != 8) { |
605 | 9 | g_set_error(error, |
606 | 9 | FWUPD_ERROR, |
607 | 9 | FWUPD_ERROR_INVALID_DATA, |
608 | 9 | "FuStructCabFolder requested 0x%x and got 0x%x", |
609 | 9 | (guint) 8, |
610 | 9 | (guint) st->buf->len); |
611 | 9 | return NULL; |
612 | 9 | } |
613 | 2.75k | if (!fu_struct_cab_folder_parse_internal(st, error)) |
614 | 0 | return NULL; |
615 | 2.75k | return g_steal_pointer(&st); |
616 | 2.75k | } |
617 | | /** |
618 | | * fu_struct_cab_header_ref: (skip): |
619 | | **/ |
620 | | FuStructCabHeader * |
621 | | fu_struct_cab_header_ref(FuStructCabHeader *st) |
622 | 0 | { |
623 | 0 | g_return_val_if_fail(st != NULL, NULL); |
624 | 0 | st->refcount++; |
625 | 0 | return st; |
626 | 0 | } |
627 | | /** |
628 | | * fu_struct_cab_header_unref: (skip): |
629 | | **/ |
630 | | void |
631 | | fu_struct_cab_header_unref(FuStructCabHeader *st) |
632 | 2.76k | { |
633 | 2.76k | g_return_if_fail(st != NULL); |
634 | 2.76k | if (st->refcount == 0) { |
635 | 0 | g_critical("FuStructCabHeader refcount already zero"); |
636 | 0 | return; |
637 | 0 | } |
638 | 2.76k | if (--st->refcount > 0) |
639 | 0 | return; |
640 | 2.76k | if (st->buf != NULL) |
641 | 2.76k | g_byte_array_unref(st->buf); |
642 | 2.76k | g_free(st); |
643 | 2.76k | } |
644 | | /** |
645 | | * fu_struct_cab_header_new_internal: (skip): |
646 | | **/ |
647 | | static FuStructCabHeader * |
648 | | fu_struct_cab_header_new_internal(void) |
649 | 2.76k | { |
650 | 2.76k | FuStructCabHeader *st = g_new0(FuStructCabHeader, 1); |
651 | 2.76k | st->refcount = 1; |
652 | 2.76k | return st; |
653 | 2.76k | } |
654 | | |
655 | | /* getters */ |
656 | | /** |
657 | | * fu_struct_cab_header_get_signature: (skip): |
658 | | **/ |
659 | | static gchar * |
660 | | fu_struct_cab_header_get_signature(const FuStructCabHeader *st) |
661 | 43 | { |
662 | 43 | g_return_val_if_fail(st != NULL, NULL); |
663 | 43 | return fu_memstrsafe(st->buf->data, st->buf->len, 0, 4, NULL); |
664 | 43 | } |
665 | | /** |
666 | | * fu_struct_cab_header_get_size: (skip): |
667 | | **/ |
668 | | guint32 |
669 | | fu_struct_cab_header_get_size(const FuStructCabHeader *st) |
670 | 1.31k | { |
671 | 1.31k | g_return_val_if_fail(st != NULL, 0x0); |
672 | 1.31k | return fu_memread_uint32(st->buf->data + 8, G_LITTLE_ENDIAN); |
673 | 1.31k | } |
674 | | /** |
675 | | * fu_struct_cab_header_get_off_cffile: (skip): |
676 | | **/ |
677 | | guint32 |
678 | | fu_struct_cab_header_get_off_cffile(const FuStructCabHeader *st) |
679 | 1.22k | { |
680 | 1.22k | g_return_val_if_fail(st != NULL, 0x0); |
681 | 1.22k | return fu_memread_uint32(st->buf->data + 16, G_LITTLE_ENDIAN); |
682 | 1.22k | } |
683 | | /** |
684 | | * fu_struct_cab_header_get_version_minor: (skip): |
685 | | **/ |
686 | | static guint8 |
687 | | fu_struct_cab_header_get_version_minor(const FuStructCabHeader *st) |
688 | 2.59k | { |
689 | 2.59k | g_return_val_if_fail(st != NULL, 0x0); |
690 | 2.59k | return st->buf->data[24]; |
691 | 2.59k | } |
692 | | /** |
693 | | * fu_struct_cab_header_get_version_major: (skip): |
694 | | **/ |
695 | | static guint8 |
696 | | fu_struct_cab_header_get_version_major(const FuStructCabHeader *st) |
697 | 2.58k | { |
698 | 2.58k | g_return_val_if_fail(st != NULL, 0x0); |
699 | 2.58k | return st->buf->data[25]; |
700 | 2.58k | } |
701 | | /** |
702 | | * fu_struct_cab_header_get_nr_folders: (skip): |
703 | | **/ |
704 | | guint16 |
705 | | fu_struct_cab_header_get_nr_folders(const FuStructCabHeader *st) |
706 | 6.03k | { |
707 | 6.03k | g_return_val_if_fail(st != NULL, 0x0); |
708 | 6.03k | return fu_memread_uint16(st->buf->data + 26, G_LITTLE_ENDIAN); |
709 | 6.03k | } |
710 | | /** |
711 | | * fu_struct_cab_header_get_nr_files: (skip): |
712 | | **/ |
713 | | guint16 |
714 | | fu_struct_cab_header_get_nr_files(const FuStructCabHeader *st) |
715 | 14.3k | { |
716 | 14.3k | g_return_val_if_fail(st != NULL, 0x0); |
717 | 14.3k | return fu_memread_uint16(st->buf->data + 28, G_LITTLE_ENDIAN); |
718 | 14.3k | } |
719 | | /** |
720 | | * fu_struct_cab_header_get_flags: (skip): |
721 | | **/ |
722 | | guint16 |
723 | | fu_struct_cab_header_get_flags(const FuStructCabHeader *st) |
724 | 1.19k | { |
725 | 1.19k | g_return_val_if_fail(st != NULL, 0x0); |
726 | 1.19k | return fu_memread_uint16(st->buf->data + 30, G_LITTLE_ENDIAN); |
727 | 1.19k | } |
728 | | /** |
729 | | * fu_struct_cab_header_get_set_id: (skip): |
730 | | **/ |
731 | | guint16 |
732 | | fu_struct_cab_header_get_set_id(const FuStructCabHeader *st) |
733 | 0 | { |
734 | 0 | g_return_val_if_fail(st != NULL, 0x0); |
735 | 0 | return fu_memread_uint16(st->buf->data + 32, G_LITTLE_ENDIAN); |
736 | 0 | } |
737 | | /** |
738 | | * fu_struct_cab_header_get_idx_cabinet: (skip): |
739 | | **/ |
740 | | guint16 |
741 | | fu_struct_cab_header_get_idx_cabinet(const FuStructCabHeader *st) |
742 | 1.26k | { |
743 | 1.26k | g_return_val_if_fail(st != NULL, 0x0); |
744 | 1.26k | return fu_memread_uint16(st->buf->data + 34, G_LITTLE_ENDIAN); |
745 | 1.26k | } |
746 | | |
747 | | /* setters */ |
748 | | /** |
749 | | * fu_struct_cab_header_set_signature: (skip): |
750 | | **/ |
751 | | static gboolean |
752 | | fu_struct_cab_header_set_signature(FuStructCabHeader *st, const gchar *value, GError **error) |
753 | 102 | { |
754 | 102 | gsize len; |
755 | 102 | g_return_val_if_fail(st != NULL, FALSE); |
756 | 102 | g_return_val_if_fail(error == NULL || *error == NULL, FALSE); |
757 | 102 | if (value == NULL) { |
758 | 0 | memset(st->buf->data + 0, 0x0, 4); |
759 | 0 | return TRUE; |
760 | 0 | } |
761 | 102 | len = strlen(value); |
762 | 102 | if (len > 4) { |
763 | 0 | g_set_error(error, |
764 | 0 | FWUPD_ERROR, |
765 | 0 | FWUPD_ERROR_INVALID_DATA, |
766 | 0 | "string '%s' (0x%x bytes) does not fit in FuStructCabHeader.signature (0x%x bytes)", |
767 | 0 | value, (guint) len, (guint) 4); |
768 | 0 | return FALSE; |
769 | 0 | } |
770 | 102 | return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error); |
771 | 102 | } |
772 | | /** |
773 | | * fu_struct_cab_header_set_size: (skip): |
774 | | **/ |
775 | | void |
776 | | fu_struct_cab_header_set_size(FuStructCabHeader *st, guint32 value) |
777 | 0 | { |
778 | 0 | g_return_if_fail(st != NULL); |
779 | 0 | fu_memwrite_uint32(st->buf->data + 8, value, G_LITTLE_ENDIAN); |
780 | 0 | } |
781 | | /** |
782 | | * fu_struct_cab_header_set_off_cffile: (skip): |
783 | | **/ |
784 | | void |
785 | | fu_struct_cab_header_set_off_cffile(FuStructCabHeader *st, guint32 value) |
786 | 0 | { |
787 | 0 | g_return_if_fail(st != NULL); |
788 | 0 | fu_memwrite_uint32(st->buf->data + 16, value, G_LITTLE_ENDIAN); |
789 | 0 | } |
790 | | /** |
791 | | * fu_struct_cab_header_set_version_minor: (skip): |
792 | | **/ |
793 | | static void |
794 | | fu_struct_cab_header_set_version_minor(FuStructCabHeader *st, guint8 value) |
795 | 102 | { |
796 | 102 | g_return_if_fail(st != NULL); |
797 | 102 | st->buf->data[24] = value; |
798 | 102 | } |
799 | | /** |
800 | | * fu_struct_cab_header_set_version_major: (skip): |
801 | | **/ |
802 | | static void |
803 | | fu_struct_cab_header_set_version_major(FuStructCabHeader *st, guint8 value) |
804 | 102 | { |
805 | 102 | g_return_if_fail(st != NULL); |
806 | 102 | st->buf->data[25] = value; |
807 | 102 | } |
808 | | /** |
809 | | * fu_struct_cab_header_set_nr_folders: (skip): |
810 | | **/ |
811 | | void |
812 | | fu_struct_cab_header_set_nr_folders(FuStructCabHeader *st, guint16 value) |
813 | 102 | { |
814 | 102 | g_return_if_fail(st != NULL); |
815 | 102 | fu_memwrite_uint16(st->buf->data + 26, value, G_LITTLE_ENDIAN); |
816 | 102 | } |
817 | | /** |
818 | | * fu_struct_cab_header_set_nr_files: (skip): |
819 | | **/ |
820 | | void |
821 | | fu_struct_cab_header_set_nr_files(FuStructCabHeader *st, guint16 value) |
822 | 0 | { |
823 | 0 | g_return_if_fail(st != NULL); |
824 | 0 | fu_memwrite_uint16(st->buf->data + 28, value, G_LITTLE_ENDIAN); |
825 | 0 | } |
826 | | /** |
827 | | * fu_struct_cab_header_set_flags: (skip): |
828 | | **/ |
829 | | void |
830 | | fu_struct_cab_header_set_flags(FuStructCabHeader *st, guint16 value) |
831 | 0 | { |
832 | 0 | g_return_if_fail(st != NULL); |
833 | 0 | fu_memwrite_uint16(st->buf->data + 30, value, G_LITTLE_ENDIAN); |
834 | 0 | } |
835 | | /** |
836 | | * fu_struct_cab_header_set_set_id: (skip): |
837 | | **/ |
838 | | void |
839 | | fu_struct_cab_header_set_set_id(FuStructCabHeader *st, guint16 value) |
840 | 0 | { |
841 | 0 | g_return_if_fail(st != NULL); |
842 | 0 | fu_memwrite_uint16(st->buf->data + 32, value, G_LITTLE_ENDIAN); |
843 | 0 | } |
844 | | /** |
845 | | * fu_struct_cab_header_set_idx_cabinet: (skip): |
846 | | **/ |
847 | | void |
848 | | fu_struct_cab_header_set_idx_cabinet(FuStructCabHeader *st, guint16 value) |
849 | 0 | { |
850 | 0 | g_return_if_fail(st != NULL); |
851 | 0 | fu_memwrite_uint16(st->buf->data + 34, value, G_LITTLE_ENDIAN); |
852 | 0 | } |
853 | | /** |
854 | | * fu_struct_cab_header_new: (skip): |
855 | | **/ |
856 | | FuStructCabHeader * |
857 | | fu_struct_cab_header_new(void) |
858 | 102 | { |
859 | 102 | FuStructCabHeader *st = fu_struct_cab_header_new_internal(); |
860 | 102 | st->buf = g_byte_array_sized_new(36); |
861 | 102 | fu_byte_array_set_size(st->buf, 36, 0x0); |
862 | 102 | fu_struct_cab_header_set_signature(st, "MSCF", NULL); |
863 | 102 | fu_struct_cab_header_set_version_minor(st, 3); |
864 | 102 | fu_struct_cab_header_set_version_major(st, 1); |
865 | 102 | fu_struct_cab_header_set_nr_folders(st, 1); |
866 | 102 | return st; |
867 | 102 | } |
868 | | /** |
869 | | * fu_struct_cab_header_to_string: (skip): |
870 | | **/ |
871 | | static gchar * |
872 | | fu_struct_cab_header_to_string(const FuStructCabHeader *st) |
873 | 0 | { |
874 | 0 | g_autoptr(GString) str = g_string_new("FuStructCabHeader:\n"); |
875 | 0 | g_return_val_if_fail(st != NULL, NULL); |
876 | 0 | { |
877 | 0 | g_autofree gchar *tmp = fu_struct_cab_header_get_signature(st); |
878 | 0 | if (tmp != NULL) |
879 | 0 | g_string_append_printf(str, " signature: %s\n", tmp); |
880 | 0 | } |
881 | 0 | g_string_append_printf(str, " size: 0x%x\n", |
882 | 0 | (guint) fu_struct_cab_header_get_size(st)); |
883 | 0 | g_string_append_printf(str, " off_cffile: 0x%x\n", |
884 | 0 | (guint) fu_struct_cab_header_get_off_cffile(st)); |
885 | 0 | g_string_append_printf(str, " version_minor: 0x%x\n", |
886 | 0 | (guint) fu_struct_cab_header_get_version_minor(st)); |
887 | 0 | g_string_append_printf(str, " version_major: 0x%x\n", |
888 | 0 | (guint) fu_struct_cab_header_get_version_major(st)); |
889 | 0 | g_string_append_printf(str, " nr_folders: 0x%x\n", |
890 | 0 | (guint) fu_struct_cab_header_get_nr_folders(st)); |
891 | 0 | g_string_append_printf(str, " nr_files: 0x%x\n", |
892 | 0 | (guint) fu_struct_cab_header_get_nr_files(st)); |
893 | 0 | g_string_append_printf(str, " flags: 0x%x\n", |
894 | 0 | (guint) fu_struct_cab_header_get_flags(st)); |
895 | 0 | g_string_append_printf(str, " set_id: 0x%x\n", |
896 | 0 | (guint) fu_struct_cab_header_get_set_id(st)); |
897 | 0 | g_string_append_printf(str, " idx_cabinet: 0x%x\n", |
898 | 0 | (guint) fu_struct_cab_header_get_idx_cabinet(st)); |
899 | 0 | if (str->len > 0) |
900 | 0 | g_string_set_size(str, str->len - 1); |
901 | 0 | return g_string_free(g_steal_pointer(&str), FALSE); |
902 | 0 | } |
903 | | static gboolean |
904 | | fu_struct_cab_header_validate_internal(FuStructCabHeader *st, GError **error) |
905 | 2.64k | { |
906 | 2.64k | g_return_val_if_fail(st != NULL, FALSE); |
907 | 2.64k | if (strncmp((const gchar *) (st->buf->data + 0), "MSCF", 4) != 0) { |
908 | 43 | g_autofree gchar *str = fu_struct_cab_header_get_signature(st); |
909 | 43 | g_set_error(error, |
910 | 43 | FWUPD_ERROR, |
911 | 43 | FWUPD_ERROR_INVALID_DATA, |
912 | 43 | "constant FuStructCabHeader.signature was not valid, " |
913 | 43 | "expected 'MSCF' and got '%s'", |
914 | 43 | str); |
915 | 43 | return FALSE; |
916 | 43 | } |
917 | 2.59k | if (fu_struct_cab_header_get_version_minor(st) != 3) { |
918 | 8 | g_set_error_literal(error, |
919 | 8 | FWUPD_ERROR, |
920 | 8 | FWUPD_ERROR_INVALID_DATA, |
921 | 8 | "constant FuStructCabHeader.version_minor was not valid"); |
922 | 8 | return FALSE; |
923 | 8 | } |
924 | 2.58k | if (fu_struct_cab_header_get_version_major(st) != 1) { |
925 | 7 | g_set_error_literal(error, |
926 | 7 | FWUPD_ERROR, |
927 | 7 | FWUPD_ERROR_INVALID_DATA, |
928 | 7 | "constant FuStructCabHeader.version_major was not valid"); |
929 | 7 | return FALSE; |
930 | 7 | } |
931 | 2.58k | return TRUE; |
932 | 2.58k | } |
933 | | /** |
934 | | * fu_struct_cab_header_validate_stream: (skip): |
935 | | **/ |
936 | | gboolean |
937 | | fu_struct_cab_header_validate_stream(GInputStream *stream, gsize offset, GError **error) |
938 | 1.37k | { |
939 | 1.37k | g_autoptr(FuStructCabHeader) st = fu_struct_cab_header_new_internal(); |
940 | 1.37k | g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE); |
941 | 1.37k | g_return_val_if_fail(error == NULL || *error == NULL, FALSE); |
942 | 1.37k | st->buf = fu_input_stream_read_byte_array(stream, offset, 36, NULL, error); |
943 | 1.37k | if (st->buf == NULL) { |
944 | 0 | g_prefix_error(error, "FuStructCabHeader failed read of 0x%x: ", (guint) 36); |
945 | 0 | return FALSE; |
946 | 0 | } |
947 | 1.37k | if (st->buf->len != 36) { |
948 | 26 | g_set_error(error, |
949 | 26 | FWUPD_ERROR, |
950 | 26 | FWUPD_ERROR_INVALID_DATA, |
951 | 26 | "FuStructCabHeader requested 0x%x and got 0x%x", |
952 | 26 | (guint) 36, |
953 | 26 | (guint) st->buf->len); |
954 | 26 | return FALSE; |
955 | 26 | } |
956 | 1.34k | return fu_struct_cab_header_validate_internal(st, error); |
957 | 1.37k | } |
958 | | static gboolean |
959 | | fu_struct_cab_header_parse_internal(FuStructCabHeader *st, GError **error) |
960 | 1.29k | { |
961 | 1.29k | if (g_log_get_debug_enabled()) { |
962 | 0 | g_autofree gchar *str = fu_struct_cab_header_to_string(st); |
963 | 0 | g_debug("%s", str); |
964 | 0 | } |
965 | 1.29k | if (!fu_struct_cab_header_validate_internal(st, error)) |
966 | 0 | return FALSE; |
967 | 1.29k | return TRUE; |
968 | 1.29k | } |
969 | | /** |
970 | | * fu_struct_cab_header_parse_stream: (skip): |
971 | | **/ |
972 | | FuStructCabHeader * |
973 | | fu_struct_cab_header_parse_stream(GInputStream *stream, gsize offset, GError **error) |
974 | 1.29k | { |
975 | 1.29k | g_autoptr(FuStructCabHeader) st = fu_struct_cab_header_new_internal(); |
976 | 1.29k | st->buf = fu_input_stream_read_byte_array(stream, offset, 36, NULL, error); |
977 | 1.29k | if (st->buf == NULL) { |
978 | 0 | g_prefix_error(error, "FuStructCabHeader failed read of 0x%x: ", (guint) 36); |
979 | 0 | return NULL; |
980 | 0 | } |
981 | 1.29k | if (st->buf->len != 36) { |
982 | 0 | g_set_error(error, |
983 | 0 | FWUPD_ERROR, |
984 | 0 | FWUPD_ERROR_INVALID_DATA, |
985 | 0 | "FuStructCabHeader requested 0x%x and got 0x%x", |
986 | 0 | (guint) 36, |
987 | 0 | (guint) st->buf->len); |
988 | 0 | return NULL; |
989 | 0 | } |
990 | 1.29k | if (!fu_struct_cab_header_parse_internal(st, error)) |
991 | 0 | return NULL; |
992 | 1.29k | return g_steal_pointer(&st); |
993 | 1.29k | } |
994 | | /** |
995 | | * fu_struct_cab_header_reserve_ref: (skip): |
996 | | **/ |
997 | | FuStructCabHeaderReserve * |
998 | | fu_struct_cab_header_reserve_ref(FuStructCabHeaderReserve *st) |
999 | 0 | { |
1000 | 0 | g_return_val_if_fail(st != NULL, NULL); |
1001 | 0 | st->refcount++; |
1002 | 0 | return st; |
1003 | 0 | } |
1004 | | /** |
1005 | | * fu_struct_cab_header_reserve_unref: (skip): |
1006 | | **/ |
1007 | | void |
1008 | | fu_struct_cab_header_reserve_unref(FuStructCabHeaderReserve *st) |
1009 | 30 | { |
1010 | 30 | g_return_if_fail(st != NULL); |
1011 | 30 | if (st->refcount == 0) { |
1012 | 0 | g_critical("FuStructCabHeaderReserve refcount already zero"); |
1013 | 0 | return; |
1014 | 0 | } |
1015 | 30 | if (--st->refcount > 0) |
1016 | 0 | return; |
1017 | 30 | if (st->buf != NULL) |
1018 | 25 | g_byte_array_unref(st->buf); |
1019 | 30 | g_free(st); |
1020 | 30 | } |
1021 | | /** |
1022 | | * fu_struct_cab_header_reserve_new_internal: (skip): |
1023 | | **/ |
1024 | | static FuStructCabHeaderReserve * |
1025 | | fu_struct_cab_header_reserve_new_internal(void) |
1026 | 30 | { |
1027 | 30 | FuStructCabHeaderReserve *st = g_new0(FuStructCabHeaderReserve, 1); |
1028 | 30 | st->refcount = 1; |
1029 | 30 | return st; |
1030 | 30 | } |
1031 | | |
1032 | | /* getters */ |
1033 | | /** |
1034 | | * fu_struct_cab_header_reserve_get_rsvd_hdr: (skip): |
1035 | | **/ |
1036 | | guint16 |
1037 | | fu_struct_cab_header_reserve_get_rsvd_hdr(const FuStructCabHeaderReserve *st) |
1038 | 23 | { |
1039 | 23 | g_return_val_if_fail(st != NULL, 0x0); |
1040 | 23 | return fu_memread_uint16(st->buf->data + 0, G_LITTLE_ENDIAN); |
1041 | 23 | } |
1042 | | /** |
1043 | | * fu_struct_cab_header_reserve_get_rsvd_folder: (skip): |
1044 | | **/ |
1045 | | guint8 |
1046 | | fu_struct_cab_header_reserve_get_rsvd_folder(const FuStructCabHeaderReserve *st) |
1047 | 23 | { |
1048 | 23 | g_return_val_if_fail(st != NULL, 0x0); |
1049 | 23 | return st->buf->data[2]; |
1050 | 23 | } |
1051 | | /** |
1052 | | * fu_struct_cab_header_reserve_get_rsvd_block: (skip): |
1053 | | **/ |
1054 | | guint8 |
1055 | | fu_struct_cab_header_reserve_get_rsvd_block(const FuStructCabHeaderReserve *st) |
1056 | 23 | { |
1057 | 23 | g_return_val_if_fail(st != NULL, 0x0); |
1058 | 23 | return st->buf->data[3]; |
1059 | 23 | } |
1060 | | |
1061 | | /* setters */ |
1062 | | /** |
1063 | | * fu_struct_cab_header_reserve_set_rsvd_hdr: (skip): |
1064 | | **/ |
1065 | | void |
1066 | | fu_struct_cab_header_reserve_set_rsvd_hdr(FuStructCabHeaderReserve *st, guint16 value) |
1067 | 0 | { |
1068 | 0 | g_return_if_fail(st != NULL); |
1069 | 0 | fu_memwrite_uint16(st->buf->data + 0, value, G_LITTLE_ENDIAN); |
1070 | 0 | } |
1071 | | /** |
1072 | | * fu_struct_cab_header_reserve_set_rsvd_folder: (skip): |
1073 | | **/ |
1074 | | void |
1075 | | fu_struct_cab_header_reserve_set_rsvd_folder(FuStructCabHeaderReserve *st, guint8 value) |
1076 | 0 | { |
1077 | 0 | g_return_if_fail(st != NULL); |
1078 | 0 | st->buf->data[2] = value; |
1079 | 0 | } |
1080 | | /** |
1081 | | * fu_struct_cab_header_reserve_set_rsvd_block: (skip): |
1082 | | **/ |
1083 | | void |
1084 | | fu_struct_cab_header_reserve_set_rsvd_block(FuStructCabHeaderReserve *st, guint8 value) |
1085 | 0 | { |
1086 | 0 | g_return_if_fail(st != NULL); |
1087 | 0 | st->buf->data[3] = value; |
1088 | 0 | } |
1089 | | /** |
1090 | | * fu_struct_cab_header_reserve_new: (skip): |
1091 | | **/ |
1092 | | FuStructCabHeaderReserve * |
1093 | | fu_struct_cab_header_reserve_new(void) |
1094 | 0 | { |
1095 | 0 | FuStructCabHeaderReserve *st = fu_struct_cab_header_reserve_new_internal(); |
1096 | 0 | st->buf = g_byte_array_sized_new(4); |
1097 | 0 | fu_byte_array_set_size(st->buf, 4, 0x0); |
1098 | 0 | return st; |
1099 | 0 | } |
1100 | | /** |
1101 | | * fu_struct_cab_header_reserve_to_string: (skip): |
1102 | | **/ |
1103 | | static gchar * |
1104 | | fu_struct_cab_header_reserve_to_string(const FuStructCabHeaderReserve *st) |
1105 | 0 | { |
1106 | 0 | g_autoptr(GString) str = g_string_new("FuStructCabHeaderReserve:\n"); |
1107 | 0 | g_return_val_if_fail(st != NULL, NULL); |
1108 | 0 | g_string_append_printf(str, " rsvd_hdr: 0x%x\n", |
1109 | 0 | (guint) fu_struct_cab_header_reserve_get_rsvd_hdr(st)); |
1110 | 0 | g_string_append_printf(str, " rsvd_folder: 0x%x\n", |
1111 | 0 | (guint) fu_struct_cab_header_reserve_get_rsvd_folder(st)); |
1112 | 0 | g_string_append_printf(str, " rsvd_block: 0x%x\n", |
1113 | 0 | (guint) fu_struct_cab_header_reserve_get_rsvd_block(st)); |
1114 | 0 | if (str->len > 0) |
1115 | 0 | g_string_set_size(str, str->len - 1); |
1116 | 0 | return g_string_free(g_steal_pointer(&str), FALSE); |
1117 | 0 | } |
1118 | | static gboolean |
1119 | | fu_struct_cab_header_reserve_parse_internal(FuStructCabHeaderReserve *st, GError **error) |
1120 | 23 | { |
1121 | 23 | if (g_log_get_debug_enabled()) { |
1122 | 0 | g_autofree gchar *str = fu_struct_cab_header_reserve_to_string(st); |
1123 | 0 | g_debug("%s", str); |
1124 | 0 | } |
1125 | 23 | return TRUE; |
1126 | 23 | } |
1127 | | /** |
1128 | | * fu_struct_cab_header_reserve_parse_stream: (skip): |
1129 | | **/ |
1130 | | FuStructCabHeaderReserve * |
1131 | | fu_struct_cab_header_reserve_parse_stream(GInputStream *stream, gsize offset, GError **error) |
1132 | 30 | { |
1133 | 30 | g_autoptr(FuStructCabHeaderReserve) st = fu_struct_cab_header_reserve_new_internal(); |
1134 | 30 | st->buf = fu_input_stream_read_byte_array(stream, offset, 4, NULL, error); |
1135 | 30 | if (st->buf == NULL) { |
1136 | 5 | g_prefix_error(error, "FuStructCabHeaderReserve failed read of 0x%x: ", (guint) 4); |
1137 | 5 | return NULL; |
1138 | 5 | } |
1139 | 25 | if (st->buf->len != 4) { |
1140 | 2 | g_set_error(error, |
1141 | 2 | FWUPD_ERROR, |
1142 | 2 | FWUPD_ERROR_INVALID_DATA, |
1143 | 2 | "FuStructCabHeaderReserve requested 0x%x and got 0x%x", |
1144 | 2 | (guint) 4, |
1145 | 2 | (guint) st->buf->len); |
1146 | 2 | return NULL; |
1147 | 2 | } |
1148 | 23 | if (!fu_struct_cab_header_reserve_parse_internal(st, error)) |
1149 | 0 | return NULL; |
1150 | 23 | return g_steal_pointer(&st); |
1151 | 23 | } |