Coverage Report

Created: 2025-07-11 06:31

/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
75
{
17
75
    if (val == FU_CAB_COMPRESSION_NONE)
18
0
        return "none";
19
75
    if (val == FU_CAB_COMPRESSION_MSZIP)
20
0
        return "mszip";
21
75
    if (val == FU_CAB_COMPRESSION_QUANTUM)
22
3
        return "quantum";
23
72
    if (val == FU_CAB_COMPRESSION_LZX)
24
5
        return "lzx";
25
67
    return NULL;
26
72
}
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
263k
{
54
263k
    g_return_val_if_fail(st != NULL, 0x0);
55
263k
    return fu_memread_uint32(st->data + 0, G_LITTLE_ENDIAN);
56
263k
}
57
/**
58
 * fu_struct_cab_data_get_comp: (skip):
59
 **/
60
guint16
61
fu_struct_cab_data_get_comp(const FuStructCabData *st)
62
750k
{
63
750k
    g_return_val_if_fail(st != NULL, 0x0);
64
750k
    return fu_memread_uint16(st->data + 4, G_LITTLE_ENDIAN);
65
750k
}
66
/**
67
 * fu_struct_cab_data_get_uncomp: (skip):
68
 **/
69
guint16
70
fu_struct_cab_data_get_uncomp(const FuStructCabData *st)
71
750k
{
72
750k
    g_return_val_if_fail(st != NULL, 0x0);
73
750k
    return fu_memread_uint16(st->data + 6, G_LITTLE_ENDIAN);
74
750k
}
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
750k
{
135
750k
    g_return_val_if_fail(st != NULL, FALSE);
136
750k
    return TRUE;
137
750k
}
138
static gboolean
139
fu_struct_cab_data_parse_internal(FuStructCabData *st, GError **error)
140
750k
{
141
750k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
142
0
        g_autofree gchar *str = fu_struct_cab_data_to_string(st);
143
0
        g_debug("%s", str);
144
0
    }
145
750k
    if (!fu_struct_cab_data_validate_internal(st, error))
146
0
        return FALSE;
147
750k
    return TRUE;
148
750k
}
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
750k
{
155
750k
    g_autoptr(GByteArray) st = NULL;
156
750k
    st = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error);
157
750k
    if (st == NULL) {
158
110
        g_prefix_error(error, "FuStructCabData failed read of 0x%x: ", (guint) 8);
159
110
        return NULL;
160
110
    }
161
750k
    if (st->len != 8) {
162
33
        g_set_error(error,
163
33
                    FWUPD_ERROR,
164
33
                    FWUPD_ERROR_INVALID_DATA,
165
33
                    "FuStructCabData requested 0x%x and got 0x%x",
166
33
                    (guint) 8,
167
33
                    (guint) st->len);
168
33
        return NULL;
169
33
    }
170
750k
    if (!fu_struct_cab_data_parse_internal(st, error))
171
0
        return NULL;
172
750k
    return g_steal_pointer(&st);
173
750k
}
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.1k
{
181
30.1k
    g_return_val_if_fail(st != NULL, 0x0);
182
30.1k
    return fu_memread_uint32(st->data + 0, G_LITTLE_ENDIAN);
183
30.1k
}
184
/**
185
 * fu_struct_cab_file_get_uoffset: (skip):
186
 **/
187
guint32
188
fu_struct_cab_file_get_uoffset(const FuStructCabFile *st)
189
30.1k
{
190
30.1k
    g_return_val_if_fail(st != NULL, 0x0);
191
30.1k
    return fu_memread_uint32(st->data + 4, G_LITTLE_ENDIAN);
192
30.1k
}
193
/**
194
 * fu_struct_cab_file_get_index: (skip):
195
 **/
196
guint16
197
fu_struct_cab_file_get_index(const FuStructCabFile *st)
198
15.1k
{
199
15.1k
    g_return_val_if_fail(st != NULL, 0x0);
200
15.1k
    return fu_memread_uint16(st->data + 8, G_LITTLE_ENDIAN);
201
15.1k
}
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.1k
{
328
15.1k
    g_return_val_if_fail(st != NULL, FALSE);
329
15.1k
    return TRUE;
330
15.1k
}
331
static gboolean
332
fu_struct_cab_file_parse_internal(FuStructCabFile *st, GError **error)
333
15.1k
{
334
15.1k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
335
0
        g_autofree gchar *str = fu_struct_cab_file_to_string(st);
336
0
        g_debug("%s", str);
337
0
    }
