Coverage Report

Created: 2025-10-10 07:05

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