Coverage Report

Created: 2026-02-26 06:27

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/fu-dfu-firmware-struct.c
Line
Count
Source
1
/*
2
 * This file is auto-generated, do not modify!
3
 *
4
 * SPDX-License-Identifier: LGPL-2.1-or-later
5
 */
6
7
#include "config.h"
8
9
#include <glib.h>
10
11
#include "fu-dfu-firmware-struct.h"
12
#include "fu-byte-array.h"
13
#include "fu-bytes.h"
14
#include "fu-mem-private.h"
15
#include "fu-string.h"
16
17
#ifdef G_LOG_DOMAIN
18
  #undef G_LOG_DOMAIN
19
#endif
20
0
#define G_LOG_DOMAIN "FuStruct"
21
/**
22
 * fu_struct_dfu_ftr_ref: (skip):
23
 **/
24
FuStructDfuFtr *
25
fu_struct_dfu_ftr_ref(FuStructDfuFtr *st)
26
0
{
27
0
    g_return_val_if_fail(st != NULL, NULL);
28
0
    st->refcount++;
29
0
    return st;
30
0
}
31
/**
32
 * fu_struct_dfu_ftr_unref: (skip):
33
 **/
34
void
35
fu_struct_dfu_ftr_unref(FuStructDfuFtr *st)
36
696
{
37
696
    g_return_if_fail(st != NULL);
38
696
    if (st->refcount == 0) {
39
0
        g_critical("FuStructDfuFtr refcount already zero");
40
0
        return;
41
0
    }
42
696
    if (--st->refcount > 0)
43
0
        return;
44
696
    if (st->buf != NULL)
45
690
        g_byte_array_unref(st->buf);
46
696
    g_free(st);
47
696
}
48
/**
49
 * fu_struct_dfu_ftr_new_internal: (skip):
50
 **/
51
static FuStructDfuFtr *
52
fu_struct_dfu_ftr_new_internal(void)
53
696
{
54
696
    FuStructDfuFtr *st = g_new0(FuStructDfuFtr, 1);
55
696
    st->refcount = 1;
56
696
    return st;
57
696
}
58
59
/* getters */
60
/**
61
 * fu_struct_dfu_ftr_get_release: (skip):
62
 **/
63
guint16
64
fu_struct_dfu_ftr_get_release(const FuStructDfuFtr *st)
65
510
{
66
510
    g_return_val_if_fail(st != NULL, 0x0);
67
510
    return fu_memread_uint16(st->buf->data + 0, G_LITTLE_ENDIAN);
68
510
}
69
/**
70
 * fu_struct_dfu_ftr_get_pid: (skip):
71
 **/
72
guint16
73
fu_struct_dfu_ftr_get_pid(const FuStructDfuFtr *st)
74
510
{
75
510
    g_return_val_if_fail(st != NULL, 0x0);
76
510
    return fu_memread_uint16(st->buf->data + 2, G_LITTLE_ENDIAN);
77
510
}
78
/**
79
 * fu_struct_dfu_ftr_get_vid: (skip):
80
 **/
81
guint16
82
fu_struct_dfu_ftr_get_vid(const FuStructDfuFtr *st)
83
510
{
84
510
    g_return_val_if_fail(st != NULL, 0x0);
85
510
    return fu_memread_uint16(st->buf->data + 4, G_LITTLE_ENDIAN);
86
510
}
87
/**
88
 * fu_struct_dfu_ftr_get_ver: (skip):
89
 **/
90
guint16
91
fu_struct_dfu_ftr_get_ver(const FuStructDfuFtr *st)
92
510
{
93
510
    g_return_val_if_fail(st != NULL, 0x0);
94
510
    return fu_memread_uint16(st->buf->data + 6, G_LITTLE_ENDIAN);
95
510
}
96
/**
97
 * fu_struct_dfu_ftr_get_sig: (skip):
98
 **/
99
static gchar *
100
fu_struct_dfu_ftr_get_sig(const FuStructDfuFtr *st)
101
35
{
102
35
    g_return_val_if_fail(st != NULL, NULL);
103
35
    return fu_memstrsafe(st->buf->data, st->buf->len, 8, 3, NULL);
104
35
}
105
/**
106
 * fu_struct_dfu_ftr_get_len: (skip):
107
 **/
108
guint8
109
fu_struct_dfu_ftr_get_len(const FuStructDfuFtr *st)
110
510
{
111
510
    g_return_val_if_fail(st != NULL, 0x0);
112
510
    return st->buf->data[11];
113
510
}
114
/**
115
 * fu_struct_dfu_ftr_get_crc: (skip):
116
 **/
117
guint32
118
fu_struct_dfu_ftr_get_crc(const FuStructDfuFtr *st)
119
0
{
120
0
    g_return_val_if_fail(st != NULL, 0x0);
121
0
    return fu_memread_uint32(st->buf->data + 12, G_LITTLE_ENDIAN);
122
0
}
123
124
/* setters */
125
/**
126
 * fu_struct_dfu_ftr_set_release: (skip):
127
 **/
128
void
129
fu_struct_dfu_ftr_set_release(FuStructDfuFtr *st, guint16 value)
130
145
{
131
145
    g_return_if_fail(st != NULL);
132
145
    fu_memwrite_uint16(st->buf->data + 0, value, G_LITTLE_ENDIAN);
133
145
}
134
/**
135
 * fu_struct_dfu_ftr_set_pid: (skip):
136
 **/
137
void
138
fu_struct_dfu_ftr_set_pid(FuStructDfuFtr *st, guint16 value)
139
145
{
140
145
    g_return_if_fail(st != NULL);
141
145
    fu_memwrite_uint16(st->buf->data + 2, value, G_LITTLE_ENDIAN);
142
145
}
143
/**
144
 * fu_struct_dfu_ftr_set_vid: (skip):
145
 **/