338
15.1k
    if (!fu_struct_cab_file_validate_internal(st, error))
339
0
        return FALSE;
340
15.1k
    return TRUE;
341
15.1k
}
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.5k
{
348
15.5k
    g_autoptr(GByteArray) st = NULL;
349
15.5k
    st = fu_input_stream_read_byte_array(stream, offset, 16, NULL, error);
350
15.5k
    if (st == NULL) {
351
361
        g_prefix_error(error, "FuStructCabFile failed read of 0x%x: ", (guint) 16);
352
361
        return NULL;
353
361
    }
354
15.2k
    if (st->len != 16) {
355
45
        g_set_error(error,
356
45
                    FWUPD_ERROR,
357
45
                    FWUPD_ERROR_INVALID_DATA,
358
45
                    "FuStructCabFile requested 0x%x and got 0x%x",
359
45
                    (guint) 16,
360
45
                    (guint) st->len);
361
45
        return NULL;
362
45
    }
363
15.1k
    if (!fu_struct_cab_file_parse_internal(st, error))
364
0
        return NULL;
365
15.1k
    return g_steal_pointer(&st);
366
15.1k
}
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.56k
{
374
6.56k
    g_return_val_if_fail(st != NULL, 0x0);
375
6.56k
    return fu_memread_uint32(st->data + 0, G_LITTLE_ENDIAN);
376
6.56k
}
377
/**
378
 * fu_struct_cab_folder_get_ndatab: (skip):
379
 **/
380
guint16
381
fu_struct_cab_folder_get_ndatab(const FuStructCabFolder *st)
382
762k
{
383
762k
    g_return_val_if_fail(st != NULL, 0x0);
384
762k
    return fu_memread_uint16(st->data + 4, G_LITTLE_ENDIAN);
385
762k
}
386
/**
387
 * fu_struct_cab_folder_get_compression: (skip):
388
 **/
389
FuCabCompression
390
fu_struct_cab_folder_get_compression(const FuStructCabFolder *st)
391
6.63k
{
392
6.63k
    g_return_val_if_fail(st != NULL, 0x0);
393
6.63k
    return fu_memread_uint16(st->data + 6, G_LITTLE_ENDIAN);
394
6.63k
}
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
143
{
430
143
    FuStructCabFolder *st = g_byte_array_sized_new(8);
431
143
    fu_byte_array_set_size(st, 8, 0x0);
432
143
    return st;
433
143
}
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.64k
{
461
6.64k
    g_return_val_if_fail(st != NULL, FALSE);
462
6.64k
    return TRUE;
463
6.64k
}
464
static gboolean
465
fu_struct_cab_folder_parse_internal(FuStructCabFolder *st, GError **error)
466
6.64k
{
467
6.64k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
468
0
        g_autofree gchar *str = fu_struct_cab_folder_to_string(st);
469
0
        g_debug("%s", str);
470
0
    }
471
6.64k
    if (!fu_struct_cab_folder_validate_internal(st, error))
472
0
        return FALSE;
473
6.64k
    return TRUE;
474
6.64k
}
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
6.77k
{
481
6.77k
    g_autoptr(GByteArray) st = NULL;
482
6.77k
    st = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error);
483
6.77k
    if (st == NULL) {
484
108
        g_prefix_error(error, "FuStructCabFolder failed read of 0x%x: ", (guint) 8);
485
108
        return NULL;
486
108
    }
487
6.67k
    if (st->len != 8) {
488
24
        g_set_error(error,
489
24
                    FWUPD_ERROR,
490
24
                    FWUPD_ERROR_INVALID_DATA,
491
24
                    "FuStructCabFolder requested 0x%x and got 0x%x",
492
24
                    (guint) 8,
493
24
                    (guint) st->len);
494
24
        return NULL;
495
24
    }
496
6.64k
    if (!fu_struct_cab_folder_parse_internal(st, error))
497
0
        return NULL;
498
6.64k
    return g_steal_pointer(&st);
499
6.64k
}
500
/* getters */
501
/**
502
 * fu_struct_cab_header_get_signature: (skip):
503
 **/
