Coverage Report

Created: 2026-07-30 07:09

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
29
{
33
29
    if (val == FU_CAB_COMPRESSION_NONE)
34
0
        return "none";
35
29
    if (val == FU_CAB_COMPRESSION_MSZIP)
36
0
        return "mszip";
37
29
    if (val == FU_CAB_COMPRESSION_QUANTUM)
38
1
        return "quantum";
39
28
    if (val == FU_CAB_COMPRESSION_LZX)
40
1
        return "lzx";
41
27
    return NULL;
42
28
}
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.1k
{
87
10.1k
    g_return_if_fail(st != NULL);
88
10.1k
    if (st->refcount == 0) {
89
0
        g_critical("FuStructCabData refcount already zero");
90
0
        return;
91
0
    }
92
10.1k
    if (--st->refcount > 0)
93
0
        return;
94
10.1k
    if (st->buf != NULL)
95
10.1k
        g_byte_array_unref(st->buf);
96
10.1k
    g_free(st);
97
10.1k
}
98
/**
99
 * fu_struct_cab_data_new_internal: (skip):
100
 **/
101
static FuStructCabData *
102
fu_struct_cab_data_new_internal(void)
103
10.1k
{
104
10.1k
    FuStructCabData *st = g_new0(FuStructCabData, 1);
105
10.1k
    st->refcount = 1;
106
10.1k
    return st;
107
10.1k
}
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.0k
{
125
10.0k
    g_return_val_if_fail(st != NULL, 0x0);
126
10.0k
    return fu_memread_uint16(st->buf->data + 4, G_LITTLE_ENDIAN);
127
10.0k
}
128
/**
129
 * fu_struct_cab_data_get_uncomp: (skip):
130
 **/
131
guint16
132
fu_struct_cab_data_get_uncomp(const FuStructCabData *st)
133
10.0k
{
134
10.0k
    g_return_val_if_fail(st != NULL, 0x0);
135
10.0k
    return fu_memread_uint16(st->buf->data + 6, G_LITTLE_ENDIAN);
136
10.0k
}
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.0k
{
198
10.0k
    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.0k
    return TRUE;
203
10.0k
}
204
/**
205
 * fu_struct_cab_data_parse_stream: (skip):
206
 **/
207
FuStructCabData *
208
fu_struct_cab_data_parse_stream(FuInputStream *stream, gsize offset, GError **error)
209
10.1k
{
210
10.1k
    g_autoptr(FuStructCabData) st = fu_struct_cab_data_new_internal();
211
10.1k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error);
212
10.1k
    if (st->buf == NULL) {
213
85
        g_prefix_error(error, "FuStructCabData failed read of 0x%x: ", (guint) 8);
214
85
        return NULL;
215
85
    }
216
10.1k
    if (st->buf->len != 8) {
217
28
        g_set_error(error,
218
28
                    FWUPD_ERROR,
219
28
                    FWUPD_ERROR_INVALID_DATA,
220
28
                    "FuStructCabData requested 0x%x and got 0x%x",
221
28
                    (guint) 8,
222
28
                    (guint) st->buf->len);
223
28
        return NULL;
224
28
    }
225
10.0k
    if (!fu_struct_cab_data_parse_internal(st, error))
226
0
        return NULL;
227
10.0k
    return g_steal_pointer(&st);
228
10.0k
}
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
12.6k
{
245
12.6k
    g_return_if_fail(st != NULL);
246
12.6k
    if (st->refcount == 0) {
247
0
        g_critical("FuStructCabFile refcount already zero");
248
0
        return;
249
0
    }
250
12.6k
    if (--st->refcount > 0)
251
0
        return;
252
12.6k
    if (st->buf != NULL)
253
12.3k
        g_byte_array_unref(st->buf);
254
12.6k
    g_free(st);
255
12.6k
}
256
/**
257
 * fu_struct_cab_file_new_internal: (skip):
258
 **/
