Coverage Report

Created: 2025-12-14 06:56

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
72
{
32
72
    if (val == FU_CAB_COMPRESSION_NONE)
33
0
        return "none";
34
72
    if (val == FU_CAB_COMPRESSION_MSZIP)
35
0
        return "mszip";
36
72
    if (val == FU_CAB_COMPRESSION_QUANTUM)
37
3
        return "quantum";
38
69
    if (val == FU_CAB_COMPRESSION_LZX)
39
4
        return "lzx";
40
65
    return NULL;
41
69
}
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
814k
{
86
814k
    g_return_if_fail(st != NULL);
87
814k
    if (st->refcount == 0) {
88
0
        g_critical("FuStructCabData refcount already zero");
89
0
        return;
90
0
    }
91
814k
    if (--st->refcount > 0)
92
0
        return;
93
814k
    if (st->buf != NULL)
94
814k
        g_byte_array_unref(st->buf);
95
814k
    g_free(st);
96
814k
}
97
/**
98
 * fu_struct_cab_data_new_internal: (skip):
99
 **/
100
static FuStructCabData *
101
fu_struct_cab_data_new_internal(void)
102
814k
{
103
814k
    FuStructCabData *st = g_new0(FuStructCabData, 1);
104
814k
    st->refcount = 1;
105
814k
    return st;
106
814k
}
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
814k
{
124
814k
    g_return_val_if_fail(st != NULL, 0x0);
125
814k
    return fu_memread_uint16(st->buf->data + 4, G_LITTLE_ENDIAN);
126
814k
}
127
/**
128
 * fu_struct_cab_data_get_uncomp: (skip):
129
 **/
130
guint16
131
fu_struct_cab_data_get_uncomp(const FuStructCabData *st)
132
814k
{
133
814k
    g_return_val_if_fail(st != NULL, 0x0);
134
814k
    return fu_memread_uint16(st->buf->data + 6, G_LITTLE_ENDIAN);
135
814k
}
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
814k
{
197
814k
    g_return_val_if_fail(st != NULL, FALSE);
198
814k
    return TRUE;
199
814k
}
200
static gboolean
201
fu_struct_cab_data_parse_internal(FuStructCabData *st, GError **error)
202
814k
{
203
814k
    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
814k
    if (!fu_struct_cab_data_validate_internal(st, error))
208
0
        return FALSE;
209
814k
    return TRUE;
210
814k
}
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
814k
{
217
814k
    g_autoptr(FuStructCabData) st = fu_struct_cab_data_new_internal();
218
814k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error);
219
814k
    if (st->buf == NULL) {
220
109
        g_prefix_error(error, "FuStructCabData failed read of 0x%x: ", (guint) 8);
221
109
        return NULL;
222
109
    }
223
814k
    if (st->buf->len != 8) {
224
18
        g_set_error(error,
225
18
                    FWUPD_ERROR,
226
18
                    FWUPD_ERROR_INVALID_DATA,
227
18
                    "FuStructCabData requested 0x%x and got 0x%x",
228
18
                    (guint) 8,
229
18
                    (guint) st->buf->len);
230
18
        return NULL;
231
18
    }
232
814k
    if (!fu_struct_cab_data_parse_internal(st, error))
233
0
        return NULL;
234
814k
    return g_steal_pointer(&st);
235
814k
}
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.4k
{
252
14.4k
    g_return_if_fail(st != NULL);
253
14.4k
    if (st->refcount == 0) {
254
0
        g_critical("FuStructCabFile refcount already zero");
255
0
        return;
256
0
    }
257
14.4k
    if (--st->refcount > 0)
258
0
        return;
259
14.4k
    if (st->buf != NULL)
260
14.0k
        g_byte_array_unref(st->buf);
261
14.4k
    g_free(st);
262
14.4k
}
263
/**
264
 * fu_struct_cab_file_new_internal: (skip):
265
 **/
266
static FuStructCabFile *
267
fu_struct_cab_file_new_internal(void)
268
14.4k
{
269
14.4k
    FuStructCabFile *st = g_new0(FuStructCabFile, 1);
270
14.4k
    st->refcount = 1;
271
14.4k
    return st;
272
14.4k
}
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.6k
{
308
13.6k
    g_return_val_if_fail(st != NULL, 0x0);
309
13.6k
    return fu_memread_uint16(st->buf->data + 10, G_LITTLE_ENDIAN);
310
13.6k
}
311
/**
312
 * fu_struct_cab_file_get_time: (skip):
313
 **/