504
static gchar *
505
fu_struct_cab_header_get_signature(const FuStructCabHeader *st)
506
4.75M
{
507
4.75M
    g_return_val_if_fail(st != NULL, NULL);
508
4.75M
    return fu_memstrsafe(st->data, st->len, 0, 4, NULL);
509
4.75M
}
510
/**
511
 * fu_struct_cab_header_get_size: (skip):
512
 **/
513
guint32
514
fu_struct_cab_header_get_size(const FuStructCabHeader *st)
515
2.39k
{
516
2.39k
    g_return_val_if_fail(st != NULL, 0x0);
517
2.39k
    return fu_memread_uint32(st->data + 8, G_LITTLE_ENDIAN);
518
2.39k
}
519
/**
520
 * fu_struct_cab_header_get_off_cffile: (skip):
521
 **/
522
guint32
523
fu_struct_cab_header_get_off_cffile(const FuStructCabHeader *st)
524
2.21k
{
525
2.21k
    g_return_val_if_fail(st != NULL, 0x0);
526
2.21k
    return fu_memread_uint32(st->data + 16, G_LITTLE_ENDIAN);
527
2.21k
}
528
/**
529
 * fu_struct_cab_header_get_version_minor: (skip):
530
 **/
531
static guint8
532
fu_struct_cab_header_get_version_minor(const FuStructCabHeader *st)
533
5.74k
{
534
5.74k
    g_return_val_if_fail(st != NULL, 0x0);
535
5.74k
    return st->data[24];
536
5.74k
}
537
/**
538
 * fu_struct_cab_header_get_version_major: (skip):
539
 **/
540
static guint8
541
fu_struct_cab_header_get_version_major(const FuStructCabHeader *st)
542
4.91k
{
543
4.91k
    g_return_val_if_fail(st != NULL, 0x0);
544
4.91k
    return st->data[25];
545
4.91k
}
546
/**
547
 * fu_struct_cab_header_get_nr_folders: (skip):
548
 **/
549
guint16
550
fu_struct_cab_header_get_nr_folders(const FuStructCabHeader *st)
551
12.1k
{
552
12.1k
    g_return_val_if_fail(st != NULL, 0x0);
553
12.1k
    return fu_memread_uint16(st->data + 26, G_LITTLE_ENDIAN);
554
12.1k
}
555
/**
556
 * fu_struct_cab_header_get_nr_files: (skip):
557
 **/
558
guint16
559
fu_struct_cab_header_get_nr_files(const FuStructCabHeader *st)
560
20.2k
{
561
20.2k
    g_return_val_if_fail(st != NULL, 0x0);
562
20.2k
    return fu_memread_uint16(st->data + 28, G_LITTLE_ENDIAN);
563
20.2k
}
564
/**
565
 * fu_struct_cab_header_get_flags: (skip):
566
 **/
567
guint16
568
fu_struct_cab_header_get_flags(const FuStructCabHeader *st)
569
2.16k
{
570
2.16k
    g_return_val_if_fail(st != NULL, 0x0);
571
2.16k
    return fu_memread_uint16(st->data + 30, G_LITTLE_ENDIAN);
572
2.16k
}
573
/**
574
 * fu_struct_cab_header_get_set_id: (skip):
575
 **/
576
guint16
577
fu_struct_cab_header_get_set_id(const FuStructCabHeader *st)
578
0
{
579
0
    g_return_val_if_fail(st != NULL, 0x0);
580
0
    return fu_memread_uint16(st->data + 32, G_LITTLE_ENDIAN);
581
0
}
582
/**
583
 * fu_struct_cab_header_get_idx_cabinet: (skip):
584
 **/
585
guint16
586
fu_struct_cab_header_get_idx_cabinet(const FuStructCabHeader *st)
587
2.30k
{
588
2.30k
    g_return_val_if_fail(st != NULL, 0x0);
589
2.30k
    return fu_memread_uint16(st->data + 34, G_LITTLE_ENDIAN);
590
2.30k
}
591
592
/* setters */
593
/**
594
 * fu_struct_cab_header_set_signature: (skip):
595
 **/
