Coverage Report

Created: 2026-04-28 06:49

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
671
{
37
671
    g_return_if_fail(st != NULL);
38
671
    if (st->refcount == 0) {
39
0
        g_critical("FuStructDfuFtr refcount already zero");
40
0
        return;
41
0
    }
42
671
    if (--st->refcount > 0)
43
0
        return;
44
671
    if (st->buf != NULL)
45
671
        g_byte_array_unref(st->buf);
46
671
    g_free(st);
47
671
}
48
/**
49
 * fu_struct_dfu_ftr_new_internal: (skip):
50
 **/
51
static FuStructDfuFtr *
52
fu_struct_dfu_ftr_new_internal(void)
53
671
{
54
671
    FuStructDfuFtr *st = g_new0(FuStructDfuFtr, 1);
55
671
    st->refcount = 1;
56
671
    return st;
57
671
}
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
486
{
66
486
    g_return_val_if_fail(st != NULL, 0x0);
67
486
    return fu_memread_uint16(st->buf->data + 0, G_LITTLE_ENDIAN);
68
486
}
69
/**
70
 * fu_struct_dfu_ftr_get_pid: (skip):
71
 **/
72
guint16
73
fu_struct_dfu_ftr_get_pid(const FuStructDfuFtr *st)
74
486
{
75
486
    g_return_val_if_fail(st != NULL, 0x0);
76
486
    return fu_memread_uint16(st->buf->data + 2, G_LITTLE_ENDIAN);
77
486
}
78
/**
79
 * fu_struct_dfu_ftr_get_vid: (skip):
80
 **/
81
guint16
82
fu_struct_dfu_ftr_get_vid(const FuStructDfuFtr *st)
83
486
{
84
486
    g_return_val_if_fail(st != NULL, 0x0);
85
486
    return fu_memread_uint16(st->buf->data + 4, G_LITTLE_ENDIAN);
86
486
}
87
/**
88
 * fu_struct_dfu_ftr_get_ver: (skip):
89
 **/
90
guint16
91
fu_struct_dfu_ftr_get_ver(const FuStructDfuFtr *st)
92
486
{
93
486
    g_return_val_if_fail(st != NULL, 0x0);
94
486
    return fu_memread_uint16(st->buf->data + 6, G_LITTLE_ENDIAN);
95
486
}
96
/**
97
 * fu_struct_dfu_ftr_get_sig: (skip):
98
 **/
99
static gchar *
100
fu_struct_dfu_ftr_get_sig(const FuStructDfuFtr *st)
101
40
{
102
40
    g_return_val_if_fail(st != NULL, NULL);
103
40
    return fu_memstrsafe(st->buf->data, st->buf->len, 8, 3, NULL);
104
40
}
105
/**
106
 * fu_struct_dfu_ftr_get_len: (skip):
107
 **/
108
guint8
109
fu_struct_dfu_ftr_get_len(const FuStructDfuFtr *st)
110
486
{
111
486
    g_return_val_if_fail(st != NULL, 0x0);
112
486
    return st->buf->data[11];
113
486
}
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
526
{
248
526
    g_return_val_if_fail(st != NULL, FALSE);
249
526
    if (strncmp((const gchar *) (st->buf->data + 8), "UFD", 3) != 0) {
250
40
        g_autofree gchar *str = fu_struct_dfu_ftr_get_sig(st);
251
40
        g_set_error(error,
252
40
                    FWUPD_ERROR,
253
40
                    FWUPD_ERROR_INVALID_DATA,
254
40
                    "constant FuStructDfuFtr.sig was not valid, "
255
40
                    "expected 'UFD' and got '%s'",
256
40
                    str);
257
40
        return FALSE;
258
40
    }
259
486
    return TRUE;
260
526
}
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
526
{
289
526
    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
526
    if (!fu_struct_dfu_ftr_validate_internal(st, error))
294
40
        return FALSE;
295
486
    return TRUE;
296
526
}
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
526
{
303
526
    g_autoptr(FuStructDfuFtr) st = fu_struct_dfu_ftr_new_internal();
304
526
    st->buf = fu_input_stream_read_byte_array(stream, offset, 16, NULL, error);
305
526
    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
526
    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
526
    if (!fu_struct_dfu_ftr_parse_internal(st, error))
319
40
        return NULL;
320
486
    return g_steal_pointer(&st);
321
526
}
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
61
{
367
61
    g_return_val_if_fail(st != NULL, NULL);
368
61
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 5, NULL);
369
61
}
370
/**
371
 * fu_struct_dfuse_hdr_get_ver: (skip):
372
 **/