314
guint16
315
fu_struct_cab_file_get_time(const FuStructCabFile *st)
316
13.6k
{
317
13.6k
    g_return_val_if_fail(st != NULL, 0x0);
318
13.6k
    return fu_memread_uint16(st->buf->data + 12, G_LITTLE_ENDIAN);
319
13.6k
}
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.4k
{
449
14.4k
    g_autoptr(FuStructCabFile) st = fu_struct_cab_file_new_internal();
450
14.4k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 16, NULL, error);
451
14.4k
    if (st->buf == NULL) {
452
372
        g_prefix_error(error, "FuStructCabFile failed read of 0x%x: ", (guint) 16);
453
372
        return NULL;
454
372
    }
455
14.0k
    if (st->buf->len != 16) {
456
67
        g_set_error(error,
457
67
                    FWUPD_ERROR,
458
67
                    FWUPD_ERROR_INVALID_DATA,
459
67
                    "FuStructCabFile requested 0x%x and got 0x%x",
460
67
                    (guint) 16,
461
67
                    (guint) st->buf->len);
462
67
        return NULL;
463
67
    }
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.80k
{
484
6.80k
    g_return_if_fail(st != NULL);
485
6.80k
    if (st->refcount == 0) {
486
0
        g_critical("FuStructCabFolder refcount already zero");
487
0
        return;
488
0
    }
489
6.80k
    if (--st->refcount > 0)
490
0
        return;
491
6.80k
    if (st->buf != NULL)
492
6.68k
        g_byte_array_unref(st->buf);
493
6.80k
    g_free(st);
494
6.80k
}
495
/**
496
 * fu_struct_cab_folder_new_internal: (skip):
497
 **/
498
static FuStructCabFolder *
499
fu_struct_cab_folder_new_internal(void)
500
6.80k
{
501
6.80k
    FuStructCabFolder *st = g_new0(FuStructCabFolder, 1);
502
6.80k
    st->refcount = 1;
503
6.80k
    return st;
504
6.80k
}
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.46k
{
513
6.46k
    g_return_val_if_fail(st != NULL, 0x0);
514
6.46k
    return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN);
515
6.46k
}
516
/**
517
 * fu_struct_cab_folder_get_ndatab: (skip):
518
 **/
519
guint16
520
fu_struct_cab_folder_get_ndatab(const FuStructCabFolder *st)
521
826k
{
522
826k
    g_return_val_if_fail(st != NULL, 0x0);
523
826k
    return fu_memread_uint16(st->buf->data + 4, G_LITTLE_ENDIAN);
524
826k
}
525
/**
526
 * fu_struct_cab_folder_get_compression: (skip):
527
 **/
528
FuCabCompression
529
fu_struct_cab_folder_get_compression(const FuStructCabFolder *st)
530
6.53k
{
531
6.53k
    g_return_val_if_fail(st != NULL, 0x0);
532
6.53k
    return fu_memread_uint16(st->buf->data + 6, G_LITTLE_ENDIAN);
533
6.53k
}
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
103
{
569
103
    FuStructCabFolder *st = fu_struct_cab_folder_new_internal();
570
103
    st->buf = g_byte_array_sized_new(8);
571
103
    fu_byte_array_set_size(st->buf, 8, 0x0);
572
103
    return st;
573
103
}
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.55k
{
601
6.55k
    g_return_val_if_fail(st != NULL, FALSE);
602
6.55k
    return TRUE;
603
6.55k
}
604
static gboolean
605
fu_struct_cab_folder_parse_internal(FuStructCabFolder *st, GError **error)
606
6.55k
{
607
6.55k
    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.55k
    if (!fu_struct_cab_folder_validate_internal(st, error))
612
0
        return FALSE;
613
6.55k
    return TRUE;
614
6.55k
}
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.69k
{
621
6.69k
    g_autoptr(FuStructCabFolder) st = fu_struct_cab_folder_new_internal();
622
6.69k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error);
623
6.69k
    if (st->buf == NULL) {
624
111
        g_prefix_error(error, "FuStructCabFolder failed read of 0x%x: ", (guint) 8);
625
111
        return NULL;
626
111
    }
627
6.58k
    if (st->buf->len != 8) {
628
34
        g_set_error(error,
629
34
                    FWUPD_ERROR,
630
34
                    FWUPD_ERROR_INVALID_DATA,
631
34
                    "FuStructCabFolder requested 0x%x and got 0x%x",
632
34
                    (guint) 8,
633
34
                    (guint) st->buf->len);
634
34
        return NULL;
635
34
    }
