Coverage Report

Created: 2025-07-18 06:26

/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
77
{
17
77
    if (val == FU_CAB_COMPRESSION_NONE)
18
0
        return "none";
19
77
    if (val == FU_CAB_COMPRESSION_MSZIP)
20
0
        return "mszip";
21
77
    if (val == FU_CAB_COMPRESSION_QUANTUM)
22
3
        return "quantum";
23
74
    if (val == FU_CAB_COMPRESSION_LZX)
24
3
        return "lzx";
25
71
    return NULL;
26
74
}
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
122
        g_prefix_error(error, "FuStructCabData failed read of 0x%x: ", (guint) 8);
159
122
        return NULL;
160
122
    }
161
750k
    if (st->len != 8) {
162
30
        g_set_error(error,
163
30
                    FWUPD_ERROR,
164
30
                    FWUPD_ERROR_INVALID_DATA,
165
30
                    "FuStructCabData requested 0x%x and got 0x%x",
166
30
                    (guint) 8,
167
30
                    (guint) st->len);
168
30
        return NULL;
169
30
    }
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.9k
{
181
30.9k
    g_return_val_if_fail(st != NULL, 0x0);
182
30.9k
    return fu_memread_uint32(st->data + 0, G_LITTLE_ENDIAN);
183
30.9k
}
184
/**
185
 * fu_struct_cab_file_get_uoffset: (skip):
186
 **/
187
guint32
188
fu_struct_cab_file_get_uoffset(const FuStructCabFile *st)
189
30.9k
{
190
30.9k
    g_return_val_if_fail(st != NULL, 0x0);
191
30.9k
    return fu_memread_uint32(st->data + 4, G_LITTLE_ENDIAN);
192
30.9k
}
193
/**
194
 * fu_struct_cab_file_get_index: (skip):
195
 **/
196
guint16
197
fu_struct_cab_file_get_index(const FuStructCabFile *st)
198
15.5k
{
199
15.5k
    g_return_val_if_fail(st != NULL, 0x0);
200
15.5k
    return fu_memread_uint16(st->data + 8, G_LITTLE_ENDIAN);
201
15.5k
}
202
/**
203
 * fu_struct_cab_file_get_date: (skip):
204
 **/
205
guint16
206
fu_struct_cab_file_get_date(const FuStructCabFile *st)
207
15.2k
{
208
15.2k
    g_return_val_if_fail(st != NULL, 0x0);
209
15.2k
    return fu_memread_uint16(st->data + 10, G_LITTLE_ENDIAN);
210
15.2k
}
211
/**
212
 * fu_struct_cab_file_get_time: (skip):
213
 **/
214
guint16
215
fu_struct_cab_file_get_time(const FuStructCabFile *st)
216
15.2k
{
217
15.2k
    g_return_val_if_fail(st != NULL, 0x0);
218
15.2k
    return fu_memread_uint16(st->data + 12, G_LITTLE_ENDIAN);
219
15.2k
}
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.5k
{
328
15.5k
    g_return_val_if_fail(st != NULL, FALSE);
329
15.5k
    return TRUE;
330
15.5k
}
331
static gboolean
332
fu_struct_cab_file_parse_internal(FuStructCabFile *st, GError **error)
333
15.5k
{
334
15.5k
    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.5k
    if (!fu_struct_cab_file_validate_internal(st, error))
339
0
        return FALSE;
340
15.5k
    return TRUE;
341
15.5k
}
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.9k
{
348
15.9k
    g_autoptr(GByteArray) st = NULL;
349
15.9k
    st = fu_input_stream_read_byte_array(stream, offset, 16, NULL, error);
350
15.9k
    if (st == NULL) {
351
364
        g_prefix_error(error, "FuStructCabFile failed read of 0x%x: ", (guint) 16);
352
364
        return NULL;
353
364
    }
354
15.6k
    if (st->len != 16) {
355
54
        g_set_error(error,
356
54
                    FWUPD_ERROR,
357
54
                    FWUPD_ERROR_INVALID_DATA,
358
54
                    "FuStructCabFile requested 0x%x and got 0x%x",
359
54
                    (guint) 16,
360
54
                    (guint) st->len);
361
54
        return NULL;
362
54
    }
363
15.5k
    if (!fu_struct_cab_file_parse_internal(st, error))
364
0
        return NULL;
365
15.5k
    return g_steal_pointer(&st);
366
15.5k
}
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.59k
{
374
6.59k
    g_return_val_if_fail(st != NULL, 0x0);
375
6.59k
    return fu_memread_uint32(st->data + 0, G_LITTLE_ENDIAN);
376
6.59k
}
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.66k
{
392
6.66k
    g_return_val_if_fail(st != NULL, 0x0);
393
6.66k
    return fu_memread_uint16(st->data + 6, G_LITTLE_ENDIAN);
394
6.66k
}
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
141
{
430
141
    FuStructCabFolder *st = g_byte_array_sized_new(8);
431
141
    fu_byte_array_set_size(st, 8, 0x0);
432
141
    return st;
433
141
}
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.67k
{
461
6.67k
    g_return_val_if_fail(st != NULL, FALSE);
462
6.67k
    return TRUE;
463
6.67k
}
464
static gboolean
465
fu_struct_cab_folder_parse_internal(FuStructCabFolder *st, GError **error)
466
6.67k
{
467
6.67k
    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.67k
    if (!fu_struct_cab_folder_validate_internal(st, error))
472
0
        return FALSE;
473
6.67k
    return TRUE;
474
6.67k
}
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.81k
{
481
6.81k
    g_autoptr(GByteArray) st = NULL;
482
6.81k
    st = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error);