146
void
147
fu_struct_dfu_ftr_set_vid(FuStructDfuFtr *st, guint16 value)
148
145
{
149
145
    g_return_if_fail(st != NULL);
150
145
    fu_memwrite_uint16(st->buf->data + 4, value, G_LITTLE_ENDIAN);
151
145
}
152
/**
153
 * fu_struct_dfu_ftr_set_ver: (skip):
154
 **/
155
void
156
fu_struct_dfu_ftr_set_ver(FuStructDfuFtr *st, guint16 value)
157
145
{
158
145
    g_return_if_fail(st != NULL);
159
145
    fu_memwrite_uint16(st->buf->data + 6, value, G_LITTLE_ENDIAN);
160
145
}
161
/**
162
 * fu_struct_dfu_ftr_set_sig: (skip):
163
 **/
164
static gboolean
165
fu_struct_dfu_ftr_set_sig(FuStructDfuFtr *st, const gchar *value, GError **error)
166
145
{
167
145
    gsize len;
168
145
    g_return_val_if_fail(st != NULL, FALSE);
169
145
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
170
145
    if (value == NULL) {
171
0
        memset(st->buf->data + 8, 0x0, 3);
172
0
        return TRUE;
173
0
    }
174
145
    len = strlen(value);
175
145
    if (len > 3) {
176
0
        g_set_error(error,
177
0
                    FWUPD_ERROR,
178
0
                    FWUPD_ERROR_INVALID_DATA,
179
0
                    "string '%s' (0x%x bytes) does not fit in FuStructDfuFtr.sig (0x%x bytes)",
180
0
                    value, (guint) len, (guint) 3);
181
0
        return FALSE;
182
0
    }
183
145
    return fu_memcpy_safe(st->buf->data, st->buf->len, 8, (const guint8 *)value, len, 0x0, len, error);
184
145
}
185
/**
186
 * fu_struct_dfu_ftr_set_len: (skip):
187
 **/
188
void
189
fu_struct_dfu_ftr_set_len(FuStructDfuFtr *st, guint8 value)
190
145
{
191
145
    g_return_if_fail(st != NULL);
192
145
    st->buf->data[11] = value;
193
145
}
194
/**
195
 * fu_struct_dfu_ftr_set_crc: (skip):
196
 **/
197
void
198
fu_struct_dfu_ftr_set_crc(FuStructDfuFtr *st, guint32 value)
199
0
{
200
0
    g_return_if_fail(st != NULL);
201
0
    fu_memwrite_uint32(st->buf->data + 12, value, G_LITTLE_ENDIAN);
202
0
}
203
/**
204
 * fu_struct_dfu_ftr_new: (skip):
205
 **/
206
FuStructDfuFtr *
207
fu_struct_dfu_ftr_new(void)
208
145
{
209
145
    FuStructDfuFtr *st = fu_struct_dfu_ftr_new_internal();
210
145
    st->buf = g_byte_array_sized_new(16);
211
145
    fu_byte_array_set_size(st->buf, 16, 0x0);
212
145
    fu_struct_dfu_ftr_set_sig(st, "UFD", NULL);
213
145
    fu_struct_dfu_ftr_set_len(st, 16);
214
145
    return st;
215
145
}
216
/**
217
 * fu_struct_dfu_ftr_to_string: (skip):
218
 **/
219
static gchar *
220
fu_struct_dfu_ftr_to_string(const FuStructDfuFtr *st)
221
0
{
222
0
    g_autoptr(GString) str = g_string_new("FuStructDfuFtr:\n");
223
0
    g_return_val_if_fail(st != NULL, NULL);
224
0
    g_string_append_printf(str, "  release: 0x%x\n",
225
0
                           (guint) fu_struct_dfu_ftr_get_release(st));
226
0
    g_string_append_printf(str, "  pid: 0x%x\n",
227
0
                           (guint) fu_struct_dfu_ftr_get_pid(st));
228
0
    g_string_append_printf(str, "  vid: 0x%x\n",
229
0
                           (guint) fu_struct_dfu_ftr_get_vid(st));
230
0
    g_string_append_printf(str, "  ver: 0x%x\n",
231
0
                           (guint) fu_struct_dfu_ftr_get_ver(st));
232
0
    {
233
0
        g_autofree gchar *tmp = fu_struct_dfu_ftr_get_sig(st);
234
0
        if (tmp != NULL)
235
0
            g_string_append_printf(str, "  sig: %s\n", tmp);
236
0
    }
237
0
    g_string_append_printf(str, "  len: 0x%x\n",
238
0
                           (guint) fu_struct_dfu_ftr_get_len(st));
239
0
    g_string_append_printf(str, "  crc: 0x%x\n",
240
0
                           (guint) fu_struct_dfu_ftr_get_crc(st));
241
0
    if (str->len > 0)
242
0
        g_string_set_size(str, str->len - 1);
243
0
    return g_string_free(g_steal_pointer(&str), FALSE);
244
0
}
245
static gboolean
246
fu_struct_dfu_ftr_validate_internal(FuStructDfuFtr *st, GError **error)
247
545
{
248
545
    g_return_val_if_fail(st != NULL, FALSE);
249
545
    if (strncmp((const gchar *) (st->buf->data + 8), "UFD", 3) != 0) {
250
35
        g_autofree gchar *str = fu_struct_dfu_ftr_get_sig(st);
251
35
        g_set_error(error,
252
35
                    FWUPD_ERROR,
253
35
                    FWUPD_ERROR_INVALID_DATA,
254
35
                    "constant FuStructDfuFtr.sig was not valid, "
255
35
                    "expected 'UFD' and got '%s'",
256
35
                    str);
257
35
        return FALSE;
258
35
    }
259
510
    return TRUE;
260
545
}
261
/**
262
 * fu_struct_dfu_ftr_validate_stream: (skip):
263
 **/
