Coverage Report

Created: 2026-07-16 07:10

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
674
{
37
674
    g_return_if_fail(st != NULL);
38
674
    if (st->refcount == 0) {
39
0
        g_critical("FuStructDfuFtr refcount already zero");
40
0
        return;
41
0
    }
42
674
    if (--st->refcount > 0)
43
0
        return;
44
674
    if (st->buf != NULL)
45
674
        g_byte_array_unref(st->buf);
46
674
    g_free(st);
47
674
}
48
/**
49
 * fu_struct_dfu_ftr_new_internal: (skip):
50
 **/
51
static FuStructDfuFtr *
52
fu_struct_dfu_ftr_new_internal(void)
53
674
{
54
674
    FuStructDfuFtr *st = g_new0(FuStructDfuFtr, 1);
55
674
    st->refcount = 1;
56
674
    return st;
57
674
}
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
497
{
66
497
    g_return_val_if_fail(st != NULL, 0x0);
67
497
    return fu_memread_uint16(st->buf->data + 0, G_LITTLE_ENDIAN);
68
497
}
69
/**
70
 * fu_struct_dfu_ftr_get_pid: (skip):
71
 **/
72
guint16
73
fu_struct_dfu_ftr_get_pid(const FuStructDfuFtr *st)
74
497
{
75
497
    g_return_val_if_fail(st != NULL, 0x0);
76
497
    return fu_memread_uint16(st->buf->data + 2, G_LITTLE_ENDIAN);
77
497
}
78
/**
79
 * fu_struct_dfu_ftr_get_vid: (skip):
80
 **/
81
guint16
82
fu_struct_dfu_ftr_get_vid(const FuStructDfuFtr *st)
83
497
{
84
497
    g_return_val_if_fail(st != NULL, 0x0);
85
497
    return fu_memread_uint16(st->buf->data + 4, G_LITTLE_ENDIAN);
86
497
}
87
/**
88
 * fu_struct_dfu_ftr_get_ver: (skip):
89
 **/
90
guint16
91
fu_struct_dfu_ftr_get_ver(const FuStructDfuFtr *st)
92
497
{
93
497
    g_return_val_if_fail(st != NULL, 0x0);
94
497
    return fu_memread_uint16(st->buf->data + 6, G_LITTLE_ENDIAN);
95
497
}
96
/**
97
 * fu_struct_dfu_ftr_get_sig: (skip):
98
 **/
99
static gchar *
100
fu_struct_dfu_ftr_get_sig(const FuStructDfuFtr *st)
101
37
{
102
37
    g_return_val_if_fail(st != NULL, NULL);
103
37
    return fu_memstrsafe(st->buf->data, st->buf->len, 8, 3, NULL);
104
37
}
105
/**
106
 * fu_struct_dfu_ftr_get_len: (skip):
107
 **/
108
guint8
109
fu_struct_dfu_ftr_get_len(const FuStructDfuFtr *st)
110
497
{
111
497
    g_return_val_if_fail(st != NULL, 0x0);
112
497
    return st->buf->data[11];
113
497
}
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
140
{
131
140
    g_return_if_fail(st != NULL);
132
140
    fu_memwrite_uint16(st->buf->data + 0, value, G_LITTLE_ENDIAN);
133
140
}
134
/**
135
 * fu_struct_dfu_ftr_set_pid: (skip):
136
 **/
137
void
138
fu_struct_dfu_ftr_set_pid(FuStructDfuFtr *st, guint16 value)
139
140
{
140
140
    g_return_if_fail(st != NULL);
141
140
    fu_memwrite_uint16(st->buf->data + 2, value, G_LITTLE_ENDIAN);
142
140
}
143
/**
144
 * fu_struct_dfu_ftr_set_vid: (skip):
145
 **/
146
void
147
fu_struct_dfu_ftr_set_vid(FuStructDfuFtr *st, guint16 value)
148
140
{
149
140
    g_return_if_fail(st != NULL);
150
140
    fu_memwrite_uint16(st->buf->data + 4, value, G_LITTLE_ENDIAN);
151
140
}
152
/**
153
 * fu_struct_dfu_ftr_set_ver: (skip):
154
 **/