373
static guint8
374
fu_struct_dfuse_hdr_get_ver(const FuStructDfuseHdr *st)
375
972
{
376
972
    g_return_val_if_fail(st != NULL, 0x0);
377
972
    return st->buf->data[5];
378
972
}
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
491
{
385
491
    g_return_val_if_fail(st != NULL, 0x0);
386
491
    return fu_memread_uint32(st->buf->data + 6, G_LITTLE_ENDIAN);
387
491
}
388
/**
389
 * fu_struct_dfuse_hdr_get_targets: (skip):
390
 **/
391
guint8
392
fu_struct_dfuse_hdr_get_targets(const FuStructDfuseHdr *st)
393
373
{
394
373
    g_return_val_if_fail(st != NULL, 0x0);
395
373
    return st->buf->data[10];
396
373
}
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.03k
{
498
1.03k
    g_return_val_if_fail(st != NULL, FALSE);
499
1.03k
    if (strncmp((const gchar *) (st->buf->data + 0), "DfuSe", 5) != 0) {
500
61
        g_autofree gchar *str = fu_struct_dfuse_hdr_get_sig(st);
501
61
        g_set_error(error,
502
61
                    FWUPD_ERROR,
503
61
                    FWUPD_ERROR_INVALID_DATA,
504
61
                    "constant FuStructDfuseHdr.sig was not valid, "
505
61
                    "expected 'DfuSe' and got '%s'",
506
61
                    str);
507
61
        return FALSE;
508
61
    }
509
972
    if (fu_struct_dfuse_hdr_get_ver(st) != 0x01) {
510
8
        g_set_error_literal(error,
511
8
                            FWUPD_ERROR,
512
8
                            FWUPD_ERROR_INVALID_DATA,
513
8
                            "constant FuStructDfuseHdr.ver was not valid");
514
8
        return FALSE;
515
8
    }
516
964
    return TRUE;
517
972
}
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
617
{
524
617
    g_autoptr(FuStructDfuseHdr) st = fu_struct_dfuse_hdr_new_internal();
525
617
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
526
617
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
527
617
    st->buf = fu_input_stream_read_byte_array(stream, offset, 11, NULL, error);
528
617
    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
617
    if (st->buf->len != 11) {
533
16
        g_set_error(error,
534
16
                    FWUPD_ERROR,
535
16
                    FWUPD_ERROR_INVALID_DATA,
536
16
                    "FuStructDfuseHdr requested 0x%x and got 0x%x",
537
16
                    (guint) 11,
538
16
                    (guint) st->buf->len);
539
16
        return FALSE;
540
16
    }
541
601
    return fu_struct_dfuse_hdr_validate_internal(st, error);
542
617
}
543
static gboolean
544
fu_struct_dfuse_hdr_parse_internal(FuStructDfuseHdr *st, GError **error)
545
432
{
546
432
    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
432
    if (!fu_struct_dfuse_hdr_validate_internal(st, error))
551
0
        return FALSE;
552
432
    return TRUE;
553
432
}
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
432
{
560
432
    g_autoptr(FuStructDfuseHdr) st = fu_struct_dfuse_hdr_new_internal();
561
432
    st->buf = fu_input_stream_read_byte_array(stream, offset, 11, NULL, error);
562
432
    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
432
    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
432
    if (!fu_struct_dfuse_hdr_parse_internal(st, error))
576
0
        return NULL;
577
432
    return g_steal_pointer(&st);
578
432
}
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
531
{
595
531
    g_return_if_fail(st != NULL);
596
531
    if (st->refcount == 0) {
597
0
        g_critical("FuStructDfuseImage refcount already zero");
598
0
        return;
599
0
    }
600
531
    if (--st->refcount > 0)
601
0
        return;
602
531
    if (st->buf != NULL)
603
525
        g_byte_array_unref(st->buf);
604
531
    g_free(st);
605
531
}
606
/**
607
 * fu_struct_dfuse_image_new_internal: (skip):
608
 **/