264
gboolean
265
fu_struct_dfu_ftr_validate_stream(GInputStream *stream, gsize offset, GError **error)
266
0
{
267
0
    g_autoptr(FuStructDfuFtr) st = fu_struct_dfu_ftr_new_internal();
268
0
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
269
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
270
0
    st->buf = fu_input_stream_read_byte_array(stream, offset, 16, NULL, error);
271
0
    if (st->buf == NULL) {
272
0
        g_prefix_error(error, "FuStructDfuFtr failed read of 0x%x: ", (guint) 16);
273
0
        return FALSE;
274
0
    }
275
0
    if (st->buf->len != 16) {
276
0
        g_set_error(error,
277
0
                    FWUPD_ERROR,
278
0
                    FWUPD_ERROR_INVALID_DATA,
279
0
                    "FuStructDfuFtr requested 0x%x and got 0x%x",
280
0
                    (guint) 16,
281
0
                    (guint) st->buf->len);
282
0
        return FALSE;
283
0
    }
284
0
    return fu_struct_dfu_ftr_validate_internal(st, error);
285
0
}
286
static gboolean
287
fu_struct_dfu_ftr_parse_internal(FuStructDfuFtr *st, GError **error)
288
545
{
289
545
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
290
0
        g_autofree gchar *str = fu_struct_dfu_ftr_to_string(st);
291
0
        g_debug("%s", str);
292
0
    }
293
545
    if (!fu_struct_dfu_ftr_validate_internal(st, error))
294
35
        return FALSE;
295
510
    return TRUE;
296
545
}
297
/**
298
 * fu_struct_dfu_ftr_parse_stream: (skip):
299
 **/
300
FuStructDfuFtr *
301
fu_struct_dfu_ftr_parse_stream(GInputStream *stream, gsize offset, GError **error)
302
551
{
303
551
    g_autoptr(FuStructDfuFtr) st = fu_struct_dfu_ftr_new_internal();
304
551
    st->buf = fu_input_stream_read_byte_array(stream, offset, 16, NULL, error);
305
551
    if (st->buf == NULL) {
306
6
        g_prefix_error(error, "FuStructDfuFtr failed read of 0x%x: ", (guint) 16);
307
6
        return NULL;
308
6
    }
309
545
    if (st->buf->len != 16) {
310
0
        g_set_error(error,
311
0
                    FWUPD_ERROR,
312
0
                    FWUPD_ERROR_INVALID_DATA,
313
0
                    "FuStructDfuFtr requested 0x%x and got 0x%x",
314
0
                    (guint) 16,
315
0
                    (guint) st->buf->len);
316
0
        return NULL;
317
0
    }
318
545
    if (!fu_struct_dfu_ftr_parse_internal(st, error))
319
35
        return NULL;
320
510
    return g_steal_pointer(&st);
321
545
}
322
/**
323
 * fu_struct_dfuse_hdr_ref: (skip):
324
 **/
325
FuStructDfuseHdr *
326
fu_struct_dfuse_hdr_ref(FuStructDfuseHdr *st)
327
0
{
328
0
    g_return_val_if_fail(st != NULL, NULL);
329
0
    st->refcount++;
330
0
    return st;
331
0
}
332
/**
333
 * fu_struct_dfuse_hdr_unref: (skip):
334
 **/
335
void
336
fu_struct_dfuse_hdr_unref(FuStructDfuseHdr *st)
337
1.27k
{
338
1.27k
    g_return_if_fail(st != NULL);
339
1.27k
    if (st->refcount == 0) {
340
0
        g_critical("FuStructDfuseHdr refcount already zero");
341
0
        return;
342
0
    }
343
1.27k
    if (--st->refcount > 0)
344
0
        return;
345
1.27k
    if (st->buf != NULL)
346
1.27k
        g_byte_array_unref(st->buf);
347
1.27k
    g_free(st);
348
1.27k
}
349
/**
350
 * fu_struct_dfuse_hdr_new_internal: (skip):
351
 **/
352
static FuStructDfuseHdr *
353
fu_struct_dfuse_hdr_new_internal(void)
354
1.27k
{
355
1.27k
    FuStructDfuseHdr *st = g_new0(FuStructDfuseHdr, 1);
356
1.27k
    st->refcount = 1;
357
1.27k
    return st;
358
1.27k
}
359
360
/* getters */
361
/**
362
 * fu_struct_dfuse_hdr_get_sig: (skip):
363
 **/
364
static gchar *
365
fu_struct_dfuse_hdr_get_sig(const FuStructDfuseHdr *st)
366
54
{
367
54
    g_return_val_if_fail(st != NULL, NULL);
368
54
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 5, NULL);
369
54
}
370
/**
371
 * fu_struct_dfuse_hdr_get_ver: (skip):
372
 **/
373
static guint8
374
fu_struct_dfuse_hdr_get_ver(const FuStructDfuseHdr *st)
375
1.06k
{
376
1.06k
    g_return_val_if_fail(st != NULL, 0x0);
377
1.06k
    return st->buf->data[5];
378
1.06k
}
379
/**
380
 * fu_struct_dfuse_hdr_get_image_size: (skip):
381
 **/
382
guint32
383
fu_struct_dfuse_hdr_get_image_size(const FuStructDfuseHdr *st)
384
590
{
385
590
    g_return_val_if_fail(st != NULL, 0x0);
386
590
    return fu_memread_uint32(st->buf->data + 6, G_LITTLE_ENDIAN);
387
590
}
388
/**
389
 * fu_struct_dfuse_hdr_get_targets: (skip):
390
 **/
391
guint8
392
fu_struct_dfuse_hdr_get_targets(const FuStructDfuseHdr *st)
393
420
{
394
420
    g_return_val_if_fail(st != NULL, 0x0);
395
420
    return st->buf->data[10];
396
420
}
397
398
/* setters */
399
/**
400
 * fu_struct_dfuse_hdr_set_sig: (skip):
401
 **/