636
6.55k
    if (!fu_struct_cab_folder_parse_internal(st, error))
637
0
        return NULL;
638
6.55k
    return g_steal_pointer(&st);
639
6.55k
}
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
185k
{
656
185k
    g_return_if_fail(st != NULL);
657
185k
    if (st->refcount == 0) {
658
0
        g_critical("FuStructCabHeader refcount already zero");
659
0
        return;
660
0
    }
661
185k
    if (--st->refcount > 0)
662
0
        return;
663
185k
    if (st->buf != NULL)
664
185k
        g_byte_array_unref(st->buf);
665
185k
    g_free(st);
666
185k
}
667
/**
668
 * fu_struct_cab_header_new_internal: (skip):
669
 **/
670
static FuStructCabHeader *
671
fu_struct_cab_header_new_internal(void)
672
185k
{
673
185k
    FuStructCabHeader *st = g_new0(FuStructCabHeader, 1);
674
185k
    st->refcount = 1;
675
185k
    return st;
676
185k
}
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
175k
{
685
175k
    g_return_val_if_fail(st != NULL, NULL);
686
175k
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 4, NULL);
687
175k
}
688
/**
689
 * fu_struct_cab_header_get_size: (skip):
690
 **/
691
guint32
692
fu_struct_cab_header_get_size(const FuStructCabHeader *st)
693
2.40k
{
694
2.40k
    g_return_val_if_fail(st != NULL, 0x0);
695
2.40k
    return fu_memread_uint32(st->buf->data + 8, G_LITTLE_ENDIAN);
696
2.40k
}
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.24k
{
703
2.24k
    g_return_val_if_fail(st != NULL, 0x0);
704
2.24k
    return fu_memread_uint32(st->buf->data + 16, G_LITTLE_ENDIAN);
705
2.24k
}
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.24k
{
712
5.24k
    g_return_val_if_fail(st != NULL, 0x0);
713
5.24k
    return st->buf->data[24];
714
5.24k
}
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.95k
{
721
4.95k
    g_return_val_if_fail(st != NULL, 0x0);
722
4.95k
    return st->buf->data[25];
723
4.95k
}
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.17k
{
748
2.17k
    g_return_val_if_fail(st != NULL, 0x0);
749
2.17k
    return fu_memread_uint16(st->buf->data + 30, G_LITTLE_ENDIAN);
750
2.17k
}
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.32k
{
766
2.32k
    g_return_val_if_fail(st != NULL, 0x0);
767
2.32k
    return fu_memread_uint16(st->buf->data + 34, G_LITTLE_ENDIAN);
768
2.32k
}
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
103
{
777
103
    gsize len;
778
103
    g_return_val_if_fail(st != NULL, FALSE);
779
103
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
780
103
    if (value == NULL) {
781
0
        memset(st->buf->data + 0, 0x0, 4);
782
0
        return TRUE;
783
0
    }
784
103
    len = strlen(value);
785
103
    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
103
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
794
103
}
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
103
{
819
103
    g_return_if_fail(st != NULL);
820
103
    st->buf->data[24] = value;
821
103
}
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
103
{
828
103
    g_return_if_fail(st != NULL);
829
103
    st->buf->data[25] = value;
830
103
}
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
103
{
837
103
    g_return_if_fail(st != NULL);
838
103
    fu_memwrite_uint16(st->buf->data + 26, value, G_LITTLE_ENDIAN);
839
103
}
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
103
{
882
103
    FuStructCabHeader *st = fu_struct_cab_header_new_internal();
883
103
    st->buf = g_byte_array_sized_new(36);
884
103
    fu_byte_array_set_size(st->buf, 36, 0x0);
885
103
    fu_struct_cab_header_set_signature(st, "MSCF", NULL);
886
103
    fu_struct_cab_header_set_version_minor(st, 3);
887
103
    fu_struct_cab_header_set_version_major(st, 1);
888
103
    fu_struct_cab_header_set_nr_folders(st, 1);
889
103
    return st;
890
103
}
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
    g_string_append_printf(str, "  size: 0x%x\n",
900
0
                           (guint) fu_struct_cab_header_get_size(st));
901
0
    g_string_append_printf(str, "  off_cffile: 0x%x\n",
902
0
                           (guint) fu_struct_cab_header_get_off_cffile(st));