609
static FuStructDfuseImage *
610
fu_struct_dfuse_image_new_internal(void)
611
531
{
612
531
    FuStructDfuseImage *st = g_new0(FuStructDfuseImage, 1);
613
531
    st->refcount = 1;
614
531
    return st;
615
531
}
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
52
{
624
52
    g_return_val_if_fail(st != NULL, NULL);
625
52
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 6, NULL);
626
52
}
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
311
{
633
311
    g_return_val_if_fail(st != NULL, 0x0);
634
311
    return st->buf->data[6];
635
311
}
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
311
{
642
311
    g_return_val_if_fail(st != NULL, 0x0);
643
311
    return fu_memread_uint32(st->buf->data + 7, G_LITTLE_ENDIAN);
644
311
}
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
206
{
651
206
    g_return_val_if_fail(st != NULL, NULL);
652
206
    return fu_memstrsafe(st->buf->data, st->buf->len, 11, 255, NULL);
653
206
}
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
311
{
669
311
    g_return_val_if_fail(st != NULL, 0x0);
670
311
    return fu_memread_uint32(st->buf->data + 270, G_LITTLE_ENDIAN);
671
311
}
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
142
{
680
142
    gsize len;
681
142
    g_return_val_if_fail(st != NULL, FALSE);
682
142
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
683
142
    if (value == NULL) {
684
0
        memset(st->buf->data + 0, 0x0, 6);
685
0
        return TRUE;
686
0
    }
687
142
    len = strlen(value);
688
142
    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
142
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
697
142
}
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
142
{
704
142
    g_return_if_fail(st != NULL);
705
142
    st->buf->data[6] = value;
706
142
}
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
102
{
713
102
    g_return_if_fail(st != NULL);
714
102
    fu_memwrite_uint32(st->buf->data + 7, value, G_LITTLE_ENDIAN);
715
102
}
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
102
{
722
102
    gsize len;
723
102
    g_return_val_if_fail(st != NULL, FALSE);
724
102
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
725
102
    if (value == NULL) {
726
0
        memset(st->buf->data + 11, 0x0, 255);
727
0
        return TRUE;
728
0
    }
729
102
    len = strlen(value);
730
102
    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
102
    return fu_memcpy_safe(st->buf->data, st->buf->len, 11, (const guint8 *)value, len, 0x0, len, error);
739
102
}
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
142
{
746
142
    g_return_if_fail(st != NULL);
747
142
    fu_memwrite_uint32(st->buf->data + 266, value, G_LITTLE_ENDIAN);
748
142
}
749
/**
750
 * fu_struct_dfuse_image_set_chunks: (skip):
751
 **/
752
void
753
fu_struct_dfuse_image_set_chunks(FuStructDfuseImage *st, guint32 value)
754
142
{
755
142
    g_return_if_fail(st != NULL);
756
142
    fu_memwrite_uint32(st->buf->data + 270, value, G_LITTLE_ENDIAN);
757
142
}
758
/**
759
 * fu_struct_dfuse_image_new: (skip):
760
 **/
761
FuStructDfuseImage *
762
fu_struct_dfuse_image_new(void)
763
142
{
764
142
    FuStructDfuseImage *st = fu_struct_dfuse_image_new_internal();
765
142
    st->buf = g_byte_array_sized_new(274);
766
142
    fu_byte_array_set_size(st->buf, 274, 0x0);
767
142
    fu_struct_dfuse_image_set_sig(st, "Target", NULL);
768
142
    return st;
769
142
}
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
142
{
806
142
    g_return_val_if_fail(st != NULL, NULL);
807
142
    return g_bytes_new(st->buf->data, st->buf->len);
808
142
}
809
static gboolean
810
fu_struct_dfuse_image_validate_internal(FuStructDfuseImage *st, GError **error)
811
363
{
812
363
    g_return_val_if_fail(st != NULL, FALSE);
813
363
    if (strncmp((const gchar *) (st->buf->data + 0), "Target", 6) != 0) {
814
52
        g_autofree gchar *str = fu_struct_dfuse_image_get_sig(st);
815
52
        g_set_error(error,
816
52
                    FWUPD_ERROR,
817
52
                    FWUPD_ERROR_INVALID_DATA,
818
52
                    "constant FuStructDfuseImage.sig was not valid, "
819
52
                    "expected 'Target' and got '%s'",
820
52
                    str);
821
52
        return FALSE;
822
52
    }
823
311
    return TRUE;
824
363
}
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
363
{
846
363
    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
363
    if (!fu_struct_dfuse_image_validate_internal(st, error))
851
52
        return FALSE;
852
311
    return TRUE;
853
363
}
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
389
{
860
389
    g_autoptr(FuStructDfuseImage) st = fu_struct_dfuse_image_new_internal();
861
389
    st->buf = fu_input_stream_read_byte_array(stream, offset, 274, NULL, error);
862
389
    if (st->buf == NULL) {
863
6
        g_prefix_error(error, "FuStructDfuseImage failed read of 0x%x: ", (guint) 274);
864
6
        return NULL;
865
6
    }
866
383
    if (st->buf->len != 274) {
867
20
        g_set_error(error,
868
20
                    FWUPD_ERROR,
869
20
                    FWUPD_ERROR_INVALID_DATA,
870
20
                    "FuStructDfuseImage requested 0x%x and got 0x%x",
871
20
                    (guint) 274,
872
20
                    (guint) st->buf->len);
873
20
        return NULL;
874
20
    }
875
363
    if (!fu_struct_dfuse_image_parse_internal(st, error))
876
52
        return NULL;
877
311
    return g_steal_pointer(&st);
878
363
}
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.47k
{
895
1.47k
    g_return_if_fail(st != NULL);
896
1.47k
    if (st->refcount == 0) {
897
0
        g_critical("FuStructDfuseElement refcount already zero");
898
0
        return;
899
0
    }
900
1.47k
    if (--st->refcount > 0)
901
0
        return;
902
1.47k
    if (st->buf != NULL)
903
1.43k
        g_byte_array_unref(st->buf);
904
1.47k
    g_free(st);
905
1.47k
}
906
/**
907
 * fu_struct_dfuse_element_new_internal: (skip):
908
 **/
