Coverage Report

Created: 2025-07-01 07:09

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