155
void
156
fu_struct_dfu_ftr_set_ver(FuStructDfuFtr *st, guint16 value)
157
140
{
158
140
    g_return_if_fail(st != NULL);
159
140
    fu_memwrite_uint16(st->buf->data + 6, value, G_LITTLE_ENDIAN);
160
140
}
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
140
{
167
140
    gsize len;
168
140
    g_return_val_if_fail(st != NULL, FALSE);
169
140
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
170
140
    if (value == NULL) {
171
0
        memset(st->buf->data + 8, 0x0, 3);
172
0
        return TRUE;
173
0
    }
174
140
    len = strlen(value);
175
140
    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
140
    return fu_memcpy_safe(st->buf->data, st->buf->len, 8, (const guint8 *)value, len, 0x0, len, error);
184
140
}
185
/**
186
 * fu_struct_dfu_ftr_set_len: (skip):
187
 **/
188
void
189
fu_struct_dfu_ftr_set_len(FuStructDfuFtr *st, guint8 value)
190
140
{
191
140
    g_return_if_fail(st != NULL);
192
140
    st->buf->data[11] = value;
193
140
}
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
140
{
209
140
    FuStructDfuFtr *st = fu_struct_dfu_ftr_new_internal();
210
140
    st->buf = g_byte_array_sized_new(16);
211
140
    fu_byte_array_set_size(st->buf, 16, 0x0);
212
140
    fu_struct_dfu_ftr_set_sig(st, "UFD", NULL);
213
140
    fu_struct_dfu_ftr_set_len(st, 16);
214
140
    return st;
215
140
}
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
534
{
248
534
    g_return_val_if_fail(st != NULL, FALSE);
249
534
    if (strncmp((const gchar *) (st->buf->data + 8), "UFD", 3) != 0) {
250
37
        g_autofree gchar *str = fu_struct_dfu_ftr_get_sig(st);
251
37
        g_set_error(error,
252
37
                    FWUPD_ERROR,
253
37
                    FWUPD_ERROR_INVALID_DATA,
254
37
                    "constant FuStructDfuFtr.sig was not valid, "
255
37
                    "expected 'UFD' and got '%s'",
256
37
                    str);
257
37
        return FALSE;
258
37
    }
259
497
    return TRUE;
260
534
}
261
/**
262
 * fu_struct_dfu_ftr_validate_stream: (skip):
263
 **/