909
static FuStructDfuseElement *
910
fu_struct_dfuse_element_new_internal(void)
911
1.47k
{
912
1.47k
    FuStructDfuseElement *st = g_new0(FuStructDfuseElement, 1);
913
1.47k
    st->refcount = 1;
914
1.47k
    return st;
915
1.47k
}
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
951
{
924
951
    g_return_val_if_fail(st != NULL, 0x0);
925
951
    return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN);
926
951
}
927
/**
928
 * fu_struct_dfuse_element_get_size: (skip):
929
 **/
930
guint32
931
fu_struct_dfuse_element_get_size(const FuStructDfuseElement *st)
932
959
{
933
959
    g_return_val_if_fail(st != NULL, 0x0);
934
959
    return fu_memread_uint32(st->buf->data + 4, G_LITTLE_ENDIAN);
935
959
}
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
467
{
944
467
    g_return_if_fail(st != NULL);
945
467
    fu_memwrite_uint32(st->buf->data + 0, value, G_LITTLE_ENDIAN);
946
467
}
947
/**
948
 * fu_struct_dfuse_element_set_size: (skip):
949
 **/
950
void
951
fu_struct_dfuse_element_set_size(FuStructDfuseElement *st, guint32 value)
952
467
{
953
467
    g_return_if_fail(st != NULL);
954
467
    fu_memwrite_uint32(st->buf->data + 4, value, G_LITTLE_ENDIAN);
955
467
}
956
/**
957
 * fu_struct_dfuse_element_new: (skip):
958
 **/
959
FuStructDfuseElement *
960
fu_struct_dfuse_element_new(void)
961
467
{
962
467
    FuStructDfuseElement *st = fu_struct_dfuse_element_new_internal();
963
467
    st->buf = g_byte_array_sized_new(8);
964
467
    fu_byte_array_set_size(st->buf, 8, 0x0);
965
467
    return st;
966
467
}
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
467
{
989
467
    g_return_val_if_fail(st != NULL, NULL);
990
467
    return g_bytes_new(st->buf->data, st->buf->len);
991
467
}
992
static gboolean
993
fu_struct_dfuse_element_validate_internal(FuStructDfuseElement *st, GError **error)
994
959
{
995
959
    g_return_val_if_fail(st != NULL, FALSE);
996
959
    return TRUE;
997
959
}
998
static gboolean
999
fu_struct_dfuse_element_parse_internal(FuStructDfuseElement *st, GError **error)
1000
959
{
1001
959
    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
959
    if (!fu_struct_dfuse_element_validate_internal(st, error))
1006
0
        return FALSE;
1007
959
    return TRUE;
1008
959
}
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.00k
{
1015
1.00k
    g_autoptr(FuStructDfuseElement) st = fu_struct_dfuse_element_new_internal();
1016
1.00k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error);
1017
1.00k
    if (st->buf == NULL) {
1018
41
        g_prefix_error(error, "FuStructDfuseElement failed read of 0x%x: ", (guint) 8);
1019
41
        return NULL;
1020
41
    }
1021
967
    if (st->buf->len != 8) {
1022
8
        g_set_error(error,
1023
8
                    FWUPD_ERROR,
1024
8
                    FWUPD_ERROR_INVALID_DATA,
1025
8
                    "FuStructDfuseElement requested 0x%x and got 0x%x",
1026
8
                    (guint) 8,
1027
8
                    (guint) st->buf->len);
1028
8
        return NULL;
1029
8
    }
1030
959
    if (!fu_struct_dfuse_element_parse_internal(st, error))
1031
0
        return NULL;
1032
959
    return g_steal_pointer(&st);
1033
959
}