402
static gboolean
403
fu_struct_dfuse_hdr_set_sig(FuStructDfuseHdr *st, const gchar *value, GError **error)
404
145
{
405
145
    gsize len;
406
145
    g_return_val_if_fail(st != NULL, FALSE);
407
145
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
408
145
    if (value == NULL) {
409
0
        memset(st->buf->data + 0, 0x0, 5);
410
0
        return TRUE;
411
0
    }
412
145
    len = strlen(value);
413
145
    if (len > 5) {
414
0
        g_set_error(error,
415
0
                    FWUPD_ERROR,
416
0
                    FWUPD_ERROR_INVALID_DATA,
417
0
                    "string '%s' (0x%x bytes) does not fit in FuStructDfuseHdr.sig (0x%x bytes)",
418
0
                    value, (guint) len, (guint) 5);
419
0
        return FALSE;
420
0
    }
421
145
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
422
145
}
423
/**
424
 * fu_struct_dfuse_hdr_set_ver: (skip):
425
 **/
426
static void
427
fu_struct_dfuse_hdr_set_ver(FuStructDfuseHdr *st, guint8 value)
428
145
{
429
145
    g_return_if_fail(st != NULL);
430
145
    st->buf->data[5] = value;
431
145
}
432
/**
433
 * fu_struct_dfuse_hdr_set_image_size: (skip):
434
 **/
435
void
436
fu_struct_dfuse_hdr_set_image_size(FuStructDfuseHdr *st, guint32 value)
437
145
{
438
145
    g_return_if_fail(st != NULL);
439
145
    fu_memwrite_uint32(st->buf->data + 6, value, G_LITTLE_ENDIAN);
440
145
}
441
/**
442
 * fu_struct_dfuse_hdr_set_targets: (skip):
443
 **/
444
void
445
fu_struct_dfuse_hdr_set_targets(FuStructDfuseHdr *st, guint8 value)
446
145
{
447
145
    g_return_if_fail(st != NULL);
448
145
    st->buf->data[10] = value;
449
145
}
450
/**
451
 * fu_struct_dfuse_hdr_new: (skip):
452
 **/
453
FuStructDfuseHdr *
454
fu_struct_dfuse_hdr_new(void)
455
145
{
456
145
    FuStructDfuseHdr *st = fu_struct_dfuse_hdr_new_internal();
457
145
    st->buf = g_byte_array_sized_new(11);
458
145
    fu_byte_array_set_size(st->buf, 11, 0x0);
459
145
    fu_struct_dfuse_hdr_set_sig(st, "DfuSe", NULL);
460
145
    fu_struct_dfuse_hdr_set_ver(st, 0x01);
461
145
    return st;
462
145
}
463
/**
464
 * fu_struct_dfuse_hdr_to_string: (skip):
465
 **/
466
static gchar *
467
fu_struct_dfuse_hdr_to_string(const FuStructDfuseHdr *st)
468
0
{
469
0
    g_autoptr(GString) str = g_string_new("FuStructDfuseHdr:\n");
470
0
    g_return_val_if_fail(st != NULL, NULL);
471
0
    {
472
0
        g_autofree gchar *tmp = fu_struct_dfuse_hdr_get_sig(st);
473
0
        if (tmp != NULL)
474
0
            g_string_append_printf(str, "  sig: %s\n", tmp);
475
0
    }
476
0
    g_string_append_printf(str, "  ver: 0x%x\n",
477
0
                           (guint) fu_struct_dfuse_hdr_get_ver(st));
478
0
    g_string_append_printf(str, "  image_size: 0x%x\n",
479
0
                           (guint) fu_struct_dfuse_hdr_get_image_size(st));
480
0
    g_string_append_printf(str, "  targets: 0x%x\n",
481
0
                           (guint) fu_struct_dfuse_hdr_get_targets(st));
482
0
    if (str->len > 0)
483
0
        g_string_set_size(str, str->len - 1);
484
0
    return g_string_free(g_steal_pointer(&str), FALSE);
485
0
}
486
/**
487
 * fu_struct_dfuse_hdr_to_bytes: (skip):
488
 **/
489
GBytes *
490
fu_struct_dfuse_hdr_to_bytes(const FuStructDfuseHdr *st)
491
145
{
492
145
    g_return_val_if_fail(st != NULL, NULL);
493
145
    return g_bytes_new(st->buf->data, st->buf->len);
494
145
}
495
static gboolean
496
fu_struct_dfuse_hdr_validate_internal(FuStructDfuseHdr *st, GError **error)
497
1.11k
{
498
1.11k
    g_return_val_if_fail(st != NULL, FALSE);
499
1.11k
    if (strncmp((const gchar *) (st->buf->data + 0), "DfuSe", 5) != 0) {
500
54
        g_autofree gchar *str = fu_struct_dfuse_hdr_get_sig(st);
501
54
        g_set_error(error,
502
54
                    FWUPD_ERROR,
503
54
                    FWUPD_ERROR_INVALID_DATA,
504
54
                    "constant FuStructDfuseHdr.sig was not valid, "
505
54
                    "expected 'DfuSe' and got '%s'",
506
54
                    str);
507
54
        return FALSE;
508
54
    }
509
1.06k
    if (fu_struct_dfuse_hdr_get_ver(st) != 0x01) {
510
7
        g_set_error_literal(error,
511
7
                            FWUPD_ERROR,
512
7
                            FWUPD_ERROR_INVALID_DATA,
513
7
                            "constant FuStructDfuseHdr.ver was not valid");
514
7
        return FALSE;
515
7
    }
516
1.05k
    return TRUE;
517
1.06k
}
518
/**
519
 * fu_struct_dfuse_hdr_validate_stream: (skip):
520
 **/