264
gboolean
265
fu_struct_dfu_ftr_validate_stream(FuInputStream *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(FU_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
534
{
289
534
    if (g_log_get_debug_enabled()) {
290
0
        g_autofree gchar *str = fu_struct_dfu_ftr_to_string(st);
291
0
        g_debug("%s", str);
292
0
    }
293
534
    if (!fu_struct_dfu_ftr_validate_internal(st, error))
294
37
        return FALSE;
295
497
    return TRUE;
296
534
}
297
/**
298
 * fu_struct_dfu_ftr_parse_stream: (skip):
299
 **/
300
FuStructDfuFtr *
301
fu_struct_dfu_ftr_parse_stream(FuInputStream *stream, gsize offset, GError **error)
302
534
{
303
534
    g_autoptr(FuStructDfuFtr) st = fu_struct_dfu_ftr_new_internal();
304
534
    st->buf = fu_input_stream_read_byte_array(stream, offset, 16, NULL, error);
305
534
    if (st->buf == NULL) {
306
0
        g_prefix_error(error, "FuStructDfuFtr failed read of 0x%x: ", (guint) 16);
307
0
        return NULL;
308
0
    }
309
534
    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
534
    if (!fu_struct_dfu_ftr_parse_internal(st, error))
319
37
        return NULL;
320
497
    return g_steal_pointer(&st);
321
534
}
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.21k
{
338
1.21k
    g_return_if_fail(st != NULL);
339
1.21k
    if (st->refcount == 0) {
340
0
        g_critical("FuStructDfuseHdr refcount already zero");
341
0
        return;
342
0
    }
343
1.21k
    if (--st->refcount > 0)
344
0
        return;
345
1.21k
    if (st->buf != NULL)
346
1.21k
        g_byte_array_unref(st->buf);
347
1.21k
    g_free(st);
348
1.21k
}
349
/**
350
 * fu_struct_dfuse_hdr_new_internal: (skip):
351
 **/
352
static FuStructDfuseHdr *
353
fu_struct_dfuse_hdr_new_internal(void)
354
1.21k
{
355
1.21k
    FuStructDfuseHdr *st = g_new0(FuStructDfuseHdr, 1);
356
1.21k
    st->refcount = 1;
357
1.21k
    return st;
358
1.21k
}
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
57
{
367
57
    g_return_val_if_fail(st != NULL, NULL);
368
57
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 5, NULL);
369
57
}
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.00k
{
376
1.00k
    g_return_val_if_fail(st != NULL, 0x0);
377
1.00k
    return st->buf->data[5];
378
1.00k
}
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
552
{
385
552
    g_return_val_if_fail(st != NULL, 0x0);
386
552
    return fu_memread_uint32(st->buf->data + 6, G_LITTLE_ENDIAN);
387
552
}
388
/**
389
 * fu_struct_dfuse_hdr_get_targets: (skip):
390
 **/
391
guint8
392
fu_struct_dfuse_hdr_get_targets(const FuStructDfuseHdr *st)
393
362
{
394
362
    g_return_val_if_fail(st != NULL, 0x0);
395
362
    return st->buf->data[10];
396
362
}
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
140
{
405
140
    gsize len;
406
140
    g_return_val_if_fail(st != NULL, FALSE);
407
140
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
408
140
    if (value == NULL) {
409
0
        memset(st->buf->data + 0, 0x0, 5);
410
0
        return TRUE;
411
0
    }
412
140
    len = strlen(value);
413
140
    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
140
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
422
140
}
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
140
{
429
140
    g_return_if_fail(st != NULL);
430
140
    st->buf->data[5] = value;
431
140
}
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
140
{
438
140
    g_return_if_fail(st != NULL);
439
140
    fu_memwrite_uint32(st->buf->data + 6, value, G_LITTLE_ENDIAN);
440
140
}
441
/**
442
 * fu_struct_dfuse_hdr_set_targets: (skip):
443
 **/
444
void
445
fu_struct_dfuse_hdr_set_targets(FuStructDfuseHdr *st, guint8 value)
446
140
{
447
140
    g_return_if_fail(st != NULL);
448
140
    st->buf->data[10] = value;
449
140
}
450
/**
451
 * fu_struct_dfuse_hdr_new: (skip):
452
 **/
453
FuStructDfuseHdr *
454
fu_struct_dfuse_hdr_new(void)
455
140
{
456
140
    FuStructDfuseHdr *st = fu_struct_dfuse_hdr_new_internal();
457
140
    st->buf = g_byte_array_sized_new(11);
458
140
    fu_byte_array_set_size(st->buf, 11, 0x0);
459
140
    fu_struct_dfuse_hdr_set_sig(st, "DfuSe", NULL);
460
140
    fu_struct_dfuse_hdr_set_ver(st, 0x01);
461
140
    return st;
462
140
}
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
140
{
492
140
    g_return_val_if_fail(st != NULL, NULL);
493
140
    return g_bytes_new(st->buf->data, st->buf->len);
494
140
}
495
static gboolean
496
fu_struct_dfuse_hdr_validate_internal(FuStructDfuseHdr *st, GError **error)
497
1.06k
{
498
1.06k
    g_return_val_if_fail(st != NULL, FALSE);
499
1.06k
    if (strncmp((const gchar *) (st->buf->data + 0), "DfuSe", 5) != 0) {
500
57
        g_autofree gchar *str = fu_struct_dfuse_hdr_get_sig(st);
501
57
        g_set_error(error,
502
57
                    FWUPD_ERROR,
503
57
                    FWUPD_ERROR_INVALID_DATA,
504
57
                    "constant FuStructDfuseHdr.sig was not valid, "
505
57
                    "expected 'DfuSe' and got '%s'",
506
57
                    str);
507
57
        return FALSE;
508
57
    }
509
1.00k
    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
996
    return TRUE;
517
1.00k
}
518
/**
519
 * fu_struct_dfuse_hdr_validate_stream: (skip):
520
 **/
521
gboolean
522
fu_struct_dfuse_hdr_validate_stream(FuInputStream *stream, gsize offset, GError **error)
523
616
{
524
616
    g_autoptr(FuStructDfuseHdr) st = fu_struct_dfuse_hdr_new_internal();
525
616
    g_return_val_if_fail(FU_IS_INPUT_STREAM(stream), FALSE);
526
616
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
527
616
    st->buf = fu_input_stream_read_byte_array(stream, offset, 11, NULL, error);
528
616
    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
616
    if (st->buf->len != 11) {
533
13
        g_set_error(error,
534
13
                    FWUPD_ERROR,
535
13
                    FWUPD_ERROR_INVALID_DATA,
536
13
                    "FuStructDfuseHdr requested 0x%x and got 0x%x",
537
13
                    (guint) 11,
538
13
                    (guint) st->buf->len);
539
13
        return FALSE;
540
13
    }
541
603
    return fu_struct_dfuse_hdr_validate_internal(st, error);
542
616
}
543
static gboolean
544
fu_struct_dfuse_hdr_parse_internal(FuStructDfuseHdr *st, GError **error)
545
457
{
546
457
    if (g_log_get_debug_enabled()) {
547
0
        g_autofree gchar *str = fu_struct_dfuse_hdr_to_string(st);
548
0
        g_debug("%s", str);
549
0
    }
550
457
    if (!fu_struct_dfuse_hdr_validate_internal(st, error))
551
0
        return FALSE;
552
457
    return TRUE;
553
457
}
554
/**
555
 * fu_struct_dfuse_hdr_parse_stream: (skip):
556
 **/
557
FuStructDfuseHdr *
558
fu_struct_dfuse_hdr_parse_stream(FuInputStream *stream, gsize offset, GError **error)
559
457
{
560
457
    g_autoptr(FuStructDfuseHdr) st = fu_struct_dfuse_hdr_new_internal();
561
457
    st->buf = fu_input_stream_read_byte_array(stream, offset, 11, NULL, error);
562
457
    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
457
    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
457
    if (!fu_struct_dfuse_hdr_parse_internal(st, error))
576
0
        return NULL;
577
457
    return g_steal_pointer(&st);
578
457
}
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
498
{
595
498
    g_return_if_fail(st != NULL);
596
498
    if (st->refcount == 0) {
597
0
        g_critical("FuStructDfuseImage refcount already zero");
598
0
        return;
599
0
    }
600
498
    if (--st->refcount > 0)
601
0
        return;
602
498
    if (st->buf != NULL)
603
483
        g_byte_array_unref(st->buf);
604
498
    g_free(st);
605
498
}
606
/**
607
 * fu_struct_dfuse_image_new_internal: (skip):
608
 **/
609
static FuStructDfuseImage *
610
fu_struct_dfuse_image_new_internal(void)
611
498
{
612
498
    FuStructDfuseImage *st = g_new0(FuStructDfuseImage, 1);
613
498
    st->refcount = 1;
614
498
    return st;
615
498
}
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
50
{
624
50
    g_return_val_if_fail(st != NULL, NULL);
625
50
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 6, NULL);
626
50
}
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
283
{
633
283
    g_return_val_if_fail(st != NULL, 0x0);
634
283
    return st->buf->data[6];
635
283
}
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
283
{
642
283
    g_return_val_if_fail(st != NULL, 0x0);
643
283
    return fu_memread_uint32(st->buf->data + 7, G_LITTLE_ENDIAN);
644
283
}
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
127
{
651
127
    g_return_val_if_fail(st != NULL, NULL);
652
127
    return fu_memstrsafe(st->buf->data, st->buf->len, 11, 255, NULL);
653
127
}
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
283
{
669
283
    g_return_val_if_fail(st != NULL, 0x0);
670
283
    return fu_memread_uint32(st->buf->data + 270, G_LITTLE_ENDIAN);
671
283
}
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
124
{
680
124
    gsize len;
681
124
    g_return_val_if_fail(st != NULL, FALSE);
682
124
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
683
124
    if (value == NULL) {
684
0
        memset(st->buf->data + 0, 0x0, 6);
685
0
        return TRUE;
686
0
    }
687
124
    len = strlen(value);
688
124
    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
124
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
697
124
}
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
124
{
704
124
    g_return_if_fail(st != NULL);
705
124
    st->buf->data[6] = value;
706
124
}
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
75
{
713
75
    g_return_if_fail(st != NULL);
714
75
    fu_memwrite_uint32(st->buf->data + 7, value, G_LITTLE_ENDIAN);
715
75
}
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
75
{
722
75
    gsize len;
723
75
    g_return_val_if_fail(st != NULL, FALSE);
724
75
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
725
75
    if (value == NULL) {
726
0
        memset(st->buf->data + 11, 0x0, 255);
727
0
        return TRUE;
728
0
    }
729
75
    len = strlen(value);
730
75
    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
75
    return fu_memcpy_safe(st->buf->data, st->buf->len, 11, (const guint8 *)value, len, 0x0, len, error);
739
75
}
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
124
{
746
124
    g_return_if_fail(st != NULL);
747
124
    fu_memwrite_uint32(st->buf->data + 266, value, G_LITTLE_ENDIAN);
748
124
}
749
/**
750
 * fu_struct_dfuse_image_set_chunks: (skip):
751
 **/