596
static gboolean
597
fu_struct_cab_header_set_signature(FuStructCabHeader *st, const gchar *value, GError **error)
598
143
{
599
143
    gsize len;
600
143
    g_return_val_if_fail(st != NULL, FALSE);
601
143
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
602
143
    if (value == NULL) {
603
0
        memset(st->data + 0, 0x0, 4);
604
0
        return TRUE;
605
0
    }
606
143
    len = strlen(value);
607
143
    if (len > 4) {
608
0
        g_set_error(error,
609
0
                    FWUPD_ERROR,
610
0
                    FWUPD_ERROR_INVALID_DATA,
611
0
                    "string '%s' (0x%x bytes) does not fit in FuStructCabHeader.signature (0x%x bytes)",
612
0
                    value, (guint) len, (guint) 4);
613
0
        return FALSE;
614
0
    }
615
143
    return fu_memcpy_safe(st->data, st->len, 0, (const guint8 *)value, len, 0x0, len, error);
616
143
}
617
/**
618
 * fu_struct_cab_header_set_size: (skip):
619
 **/
620
void
621
fu_struct_cab_header_set_size(FuStructCabHeader *st, guint32 value)
622
0
{
623
0
    g_return_if_fail(st != NULL);
624
0
    fu_memwrite_uint32(st->data + 8, value, G_LITTLE_ENDIAN);
625
0
}
626
/**
627
 * fu_struct_cab_header_set_off_cffile: (skip):
628
 **/
629
void
630
fu_struct_cab_header_set_off_cffile(FuStructCabHeader *st, guint32 value)
631
0
{
632
0
    g_return_if_fail(st != NULL);
633
0
    fu_memwrite_uint32(st->data + 16, value, G_LITTLE_ENDIAN);
634
0
}
635
/**
636
 * fu_struct_cab_header_set_version_minor: (skip):
637
 **/
638
static void
639
fu_struct_cab_header_set_version_minor(FuStructCabHeader *st, guint8 value)
640
143
{
641
143
    g_return_if_fail(st != NULL);
642
143
    st->data[24] = value;
643
143
}
644
/**
645
 * fu_struct_cab_header_set_version_major: (skip):
646
 **/
647
static void
648
fu_struct_cab_header_set_version_major(FuStructCabHeader *st, guint8 value)
649
143
{
650
143
    g_return_if_fail(st != NULL);
651
143
    st->data[25] = value;
652
143
}
653
/**
654
 * fu_struct_cab_header_set_nr_folders: (skip):
655
 **/
656
void
657
fu_struct_cab_header_set_nr_folders(FuStructCabHeader *st, guint16 value)
658
143
{
659
143
    g_return_if_fail(st != NULL);
660
143
    fu_memwrite_uint16(st->data + 26, value, G_LITTLE_ENDIAN);
661
143
}
662
/**
663
 * fu_struct_cab_header_set_nr_files: (skip):
664
 **/
665
void
666
fu_struct_cab_header_set_nr_files(FuStructCabHeader *st, guint16 value)
667
0
{
668
0
    g_return_if_fail(st != NULL);
669
0
    fu_memwrite_uint16(st->data + 28, value, G_LITTLE_ENDIAN);
670
0
}
671
/**
672
 * fu_struct_cab_header_set_flags: (skip):
673
 **/
674
void
675
fu_struct_cab_header_set_flags(FuStructCabHeader *st, guint16 value)
676
0
{
677
0
    g_return_if_fail(st != NULL);
678
0
    fu_memwrite_uint16(st->data + 30, value, G_LITTLE_ENDIAN);
679
0
}
680
/**
681
 * fu_struct_cab_header_set_set_id: (skip):
682
 **/
683
void
684
fu_struct_cab_header_set_set_id(FuStructCabHeader *st, guint16 value)
685
0
{
686
0
    g_return_if_fail(st != NULL);
687
0
    fu_memwrite_uint16(st->data + 32, value, G_LITTLE_ENDIAN);
688
0
}
689
/**
690
 * fu_struct_cab_header_set_idx_cabinet: (skip):
691
 **/
692
void
693
fu_struct_cab_header_set_idx_cabinet(FuStructCabHeader *st, guint16 value)
694
0
{
695
0
    g_return_if_fail(st != NULL);
696
0
    fu_memwrite_uint16(st->data + 34, value, G_LITTLE_ENDIAN);
697
0
}
698
/**
699
 * fu_struct_cab_header_new: (skip):
700
 **/