259
static FuStructCabFile *
260
fu_struct_cab_file_new_internal(void)
261
12.6k
{
262
12.6k
    FuStructCabFile *st = g_new0(FuStructCabFile, 1);
263
12.6k
    st->refcount = 1;
264
12.6k
    return st;
265
12.6k
}
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
24.4k
{
274
24.4k
    g_return_val_if_fail(st != NULL, 0x0);
275
24.4k
    return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN);
276
24.4k
}
277
/**
278
 * fu_struct_cab_file_get_uoffset: (skip):
279
 **/
280
guint32
281
fu_struct_cab_file_get_uoffset(const FuStructCabFile *st)
282
24.4k
{
283
24.4k
    g_return_val_if_fail(st != NULL, 0x0);
284
24.4k
    return fu_memread_uint32(st->buf->data + 4, G_LITTLE_ENDIAN);
285
24.4k
}
286
/**
287
 * fu_struct_cab_file_get_index: (skip):
288
 **/
289
guint16
290
fu_struct_cab_file_get_index(const FuStructCabFile *st)
291
12.3k
{
292
12.3k
    g_return_val_if_fail(st != NULL, 0x0);
293
12.3k
    return fu_memread_uint16(st->buf->data + 8, G_LITTLE_ENDIAN);
294
12.3k
}
295
/**
296
 * fu_struct_cab_file_get_date: (skip):
297
 **/
298
guint16
299
fu_struct_cab_file_get_date(const FuStructCabFile *st)
300
12.0k
{
301
12.0k
    g_return_val_if_fail(st != NULL, 0x0);
302
12.0k
    return fu_memread_uint16(st->buf->data + 10, G_LITTLE_ENDIAN);
303
12.0k
}
304
/**
305
 * fu_struct_cab_file_get_time: (skip):
306
 **/
307
guint16
308
fu_struct_cab_file_get_time(const FuStructCabFile *st)
309
12.0k
{
310
12.0k
    g_return_val_if_fail(st != NULL, 0x0);
311
12.0k
    return fu_memread_uint16(st->buf->data + 12, G_LITTLE_ENDIAN);
312
12.0k
}
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
12.3k
{
422
12.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
12.3k
    return TRUE;
427
12.3k
}
428
/**
429
 * fu_struct_cab_file_parse_stream: (skip):
430
 **/
431
FuStructCabFile *
432
fu_struct_cab_file_parse_stream(FuInputStream *stream, gsize offset, GError **error)
433
12.6k
{
434
12.6k
    g_autoptr(FuStructCabFile) st = fu_struct_cab_file_new_internal();
435
12.6k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 16, NULL, error);
436
12.6k
    if (st->buf == NULL) {
437
271
        g_prefix_error(error, "FuStructCabFile failed read of 0x%x: ", (guint) 16);
438
271
        return NULL;
439
271
    }
440
12.3k
    if (st->buf->len != 16) {
441
80
        g_set_error(error,
442
80
                    FWUPD_ERROR,
443
80
                    FWUPD_ERROR_INVALID_DATA,
444
80
                    "FuStructCabFile requested 0x%x and got 0x%x",
445
80
                    (guint) 16,
446
80
                    (guint) st->buf->len);
447
80
        return NULL;
448
80
    }
449
12.3k
    if (!fu_struct_cab_file_parse_internal(st, error))
450
0
        return NULL;
451
12.3k
    return g_steal_pointer(&st);
452
12.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.95k
{
469
2.95k
    g_return_if_fail(st != NULL);
470
2.95k
    if (st->refcount == 0) {
471
0
        g_critical("FuStructCabFolder refcount already zero");
472
0
        return;
473
0
    }
474
2.95k
    if (--st->refcount > 0)
475
0
        return;
476
2.95k
    if (st->buf != NULL)
477
2.90k
        g_byte_array_unref(st->buf);
478
2.95k
    g_free(st);
479
2.95k
}
480
/**
481
 * fu_struct_cab_folder_new_internal: (skip):
482
 **/