752
void
753
fu_struct_dfuse_image_set_chunks(FuStructDfuseImage *st, guint32 value)
754
124
{
755
124
    g_return_if_fail(st != NULL);
756
124
    fu_memwrite_uint32(st->buf->data + 270, value, G_LITTLE_ENDIAN);
757
124
}
758
/**
759
 * fu_struct_dfuse_image_new: (skip):
760
 **/
761
FuStructDfuseImage *
762
fu_struct_dfuse_image_new(void)
763
124
{
764
124
    FuStructDfuseImage *st = fu_struct_dfuse_image_new_internal();
765
124
    st->buf = g_byte_array_sized_new(274);
766
124
    fu_byte_array_set_size(st->buf, 274, 0x0);
767
124
    fu_struct_dfuse_image_set_sig(st, "Target", NULL);
768
124
    return st;
769
124
}
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
124
{
806
124
    g_return_val_if_fail(st != NULL, NULL);
807
124
    return g_bytes_new(st->buf->data, st->buf->len);
808
124
}
809
static gboolean
810
fu_struct_dfuse_image_validate_internal(FuStructDfuseImage *st, GError **error)
811
333
{
812
333
    g_return_val_if_fail(st != NULL, FALSE);
813
333
    if (strncmp((const gchar *) (st->buf->data + 0), "Target", 6) != 0) {
814
50
        g_autofree gchar *str = fu_struct_dfuse_image_get_sig(st);
815
50
        g_set_error(error,
816
50
                    FWUPD_ERROR,
817
50
                    FWUPD_ERROR_INVALID_DATA,
818
50
                    "constant FuStructDfuseImage.sig was not valid, "
819
50
                    "expected 'Target' and got '%s'",
820
50
                    str);
821
50
        return FALSE;
822
50
    }
823
283
    return TRUE;
824
333
}
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
333
{
846
333
    if (g_log_get_debug_enabled()) {
847
0
        g_autofree gchar *str = fu_struct_dfuse_image_to_string(st);
848
0
        g_debug("%s", str);
849
0
    }
850
333
    if (!fu_struct_dfuse_image_validate_internal(st, error))
851
50
        return FALSE;
852
283
    return TRUE;
853
333
}
854
/**
855
 * fu_struct_dfuse_image_parse_stream: (skip):
856
 **/
