Coverage Report

Created: 2026-01-09 07:21

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