701
FuStructCabHeader *
702
fu_struct_cab_header_new(void)
703
143
{
704
143
    FuStructCabHeader *st = g_byte_array_sized_new(36);
705
143
    fu_byte_array_set_size(st, 36, 0x0);
706
143
    fu_struct_cab_header_set_signature(st, "MSCF", NULL);
707
143
    fu_struct_cab_header_set_version_minor(st, 3);
708
143
    fu_struct_cab_header_set_version_major(st, 1);
709
143
    fu_struct_cab_header_set_nr_folders(st, 1);
710
143
    return st;
711
143
}
712
/**
713
 * fu_struct_cab_header_to_string: (skip):
714
 **/
715
static gchar *
716
fu_struct_cab_header_to_string(const FuStructCabHeader *st)
717
0
{
718
0
    g_autoptr(GString) str = g_string_new("FuStructCabHeader:\n");
719
0
    g_return_val_if_fail(st != NULL, NULL);
720
0
    g_string_append_printf(str, "  size: 0x%x\n",
721
0
                           (guint) fu_struct_cab_header_get_size(st));
722
0
    g_string_append_printf(str, "  off_cffile: 0x%x\n",
723
0
                           (guint) fu_struct_cab_header_get_off_cffile(st));
724
0
    g_string_append_printf(str, "  nr_folders: 0x%x\n",
725
0
                           (guint) fu_struct_cab_header_get_nr_folders(st));
726
0
    g_string_append_printf(str, "  nr_files: 0x%x\n",
727
0
                           (guint) fu_struct_cab_header_get_nr_files(st));
728
0
    g_string_append_printf(str, "  flags: 0x%x\n",
729
0
                           (guint) fu_struct_cab_header_get_flags(st));
730
0
    g_string_append_printf(str, "  set_id: 0x%x\n",
731
0
                           (guint) fu_struct_cab_header_get_set_id(st));
732
0
    g_string_append_printf(str, "  idx_cabinet: 0x%x\n",
733
0
                           (guint) fu_struct_cab_header_get_idx_cabinet(st));
734
0
    if (str->len > 0)
735
0
        g_string_set_size(str, str->len - 1);
736
0
    return g_string_free(g_steal_pointer(&str), FALSE);
737
0
}
738
static gboolean
739
fu_struct_cab_header_validate_internal(FuStructCabHeader *st, GError **error)
740
4.76M
{
741
4.76M
    g_return_val_if_fail(st != NULL, FALSE);
742
4.76M
    if (strncmp((const gchar *) (st->data + 0), "MSCF", 4) != 0) {
743
4.75M
        g_autofree gchar *str = fu_struct_cab_header_get_signature(st);
744
4.75M
        g_set_error(error,
745
4.75M
                    FWUPD_ERROR,
746
4.75M
                    FWUPD_ERROR_INVALID_DATA,
747
4.75M
                    "constant FuStructCabHeader.signature was not valid, "
748
4.75M
                    "expected 'MSCF' and got '%s'",
749
4.75M
                    str);
750
4.75M
        return FALSE;
751
4.75M
    }
752
5.74k
    if (fu_struct_cab_header_get_version_minor(st) != 3) {
753
832
        g_set_error_literal(error,
754
832
                            FWUPD_ERROR,
755
832
                            FWUPD_ERROR_INVALID_DATA,
756
832
                            "constant FuStructCabHeader.version_minor was not valid");
757
832
        return FALSE;
758
832
    }
759
4.91k
    if (fu_struct_cab_header_get_version_major(st) != 1) {
760
210
        g_set_error_literal(error,
761
210
                            FWUPD_ERROR,
762
210
                            FWUPD_ERROR_INVALID_DATA,
763
210
                            "constant FuStructCabHeader.version_major was not valid");
764
210
        return FALSE;
765
210
    }
766
4.70k
    return TRUE;
767
4.91k
}
768
/**
769
 * fu_struct_cab_header_validate_stream: (skip):
770
 **/