483
6.81k
    if (st == NULL) {
484
111
        g_prefix_error(error, "FuStructCabFolder failed read of 0x%x: ", (guint) 8);
485
111
        return NULL;
486
111
    }
487
6.69k
    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.67k
    if (!fu_struct_cab_folder_parse_internal(st, error))
497
0
        return NULL;
498
6.67k
    return g_steal_pointer(&st);
499
6.67k
}
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
3.87M
{
507
3.87M
    g_return_val_if_fail(st != NULL, NULL);
508
3.87M
    return fu_memstrsafe(st->data, st->len, 0, 4, NULL);
509
3.87M
}
510
/**
511
 * fu_struct_cab_header_get_size: (skip):
512
 **/
513
guint32
514
fu_struct_cab_header_get_size(const FuStructCabHeader *st)
515
2.48k
{
516
2.48k
    g_return_val_if_fail(st != NULL, 0x0);
517
2.48k
    return fu_memread_uint32(st->data + 8, G_LITTLE_ENDIAN);
518
2.48k
}
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.31k
{
525
2.31k
    g_return_val_if_fail(st != NULL, 0x0);
526
2.31k
    return fu_memread_uint32(st->data + 16, G_LITTLE_ENDIAN);
527
2.31k
}
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.97k
{
534
5.97k
    g_return_val_if_fail(st != NULL, 0x0);
535
5.97k
    return st->data[24];
536
5.97k
}
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
5.12k
{
543
5.12k
    g_return_val_if_fail(st != NULL, 0x0);
544
5.12k
    return st->data[25];
545
5.12k
}
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.4k
{
552
12.4k
    g_return_val_if_fail(st != NULL, 0x0);
553
12.4k
    return fu_memread_uint16(st->data + 26, G_LITTLE_ENDIAN);
554
12.4k
}
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.8k
{
561
20.8k
    g_return_val_if_fail(st != NULL, 0x0);
562
20.8k
    return fu_memread_uint16(st->data + 28, G_LITTLE_ENDIAN);
563
20.8k
}
564
/**
565
 * fu_struct_cab_header_get_flags: (skip):
566
 **/
