Coverage Report

Created: 2025-11-11 06:44

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/fu-wac-struct.c
Line
Count
Source
1
/* auto-generated, do not modify */
2
#include "config.h"
3
4
#include <glib.h>
5
6
#include "fu-wac-struct.h"
7
#include "fu-byte-array.h"
8
#include "fu-mem-private.h"
9
#include "fu-string.h"
10
11
#ifdef G_LOG_DOMAIN
12
  #undef G_LOG_DOMAIN
13
#endif
14
0
#define G_LOG_DOMAIN "FuStruct"
15
16
const gchar *
17
fu_wac_report_id_to_string(FuWacReportId val)
18
0
{
19
0
    if (val == FU_WAC_REPORT_ID_FW_DESCRIPTOR)
20
0
        return "fw-descriptor";
21
0
    if (val == FU_WAC_REPORT_ID_SWITCH_TO_FLASH_LOADER)
22
0
        return "switch-to-flash-loader";
23
0
    if (val == FU_WAC_REPORT_ID_QUIT_AND_RESET)
24
0
        return "quit-and-reset";
25
0
    if (val == FU_WAC_REPORT_ID_READ_BLOCK_DATA)
26
0
        return "read-block-data";
27
0
    if (val == FU_WAC_REPORT_ID_WRITE_BLOCK)
28
0
        return "write-block";
29
0
    if (val == FU_WAC_REPORT_ID_ERASE_BLOCK)
30
0
        return "erase-block";
31
0
    if (val == FU_WAC_REPORT_ID_SET_READ_ADDRESS)
32
0
        return "set-read-address";
33
0
    if (val == FU_WAC_REPORT_ID_GET_STATUS)
34
0
        return "get-status";
35
0
    if (val == FU_WAC_REPORT_ID_UPDATE_RESET)
36
0
        return "update-reset";
37
0
    if (val == FU_WAC_REPORT_ID_WRITE_WORD)
38
0
        return "write-word";
39
0
    if (val == FU_WAC_REPORT_ID_GET_PARAMETERS)
40
0
        return "get-parameters";
41
0
    if (val == FU_WAC_REPORT_ID_GET_FLASH_DESCRIPTOR)
42
0
        return "get-flash-descriptor";
43
0
    if (val == FU_WAC_REPORT_ID_GET_CHECKSUMS)
44
0
        return "get-checksums";
45
0
    if (val == FU_WAC_REPORT_ID_SET_CHECKSUM_FOR_BLOCK)
46
0
        return "set-checksum-for-block";
47
0
    if (val == FU_WAC_REPORT_ID_CALCULATE_CHECKSUM_FOR_BLOCK)
48
0
        return "calculate-checksum-for-block";
49
0
    if (val == FU_WAC_REPORT_ID_WRITE_CHECKSUM_TABLE)
50
0
        return "write-checksum-table";
51
0
    if (val == FU_WAC_REPORT_ID_GET_CURRENT_FIRMWARE_IDX)
52
0
        return "get-current-firmware-idx";
53
0
    if (val == FU_WAC_REPORT_ID_MODULE)
54
0
        return "module";
55
0
    return NULL;
56
0
}
57
58
const gchar *
59
fu_wac_module_fw_type_to_string(FuWacModuleFwType val)
60
0
{
61
0
    if (val == FU_WAC_MODULE_FW_TYPE_TOUCH)
62
0
        return "touch";
63
0
    if (val == FU_WAC_MODULE_FW_TYPE_BLUETOOTH)
64
0
        return "bluetooth";
65
0
    if (val == FU_WAC_MODULE_FW_TYPE_EMR_CORRECTION)
66
0
        return "emr-correction";
67
0
    if (val == FU_WAC_MODULE_FW_TYPE_BLUETOOTH_HID)
68
0
        return "bluetooth-hid";
69
0
    if (val == FU_WAC_MODULE_FW_TYPE_SCALER)
70
0
        return "scaler";
71
0
    if (val == FU_WAC_MODULE_FW_TYPE_BLUETOOTH_ID6)
72
0
        return "bluetooth-id6";
73
0
    if (val == FU_WAC_MODULE_FW_TYPE_TOUCH_ID7)
74
0
        return "touch-id7";
75
0
    if (val == FU_WAC_MODULE_FW_TYPE_BLUETOOTH_ID9)
76
0
        return "bluetooth-id9";
77
0
    if (val == FU_WAC_MODULE_FW_TYPE_SUB_CPU)
78
0
        return "sub-cpu";
79
0
    if (val == FU_WAC_MODULE_FW_TYPE_MAIN)
80
0
        return "main";
81
0
    return NULL;
82
0
}
83
84
const gchar *
85
fu_wac_module_command_to_string(FuWacModuleCommand val)
86
0
{
87
0
    if (val == FU_WAC_MODULE_COMMAND_START)
88
0
        return "start";
89
0
    if (val == FU_WAC_MODULE_COMMAND_DATA)
90
0
        return "data";
91
0
    if (val == FU_WAC_MODULE_COMMAND_END)
92
0
        return "end";
93
0
    return NULL;
94
0
}
95
96
const gchar *
97
fu_wac_module_status_to_string(FuWacModuleStatus val)
98
0
{
99
0
    if (val == FU_WAC_MODULE_STATUS_OK)
100
0
        return "ok";
101
0
    if (val == FU_WAC_MODULE_STATUS_BUSY)
102
0
        return "busy";
103
0
    if (val == FU_WAC_MODULE_STATUS_ERR_CRC)
104
0
        return "err-crc";
105
0
    if (val == FU_WAC_MODULE_STATUS_ERR_CMD)
106
0
        return "err-cmd";
107
0
    if (val == FU_WAC_MODULE_STATUS_ERR_HW_ACCESS_FAIL)
108
0
        return "err-hw-access-fail";
109
0
    if (val == FU_WAC_MODULE_STATUS_ERR_FLASH_NO_SUPPORT)
110
0
        return "err-flash-no-support";
111
0
    if (val == FU_WAC_MODULE_STATUS_ERR_MODE_WRONG)
112
0
        return "err-mode-wrong";
113
0
    if (val == FU_WAC_MODULE_STATUS_ERR_MPU_NO_SUPPORT)
114
0
        return "err-mpu-no-support";
115
0
    if (val == FU_WAC_MODULE_STATUS_ERR_VERSION_NO_SUPPORT)
116
0
        return "err-version-no-support";
117
0
    if (val == FU_WAC_MODULE_STATUS_ERR_ERASE)
118
0
        return "err-erase";
119
0
    if (val == FU_WAC_MODULE_STATUS_ERR_WRITE)
120
0
        return "err-write";
121
0
    if (val == FU_WAC_MODULE_STATUS_ERR_EXIT)
122
0
        return "err-exit";
123
0
    if (val == FU_WAC_MODULE_STATUS_ERR)
124
0
        return "err";
125
0
    if (val == FU_WAC_MODULE_STATUS_ERR_INVALID_OP)
126
0
        return "err-invalid-op";
127
0
    if (val == FU_WAC_MODULE_STATUS_ERR_WRONG_IMAGE)
128
0
        return "err-wrong-image";
129
0
    return NULL;
130
0
}
131
132
gchar *
133
fu_wac_device_status_to_string(FuWacDeviceStatus val)
134
0
{
135
0
    const gchar *data[6] = {0};
136
0
    guint idx = 0;
137
0
    if (val == FU_WAC_DEVICE_STATUS_UNKNOWN)
138
0
        return g_strdup("unknown");
139
0
    if (val & FU_WAC_DEVICE_STATUS_WRITING)
140
0
        data[idx++] = "writing";
141
0
    if (val & FU_WAC_DEVICE_STATUS_ERASING)
142
0
        data[idx++] = "erasing";
143
0
    if (val & FU_WAC_DEVICE_STATUS_ERROR_WRITE)
144
0
        data[idx++] = "error-write";
145
0
    if (val & FU_WAC_DEVICE_STATUS_ERROR_ERASE)
146
0
        data[idx++] = "error-erase";
147
0
    if (val & FU_WAC_DEVICE_STATUS_WRITE_PROTECTED)
148
0
        data[idx++] = "write-protected";
149
0
    return g_strjoinv(",", (gchar **)data);
150
0
}
151
/**
152
 * fu_struct_wac_firmware_hdr_ref: (skip):
153
 **/