903
0
    g_string_append_printf(str, "  nr_folders: 0x%x\n",
904
0
                           (guint) fu_struct_cab_header_get_nr_folders(st));
905
0
    g_string_append_printf(str, "  nr_files: 0x%x\n",
906
0
                           (guint) fu_struct_cab_header_get_nr_files(st));
907
0
    g_string_append_printf(str, "  flags: 0x%x\n",
908
0
                           (guint) fu_struct_cab_header_get_flags(st));
909
0
    g_string_append_printf(str, "  set_id: 0x%x\n",
910
0
                           (guint) fu_struct_cab_header_get_set_id(st));
911
0
    g_string_append_printf(str, "  idx_cabinet: 0x%x\n",
912
0
                           (guint) fu_struct_cab_header_get_idx_cabinet(st));
913
0
    if (str->len > 0)
914
0
        g_string_set_size(str, str->len - 1);
915
0
    return g_string_free(g_steal_pointer(&str), FALSE);
916
0
}
917
static gboolean
918
fu_struct_cab_header_validate_internal(FuStructCabHeader *st, GError **error)
919
180k
{
920
180k
    g_return_val_if_fail(st != NULL, FALSE);
921
180k
    if (strncmp((const gchar *) (st->buf->data + 0), "MSCF", 4) != 0) {
922
175k
        g_autofree gchar *str = fu_struct_cab_header_get_signature(st);
923
175k
        g_set_error(error,
924
175k
                    FWUPD_ERROR,
925
175k
                    FWUPD_ERROR_INVALID_DATA,
926
175k
                    "constant FuStructCabHeader.signature was not valid, "
927
175k
                    "expected 'MSCF' and got '%s'",
928
175k
                    str);
929
175k
        return FALSE;
930
175k
    }
931
5.24k
    if (fu_struct_cab_header_get_version_minor(st) != 3) {
932
287
        g_set_error_literal(error,
933
287
                            FWUPD_ERROR,
934
287
                            FWUPD_ERROR_INVALID_DATA,
935
287
                            "constant FuStructCabHeader.version_minor was not valid");
936
287
        return FALSE;
937
287
    }
938
4.95k
    if (fu_struct_cab_header_get_version_major(st) != 1) {
939
225
        g_set_error_literal(error,
940
225
                            FWUPD_ERROR,
941
225
                            FWUPD_ERROR_INVALID_DATA,
942
225
                            "constant FuStructCabHeader.version_major was not valid");
943
225
        return FALSE;
944
225
    }
945
4.73k
    return TRUE;
946
4.95k
}
947
/**
948
 * fu_struct_cab_header_validate_stream: (skip):
949
 **/
950
gboolean
951
fu_struct_cab_header_validate_stream(GInputStream *stream, gsize offset, GError **error)
952
183k
{
953
183k
    g_autoptr(FuStructCabHeader) st = fu_struct_cab_header_new_internal();
954
183k
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
955
183k
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
956
183k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 36, NULL, error);
957
183k
    if (st->buf == NULL) {
958
0
        g_prefix_error(error, "FuStructCabHeader failed read of 0x%x: ", (guint) 36);
959
0
        return FALSE;
960
0
    }
961
183k
    if (st->buf->len != 36) {
962
4.97k
        g_set_error(error,
963
4.97k
                    FWUPD_ERROR,
964
4.97k
                    FWUPD_ERROR_INVALID_DATA,
965
4.97k
                    "FuStructCabHeader requested 0x%x and got 0x%x",
966
4.97k
                    (guint) 36,
967
4.97k
                    (guint) st->buf->len);
968
4.97k
        return FALSE;
969
4.97k
    }
970
178k
    return fu_struct_cab_header_validate_internal(st, error);
971
183k
}
972
static gboolean
973
fu_struct_cab_header_parse_internal(FuStructCabHeader *st, GError **error)
974
2.36k
{
975
2.36k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
976
0
        g_autofree gchar *str = fu_struct_cab_header_to_string(st);
977
0
        g_debug("%s", str);
978
0
    }
979
2.36k
    if (!fu_struct_cab_header_validate_internal(st, error))
980
0
        return FALSE;
981
2.36k
    return TRUE;
982
2.36k
}
983
/**
984
 * fu_struct_cab_header_parse_stream: (skip):
985
 **/