857
FuStructDfuseImage *
858
fu_struct_dfuse_image_parse_stream(FuInputStream *stream, gsize offset, GError **error)
859
374
{
860
374
    g_autoptr(FuStructDfuseImage) st = fu_struct_dfuse_image_new_internal();
861
374
    st->buf = fu_input_stream_read_byte_array(stream, offset, 274, NULL, error);
862
374
    if (st->buf == NULL) {
863
15
        g_prefix_error(error, "FuStructDfuseImage failed read of 0x%x: ", (guint) 274);
864
15
        return NULL;
865
15
    }
866
359
    if (st->buf->len != 274) {
867
26
        g_set_error(error,
868
26
                    FWUPD_ERROR,
869
26
                    FWUPD_ERROR_INVALID_DATA,
870
26
                    "FuStructDfuseImage requested 0x%x and got 0x%x",
871
26
                    (guint) 274,
872
26
                    (guint) st->buf->len);
873
26
        return NULL;
874
26
    }
875
333
    if (!fu_struct_dfuse_image_parse_internal(st, error))
876
50
        return NULL;
877
283
    return g_steal_pointer(&st);
878
333
}
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
1.57k
{
895
1.57k
    g_return_if_fail(st != NULL);
896
1.57k
    if (st->refcount == 0) {
897
0
        g_critical("FuStructDfuseElement refcount already zero");
898
0
        return;
899
0
    }
900
1.57k
    if (--st->refcount > 0)
901
0
        return;
902
1.57k
    if (st->buf != NULL)
903
1.52k
        g_byte_array_unref(st->buf);
904
1.57k
    g_free(st);
905
1.57k
}
906
/**
907
 * fu_struct_dfuse_element_new_internal: (skip):
908
 **/