521
gboolean
522
fu_struct_dfuse_hdr_validate_stream(GInputStream *stream, gsize offset, GError **error)
523
624
{
524
624
    g_autoptr(FuStructDfuseHdr) st = fu_struct_dfuse_hdr_new_internal();
525
624
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
526
624
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
527
624
    st->buf = fu_input_stream_read_byte_array(stream, offset, 11, NULL, error);
528
624
    if (st->buf == NULL) {
529
0
        g_prefix_error(error, "FuStructDfuseHdr failed read of 0x%x: ", (guint) 11);
530
0
        return FALSE;
531
0
    }
532
624
    if (st->buf->len != 11) {
533
12
        g_set_error(error,
534
12
                    FWUPD_ERROR,
535
12
                    FWUPD_ERROR_INVALID_DATA,
536
12
                    "FuStructDfuseHdr requested 0x%x and got 0x%x",
537
12
                    (guint) 11,
538
12
                    (guint) st->buf->len);
539
12
        return FALSE;
540
12
    }
541
612
    return fu_struct_dfuse_hdr_validate_internal(st, error);
542
624
}
543
static gboolean
544
fu_struct_dfuse_hdr_parse_internal(FuStructDfuseHdr *st, GError **error)
545
505
{
546
505
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
547
0
        g_autofree gchar *str = fu_struct_dfuse_hdr_to_string(st);
548
0
        g_debug("%s", str);
549
0
    }
550
505
    if (!fu_struct_dfuse_hdr_validate_internal(st, error))
551
0
        return FALSE;
552
505
    return TRUE;
553
505
}
554
/**
555
 * fu_struct_dfuse_hdr_parse_stream: (skip):
556
 **/
557
FuStructDfuseHdr *
558
fu_struct_dfuse_hdr_parse_stream(GInputStream *stream, gsize offset, GError **error)
559
505
{
560
505
    g_autoptr(FuStructDfuseHdr) st = fu_struct_dfuse_hdr_new_internal();
561
505
    st->buf = fu_input_stream_read_byte_array(stream, offset, 11, NULL, error);
562
505
    if (st->buf == NULL) {
563
0
        g_prefix_error(error, "FuStructDfuseHdr failed read of 0x%x: ", (guint) 11);
564
0
        return NULL;
565
0
    }
566
505
    if (st->buf->len != 11) {
567
0
        g_set_error(error,
568
0
                    FWUPD_ERROR,
569
0
                    FWUPD_ERROR_INVALID_DATA,
570
0
                    "FuStructDfuseHdr requested 0x%x and got 0x%x",
571
0
                    (guint) 11,
572
0
                    (guint) st->buf->len);
573
0
        return NULL;
574
0
    }
575
505
    if (!fu_struct_dfuse_hdr_parse_internal(st, error))
576
0
        return NULL;
577
505
    return g_steal_pointer(&st);
578
505
}
579
/**
580
 * fu_struct_dfuse_image_ref: (skip):
581
 **/
582
FuStructDfuseImage *
583
fu_struct_dfuse_image_ref(FuStructDfuseImage *st)
584
0
{
585
0
    g_return_val_if_fail(st != NULL, NULL);
586
0
    st->refcount++;
587
0
    return st;
588
0
}
589
/**
590
 * fu_struct_dfuse_image_unref: (skip):
591
 **/
592
void
593
fu_struct_dfuse_image_unref(FuStructDfuseImage *st)
594
567
{
595
567
    g_return_if_fail(st != NULL);
596
567
    if (st->refcount == 0) {
597
0
        g_critical("FuStructDfuseImage refcount already zero");
598
0
        return;
599
0
    }
600
567
    if (--st->refcount > 0)
601
0
        return;
602
567
    if (st->buf != NULL)
603
551
        g_byte_array_unref(st->buf);
604
567
    g_free(st);
605
567
}
606
/**
607
 * fu_struct_dfuse_image_new_internal: (skip):
608
 **/
609
static FuStructDfuseImage *
610
fu_struct_dfuse_image_new_internal(void)
611
567
{
612
567
    FuStructDfuseImage *st = g_new0(FuStructDfuseImage, 1);
613
567
    st->refcount = 1;
614
567
    return st;
615
567
}
616
617
/* getters */
618
/**
619
 * fu_struct_dfuse_image_get_sig: (skip):
620
 **/
621
static gchar *
622
fu_struct_dfuse_image_get_sig(const FuStructDfuseImage *st)
623
56
{
624
56
    g_return_val_if_fail(st != NULL, NULL);
625
56
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 6, NULL);
626
56
}
627
/**
628
 * fu_struct_dfuse_image_get_alt_setting: (skip):
629
 **/
630
guint8
631
fu_struct_dfuse_image_get_alt_setting(const FuStructDfuseImage *st)
632
344
{
633
344
    g_return_val_if_fail(st != NULL, 0x0);
634
344
    return st->buf->data[6];
635
344
}
636
/**
637
 * fu_struct_dfuse_image_get_target_named: (skip):
638
 **/
639
guint32
640
fu_struct_dfuse_image_get_target_named(const FuStructDfuseImage *st)
641
344
{
642
344
    g_return_val_if_fail(st != NULL, 0x0);
643
344
    return fu_memread_uint32(st->buf->data + 7, G_LITTLE_ENDIAN);
644
344
}
645
/**
646
 * fu_struct_dfuse_image_get_target_name: (skip):
647
 **/
648
gchar *
649
fu_struct_dfuse_image_get_target_name(const FuStructDfuseImage *st)
650
99
{
651
99
    g_return_val_if_fail(st != NULL, NULL);
652
99
    return fu_memstrsafe(st->buf->data, st->buf->len, 11, 255, NULL);
653
99
}
654
/**
655
 * fu_struct_dfuse_image_get_target_size: (skip):
656
 **/