567
guint16
568
fu_struct_cab_header_get_flags(const FuStructCabHeader *st)
569
2.24k
{
570
2.24k
    g_return_val_if_fail(st != NULL, 0x0);
571
2.24k
    return fu_memread_uint16(st->data + 30, G_LITTLE_ENDIAN);
572
2.24k
}
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.40k
{
588
2.40k
    g_return_val_if_fail(st != NULL, 0x0);
589
2.40k
    return fu_memread_uint16(st->data + 34, G_LITTLE_ENDIAN);
590
2.40k
}
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
141
{
599
141
    gsize len;
600
141
    g_return_val_if_fail(st != NULL, FALSE);
601
141
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
602
141
    if (value == NULL) {
603
0
        memset(st->data + 0, 0x0, 4);
604
0
        return TRUE;
605
0
    }
606
141
    len = strlen(value);
607
141
    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
141
    return fu_memcpy_safe(st->data, st->len, 0, (const guint8 *)value, len, 0x0, len, error);
616
141
}
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
141
{
641
141
    g_return_if_fail(st != NULL);
642
141
    st->data[24] = value;
643
141
}
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
141
{
650
141
    g_return_if_fail(st != NULL);
651
141
    st->data[25] = value;
652
141
}
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
141
{
659
141
    g_return_if_fail(st != NULL);
660
141
    fu_memwrite_uint16(st->data + 26, value, G_LITTLE_ENDIAN);
661
141
}
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
141
{
704
141
    FuStructCabHeader *st = g_byte_array_sized_new(36);
705
141
    fu_byte_array_set_size(st, 36, 0x0);
706
141
    fu_struct_cab_header_set_signature(st, "MSCF", NULL);
707
141
    fu_struct_cab_header_set_version_minor(st, 3);
708
141
    fu_struct_cab_header_set_version_major(st, 1);
709
141
    fu_struct_cab_header_set_nr_folders(st, 1);
710
141
    return st;
711
141
}
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
3.87M
{
741
3.87M
    g_return_val_if_fail(st != NULL, FALSE);
742
3.87M
    if (strncmp((const gchar *) (st->data + 0), "MSCF", 4) != 0) {
743
3.87M
        g_autofree gchar *str = fu_struct_cab_header_get_signature(st);
744
3.87M
        g_set_error(error,
745
3.87M
                    FWUPD_ERROR,
746
3.87M
                    FWUPD_ERROR_INVALID_DATA,
747
3.87M
                    "constant FuStructCabHeader.signature was not valid, "
748
3.87M
                    "expected 'MSCF' and got '%s'",
749
3.87M
                    str);
750
3.87M
        return FALSE;
751
3.87M
    }
752
5.97k
    if (fu_struct_cab_header_get_version_minor(st) != 3) {
753
849
        g_set_error_literal(error,
754
849
                            FWUPD_ERROR,
755
849
                            FWUPD_ERROR_INVALID_DATA,
756
849
                            "constant FuStructCabHeader.version_minor was not valid");
757
849
        return FALSE;
758
849
    }
759
5.12k
    if (fu_struct_cab_header_get_version_major(st) != 1) {
760
232
        g_set_error_literal(error,
761
232
                            FWUPD_ERROR,
762
232
                            FWUPD_ERROR_INVALID_DATA,
763
232
                            "constant FuStructCabHeader.version_major was not valid");
764
232
        return FALSE;
765
232
    }
766
4.89k
    return TRUE;
767
5.12k
}
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
3.88M
{
774
3.88M
    g_autoptr(GByteArray) st = NULL;
775
3.88M
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
776
3.88M
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
777
3.88M
    st = fu_input_stream_read_byte_array(stream, offset, 36, NULL, error);
778
3.88M
    if (st == NULL) {
779
0
        g_prefix_error(error, "FuStructCabHeader failed read of 0x%x: ", (guint) 36);
780
0
        return FALSE;
781
0
    }
782
3.88M
    if (st->len != 36) {
783
5.84k
        g_set_error(error,
784
5.84k
                    FWUPD_ERROR,
785
5.84k
                    FWUPD_ERROR_INVALID_DATA,
786
5.84k
                    "FuStructCabHeader requested 0x%x and got 0x%x",
787
5.84k
                    (guint) 36,
788
5.84k
                    (guint) st->len);
789
5.84k
        return FALSE;
790
5.84k
    }
791
3.87M
    return fu_struct_cab_header_validate_internal(st, error);
792
3.88M
}
793
static gboolean
794
fu_struct_cab_header_parse_internal(FuStructCabHeader *st, GError **error)
795
2.44k
{
796
2.44k
    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.44k
    if (!fu_struct_cab_header_validate_internal(st, error))
801
0
        return FALSE;
802
2.44k
    return TRUE;
803
2.44k
}
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.44k
{
810
2.44k
    g_autoptr(GByteArray) st = NULL;
811
2.44k
    st = fu_input_stream_read_byte_array(stream, offset, 36, NULL, error);
812
2.44k
    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.44k
    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.44k
    if (!fu_struct_cab_header_parse_internal(st, error))
826
0
        return NULL;
827
2.44k
    return g_steal_pointer(&st);
828
2.44k
}
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
68
{
836
68
    g_return_val_if_fail(st != NULL, 0x0);
837
68
    return fu_memread_uint16(st->data + 0, G_LITTLE_ENDIAN);
838
68
}
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
68
{
845
68
    g_return_val_if_fail(st != NULL, 0x0);
846
68
    return st->data[2];
847
68
}
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
68
{
854
68
    g_return_val_if_fail(st != NULL, 0x0);
855
68
    return st->data[3];
856
68
}
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
68
{
917
68
    g_return_val_if_fail(st != NULL, FALSE);
918
68
    return TRUE;
919
68
}
920
static gboolean
921
fu_struct_cab_header_reserve_parse_internal(FuStructCabHeaderReserve *st, GError **error)
922
68
{
923
68
    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
68
    if (!fu_struct_cab_header_reserve_validate_internal(st, error))
928
0
        return FALSE;
929
68
    return TRUE;
930
68
}
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
89
{
937
89
    g_autoptr(GByteArray) st = NULL;
938
89
    st = fu_input_stream_read_byte_array(stream, offset, 4, NULL, error);
939
89
    if (st == NULL) {
940
16
        g_prefix_error(error, "FuStructCabHeaderReserve failed read of 0x%x: ", (guint) 4);
941
16
        return NULL;
942
16
    }
943
73
    if (st->len != 4) {
944
5
        g_set_error(error,
945
5
                    FWUPD_ERROR,
946
5
                    FWUPD_ERROR_INVALID_DATA,
947
5
                    "FuStructCabHeaderReserve requested 0x%x and got 0x%x",
948
5
                    (guint) 4,
949
5
                    (guint) st->len);
950
5
        return NULL;
951
5
    }
952
68
    if (!fu_struct_cab_header_reserve_parse_internal(st, error))
953
0
        return NULL;
954
68
    return g_steal_pointer(&st);
955
68
}