771
gboolean
772
fu_struct_cab_header_validate_stream(GInputStream *stream, gsize offset, GError **error)
773
4.76M
{
774
4.76M
    g_autoptr(GByteArray) st = NULL;
775
4.76M
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
776
4.76M
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
777
4.76M
    st = fu_input_stream_read_byte_array(stream, offset, 36, NULL, error);
778
4.76M
    if (st == NULL) {
779
0
        g_prefix_error(error, "FuStructCabHeader failed read of 0x%x: ", (guint) 36);
780
0
        return FALSE;
781
0
    }
782
4.76M
    if (st->len != 36) {
783
5.21k
        g_set_error(error,
784
5.21k
                    FWUPD_ERROR,
785
5.21k
                    FWUPD_ERROR_INVALID_DATA,
786
5.21k
                    "FuStructCabHeader requested 0x%x and got 0x%x",
787
5.21k
                    (guint) 36,
788
5.21k
                    (guint) st->len);
789
5.21k
        return FALSE;
790
5.21k
    }
791
4.75M
    return fu_struct_cab_header_validate_internal(st, error);
792
4.76M
}
793
static gboolean
794
fu_struct_cab_header_parse_internal(FuStructCabHeader *st, GError **error)
795
2.35k
{
796
2.35k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
797
0
        g_autofree gchar *str = fu_struct_cab_header_to_string(st);
798
0
        g_debug("%s", str);
799
0
    }
800
2.35k
    if (!fu_struct_cab_header_validate_internal(st, error))
801
0
        return FALSE;
802
2.35k
    return TRUE;
803
2.35k
}
804
/**
805
 * fu_struct_cab_header_parse_stream: (skip):
806
 **/
807
FuStructCabHeader *
808
fu_struct_cab_header_parse_stream(GInputStream *stream, gsize offset, GError **error)
809
2.35k
{
810
2.35k
    g_autoptr(GByteArray) st = NULL;
811
2.35k
    st = fu_input_stream_read_byte_array(stream, offset, 36, NULL, error);
812
2.35k
    if (st == NULL) {
813
0
        g_prefix_error(error, "FuStructCabHeader failed read of 0x%x: ", (guint) 36);
814
0
        return NULL;
815
0
    }
816
2.35k
    if (st->len != 36) {
817
0
        g_set_error(error,
818
0
                    FWUPD_ERROR,
819
0
                    FWUPD_ERROR_INVALID_DATA,
820
0
                    "FuStructCabHeader requested 0x%x and got 0x%x",
821
0
                    (guint) 36,
822
0
                    (guint) st->len);
823
0
        return NULL;
824
0
    }
825
2.35k
    if (!fu_struct_cab_header_parse_internal(st, error))
826
0
        return NULL;
827
2.35k
    return g_steal_pointer(&st);
828
2.35k
}
829
/* getters */
830
/**
831
 * fu_struct_cab_header_reserve_get_rsvd_hdr: (skip):
832
 **/
833
guint16
834
fu_struct_cab_header_reserve_get_rsvd_hdr(const FuStructCabHeaderReserve *st)
835
71
{
836
71
    g_return_val_if_fail(st != NULL, 0x0);
837
71
    return fu_memread_uint16(st->data + 0, G_LITTLE_ENDIAN);
838
71
}
839
/**
840
 * fu_struct_cab_header_reserve_get_rsvd_folder: (skip):
841
 **/
842
guint8
843
fu_struct_cab_header_reserve_get_rsvd_folder(const FuStructCabHeaderReserve *st)
844
71
{
845
71
    g_return_val_if_fail(st != NULL, 0x0);
846
71
    return st->data[2];
847
71
}
848
/**
849
 * fu_struct_cab_header_reserve_get_rsvd_block: (skip):
850
 **/
851
guint8
852
fu_struct_cab_header_reserve_get_rsvd_block(const FuStructCabHeaderReserve *st)
853
71
{
854
71
    g_return_val_if_fail(st != NULL, 0x0);
855
71
    return st->data[3];
856
71
}
857
858
/* setters */
859
/**
860
 * fu_struct_cab_header_reserve_set_rsvd_hdr: (skip):
861
 **/
862
void
863
fu_struct_cab_header_reserve_set_rsvd_hdr(FuStructCabHeaderReserve *st, guint16 value)
864
0
{
865
0
    g_return_if_fail(st != NULL);
866
0
    fu_memwrite_uint16(st->data + 0, value, G_LITTLE_ENDIAN);
867
0
}
868
/**
869
 * fu_struct_cab_header_reserve_set_rsvd_folder: (skip):
870
 **/