986
FuStructCabHeader *
987
fu_struct_cab_header_parse_stream(GInputStream *stream, gsize offset, GError **error)
988
2.36k
{
989
2.36k
    g_autoptr(FuStructCabHeader) st = fu_struct_cab_header_new_internal();
990
2.36k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 36, NULL, error);
991
2.36k
    if (st->buf == NULL) {
992
0
        g_prefix_error(error, "FuStructCabHeader failed read of 0x%x: ", (guint) 36);
993
0
        return NULL;
994
0
    }
995
2.36k
    if (st->buf->len != 36) {
996
0
        g_set_error(error,
997
0
                    FWUPD_ERROR,
998
0
                    FWUPD_ERROR_INVALID_DATA,
999
0
                    "FuStructCabHeader requested 0x%x and got 0x%x",
1000
0
                    (guint) 36,
1001
0
                    (guint) st->buf->len);
1002
0
        return NULL;
1003
0
    }
1004
2.36k
    if (!fu_struct_cab_header_parse_internal(st, error))
1005
0
        return NULL;
1006
2.36k
    return g_steal_pointer(&st);
1007
2.36k
}
1008
/**
1009
 * fu_struct_cab_header_reserve_ref: (skip):
1010
 **/
1011
FuStructCabHeaderReserve *
1012
fu_struct_cab_header_reserve_ref(FuStructCabHeaderReserve *st)
1013
0
{
1014
0
    g_return_val_if_fail(st != NULL, NULL);
1015
0
    st->refcount++;
1016
0
    return st;
1017
0
}
1018
/**
1019
 * fu_struct_cab_header_reserve_unref: (skip):
1020
 **/
1021
void
1022
fu_struct_cab_header_reserve_unref(FuStructCabHeaderReserve *st)
1023
87
{
1024
87
    g_return_if_fail(st != NULL);
1025
87
    if (st->refcount == 0) {
1026
0
        g_critical("FuStructCabHeaderReserve refcount already zero");
1027
0
        return;
1028
0
    }
1029
87
    if (--st->refcount > 0)
1030
0
        return;
1031
87
    if (st->buf != NULL)
1032
80
        g_byte_array_unref(st->buf);
1033
87
    g_free(st);
1034
87
}
1035
/**
1036
 * fu_struct_cab_header_reserve_new_internal: (skip):
1037
 **/
1038
static FuStructCabHeaderReserve *
1039
fu_struct_cab_header_reserve_new_internal(void)
1040
87
{
1041
87
    FuStructCabHeaderReserve *st = g_new0(FuStructCabHeaderReserve, 1);
1042
87
    st->refcount = 1;
1043
87
    return st;
1044
87
}
1045
1046
/* getters */
1047
/**
1048
 * fu_struct_cab_header_reserve_get_rsvd_hdr: (skip):
1049
 **/
1050
guint16
1051
fu_struct_cab_header_reserve_get_rsvd_hdr(const FuStructCabHeaderReserve *st)
1052
72
{
1053
72
    g_return_val_if_fail(st != NULL, 0x0);
1054
72
    return fu_memread_uint16(st->buf->data + 0, G_LITTLE_ENDIAN);
1055
72
}
1056
/**
1057
 * fu_struct_cab_header_reserve_get_rsvd_folder: (skip):
1058
 **/
1059
guint8
1060
fu_struct_cab_header_reserve_get_rsvd_folder(const FuStructCabHeaderReserve *st)
1061
72
{
1062
72
    g_return_val_if_fail(st != NULL, 0x0);
1063
72
    return st->buf->data[2];
1064
72
}
1065
/**
1066
 * fu_struct_cab_header_reserve_get_rsvd_block: (skip):
1067
 **/
1068
guint8
1069
fu_struct_cab_header_reserve_get_rsvd_block(const FuStructCabHeaderReserve *st)
1070
72
{
1071
72
    g_return_val_if_fail(st != NULL, 0x0);
1072
72
    return st->buf->data[3];
1073
72
}
1074
1075
/* setters */
1076
/**
1077
 * fu_struct_cab_header_reserve_set_rsvd_hdr: (skip):
1078
 **/
1079
void
1080
fu_struct_cab_header_reserve_set_rsvd_hdr(FuStructCabHeaderReserve *st, guint16 value)
1081
0
{
1082
0
    g_return_if_fail(st != NULL);
1083
0
    fu_memwrite_uint16(st->buf->data + 0, value, G_LITTLE_ENDIAN);
1084
0
}
1085
/**
1086
 * fu_struct_cab_header_reserve_set_rsvd_folder: (skip):
1087
 **/