657
guint32
658
fu_struct_dfuse_image_get_target_size(const FuStructDfuseImage *st)
659
0
{
660
0
    g_return_val_if_fail(st != NULL, 0x0);
661
0
    return fu_memread_uint32(st->buf->data + 266, G_LITTLE_ENDIAN);
662
0
}
663
/**
664
 * fu_struct_dfuse_image_get_chunks: (skip):
665
 **/
666
guint32
667
fu_struct_dfuse_image_get_chunks(const FuStructDfuseImage *st)
668
344
{
669
344
    g_return_val_if_fail(st != NULL, 0x0);
670
344
    return fu_memread_uint32(st->buf->data + 270, G_LITTLE_ENDIAN);
671
344
}
672
673
/* setters */
674
/**
675
 * fu_struct_dfuse_image_set_sig: (skip):
676
 **/
677
static gboolean
678
fu_struct_dfuse_image_set_sig(FuStructDfuseImage *st, const gchar *value, GError **error)
679
126
{
680
126
    gsize len;
681
126
    g_return_val_if_fail(st != NULL, FALSE);
682
126
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
683
126
    if (value == NULL) {
684
0
        memset(st->buf->data + 0, 0x0, 6);
685
0
        return TRUE;
686
0
    }
687
126
    len = strlen(value);
688
126
    if (len > 6) {
689
0
        g_set_error(error,
690
0
                    FWUPD_ERROR,
691
0
                    FWUPD_ERROR_INVALID_DATA,
692
0
                    "string '%s' (0x%x bytes) does not fit in FuStructDfuseImage.sig (0x%x bytes)",
693
0
                    value, (guint) len, (guint) 6);
694
0
        return FALSE;
695
0
    }
696
126
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
697
126
}
698
/**
699
 * fu_struct_dfuse_image_set_alt_setting: (skip):
700
 **/
701
void
702
fu_struct_dfuse_image_set_alt_setting(FuStructDfuseImage *st, guint8 value)
703
126
{
704
126
    g_return_if_fail(st != NULL);
705
126
    st->buf->data[6] = value;
706
126
}
707
/**
708
 * fu_struct_dfuse_image_set_target_named: (skip):
709
 **/
710
void
711
fu_struct_dfuse_image_set_target_named(FuStructDfuseImage *st, guint32 value)
712
48
{
713
48
    g_return_if_fail(st != NULL);
714
48
    fu_memwrite_uint32(st->buf->data + 7, value, G_LITTLE_ENDIAN);
715
48
}
716
/**
717
 * fu_struct_dfuse_image_set_target_name: (skip):
718
 **/
719
gboolean
720
fu_struct_dfuse_image_set_target_name(FuStructDfuseImage *st, const gchar *value, GError **error)
721
48
{
722
48
    gsize len;
723
48
    g_return_val_if_fail(st != NULL, FALSE);
724
48
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
725
48
    if (value == NULL) {
726
0
        memset(st->buf->data + 11, 0x0, 255);
727
0
        return TRUE;
728
0
    }
729
48
    len = strlen(value);
730
48
    if (len > 255) {
731
0
        g_set_error(error,
732
0
                    FWUPD_ERROR,
733
0
                    FWUPD_ERROR_INVALID_DATA,
734
0
                    "string '%s' (0x%x bytes) does not fit in FuStructDfuseImage.target_name (0x%x bytes)",
735
0
                    value, (guint) len, (guint) 255);
736
0
        return FALSE;
737
0
    }
738
48
    return fu_memcpy_safe(st->buf->data, st->buf->len, 11, (const guint8 *)value, len, 0x0, len, error);
739
48
}
740
/**
741
 * fu_struct_dfuse_image_set_target_size: (skip):
742
 **/
743
void
744
fu_struct_dfuse_image_set_target_size(FuStructDfuseImage *st, guint32 value)
745
126
{
746
126
    g_return_if_fail(st != NULL);
747
126
    fu_memwrite_uint32(st->buf->data + 266, value, G_LITTLE_ENDIAN);
748
126
}
749
/**
750
 * fu_struct_dfuse_image_set_chunks: (skip):
751
 **/
752
void
753
fu_struct_dfuse_image_set_chunks(FuStructDfuseImage *st, guint32 value)
754
126
{
755
126
    g_return_if_fail(st != NULL);
756
126
    fu_memwrite_uint32(st->buf->data + 270, value, G_LITTLE_ENDIAN);
757
126
}
758
/**
759
 * fu_struct_dfuse_image_new: (skip):
760
 **/
761
FuStructDfuseImage *
762
fu_struct_dfuse_image_new(void)
763
126
{
764
126
    FuStructDfuseImage *st = fu_struct_dfuse_image_new_internal();
765
126
    st->buf = g_byte_array_sized_new(274);
766
126
    fu_byte_array_set_size(st->buf, 274, 0x0);
767
126
    fu_struct_dfuse_image_set_sig(st, "Target", NULL);
768
126
    return st;
769
126
}
770
/**
771
 * fu_struct_dfuse_image_to_string: (skip):
772
 **/