154
FuStructWacFirmwareHdr *
155
fu_struct_wac_firmware_hdr_ref(FuStructWacFirmwareHdr *st)
156
0
{
157
0
    g_return_val_if_fail(st != NULL, NULL);
158
0
    st->refcount++;
159
0
    return st;
160
0
}
161
/**
162
 * fu_struct_wac_firmware_hdr_unref: (skip):
163
 **/
164
void
165
fu_struct_wac_firmware_hdr_unref(FuStructWacFirmwareHdr *st)
166
256k
{
167
256k
    g_return_if_fail(st != NULL);
168
256k
    if (st->refcount == 0) {
169
0
        g_critical("FuStructWacFirmwareHdr refcount already zero");
170
0
        return;
171
0
    }
172
256k
    if (--st->refcount > 0)
173
0
        return;
174
256k
    if (st->buf != NULL)
175
256k
        g_byte_array_unref(st->buf);
176
256k
    g_free(st);
177
256k
}
178
static FuStructWacFirmwareHdr *
179
fu_struct_wac_firmware_hdr_new_internal(void)
180
256k
{
181
256k
    FuStructWacFirmwareHdr *st = g_new0(FuStructWacFirmwareHdr, 1);
182
256k
    st->refcount = 1;
183
256k
    return st;
184
256k
}
185
186
/* getters */
187
/**
188
 * fu_struct_wac_firmware_hdr_get_magic: (skip):
189
 **/
190
static gchar *
191
fu_struct_wac_firmware_hdr_get_magic(const FuStructWacFirmwareHdr *st)
192
254k
{
193
254k
    g_return_val_if_fail(st != NULL, NULL);
194
254k
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 5, NULL);
195
254k
}
196
197
/* setters */
198
static gboolean
199
fu_struct_wac_firmware_hdr_validate_internal(FuStructWacFirmwareHdr *st, GError **error)
200
256k
{
201
256k
    g_return_val_if_fail(st != NULL, FALSE);
202
256k
    if (strncmp((const gchar *) (st->buf->data + 0), "WACOM", 5) != 0) {
203
254k
        g_autofree gchar *str = fu_struct_wac_firmware_hdr_get_magic(st);
204
254k
        g_set_error(error,
205
254k
                    FWUPD_ERROR,
206
254k
                    FWUPD_ERROR_INVALID_DATA,
207
254k
                    "constant FuStructWacFirmwareHdr.magic was not valid, "
208
254k
                    "expected 'WACOM' and got '%s'",
209
254k
                    str);
210
254k
        return FALSE;
211
254k
    }
212
1.88k
    return TRUE;
213
256k
}
214
/**
215
 * fu_struct_wac_firmware_hdr_validate_stream: (skip):
216
 **/
217
gboolean
218
fu_struct_wac_firmware_hdr_validate_stream(GInputStream *stream, gsize offset, GError **error)
219
256k
{
220
256k
    g_autoptr(FuStructWacFirmwareHdr) st = fu_struct_wac_firmware_hdr_new_internal();
221
256k
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
222
256k
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
223
256k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 5, NULL, error);
224
256k
    if (st->buf == NULL) {
225
0
        g_prefix_error(error, "FuStructWacFirmwareHdr failed read of 0x%x: ", (guint) 5);
226
0
        return FALSE;
227
0
    }