483
static FuStructCabFolder *
484
fu_struct_cab_folder_new_internal(void)
485
2.95k
{
486
2.95k
    FuStructCabFolder *st = g_new0(FuStructCabFolder, 1);
487
2.95k
    st->refcount = 1;
488
2.95k
    return st;
489
2.95k
}
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.74k
{
498
2.74k
    g_return_val_if_fail(st != NULL, 0x0);
499
2.74k
    return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN);
500
2.74k
}
501
/**
502
 * fu_struct_cab_folder_get_ndatab: (skip):
503
 **/
504
guint16
505
fu_struct_cab_folder_get_ndatab(const FuStructCabFolder *st)
506
15.3k
{
507
15.3k
    g_return_val_if_fail(st != NULL, 0x0);
508
15.3k
    return fu_memread_uint16(st->buf->data + 4, G_LITTLE_ENDIAN);
509
15.3k
}
510
/**
511
 * fu_struct_cab_folder_get_compression: (skip):
512
 **/
513
FuCabCompression
514
fu_struct_cab_folder_get_compression(const FuStructCabFolder *st)
515
2.77k
{
516
2.77k
    g_return_val_if_fail(st != NULL, 0x0);
517
2.77k
    return fu_memread_uint16(st->buf->data + 6, G_LITTLE_ENDIAN);
518
2.77k
}
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
120
{
554
120
    FuStructCabFolder *st = fu_struct_cab_folder_new_internal();
555
120
    st->buf = g_byte_array_sized_new(8);
556
120
    fu_byte_array_set_size(st->buf, 8, 0x0);
557
120
    return st;
558
120
}
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.77k
{
586
2.77k
    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.77k
    return TRUE;
591
2.77k
}
592
/**
593
 * fu_struct_cab_folder_parse_stream: (skip):
594
 **/
595
FuStructCabFolder *
596
fu_struct_cab_folder_parse_stream(FuInputStream *stream, gsize offset, GError **error)
597
2.83k
{
598
2.83k
    g_autoptr(FuStructCabFolder) st = fu_struct_cab_folder_new_internal();
599
2.83k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error);
600
2.83k
    if (st->buf == NULL) {
601
56
        g_prefix_error(error, "FuStructCabFolder failed read of 0x%x: ", (guint) 8);
602
56
        return NULL;
603
56
    }
604
2.78k
    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.77k
    if (!fu_struct_cab_folder_parse_internal(st, error))
614
0
        return NULL;
615
2.77k
    return g_steal_pointer(&st);
616
2.77k
}
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.67k
{
633
2.67k
    g_return_if_fail(st != NULL);
634
2.67k
    if (st->refcount == 0) {
635
0
        g_critical("FuStructCabHeader refcount already zero");
636
0
        return;
637
0
    }
638
2.67k
    if (--st->refcount > 0)
639
0
        return;
640
2.67k
    if (st->buf != NULL)
641
2.67k
        g_byte_array_unref(st->buf);
642
2.67k
    g_free(st);
643
2.67k
}
644
/**
645
 * fu_struct_cab_header_new_internal: (skip):
646
 **/
647
static FuStructCabHeader *
648
fu_struct_cab_header_new_internal(void)
649
2.67k
{
650
2.67k
    FuStructCabHeader *st = g_new0(FuStructCabHeader, 1);
651
2.67k
    st->refcount = 1;
652
2.67k
    return st;
653
2.67k
}
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.26k
{
671
1.26k
    g_return_val_if_fail(st != NULL, 0x0);
672
1.26k
    return fu_memread_uint32(st->buf->data + 8, G_LITTLE_ENDIAN);
673
1.26k
}
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.17k
{
680
1.17k
    g_return_val_if_fail(st != NULL, 0x0);
681
1.17k
    return fu_memread_uint32(st->buf->data + 16, G_LITTLE_ENDIAN);
682
1.17k
}
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.48k
{
689
2.48k
    g_return_val_if_fail(st != NULL, 0x0);
690
2.48k
    return st->buf->data[24];
691
2.48k
}
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.48k
{
698
2.48k
    g_return_val_if_fail(st != NULL, 0x0);
699
2.48k
    return st->buf->data[25];
700
2.48k
}
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
5.92k
{
707
5.92k
    g_return_val_if_fail(st != NULL, 0x0);
708
5.92k
    return fu_memread_uint16(st->buf->data + 26, G_LITTLE_ENDIAN);
709
5.92k
}
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
15.1k
{
716
15.1k
    g_return_val_if_fail(st != NULL, 0x0);
717
15.1k
    return fu_memread_uint16(st->buf->data + 28, G_LITTLE_ENDIAN);
718
15.1k
}
719
/**
720
 * fu_struct_cab_header_get_flags: (skip):
721
 **/
