Coverage Report

Created: 2025-11-24 06:59

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