228
256k
    if (st->buf->len != 5) {
229
584
        g_set_error(error,
230
584
                    FWUPD_ERROR,
231
584
                    FWUPD_ERROR_INVALID_DATA,
232
584
                    "FuStructWacFirmwareHdr requested 0x%x and got 0x%x",
233
584
                    (guint) 5,
234
584
                    (guint) st->buf->len);
235
584
        return FALSE;
236
584
    }
237
256k
    return fu_struct_wac_firmware_hdr_validate_internal(st, error);
238
256k
}
239
/**
240
 * fu_struct_wta_block_header_ref: (skip):
241
 **/
242
FuStructWtaBlockHeader *
243
fu_struct_wta_block_header_ref(FuStructWtaBlockHeader *st)
244
0
{
245
0
    g_return_val_if_fail(st != NULL, NULL);
246
0
    st->refcount++;
247
0
    return st;
248
0
}
249
/**
250
 * fu_struct_wta_block_header_unref: (skip):
251
 **/
252
void
253
fu_struct_wta_block_header_unref(FuStructWtaBlockHeader *st)
254
0
{
255
0
    g_return_if_fail(st != NULL);
256
0
    if (st->refcount == 0) {
257
0
        g_critical("FuStructWtaBlockHeader refcount already zero");
258
0
        return;
259
0
    }
260
0
    if (--st->refcount > 0)
261
0
        return;
262
0
    if (st->buf != NULL)
263
0
        g_byte_array_unref(st->buf);
264
0
    g_free(st);
265
0
}
266
static FuStructWtaBlockHeader *
267
fu_struct_wta_block_header_new_internal(void)
268
0
{
269
0
    FuStructWtaBlockHeader *st = g_new0(FuStructWtaBlockHeader, 1);
270
0
    st->refcount = 1;
271
0
    return st;
272
0
}
273
274
/* getters */
275
/**
276
 * fu_struct_wta_block_header_get_block_start: (skip):
277
 **/
278
guint32
279
fu_struct_wta_block_header_get_block_start(const FuStructWtaBlockHeader *st)
280
0
{
281
0
    g_return_val_if_fail(st != NULL, 0x0);
282
0
    return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN);
283
0
}
284
/**
285
 * fu_struct_wta_block_header_get_block_size: (skip):
286
 **/
287
guint32
288
fu_struct_wta_block_header_get_block_size(const FuStructWtaBlockHeader *st)
289
0
{
290
0
    g_return_val_if_fail(st != NULL, 0x0);
291
0
    return fu_memread_uint32(st->buf->data + 4, G_LITTLE_ENDIAN);
292
0
}
293
294
/* setters */
295
/**
296
 * fu_struct_wta_block_header_to_string: (skip):
297
 **/
298
static gchar *
299
fu_struct_wta_block_header_to_string(const FuStructWtaBlockHeader *st)
300
0
{
301
0
    g_autoptr(GString) str = g_string_new("FuStructWtaBlockHeader:\n");
302
0
    g_return_val_if_fail(st != NULL, NULL);
303
0
    g_string_append_printf(str, "  block_start: 0x%x\n",
304
0
                           (guint) fu_struct_wta_block_header_get_block_start(st));
305
0
    g_string_append_printf(str, "  block_size: 0x%x\n",
306
0
                           (guint) fu_struct_wta_block_header_get_block_size(st));
307
0
    if (str->len > 0)
308
0
        g_string_set_size(str, str->len - 1);
309
0
    return g_string_free(g_steal_pointer(&str), FALSE);
310
0
}
311
static gboolean
312
fu_struct_wta_block_header_validate_internal(FuStructWtaBlockHeader *st, GError **error)
313
0
{
314
0
    g_return_val_if_fail(st != NULL, FALSE);
315
0
    return TRUE;
316
0
}
317
static gboolean
318
fu_struct_wta_block_header_parse_internal(FuStructWtaBlockHeader *st, GError **error)
319
0
{
320
0
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
321
0
        g_autofree gchar *str = fu_struct_wta_block_header_to_string(st);
322
0
        g_debug("%s", str);
323
0
    }
324
0
    if (!fu_struct_wta_block_header_validate_internal(st, error))
325
0
        return FALSE;
326
0
    return TRUE;
327
0
}
328
329
/**
330
 * fu_struct_wta_block_header_parse: (skip):
331
 **/