909
static FuStructDfuseElement *
910
fu_struct_dfuse_element_new_internal(void)
911
1.57k
{
912
1.57k
    FuStructDfuseElement *st = g_new0(FuStructDfuseElement, 1);
913
1.57k
    st->refcount = 1;
914
1.57k
    return st;
915
1.57k
}
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
967
{
924
967
    g_return_val_if_fail(st != NULL, 0x0);
925
967
    return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN);
926
967
}
927
/**
928
 * fu_struct_dfuse_element_get_size: (skip):
929
 **/
930
guint32
931
fu_struct_dfuse_element_get_size(const FuStructDfuseElement *st)
932
974
{
933
974
    g_return_val_if_fail(st != NULL, 0x0);
934
974
    return fu_memread_uint32(st->buf->data + 4, G_LITTLE_ENDIAN);
935
974
}
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
546
{
944
546
    g_return_if_fail(st != NULL);
945
546
    fu_memwrite_uint32(st->buf->data + 0, value, G_LITTLE_ENDIAN);
946
546
}
947
/**
948
 * fu_struct_dfuse_element_set_size: (skip):
949
 **/
950
void
951
fu_struct_dfuse_element_set_size(FuStructDfuseElement *st, guint32 value)
952
546
{
953
546
    g_return_if_fail(st != NULL);
954
546
    fu_memwrite_uint32(st->buf->data + 4, value, G_LITTLE_ENDIAN);
955
546
}
956
/**
957
 * fu_struct_dfuse_element_new: (skip):
958
 **/
959
FuStructDfuseElement *
960
fu_struct_dfuse_element_new(void)
961
546
{
962
546
    FuStructDfuseElement *st = fu_struct_dfuse_element_new_internal();
963
546
    st->buf = g_byte_array_sized_new(8);
964
546
    fu_byte_array_set_size(st->buf, 8, 0x0);
965
546
    return st;
966
546
}
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
546
{
989
546
    g_return_val_if_fail(st != NULL, NULL);
990
546
    return g_bytes_new(st->buf->data, st->buf->len);
991
546
}
992
static gboolean
993
fu_struct_dfuse_element_parse_internal(FuStructDfuseElement *st, GError **error)
994
974
{
995
974
    if (g_log_get_debug_enabled()) {
996
0
        g_autofree gchar *str = fu_struct_dfuse_element_to_string(st);
997
0
        g_debug("%s", str);
998
0
    }
999
974
    return TRUE;
1000
974
}
1001
/**
1002
 * fu_struct_dfuse_element_parse_stream: (skip):
1003
 **/
1004
FuStructDfuseElement *
1005
fu_struct_dfuse_element_parse_stream(FuInputStream *stream, gsize offset, GError **error)
1006
1.02k
{
1007
1.02k
    g_autoptr(FuStructDfuseElement) st = fu_struct_dfuse_element_new_internal();
1008
1.02k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error);
1009
1.02k
    if (st->buf == NULL) {
1010
45
        g_prefix_error(error, "FuStructDfuseElement failed read of 0x%x: ", (guint) 8);
1011
45
        return NULL;
1012
45
    }
1013
982
    if (st->buf->len != 8) {
1014
8
        g_set_error(error,
1015
8
                    FWUPD_ERROR,
1016
8
                    FWUPD_ERROR_INVALID_DATA,
1017
8
                    "FuStructDfuseElement requested 0x%x and got 0x%x",
1018
8
                    (guint) 8,
1019
8
                    (guint) st->buf->len);
1020
8
        return NULL;
1021
8
    }
1022
974
    if (!fu_struct_dfuse_element_parse_internal(st, error))
1023
0
        return NULL;
1024
974
    return g_steal_pointer(&st);
1025
974
}