Coverage Report

Created: 2026-06-15 06:54

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/fu-cab-struct.c
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
}