332
FuStructWtaBlockHeader *
333
fu_struct_wta_block_header_parse(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
334
0
{
335
0
    g_autoptr(FuStructWtaBlockHeader) st = fu_struct_wta_block_header_new_internal();
336
0
    g_return_val_if_fail(buf != NULL, NULL);
337
0
    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
338
0
    if (!fu_memchk_read(bufsz, offset, 8, error)) {
339
0
        g_prefix_error_literal(error, "invalid struct FuStructWtaBlockHeader: ");
340
0
        return NULL;
341
0
    }
342
0
    st->buf = g_byte_array_new();
343
0
    g_byte_array_append(st->buf, buf + offset, 8);
344
0
    if (!fu_struct_wta_block_header_parse_internal(st, error))
345
0
        return NULL;
346
0
    return g_steal_pointer(&st);
347
0
}
348
/**
349
 * fu_struct_id9_unknown_cmd_ref: (skip):
350
 **/
351
FuStructId9UnknownCmd *
352
fu_struct_id9_unknown_cmd_ref(FuStructId9UnknownCmd *st)
353
0
{
354
0
    g_return_val_if_fail(st != NULL, NULL);
355
0
    st->refcount++;
356
0
    return st;
357
0
}
358
/**
359
 * fu_struct_id9_unknown_cmd_unref: (skip):
360
 **/
361
void
362
fu_struct_id9_unknown_cmd_unref(FuStructId9UnknownCmd *st)
363
0
{
364
0
    g_return_if_fail(st != NULL);
365
0
    if (st->refcount == 0) {
366
0
        g_critical("FuStructId9UnknownCmd refcount already zero");
367
0
        return;
368
0
    }
369
0
    if (--st->refcount > 0)
370
0
        return;
371
0
    if (st->buf != NULL)
372
0
        g_byte_array_unref(st->buf);
373
0
    g_free(st);
374
0
}
375
static FuStructId9UnknownCmd *
376
fu_struct_id9_unknown_cmd_new_internal(void)
377
0
{
378
0
    FuStructId9UnknownCmd *st = g_new0(FuStructId9UnknownCmd, 1);
379
0
    st->refcount = 1;
380
0
    return st;
381
0
}
382
383
/* getters */
384
/**
385
 * fu_struct_id9_unknown_cmd_get_unknown1: (skip):
386
 **/
387
static guint16
388
fu_struct_id9_unknown_cmd_get_unknown1(const FuStructId9UnknownCmd *st)
389
0
{
390
0
    g_return_val_if_fail(st != NULL, 0x0);
391
0
    return fu_memread_uint16(st->buf->data + 0, G_BIG_ENDIAN);
392
0
}
393
/**
394
 * fu_struct_id9_unknown_cmd_get_unknown2: (skip):
395
 **/
396
static guint32
397
fu_struct_id9_unknown_cmd_get_unknown2(const FuStructId9UnknownCmd *st)
398
0
{
399
0
    g_return_val_if_fail(st != NULL, 0x0);
400
0
    return fu_memread_uint32(st->buf->data + 2, G_BIG_ENDIAN);
401
0
}
402
403
/* setters */
404
/**
405
 * fu_struct_id9_unknown_cmd_set_unknown1: (skip):
406
 **/
407
static void
408
fu_struct_id9_unknown_cmd_set_unknown1(FuStructId9UnknownCmd *st, guint16 value)
409
0
{
410
0
    g_return_if_fail(st != NULL);
411
0
    fu_memwrite_uint16(st->buf->data + 0, value, G_BIG_ENDIAN);
412
0
}
413
/**
414
 * fu_struct_id9_unknown_cmd_set_unknown2: (skip):
415
 **/
416
static void
417
fu_struct_id9_unknown_cmd_set_unknown2(FuStructId9UnknownCmd *st, guint32 value)
418
0
{
419
0
    g_return_if_fail(st != NULL);
420
0
    fu_memwrite_uint32(st->buf->data + 2, value, G_BIG_ENDIAN);
421
0
}
422
/**
423
 * fu_struct_id9_unknown_cmd_set_size: (skip):
424
 **/
425
void
426
fu_struct_id9_unknown_cmd_set_size(FuStructId9UnknownCmd *st, guint16 value)
427
0
{
428
0
    g_return_if_fail(st != NULL);
429
0
    fu_memwrite_uint16(st->buf->data + 6, value, G_BIG_ENDIAN);
430
0
}
431
/**
432
 * fu_struct_id9_unknown_cmd_new: (skip):
433
 **/
434
FuStructId9UnknownCmd *
435
fu_struct_id9_unknown_cmd_new(void)
436
0
{
437
0
    FuStructId9UnknownCmd *st = fu_struct_id9_unknown_cmd_new_internal();
438
0
    st->buf = g_byte_array_sized_new(8);
439
0
    fu_byte_array_set_size(st->buf, 8, 0x0);
440
0
    fu_struct_id9_unknown_cmd_set_unknown1(st, 0x7050);
441
0
    fu_struct_id9_unknown_cmd_set_unknown2(st, 0);
442
0
    return st;
443
0
}
444
static gboolean
445
fu_struct_id9_unknown_cmd_validate_internal(FuStructId9UnknownCmd *st, GError **error)
446
0
{
447
0
    g_return_val_if_fail(st != NULL, FALSE);
448
0
    if (fu_struct_id9_unknown_cmd_get_unknown1(st) != 0x7050) {
449
0
        g_set_error(error,
450
0
                    FWUPD_ERROR,
451
0
                    FWUPD_ERROR_INVALID_DATA,
452
0
                    "constant FuStructId9UnknownCmd.unknown1 was not valid, "
453
0
                    "expected 0x%x and got 0x%x",
454
0
                    (guint) 0x7050,
455
0
                    (guint) fu_struct_id9_unknown_cmd_get_unknown1(st));
456
0
        return FALSE;
457
0
    }
458
0
    if (fu_struct_id9_unknown_cmd_get_unknown2(st) != 0) {
459
0
        g_set_error(error,
460
0
                    FWUPD_ERROR,
461
0
                    FWUPD_ERROR_INVALID_DATA,
462
0
                    "constant FuStructId9UnknownCmd.unknown2 was not valid, "
463
0
                    "expected 0x%x and got 0x%x",
464
0
                    (guint) 0,
465
0
                    (guint) fu_struct_id9_unknown_cmd_get_unknown2(st));
466
0
        return FALSE;
467
0
    }
468
0
    return TRUE;
469
0
}
470
/**
471
 * fu_struct_id9_spi_cmd_ref: (skip):
472
 **/
473
FuStructId9SpiCmd *
474
fu_struct_id9_spi_cmd_ref(FuStructId9SpiCmd *st)
475
0
{
476
0
    g_return_val_if_fail(st != NULL, NULL);
477
0
    st->refcount++;
478
0
    return st;
479
0
}
480
/**
481
 * fu_struct_id9_spi_cmd_unref: (skip):
482
 **/
483
void
484
fu_struct_id9_spi_cmd_unref(FuStructId9SpiCmd *st)
485
0
{
486
0
    g_return_if_fail(st != NULL);
487
0
    if (st->refcount == 0) {
488
0
        g_critical("FuStructId9SpiCmd refcount already zero");
489
0
        return;
490
0
    }
491
0
    if (--st->refcount > 0)
492
0
        return;
493
0
    if (st->buf != NULL)
494
0
        g_byte_array_unref(st->buf);
495
0
    g_free(st);
496
0
}
497
static FuStructId9SpiCmd *
498
fu_struct_id9_spi_cmd_new_internal(void)
499
0
{
500
0
    FuStructId9SpiCmd *st = g_new0(FuStructId9SpiCmd, 1);
501
0
    st->refcount = 1;
502
0
    return st;
503
0
}
504
505
/* getters */
506
/**
507
 * fu_struct_id9_spi_cmd_get_command: (skip):
508
 **/
509
static guint8
510
fu_struct_id9_spi_cmd_get_command(const FuStructId9SpiCmd *st)
511
0
{
512
0
    g_return_val_if_fail(st != NULL, 0x0);
513
0
    return st->buf->data[0];
514
0
}
515
/**
516
 * fu_struct_id9_spi_cmd_get_start_addr: (skip):
517
 **/
518
static guint32
519
fu_struct_id9_spi_cmd_get_start_addr(const FuStructId9SpiCmd *st)
520
0
{
521
0
    g_return_val_if_fail(st != NULL, 0x0);
522
0
    return fu_memread_uint32(st->buf->data + 1, G_BIG_ENDIAN);
523
0
}
524
525
/* setters */
526
/**
527
 * fu_struct_id9_spi_cmd_set_command: (skip):
528
 **/
529
static void
530
fu_struct_id9_spi_cmd_set_command(FuStructId9SpiCmd *st, guint8 value)
531
0
{
532
0
    g_return_if_fail(st != NULL);
533
0
    st->buf->data[0] = value;
534
0
}
535
/**
536
 * fu_struct_id9_spi_cmd_set_start_addr: (skip):
537
 **/
538
static void
539
fu_struct_id9_spi_cmd_set_start_addr(FuStructId9SpiCmd *st, guint32 value)
540
0
{
541
0
    g_return_if_fail(st != NULL);
542
0
    fu_memwrite_uint32(st->buf->data + 1, value, G_BIG_ENDIAN);
543
0
}
544
/**
545
 * fu_struct_id9_spi_cmd_set_size: (skip):
546
 **/
547
void
548
fu_struct_id9_spi_cmd_set_size(FuStructId9SpiCmd *st, guint16 value)
549
0
{
550
0
    g_return_if_fail(st != NULL);
551
0
    fu_memwrite_uint16(st->buf->data + 5, value, G_BIG_ENDIAN);
552
0
}
553
/**
554
 * fu_struct_id9_spi_cmd_set_data: (skip):
555
 **/
556
gboolean
557
fu_struct_id9_spi_cmd_set_data(FuStructId9SpiCmd *st, const FuStructId9UnknownCmd *st_donor, GError **error)
558
0
{
559
0
    g_return_val_if_fail(st != NULL, FALSE);
560
0
    g_return_val_if_fail(st_donor != NULL, FALSE);
561
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
562
563
0
    if (st_donor->buf->len > FU_STRUCT_ID9_UNKNOWN_CMD_SIZE) {
564
0
        g_set_error(error,
565
0
                    FWUPD_ERROR,
566
0
                    FWUPD_ERROR_INVALID_DATA,
567
0
                    "donor 'FuStructId9UnknownCmd' (0x%x bytes) does not fit in "
568
0
                    "FuStructId9SpiCmd.data (0x%x bytes)",
569
0
                    (guint) st_donor->buf->len,
570
0
                    (guint) FU_STRUCT_ID9_UNKNOWN_CMD_SIZE);
571
0
        return FALSE;
572
0
    }
573
0
    memcpy(st->buf->data + FU_STRUCT_ID9_SPI_CMD_OFFSET_DATA, st_donor->buf->data, st_donor->buf->len);
574
0
    return TRUE;
575
0
}
576
/**
577
 * fu_struct_id9_spi_cmd_new: (skip):
578
 **/
579
FuStructId9SpiCmd *
580
fu_struct_id9_spi_cmd_new(void)
581
0
{
582
0
    FuStructId9SpiCmd *st = fu_struct_id9_spi_cmd_new_internal();
583
0
    st->buf = g_byte_array_sized_new(15);
584
0
    fu_byte_array_set_size(st->buf, 15, 0x0);
585
0
    {
586
0
        g_autoptr(FuStructId9UnknownCmd) st_donor = fu_struct_id9_unknown_cmd_new();
587
0
        memcpy(st->buf->data + 0x7, st_donor->buf->data, st_donor->buf->len); /* nocheck:blocked */
588
0
    }
589
0
    fu_struct_id9_spi_cmd_set_command(st, 0x91);
590
0
    fu_struct_id9_spi_cmd_set_start_addr(st, 0);
591
0
    return st;
592
0
}
593
static gboolean
594
fu_struct_id9_spi_cmd_validate_internal(FuStructId9SpiCmd *st, GError **error)
595
0
{
596
0
    g_return_val_if_fail(st != NULL, FALSE);
597
0
    if (fu_struct_id9_spi_cmd_get_command(st) != 0x91) {
598
0
        g_set_error_literal(error,
599
0
                            FWUPD_ERROR,
600
0
                            FWUPD_ERROR_INVALID_DATA,
601
0
                            "constant FuStructId9SpiCmd.command was not valid");
602
0
        return FALSE;
603
0
    }
604
0
    if (fu_struct_id9_spi_cmd_get_start_addr(st) != 0) {
605
0
        g_set_error(error,
606
0
                    FWUPD_ERROR,
607
0
                    FWUPD_ERROR_INVALID_DATA,
608
0
                    "constant FuStructId9SpiCmd.start_addr was not valid, "
609
0
                    "expected 0x%x and got 0x%x",
610
0
                    (guint) 0,
611
0
                    (guint) fu_struct_id9_spi_cmd_get_start_addr(st));
612
0
        return FALSE;
613
0
    }
614
0
    {
615
0
        GByteArray buf_tmp = {
616
0
            .data = (guint8*) st->buf->data + 0x7,
617
0
            .len = 8,
618
0
        };
619
0
        FuStructId9UnknownCmd st_tmp = { .buf = &buf_tmp };
620
0
        if (!fu_struct_id9_unknown_cmd_validate_internal(&st_tmp, error))
621
0
            return FALSE;
622
0
    }
623
0
    return TRUE;
624
0
}
625
/**
626
 * fu_struct_id9_loader_cmd_ref: (skip):
627
 **/
628
FuStructId9LoaderCmd *
629
fu_struct_id9_loader_cmd_ref(FuStructId9LoaderCmd *st)
630
0
{
631
0
    g_return_val_if_fail(st != NULL, NULL);
632
0
    st->refcount++;
633
0
    return st;
634
0
}
635
/**
636
 * fu_struct_id9_loader_cmd_unref: (skip):
637
 **/
638
void
639
fu_struct_id9_loader_cmd_unref(FuStructId9LoaderCmd *st)
640
0
{
641
0
    g_return_if_fail(st != NULL);
642
0
    if (st->refcount == 0) {
643
0
        g_critical("FuStructId9LoaderCmd refcount already zero");
644
0
        return;
645
0
    }
646
0
    if (--st->refcount > 0)
647
0
        return;
648
0
    if (st->buf != NULL)
649
0
        g_byte_array_unref(st->buf);
650
0
    g_free(st);
651
0
}
652
static FuStructId9LoaderCmd *
653
fu_struct_id9_loader_cmd_new_internal(void)
654
0
{
655
0
    FuStructId9LoaderCmd *st = g_new0(FuStructId9LoaderCmd, 1);
656
0
    st->refcount = 1;
657
0
    return st;
658
0
}
659
660
/* getters */
661
662
/* setters */
663
/**
664
 * fu_struct_id9_loader_cmd_set_command: (skip):
665
 **/
666
void
667
fu_struct_id9_loader_cmd_set_command(FuStructId9LoaderCmd *st, guint8 value)
668
0
{
669
0
    g_return_if_fail(st != NULL);
670
0
    st->buf->data[0] = value;
671
0
}
672
/**
673
 * fu_struct_id9_loader_cmd_set_size: (skip):
674
 **/
675
void
676
fu_struct_id9_loader_cmd_set_size(FuStructId9LoaderCmd *st, guint16 value)
677
0
{
678
0
    g_return_if_fail(st != NULL);
679
0
    fu_memwrite_uint16(st->buf->data + 1, value, G_BIG_ENDIAN);
680
0
}
681
/**
682
 * fu_struct_id9_loader_cmd_set_crc: (skip):
683
 **/
684
void
685
fu_struct_id9_loader_cmd_set_crc(FuStructId9LoaderCmd *st, guint32 value)
686
0
{
687
0
    g_return_if_fail(st != NULL);
688
0
    fu_memwrite_uint32(st->buf->data + 3, value, G_BIG_ENDIAN);
689
0
}
690
/**
691
 * fu_struct_id9_loader_cmd_set_data: (skip):
692
 **/
693
gboolean
694
fu_struct_id9_loader_cmd_set_data(FuStructId9LoaderCmd *st, const FuStructId9SpiCmd *st_donor, GError **error)
695
0
{
696
0
    g_return_val_if_fail(st != NULL, FALSE);
697
0
    g_return_val_if_fail(st_donor != NULL, FALSE);
698
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
699
700
0
    if (st_donor->buf->len > FU_STRUCT_ID9_SPI_CMD_SIZE) {
701
0
        g_set_error(error,
702
0
                    FWUPD_ERROR,
703
0
                    FWUPD_ERROR_INVALID_DATA,
704
0
                    "donor 'FuStructId9SpiCmd' (0x%x bytes) does not fit in "
705
0
                    "FuStructId9LoaderCmd.data (0x%x bytes)",
706
0
                    (guint) st_donor->buf->len,
707
0
                    (guint) FU_STRUCT_ID9_SPI_CMD_SIZE);
708
0
        return FALSE;
709
0
    }
710
0
    memcpy(st->buf->data + FU_STRUCT_ID9_LOADER_CMD_OFFSET_DATA, st_donor->buf->data, st_donor->buf->len);
711
0
    return TRUE;
712
0
}
713
/**
714
 * fu_struct_id9_loader_cmd_new: (skip):
715
 **/
716
FuStructId9LoaderCmd *
717
fu_struct_id9_loader_cmd_new(void)
718
0
{
719
0
    FuStructId9LoaderCmd *st = fu_struct_id9_loader_cmd_new_internal();
720
0
    st->buf = g_byte_array_sized_new(22);
721
0
    fu_byte_array_set_size(st->buf, 22, 0x0);
722
0
    {
723
0
        g_autoptr(FuStructId9SpiCmd) st_donor = fu_struct_id9_spi_cmd_new();
724
0
        memcpy(st->buf->data + 0x7, st_donor->buf->data, st_donor->buf->len); /* nocheck:blocked */
725
0
    }
726
0
    return st;
727
0
}
728
/**
729
 * fu_struct_id9_loader_cmd_to_bytes: (skip):
730
 **/
731
GBytes *
732
fu_struct_id9_loader_cmd_to_bytes(const FuStructId9LoaderCmd *st)
733
0
{
734
0
    g_return_val_if_fail(st != NULL, NULL);
735
0
    return g_bytes_new(st->buf->data, st->buf->len);
736
0
}
737
static gboolean
738
fu_struct_id9_loader_cmd_validate_internal(FuStructId9LoaderCmd *st, GError **error)
739
0
{
740
0
    g_return_val_if_fail(st != NULL, FALSE);
741
0
    {
742
0
        GByteArray buf_tmp = {
743
0
            .data = (guint8*) st->buf->data + 0x7,
744
0
            .len = 15,
745
0
        };
746
0
        FuStructId9SpiCmd st_tmp = { .buf = &buf_tmp };
747
0
        if (!fu_struct_id9_spi_cmd_validate_internal(&st_tmp, error))
748
0
            return FALSE;
749
0
    }
750
0
    return TRUE;
751
0
}
752
/**
753
 * fu_struct_id9_loader_cmd_validate: (skip):
754
 **/
755
gboolean
756
fu_struct_id9_loader_cmd_validate(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
757
0
{
758
0
    GByteArray st_buf = {.data = (guint8 *) buf + offset, .len = bufsz - offset, };
759
0
    FuStructId9LoaderCmd st_tmp = {.buf = &st_buf };
760
0
    g_return_val_if_fail(buf != NULL, FALSE);
761
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
762
0
    if (!fu_memchk_read(bufsz, offset, 22, error)) {
763
0
        g_prefix_error_literal(error, "invalid struct FuStructId9LoaderCmd: ");
764
0
        return FALSE;
765
0
    }
766
0
    if (!fu_struct_id9_loader_cmd_validate_internal(&st_tmp, error))
767
0
        return FALSE;
768
0
    return TRUE;
769
0
}
770
/**
771
 * fu_struct_module_desc_ref: (skip):
772
 **/
773
FuStructModuleDesc *
774
fu_struct_module_desc_ref(FuStructModuleDesc *st)
775
0
{
776
0
    g_return_val_if_fail(st != NULL, NULL);
777
0
    st->refcount++;
778
0
    return st;
779
0
}
780
/**
781
 * fu_struct_module_desc_unref: (skip):
782
 **/
783
void
784
fu_struct_module_desc_unref(FuStructModuleDesc *st)
785
0
{
786
0
    g_return_if_fail(st != NULL);
787
0
    if (st->refcount == 0) {
788
0
        g_critical("FuStructModuleDesc refcount already zero");
789
0
        return;
790
0
    }
791
0
    if (--st->refcount > 0)
792
0
        return;
793
0
    if (st->buf != NULL)
794
0
        g_byte_array_unref(st->buf);
795
0
    g_free(st);
796
0
}
797
static FuStructModuleDesc *
798
fu_struct_module_desc_new_internal(void)
799
0
{
800
0
    FuStructModuleDesc *st = g_new0(FuStructModuleDesc, 1);
801
0
    st->refcount = 1;
802
0
    return st;
803
0
}
804
805
/* getters */
806
/**
807
 * fu_struct_module_desc_get_bootloader_version: (skip):
808
 **/
809
guint16
810
fu_struct_module_desc_get_bootloader_version(const FuStructModuleDesc *st)
811
0
{
812
0
    g_return_val_if_fail(st != NULL, 0x0);
813
0
    return fu_memread_uint16(st->buf->data + 1, G_BIG_ENDIAN);
814
0
}
815
/**
816
 * fu_struct_module_desc_get_number_modules: (skip):
817
 **/
818
guint8
819
fu_struct_module_desc_get_number_modules(const FuStructModuleDesc *st)
820
0
{
821
0
    g_return_val_if_fail(st != NULL, 0x0);
822
0
    return st->buf->data[3];
823
0
}
824
825
/* setters */
826
/**
827
 * fu_struct_module_desc_to_string: (skip):
828
 **/
829
static gchar *
830
fu_struct_module_desc_to_string(const FuStructModuleDesc *st)
831
0
{
832
0
    g_autoptr(GString) str = g_string_new("FuStructModuleDesc:\n");
833
0
    g_return_val_if_fail(st != NULL, NULL);
834
0
    g_string_append_printf(str, "  bootloader_version: 0x%x\n",
835
0
                           (guint) fu_struct_module_desc_get_bootloader_version(st));
836
0
    g_string_append_printf(str, "  number_modules: 0x%x\n",
837
0
                           (guint) fu_struct_module_desc_get_number_modules(st));
838
0
    if (str->len > 0)
839
0
        g_string_set_size(str, str->len - 1);
840
0
    return g_string_free(g_steal_pointer(&str), FALSE);
841
0
}
842
static gboolean
843
fu_struct_module_desc_validate_internal(FuStructModuleDesc *st, GError **error)
844
0
{
845
0
    g_return_val_if_fail(st != NULL, FALSE);
846
0
    return TRUE;
847
0
}
848
static gboolean
849
fu_struct_module_desc_parse_internal(FuStructModuleDesc *st, GError **error)
850
0
{
851
0
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
852
0
        g_autofree gchar *str = fu_struct_module_desc_to_string(st);
853
0
        g_debug("%s", str);
854
0
    }
855
0
    if (!fu_struct_module_desc_validate_internal(st, error))
856
0
        return FALSE;
857
0
    return TRUE;
858
0
}
859
860
/**
861
 * fu_struct_module_desc_parse: (skip):
862
 **/
863
FuStructModuleDesc *
864
fu_struct_module_desc_parse(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
865
0
{
866
0
    g_autoptr(FuStructModuleDesc) st = fu_struct_module_desc_new_internal();
867
0
    g_return_val_if_fail(buf != NULL, NULL);
868
0
    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
869
0
    if (!fu_memchk_read(bufsz, offset, 4, error)) {
870
0
        g_prefix_error_literal(error, "invalid struct FuStructModuleDesc: ");
871
0
        return NULL;
872
0
    }
873
0
    st->buf = g_byte_array_new();
874
0
    g_byte_array_append(st->buf, buf + offset, 4);
875
0
    if (!fu_struct_module_desc_parse_internal(st, error))
876
0
        return NULL;
877
0
    return g_steal_pointer(&st);
878
0
}
879
/**
880
 * fu_struct_module_item_ref: (skip):
881
 **/
882
FuStructModuleItem *
883
fu_struct_module_item_ref(FuStructModuleItem *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_module_item_unref: (skip):
891
 **/
892
void
893
fu_struct_module_item_unref(FuStructModuleItem *st)
894
0
{
895
0
    g_return_if_fail(st != NULL);
896
0
    if (st->refcount == 0) {
897
0
        g_critical("FuStructModuleItem refcount already zero");
898
0
        return;
899
0
    }
900
0
    if (--st->refcount > 0)
901
0
        return;
902
0
    if (st->buf != NULL)
903
0
        g_byte_array_unref(st->buf);
904
0
    g_free(st);
905
0
}
906
static FuStructModuleItem *
907
fu_struct_module_item_new_internal(void)
908
0
{
909
0
    FuStructModuleItem *st = g_new0(FuStructModuleItem, 1);
910
0
    st->refcount = 1;
911
0
    return st;
912
0
}
913
914
/* getters */
915
/**
916
 * fu_struct_module_item_get_kind: (skip):
917
 **/
918
FuWacModuleFwType
919
fu_struct_module_item_get_kind(const FuStructModuleItem *st)
920
0
{
921
0
    g_return_val_if_fail(st != NULL, 0x0);
922
0
    return st->buf->data[0];
923
0
}
924
/**
925
 * fu_struct_module_item_get_version: (skip):
926
 **/
927
guint16
928
fu_struct_module_item_get_version(const FuStructModuleItem *st)
929
0
{
930
0
    g_return_val_if_fail(st != NULL, 0x0);
931
0
    return fu_memread_uint16(st->buf->data + 1, G_BIG_ENDIAN);
932
0
}
933
/**
934
 * fu_struct_module_item_get_version2: (skip):
935
 **/
936
guint8
937
fu_struct_module_item_get_version2(const FuStructModuleItem *st)
938
0
{
939
0
    g_return_val_if_fail(st != NULL, 0x0);
940
0
    return st->buf->data[3];
941
0
}
942
943
/* setters */
944
/**
945
 * fu_struct_module_item_to_string: (skip):
946
 **/
947
static gchar *
948
fu_struct_module_item_to_string(const FuStructModuleItem *st)
949
0
{
950
0
    g_autoptr(GString) str = g_string_new("FuStructModuleItem:\n");
951
0
    g_return_val_if_fail(st != NULL, NULL);
952
0
    {
953
0
        const gchar *tmp = fu_wac_module_fw_type_to_string(fu_struct_module_item_get_kind(st));
954
0
        if (tmp != NULL) {
955
0
            g_string_append_printf(str, "  kind: 0x%x [%s]\n", (guint) fu_struct_module_item_get_kind(st), tmp);
956
0
        } else {
957
0
            g_string_append_printf(str, "  kind: 0x%x\n", (guint) fu_struct_module_item_get_kind(st));
958
0
        }
959
0
    }
960
0
    g_string_append_printf(str, "  version: 0x%x\n",
961
0
                           (guint) fu_struct_module_item_get_version(st));
962
0
    g_string_append_printf(str, "  version2: 0x%x\n",
963
0
                           (guint) fu_struct_module_item_get_version2(st));
964
0
    if (str->len > 0)
965
0
        g_string_set_size(str, str->len - 1);
966
0
    return g_string_free(g_steal_pointer(&str), FALSE);
967
0
}
968
static gboolean
969
fu_struct_module_item_validate_internal(FuStructModuleItem *st, GError **error)
970
0
{
971
0
    g_return_val_if_fail(st != NULL, FALSE);
972
0
    return TRUE;
973
0
}
974
static gboolean
975
fu_struct_module_item_parse_internal(FuStructModuleItem *st, GError **error)
976
0
{
977
0
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
978
0
        g_autofree gchar *str = fu_struct_module_item_to_string(st);
979
0
        g_debug("%s", str);
980
0
    }
981
0
    if (!fu_struct_module_item_validate_internal(st, error))
982
0
        return FALSE;
983
0
    return TRUE;
984
0
}
985
986
/**
987
 * fu_struct_module_item_parse: (skip):
988
 **/
989
FuStructModuleItem *
990
fu_struct_module_item_parse(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
991
0
{
992
0
    g_autoptr(FuStructModuleItem) st = fu_struct_module_item_new_internal();
993
0
    g_return_val_if_fail(buf != NULL, NULL);
994
0
    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
995
0
    if (!fu_memchk_read(bufsz, offset, 4, error)) {
996
0
        g_prefix_error_literal(error, "invalid struct FuStructModuleItem: ");
997
0
        return NULL;
998
0
    }
999
0
    st->buf = g_byte_array_new();
1000
0
    g_byte_array_append(st->buf, buf + offset, 4);
1001
0
    if (!fu_struct_module_item_parse_internal(st, error))
1002
0
        return NULL;
1003
0
    return g_steal_pointer(&st);
1004
0
}