1088
void
1089
fu_struct_cab_header_reserve_set_rsvd_folder(FuStructCabHeaderReserve *st, guint8 value)
1090
0
{
1091
0
    g_return_if_fail(st != NULL);
1092
0
    st->buf->data[2] = value;
1093
0
}
1094
/**
1095
 * fu_struct_cab_header_reserve_set_rsvd_block: (skip):
1096
 **/
1097
void
1098
fu_struct_cab_header_reserve_set_rsvd_block(FuStructCabHeaderReserve *st, guint8 value)
1099
0
{
1100
0
    g_return_if_fail(st != NULL);
1101
0
    st->buf->data[3] = value;
1102
0
}
1103
/**
1104
 * fu_struct_cab_header_reserve_new: (skip):
1105
 **/
1106
FuStructCabHeaderReserve *
1107
fu_struct_cab_header_reserve_new(void)
1108
0
{
1109
0
    FuStructCabHeaderReserve *st = fu_struct_cab_header_reserve_new_internal();
1110
0
    st->buf = g_byte_array_sized_new(4);
1111
0
    fu_byte_array_set_size(st->buf, 4, 0x0);
1112
0
    return st;
1113
0
}
1114
/**
1115
 * fu_struct_cab_header_reserve_to_string: (skip):
1116
 **/
1117
static gchar *
1118
fu_struct_cab_header_reserve_to_string(const FuStructCabHeaderReserve *st)
1119
0
{
1120
0
    g_autoptr(GString) str = g_string_new("FuStructCabHeaderReserve:\n");
1121
0
    g_return_val_if_fail(st != NULL, NULL);
1122
0
    g_string_append_printf(str, "  rsvd_hdr: 0x%x\n",
1123
0
                           (guint) fu_struct_cab_header_reserve_get_rsvd_hdr(st));
1124
0
    g_string_append_printf(str, "  rsvd_folder: 0x%x\n",
1125
0
                           (guint) fu_struct_cab_header_reserve_get_rsvd_folder(st));
1126
0
    g_string_append_printf(str, "  rsvd_block: 0x%x\n",
1127
0
                           (guint) fu_struct_cab_header_reserve_get_rsvd_block(st));
1128
0
    if (str->len > 0)
1129
0
        g_string_set_size(str, str->len - 1);
1130
0
    return g_string_free(g_steal_pointer(&str), FALSE);
1131
0
}
1132
static gboolean
1133
fu_struct_cab_header_reserve_validate_internal(FuStructCabHeaderReserve *st, GError **error)
1134
72
{
1135
72
    g_return_val_if_fail(st != NULL, FALSE);
1136
72
    return TRUE;
1137
72
}
1138
static gboolean
1139
fu_struct_cab_header_reserve_parse_internal(FuStructCabHeaderReserve *st, GError **error)
1140
72
{
1141
72
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
1142
0
        g_autofree gchar *str = fu_struct_cab_header_reserve_to_string(st);
1143
0
        g_debug("%s", str);
1144
0
    }
1145
72
    if (!fu_struct_cab_header_reserve_validate_internal(st, error))
1146
0
        return FALSE;
1147
72
    return TRUE;
1148
72
}
1149
/**
1150
 * fu_struct_cab_header_reserve_parse_stream: (skip):
1151
 **/
1152
FuStructCabHeaderReserve *
1153
fu_struct_cab_header_reserve_parse_stream(GInputStream *stream, gsize offset, GError **error)
1154
87
{
1155
87
    g_autoptr(FuStructCabHeaderReserve) st = fu_struct_cab_header_reserve_new_internal();
1156
87
    st->buf = fu_input_stream_read_byte_array(stream, offset, 4, NULL, error);
1157
87
    if (st->buf == NULL) {
1158
7
        g_prefix_error(error, "FuStructCabHeaderReserve failed read of 0x%x: ", (guint) 4);
1159
7
        return NULL;
1160
7
    }
1161
80
    if (st->buf->len != 4) {
1162
8
        g_set_error(error,
1163
8
                    FWUPD_ERROR,
1164
8
                    FWUPD_ERROR_INVALID_DATA,
1165
8
                    "FuStructCabHeaderReserve requested 0x%x and got 0x%x",
1166
8
                    (guint) 4,
1167
8
                    (guint) st->buf->len);
1168
8
        return NULL;
1169
8
    }
1170
72
    if (!fu_struct_cab_header_reserve_parse_internal(st, error))
1171
0
        return NULL;
1172
72
    return g_steal_pointer(&st);
1173
72
}