722
guint16
723
fu_struct_cab_header_get_flags(const FuStructCabHeader *st)
724
1.14k
{
725
1.14k
    g_return_val_if_fail(st != NULL, 0x0);
726
1.14k
    return fu_memread_uint16(st->buf->data + 30, G_LITTLE_ENDIAN);
727
1.14k
}
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.21k
{
743
1.21k
    g_return_val_if_fail(st != NULL, 0x0);
744
1.21k
    return fu_memread_uint16(st->buf->data + 34, G_LITTLE_ENDIAN);
745
1.21k
}
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
120
{
754
120
    gsize len;
755
120
    g_return_val_if_fail(st != NULL, FALSE);
756
120
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
757
120
    if (value == NULL) {
758
0
        memset(st->buf->data + 0, 0x0, 4);
759
0
        return TRUE;
760
0
    }
761
120
    len = strlen(value);
762
120
    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
120
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
771
120
}
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
120
{
796
120
    g_return_if_fail(st != NULL);
797
120
    st->buf->data[24] = value;
798
120
}
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
120
{
805
120
    g_return_if_fail(st != NULL);
806
120
    st->buf->data[25] = value;
807
120
}
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
120
{
814
120
    g_return_if_fail(st != NULL);
815
120
    fu_memwrite_uint16(st->buf->data + 26, value, G_LITTLE_ENDIAN);
816
120
}
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
120
{
859
120
    FuStructCabHeader *st = fu_struct_cab_header_new_internal();
860
120
    st->buf = g_byte_array_sized_new(36);
861
120
    fu_byte_array_set_size(st->buf, 36, 0x0);
862
120
    fu_struct_cab_header_set_signature(st, "MSCF", NULL);
863
120
    fu_struct_cab_header_set_version_minor(st, 3);
864
120
    fu_struct_cab_header_set_version_major(st, 1);
865
120
    fu_struct_cab_header_set_nr_folders(st, 1);
866
120
    return st;
867
120
}
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.53k
{
906
2.53k
    g_return_val_if_fail(st != NULL, FALSE);
907
2.53k
    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.48k
    if (fu_struct_cab_header_get_version_minor(st) != 3) {
918
7
        g_set_error_literal(error,
919
7
                            FWUPD_ERROR,
920
7
                            FWUPD_ERROR_INVALID_DATA,
921
7
                            "constant FuStructCabHeader.version_minor was not valid");
922
7
        return FALSE;
923
7
    }
924
2.48k
    if (fu_struct_cab_header_get_version_major(st) != 1) {
925
5
        g_set_error_literal(error,
926
5
                            FWUPD_ERROR,
927
5
                            FWUPD_ERROR_INVALID_DATA,
928
5
                            "constant FuStructCabHeader.version_major was not valid");
929
5
        return FALSE;
930
5
    }
931
2.47k
    return TRUE;
932
2.48k
}
933
/**
934
 * fu_struct_cab_header_validate_stream: (skip):
935
 **/
