Coverage Report

Created: 2026-02-26 06:27

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