773
static gchar *
774
fu_struct_dfuse_image_to_string(const FuStructDfuseImage *st)
775
0
{
776
0
    g_autoptr(GString) str = g_string_new("FuStructDfuseImage:\n");
777
0
    g_return_val_if_fail(st != NULL, NULL);
778
0
    {
779
0
        g_autofree gchar *tmp = fu_struct_dfuse_image_get_sig(st);
780
0
        if (tmp != NULL)
781
0
            g_string_append_printf(str, "  sig: %s\n", tmp);
782
0
    }
783
0
    g_string_append_printf(str, "  alt_setting: 0x%x\n",
784
0
                           (guint) fu_struct_dfuse_image_get_alt_setting(st));
785
0
    g_string_append_printf(str, "  target_named: 0x%x\n",
786
0
                           (guint) fu_struct_dfuse_image_get_target_named(st));
787
0
    {
788
0
        g_autofree gchar *tmp = fu_struct_dfuse_image_get_target_name(st);
789
0
        if (tmp != NULL)
790
0
            g_string_append_printf(str, "  target_name: %s\n", tmp);
791
0
    }
792
0
    g_string_append_printf(str, "  target_size: 0x%x\n",
793
0
                           (guint) fu_struct_dfuse_image_get_target_size(st));
794
0
    g_string_append_printf(str, "  chunks: 0x%x\n",
795
0
                           (guint) fu_struct_dfuse_image_get_chunks(st));
796
0
    if (str->len > 0)
797
0
        g_string_set_size(str, str->len - 1);
798
0
    return g_string_free(g_steal_pointer(&str), FALSE);
799
0
}
800
/**
801
 * fu_struct_dfuse_image_to_bytes: (skip):
802
 **/
803
GBytes *
804
fu_struct_dfuse_image_to_bytes(const FuStructDfuseImage *st)
805
126
{
806
126
    g_return_val_if_fail(st != NULL, NULL);
807
126
    return g_bytes_new(st->buf->data, st->buf->len);
808
126
}
809
static gboolean
810
fu_struct_dfuse_image_validate_internal(FuStructDfuseImage *st, GError **error)
811
400
{
812
400
    g_return_val_if_fail(st != NULL, FALSE);
813
400
    if (strncmp((const gchar *) (st->buf->data + 0), "Target", 6) != 0) {
814
56
        g_autofree gchar *str = fu_struct_dfuse_image_get_sig(st);
815
56
        g_set_error(error,
816
56
                    FWUPD_ERROR,
817
56
                    FWUPD_ERROR_INVALID_DATA,
818
56
                    "constant FuStructDfuseImage.sig was not valid, "
819
56
                    "expected 'Target' and got '%s'",
820
56
                    str);
821
56
        return FALSE;
822
56
    }
823
344
    return TRUE;
824
400
}
825
/**
826
 * fu_struct_dfuse_image_validate: (skip):
827
 **/
828
gboolean
829
fu_struct_dfuse_image_validate(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
830
0
{
831
0
    GByteArray st_buf = {.data = (guint8 *) buf + offset, .len = bufsz - offset, };
832
0
    FuStructDfuseImage st_tmp = {.buf = &st_buf };
833
0
    g_return_val_if_fail(buf != NULL, FALSE);
834
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
835
0
    if (!fu_memchk_read(bufsz, offset, 274, error)) {
836
0
        g_prefix_error_literal(error, "invalid struct FuStructDfuseImage: ");
837
0
        return FALSE;
838
0
    }
839
0
    if (!fu_struct_dfuse_image_validate_internal(&st_tmp, error))
840
0
        return FALSE;
841
0
    return TRUE;
842
0
}
843
static gboolean
844
fu_struct_dfuse_image_parse_internal(FuStructDfuseImage *st, GError **error)
845
400
{
846
400
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
847
0
        g_autofree gchar *str = fu_struct_dfuse_image_to_string(st);
848
0
        g_debug("%s", str);
849
0
    }
850
400
    if (!fu_struct_dfuse_image_validate_internal(st, error))
851
56
        return FALSE;
852
344
    return TRUE;
853
400
}
854
/**
855
 * fu_struct_dfuse_image_parse_stream: (skip):
856
 **/
857
FuStructDfuseImage *
858
fu_struct_dfuse_image_parse_stream(GInputStream *stream, gsize offset, GError **error)
859
441
{
860
441
    g_autoptr(FuStructDfuseImage) st = fu_struct_dfuse_image_new_internal();
861
441
    st->buf = fu_input_stream_read_byte_array(stream, offset, 274, NULL, error);
862
441
    if (st->buf == NULL) {
863
16
        g_prefix_error(error, "FuStructDfuseImage failed read of 0x%x: ", (guint) 274);
864
16
        return NULL;
865
16
    }
866
425
    if (st->buf->len != 274) {
867
25
        g_set_error(error,
868
25
                    FWUPD_ERROR,
869
25
                    FWUPD_ERROR_INVALID_DATA,
870
25
                    "FuStructDfuseImage requested 0x%x and got 0x%x",
871
25
                    (guint) 274,
872
25
                    (guint) st->buf->len);
873
25
        return NULL;
874
25
    }
875
400
    if (!fu_struct_dfuse_image_parse_internal(st, error))
876
56
        return NULL;
877
344
    return g_steal_pointer(&st);
878
400
}
879
/**
880
 * fu_struct_dfuse_element_ref: (skip):
881
 **/
882
FuStructDfuseElement *
883
fu_struct_dfuse_element_ref(FuStructDfuseElement *st)
884
0
{
885
0
    g_return_val_if_fail(st != NULL, NULL);
886
0
    st->refcount++;
887
0
    return st;
888
0
}
889
/**
890
 * fu_struct_dfuse_element_unref: (skip):
891
 **/
892
void
893
fu_struct_dfuse_element_unref(FuStructDfuseElement *st)
894
5.67k
{
895
5.67k
    g_return_if_fail(st != NULL);
896
5.67k
    if (st->refcount == 0) {
897
0
        g_critical("FuStructDfuseElement refcount already zero");
898
0
        return;
899
0
    }
900
5.67k
    if (--st->refcount > 0)
901
0
        return;
902
5.67k
    if (st->buf != NULL)
903
5.55k
        g_byte_array_unref(st->buf);
904
5.67k
    g_free(st);
905
5.67k
}
906
/**
907
 * fu_struct_dfuse_element_new_internal: (skip):
908
 **/