936
gboolean
937
fu_struct_cab_header_validate_stream(FuInputStream *stream, gsize offset, GError **error)
938
1.31k
{
939
1.31k
    g_autoptr(FuStructCabHeader) st = fu_struct_cab_header_new_internal();
940
1.31k
    g_return_val_if_fail(FU_IS_INPUT_STREAM(stream), FALSE);
941
1.31k
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
942
1.31k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 36, NULL, error);
943
1.31k
    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.31k
    if (st->buf->len != 36) {
948
24
        g_set_error(error,
949
24
                    FWUPD_ERROR,
950
24
                    FWUPD_ERROR_INVALID_DATA,
951
24
                    "FuStructCabHeader requested 0x%x and got 0x%x",
952
24
                    (guint) 36,
953
24
                    (guint) st->buf->len);
954
24
        return FALSE;
955
24
    }
956
1.29k
    return fu_struct_cab_header_validate_internal(st, error);
957
1.31k
}
958
static gboolean
959
fu_struct_cab_header_parse_internal(FuStructCabHeader *st, GError **error)
960
1.23k
{
961
1.23k
    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.23k
    if (!fu_struct_cab_header_validate_internal(st, error))
966
0
        return FALSE;
967
1.23k
    return TRUE;
968
1.23k
}
969
/**
970
 * fu_struct_cab_header_parse_stream: (skip):
971
 **/
972
FuStructCabHeader *
973
fu_struct_cab_header_parse_stream(FuInputStream *stream, gsize offset, GError **error)
974
1.23k
{
975
1.23k
    g_autoptr(FuStructCabHeader) st = fu_struct_cab_header_new_internal();
976
1.23k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 36, NULL, error);
977
1.23k
    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.23k
    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.23k
    if (!fu_struct_cab_header_parse_internal(st, error))
991
0
        return NULL;
992
1.23k
    return g_steal_pointer(&st);
993
1.23k
}
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
32
{
1010
32
    g_return_if_fail(st != NULL);
1011
32
    if (st->refcount == 0) {
1012
0
        g_critical("FuStructCabHeaderReserve refcount already zero");
1013
0
        return;
1014
0
    }
1015
32
    if (--st->refcount > 0)
1016
0
        return;
1017
32
    if (st->buf != NULL)
1018
27
        g_byte_array_unref(st->buf);
1019
32
    g_free(st);
1020
32
}
1021
/**
1022
 * fu_struct_cab_header_reserve_new_internal: (skip):
1023
 **/
1024
static FuStructCabHeaderReserve *
1025
fu_struct_cab_header_reserve_new_internal(void)
1026
32
{
1027
32
    FuStructCabHeaderReserve *st = g_new0(FuStructCabHeaderReserve, 1);
1028
32
    st->refcount = 1;
1029
32
    return st;
1030
32
}
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
25
{
1039
25
    g_return_val_if_fail(st != NULL, 0x0);
1040
25
    return fu_memread_uint16(st->buf->data + 0, G_LITTLE_ENDIAN);
1041
25
}
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
25
{
1048
25
    g_return_val_if_fail(st != NULL, 0x0);
1049
25
    return st->buf->data[2];
1050
25
}
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
25
{
1057
25
    g_return_val_if_fail(st != NULL, 0x0);
1058
25
    return st->buf->data[3];
1059
25
}
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
25
{
1121
25
    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
25
    return TRUE;
1126
25
}
1127
/**
1128
 * fu_struct_cab_header_reserve_parse_stream: (skip):
1129
 **/
1130
FuStructCabHeaderReserve *
1131
fu_struct_cab_header_reserve_parse_stream(FuInputStream *stream, gsize offset, GError **error)
1132
32
{
1133
32
    g_autoptr(FuStructCabHeaderReserve) st = fu_struct_cab_header_reserve_new_internal();
1134
32
    st->buf = fu_input_stream_read_byte_array(stream, offset, 4, NULL, error);
1135
32
    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
27
    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
25
    if (!fu_struct_cab_header_reserve_parse_internal(st, error))
1149
0
        return NULL;
1150
25
    return g_steal_pointer(&st);
1151
25
}