871
void
872
fu_struct_cab_header_reserve_set_rsvd_folder(FuStructCabHeaderReserve *st, guint8 value)
873
0
{
874
0
    g_return_if_fail(st != NULL);
875
0
    st->data[2] = value;
876
0
}
877
/**
878
 * fu_struct_cab_header_reserve_set_rsvd_block: (skip):
879
 **/
880
void
881
fu_struct_cab_header_reserve_set_rsvd_block(FuStructCabHeaderReserve *st, guint8 value)
882
0
{
883
0
    g_return_if_fail(st != NULL);
884
0
    st->data[3] = value;
885
0
}
886
/**
887
 * fu_struct_cab_header_reserve_new: (skip):
888
 **/
889
FuStructCabHeaderReserve *
890
fu_struct_cab_header_reserve_new(void)
891
0
{
892
0
    FuStructCabHeaderReserve *st = g_byte_array_sized_new(4);
893
0
    fu_byte_array_set_size(st, 4, 0x0);
894
0
    return st;
895
0
}
896
/**
897
 * fu_struct_cab_header_reserve_to_string: (skip):
898
 **/
899
static gchar *
900
fu_struct_cab_header_reserve_to_string(const FuStructCabHeaderReserve *st)
901
0
{
902
0
    g_autoptr(GString) str = g_string_new("FuStructCabHeaderReserve:\n");
903
0
    g_return_val_if_fail(st != NULL, NULL);
904
0
    g_string_append_printf(str, "  rsvd_hdr: 0x%x\n",
905
0
                           (guint) fu_struct_cab_header_reserve_get_rsvd_hdr(st));
906
0
    g_string_append_printf(str, "  rsvd_folder: 0x%x\n",
907
0
                           (guint) fu_struct_cab_header_reserve_get_rsvd_folder(st));
908
0
    g_string_append_printf(str, "  rsvd_block: 0x%x\n",
909
0
                           (guint) fu_struct_cab_header_reserve_get_rsvd_block(st));
910
0
    if (str->len > 0)
911
0
        g_string_set_size(str, str->len - 1);
912
0
    return g_string_free(g_steal_pointer(&str), FALSE);
913
0
}
914
static gboolean
915
fu_struct_cab_header_reserve_validate_internal(FuStructCabHeaderReserve *st, GError **error)
916
71
{
917
71
    g_return_val_if_fail(st != NULL, FALSE);
918
71
    return TRUE;
919
71
}
920
static gboolean
921
fu_struct_cab_header_reserve_parse_internal(FuStructCabHeaderReserve *st, GError **error)
922
71
{
923
71
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
924
0
        g_autofree gchar *str = fu_struct_cab_header_reserve_to_string(st);
925
0
        g_debug("%s", str);
926
0
    }
927
71
    if (!fu_struct_cab_header_reserve_validate_internal(st, error))
928
0
        return FALSE;
929
71
    return TRUE;
930
71
}
931
/**
932
 * fu_struct_cab_header_reserve_parse_stream: (skip):
933
 **/
934
FuStructCabHeaderReserve *
935
fu_struct_cab_header_reserve_parse_stream(GInputStream *stream, gsize offset, GError **error)
936
87
{
937
87
    g_autoptr(GByteArray) st = NULL;
938
87
    st = fu_input_stream_read_byte_array(stream, offset, 4, NULL, error);
939
87
    if (st == NULL) {
940
9
        g_prefix_error(error, "FuStructCabHeaderReserve failed read of 0x%x: ", (guint) 4);
941
9
        return NULL;
942
9
    }
943
78
    if (st->len != 4) {
944
7
        g_set_error(error,
945
7
                    FWUPD_ERROR,
946
7
                    FWUPD_ERROR_INVALID_DATA,
947
7
                    "FuStructCabHeaderReserve requested 0x%x and got 0x%x",
948
7
                    (guint) 4,
949
7
                    (guint) st->len);
950
7
        return NULL;
951
7
    }
952
71
    if (!fu_struct_cab_header_reserve_parse_internal(st, error))
953
0
        return NULL;
954
71
    return g_steal_pointer(&st);
955
71
}