Coverage Report

Created: 2026-06-10 07:04

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