909
static FuStructDfuseElement *
910
fu_struct_dfuse_element_new_internal(void)
911
5.67k
{
912
5.67k
    FuStructDfuseElement *st = g_new0(FuStructDfuseElement, 1);
913
5.67k
    st->refcount = 1;
914
5.67k
    return st;
915
5.67k
}
916
917
/* getters */
918
/**
919
 * fu_struct_dfuse_element_get_address: (skip):
920
 **/
921
guint32
922
fu_struct_dfuse_element_get_address(const FuStructDfuseElement *st)
923
3.90k
{
924
3.90k
    g_return_val_if_fail(st != NULL, 0x0);
925
3.90k
    return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN);
926
3.90k
}
927
/**
928
 * fu_struct_dfuse_element_get_size: (skip):
929
 **/
930
guint32
931
fu_struct_dfuse_element_get_size(const FuStructDfuseElement *st)
932
3.95k
{
933
3.95k
    g_return_val_if_fail(st != NULL, 0x0);
934
3.95k
    return fu_memread_uint32(st->buf->data + 4, G_LITTLE_ENDIAN);
935
3.95k
}
936
937
/* setters */
938
/**
939
 * fu_struct_dfuse_element_set_address: (skip):
940
 **/
941
void
942
fu_struct_dfuse_element_set_address(FuStructDfuseElement *st, guint32 value)
943
1.58k
{
944
1.58k
    g_return_if_fail(st != NULL);
945
1.58k
    fu_memwrite_uint32(st->buf->data + 0, value, G_LITTLE_ENDIAN);
946
1.58k
}
947
/**
948
 * fu_struct_dfuse_element_set_size: (skip):
949
 **/
950
void
951
fu_struct_dfuse_element_set_size(FuStructDfuseElement *st, guint32 value)
952
1.58k
{
953
1.58k
    g_return_if_fail(st != NULL);
954
1.58k
    fu_memwrite_uint32(st->buf->data + 4, value, G_LITTLE_ENDIAN);
955
1.58k
}
956
/**
957
 * fu_struct_dfuse_element_new: (skip):
958
 **/
959
FuStructDfuseElement *
960
fu_struct_dfuse_element_new(void)
961
1.58k
{
962
1.58k
    FuStructDfuseElement *st = fu_struct_dfuse_element_new_internal();
963
1.58k
    st->buf = g_byte_array_sized_new(8);
964
1.58k
    fu_byte_array_set_size(st->buf, 8, 0x0);
965
1.58k
    return st;
966
1.58k
}
967
/**
968
 * fu_struct_dfuse_element_to_string: (skip):
969
 **/
970
static gchar *
971
fu_struct_dfuse_element_to_string(const FuStructDfuseElement *st)
972
0
{
973
0
    g_autoptr(GString) str = g_string_new("FuStructDfuseElement:\n");
974
0
    g_return_val_if_fail(st != NULL, NULL);
975
0
    g_string_append_printf(str, "  address: 0x%x\n",
976
0
                           (guint) fu_struct_dfuse_element_get_address(st));
977
0
    g_string_append_printf(str, "  size: 0x%x\n",
978
0
                           (guint) fu_struct_dfuse_element_get_size(st));
979
0
    if (str->len > 0)
980
0
        g_string_set_size(str, str->len - 1);
981
0
    return g_string_free(g_steal_pointer(&str), FALSE);
982
0
}
983
/**
984
 * fu_struct_dfuse_element_to_bytes: (skip):
985
 **/
986
GBytes *
987
fu_struct_dfuse_element_to_bytes(const FuStructDfuseElement *st)
988
1.58k
{
989
1.58k
    g_return_val_if_fail(st != NULL, NULL);
990
1.58k
    return g_bytes_new(st->buf->data, st->buf->len);
991
1.58k
}
992
static gboolean
993
fu_struct_dfuse_element_validate_internal(FuStructDfuseElement *st, GError **error)
994
3.95k
{
995
3.95k
    g_return_val_if_fail(st != NULL, FALSE);
996
3.95k
    return TRUE;
997
3.95k
}
998
static gboolean
999
fu_struct_dfuse_element_parse_internal(FuStructDfuseElement *st, GError **error)
1000
3.95k
{
1001
3.95k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
1002
0
        g_autofree gchar *str = fu_struct_dfuse_element_to_string(st);
1003
0
        g_debug("%s", str);
1004
0
    }
1005
3.95k
    if (!fu_struct_dfuse_element_validate_internal(st, error))
1006
0
        return FALSE;
1007
3.95k
    return TRUE;
1008
3.95k
}
1009
/**
1010
 * fu_struct_dfuse_element_parse_stream: (skip):
1011
 **/
1012
FuStructDfuseElement *
1013
fu_struct_dfuse_element_parse_stream(GInputStream *stream, gsize offset, GError **error)
1014
4.08k
{
1015
4.08k
    g_autoptr(FuStructDfuseElement) st = fu_struct_dfuse_element_new_internal();
1016
4.08k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error);
1017
4.08k
    if (st->buf == NULL) {
1018
115
        g_prefix_error(error, "FuStructDfuseElement failed read of 0x%x: ", (guint) 8);
1019
115
        return NULL;
1020
115
    }
1021
3.96k
    if (st->buf->len != 8) {
1022
7
        g_set_error(error,
1023
7
                    FWUPD_ERROR,
1024
7
                    FWUPD_ERROR_INVALID_DATA,
1025
7
                    "FuStructDfuseElement requested 0x%x and got 0x%x",
1026
7
                    (guint) 8,
1027
7
                    (guint) st->buf->len);
1028
7
        return NULL;
1029
7
    }
1030
3.95k
    if (!fu_struct_dfuse_element_parse_internal(st, error))
1031
0
        return NULL;
1032
3.95k
    return g_steal_pointer(&st);
1033
3.95k
}