Coverage Report

Created: 2025-11-24 06:59

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
222k
{
167
222k
    g_return_if_fail(st != NULL);
168
222k
    if (st->refcount == 0) {
169
0
        g_critical("FuStructWacFirmwareHdr refcount already zero");
170
0
        return;
171
0
    }
172
222k
    if (--st->refcount > 0)
173
0
        return;
174
222k
    if (st->buf != NULL)
175
222k
        g_byte_array_unref(st->buf);
176
222k
    g_free(st);
177
222k
}
178
/**
179
 * fu_struct_wac_firmware_hdr_new_internal: (skip):
180
 **/
181
static FuStructWacFirmwareHdr *
182
fu_struct_wac_firmware_hdr_new_internal(void)
183
222k
{
184
222k
    FuStructWacFirmwareHdr *st = g_new0(FuStructWacFirmwareHdr, 1);
185
222k
    st->refcount = 1;
186
222k
    return st;
187
222k
}
188
189
/* getters */
190
/**
191
 * fu_struct_wac_firmware_hdr_get_magic: (skip):
192
 **/
193
static gchar *
194
fu_struct_wac_firmware_hdr_get_magic(const FuStructWacFirmwareHdr *st)
195
219k
{
196
219k
    g_return_val_if_fail(st != NULL, NULL);
197
219k
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 5, NULL);
198
219k
}
199
200
/* setters */
201
static gboolean
202
fu_struct_wac_firmware_hdr_validate_internal(FuStructWacFirmwareHdr *st, GError **error)
203
221k
{
204
221k
    g_return_val_if_fail(st != NULL, FALSE);
205
221k
    if (strncmp((const gchar *) (st->buf->data + 0), "WACOM", 5) != 0) {
206
219k
        g_autofree gchar *str = fu_struct_wac_firmware_hdr_get_magic(st);
207
219k
        g_set_error(error,
208
219k
                    FWUPD_ERROR,
209
219k
                    FWUPD_ERROR_INVALID_DATA,
210
219k
                    "constant FuStructWacFirmwareHdr.magic was not valid, "
211
219k
                    "expected 'WACOM' and got '%s'",
212
219k
                    str);
213
219k
        return FALSE;
214
219k
    }
215
1.90k
    return TRUE;
216
221k
}
217
/**
218
 * fu_struct_wac_firmware_hdr_validate_stream: (skip):
219
 **/
220
gboolean
221
fu_struct_wac_firmware_hdr_validate_stream(GInputStream *stream, gsize offset, GError **error)
222
222k
{
223
222k
    g_autoptr(FuStructWacFirmwareHdr) st = fu_struct_wac_firmware_hdr_new_internal();
224
222k
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
225
222k
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
226
222k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 5, NULL, error);
227
222k
    if (st->buf == NULL) {
228
0
        g_prefix_error(error, "FuStructWacFirmwareHdr failed read of 0x%x: ", (guint) 5);
229
0
        return FALSE;
230
0
    }
231
222k
    if (st->buf->len != 5) {
232
598
        g_set_error(error,
233
598
                    FWUPD_ERROR,
234
598
                    FWUPD_ERROR_INVALID_DATA,
235
598
                    "FuStructWacFirmwareHdr requested 0x%x and got 0x%x",
236
598
                    (guint) 5,
237
598
                    (guint) st->buf->len);
238
598
        return FALSE;
239
598
    }
240
221k
    return fu_struct_wac_firmware_hdr_validate_internal(st, error);
241
222k
}
242
/**
243
 * fu_struct_wta_block_header_ref: (skip):
244
 **/
245
FuStructWtaBlockHeader *
246
fu_struct_wta_block_header_ref(FuStructWtaBlockHeader *st)
247
0
{
248
0
    g_return_val_if_fail(st != NULL, NULL);
249
0
    st->refcount++;
250
0
    return st;
251
0
}
252
/**
253
 * fu_struct_wta_block_header_unref: (skip):
254
 **/
255
void
256
fu_struct_wta_block_header_unref(FuStructWtaBlockHeader *st)
257
0
{
258
0
    g_return_if_fail(st != NULL);
259
0
    if (st->refcount == 0) {
260
0
        g_critical("FuStructWtaBlockHeader refcount already zero");
261
0
        return;
262
0
    }
263
0
    if (--st->refcount > 0)
264
0
        return;
265
0
    if (st->buf != NULL)
266
0
        g_byte_array_unref(st->buf);
267
0
    g_free(st);
268
0
}
269
/**
270
 * fu_struct_wta_block_header_new_internal: (skip):
271
 **/
272
static FuStructWtaBlockHeader *
273
fu_struct_wta_block_header_new_internal(void)
274
0
{
275
0
    FuStructWtaBlockHeader *st = g_new0(FuStructWtaBlockHeader, 1);
276
0
    st->refcount = 1;
277
0
    return st;
278
0
}
279
280
/* getters */
281
/**
282
 * fu_struct_wta_block_header_get_block_start: (skip):
283
 **/
284
guint32
285
fu_struct_wta_block_header_get_block_start(const FuStructWtaBlockHeader *st)
286
0
{
287
0
    g_return_val_if_fail(st != NULL, 0x0);
288
0
    return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN);
289
0
}
290
/**
291
 * fu_struct_wta_block_header_get_block_size: (skip):
292
 **/
293
guint32
294
fu_struct_wta_block_header_get_block_size(const FuStructWtaBlockHeader *st)
295
0
{
296
0
    g_return_val_if_fail(st != NULL, 0x0);
297
0
    return fu_memread_uint32(st->buf->data + 4, G_LITTLE_ENDIAN);
298
0
}
299
300
/* setters */
301
/**
302
 * fu_struct_wta_block_header_to_string: (skip):
303
 **/
304
static gchar *
305
fu_struct_wta_block_header_to_string(const FuStructWtaBlockHeader *st)
306
0
{
307
0
    g_autoptr(GString) str = g_string_new("FuStructWtaBlockHeader:\n");
308
0
    g_return_val_if_fail(st != NULL, NULL);
309
0
    g_string_append_printf(str, "  block_start: 0x%x\n",
310
0
                           (guint) fu_struct_wta_block_header_get_block_start(st));
311
0
    g_string_append_printf(str, "  block_size: 0x%x\n",
312
0
                           (guint) fu_struct_wta_block_header_get_block_size(st));
313
0
    if (str->len > 0)
314
0
        g_string_set_size(str, str->len - 1);
315
0
    return g_string_free(g_steal_pointer(&str), FALSE);
316
0
}
317
static gboolean
318
fu_struct_wta_block_header_validate_internal(FuStructWtaBlockHeader *st, GError **error)
319
0
{
320
0
    g_return_val_if_fail(st != NULL, FALSE);
321
0
    return TRUE;
322
0
}
323
static gboolean
324
fu_struct_wta_block_header_parse_internal(FuStructWtaBlockHeader *st, GError **error)
325
0
{
326
0
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
327
0
        g_autofree gchar *str = fu_struct_wta_block_header_to_string(st);
328
0
        g_debug("%s", str);
329
0
    }
330
0
    if (!fu_struct_wta_block_header_validate_internal(st, error))
331
0
        return FALSE;
332
0
    return TRUE;
333
0
}
334
335
/**
336
 * fu_struct_wta_block_header_parse: (skip):
337
 **/
338
FuStructWtaBlockHeader *
339
fu_struct_wta_block_header_parse(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
340
0
{
341
0
    g_autoptr(FuStructWtaBlockHeader) st = fu_struct_wta_block_header_new_internal();
342
0
    g_return_val_if_fail(buf != NULL, NULL);
343
0
    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
344
0
    if (!fu_memchk_read(bufsz, offset, 8, error)) {
345
0
        g_prefix_error_literal(error, "invalid struct FuStructWtaBlockHeader: ");
346
0
        return NULL;
347
0
    }
348
0
    st->buf = g_byte_array_new();
349
0
    g_byte_array_append(st->buf, buf + offset, 8);
350
0
    if (!fu_struct_wta_block_header_parse_internal(st, error))
351
0
        return NULL;
352
0
    return g_steal_pointer(&st);
353
0
}
354
/**
355
 * fu_struct_id9_unknown_cmd_ref: (skip):
356
 **/
357
FuStructId9UnknownCmd *
358
fu_struct_id9_unknown_cmd_ref(FuStructId9UnknownCmd *st)
359
0
{
360
0
    g_return_val_if_fail(st != NULL, NULL);
361
0
    st->refcount++;
362
0
    return st;
363
0
}
364
/**
365
 * fu_struct_id9_unknown_cmd_unref: (skip):
366
 **/
367
void
368
fu_struct_id9_unknown_cmd_unref(FuStructId9UnknownCmd *st)
369
0
{
370
0
    g_return_if_fail(st != NULL);
371
0
    if (st->refcount == 0) {
372
0
        g_critical("FuStructId9UnknownCmd refcount already zero");
373
0
        return;
374
0
    }
375
0
    if (--st->refcount > 0)
376
0
        return;
377
0
    if (st->buf != NULL)
378
0
        g_byte_array_unref(st->buf);
379
0
    g_free(st);
380
0
}
381
/**
382
 * fu_struct_id9_unknown_cmd_new_internal: (skip):
383
 **/
384
static FuStructId9UnknownCmd *
385
fu_struct_id9_unknown_cmd_new_internal(void)
386
0
{
387
0
    FuStructId9UnknownCmd *st = g_new0(FuStructId9UnknownCmd, 1);
388
0
    st->refcount = 1;
389
0
    return st;
390
0
}
391
392
/* getters */
393
/**
394
 * fu_struct_id9_unknown_cmd_get_unknown1: (skip):
395
 **/
396
static guint16
397
fu_struct_id9_unknown_cmd_get_unknown1(const FuStructId9UnknownCmd *st)
398
0
{
399
0
    g_return_val_if_fail(st != NULL, 0x0);
400
0
    return fu_memread_uint16(st->buf->data + 0, G_BIG_ENDIAN);
401
0
}
402
/**
403
 * fu_struct_id9_unknown_cmd_get_unknown2: (skip):
404
 **/
405
static guint32
406
fu_struct_id9_unknown_cmd_get_unknown2(const FuStructId9UnknownCmd *st)
407
0
{
408
0
    g_return_val_if_fail(st != NULL, 0x0);
409
0
    return fu_memread_uint32(st->buf->data + 2, G_BIG_ENDIAN);
410
0
}
411
412
/* setters */
413
/**
414
 * fu_struct_id9_unknown_cmd_set_unknown1: (skip):
415
 **/
416
static void
417
fu_struct_id9_unknown_cmd_set_unknown1(FuStructId9UnknownCmd *st, guint16 value)
418
0
{
419
0
    g_return_if_fail(st != NULL);
420
0
    fu_memwrite_uint16(st->buf->data + 0, value, G_BIG_ENDIAN);
421
0
}
422
/**
423
 * fu_struct_id9_unknown_cmd_set_unknown2: (skip):
424
 **/
425
static void
426
fu_struct_id9_unknown_cmd_set_unknown2(FuStructId9UnknownCmd *st, guint32 value)
427
0
{
428
0
    g_return_if_fail(st != NULL);
429
0
    fu_memwrite_uint32(st->buf->data + 2, value, G_BIG_ENDIAN);
430
0
}
431
/**
432
 * fu_struct_id9_unknown_cmd_set_size: (skip):
433
 **/
434
void
435
fu_struct_id9_unknown_cmd_set_size(FuStructId9UnknownCmd *st, guint16 value)
436
0
{
437
0
    g_return_if_fail(st != NULL);
438
0
    fu_memwrite_uint16(st->buf->data + 6, value, G_BIG_ENDIAN);
439
0
}
440
/**
441
 * fu_struct_id9_unknown_cmd_new: (skip):
442
 **/
443
FuStructId9UnknownCmd *
444
fu_struct_id9_unknown_cmd_new(void)
445
0
{
446
0
    FuStructId9UnknownCmd *st = fu_struct_id9_unknown_cmd_new_internal();
447
0
    st->buf = g_byte_array_sized_new(8);
448
0
    fu_byte_array_set_size(st->buf, 8, 0x0);
449
0
    fu_struct_id9_unknown_cmd_set_unknown1(st, 0x7050);
450
0
    fu_struct_id9_unknown_cmd_set_unknown2(st, 0);
451
0
    return st;
452
0
}
453
static gboolean
454
fu_struct_id9_unknown_cmd_validate_internal(FuStructId9UnknownCmd *st, GError **error)
455
0
{
456
0
    g_return_val_if_fail(st != NULL, FALSE);
457
0
    if (fu_struct_id9_unknown_cmd_get_unknown1(st) != 0x7050) {
458
0
        g_set_error(error,
459
0
                    FWUPD_ERROR,
460
0
                    FWUPD_ERROR_INVALID_DATA,
461
0
                    "constant FuStructId9UnknownCmd.unknown1 was not valid, "
462
0
                    "expected 0x%x and got 0x%x",
463
0
                    (guint) 0x7050,
464
0
                    (guint) fu_struct_id9_unknown_cmd_get_unknown1(st));
465
0
        return FALSE;
466
0
    }
467
0
    if (fu_struct_id9_unknown_cmd_get_unknown2(st) != 0) {
468
0
        g_set_error(error,
469
0
                    FWUPD_ERROR,
470
0
                    FWUPD_ERROR_INVALID_DATA,
471
0
                    "constant FuStructId9UnknownCmd.unknown2 was not valid, "
472
0
                    "expected 0x%x and got 0x%x",
473
0
                    (guint) 0,
474
0
                    (guint) fu_struct_id9_unknown_cmd_get_unknown2(st));
475
0
        return FALSE;
476
0
    }
477
0
    return TRUE;
478
0
}
479
/**
480
 * fu_struct_id9_spi_cmd_ref: (skip):
481
 **/
482
FuStructId9SpiCmd *
483
fu_struct_id9_spi_cmd_ref(FuStructId9SpiCmd *st)
484
0
{
485
0
    g_return_val_if_fail(st != NULL, NULL);
486
0
    st->refcount++;
487
0
    return st;
488
0
}
489
/**
490
 * fu_struct_id9_spi_cmd_unref: (skip):
491
 **/
492
void
493
fu_struct_id9_spi_cmd_unref(FuStructId9SpiCmd *st)
494
0
{
495
0
    g_return_if_fail(st != NULL);
496
0
    if (st->refcount == 0) {
497
0
        g_critical("FuStructId9SpiCmd refcount already zero");
498
0
        return;
499
0
    }
500
0
    if (--st->refcount > 0)
501
0
        return;
502
0
    if (st->buf != NULL)
503
0
        g_byte_array_unref(st->buf);
504
0
    g_free(st);
505
0
}
506
/**
507
 * fu_struct_id9_spi_cmd_new_internal: (skip):
508
 **/
509
static FuStructId9SpiCmd *
510
fu_struct_id9_spi_cmd_new_internal(void)
511
0
{
512
0
    FuStructId9SpiCmd *st = g_new0(FuStructId9SpiCmd, 1);
513
0
    st->refcount = 1;
514
0
    return st;
515
0
}
516
517
/* getters */
518
/**
519
 * fu_struct_id9_spi_cmd_get_command: (skip):
520
 **/
521
static guint8
522
fu_struct_id9_spi_cmd_get_command(const FuStructId9SpiCmd *st)
523
0
{
524
0
    g_return_val_if_fail(st != NULL, 0x0);
525
0
    return st->buf->data[0];
526
0
}
527
/**
528
 * fu_struct_id9_spi_cmd_get_start_addr: (skip):
529
 **/
530
static guint32
531
fu_struct_id9_spi_cmd_get_start_addr(const FuStructId9SpiCmd *st)
532
0
{
533
0
    g_return_val_if_fail(st != NULL, 0x0);
534
0
    return fu_memread_uint32(st->buf->data + 1, G_BIG_ENDIAN);
535
0
}
536
537
/* setters */
538
/**
539
 * fu_struct_id9_spi_cmd_set_command: (skip):
540
 **/
541
static void
542
fu_struct_id9_spi_cmd_set_command(FuStructId9SpiCmd *st, guint8 value)
543
0
{
544
0
    g_return_if_fail(st != NULL);
545
0
    st->buf->data[0] = value;
546
0
}
547
/**
548
 * fu_struct_id9_spi_cmd_set_start_addr: (skip):
549
 **/
550
static void
551
fu_struct_id9_spi_cmd_set_start_addr(FuStructId9SpiCmd *st, guint32 value)
552
0
{
553
0
    g_return_if_fail(st != NULL);
554
0
    fu_memwrite_uint32(st->buf->data + 1, value, G_BIG_ENDIAN);
555
0
}
556
/**
557
 * fu_struct_id9_spi_cmd_set_size: (skip):
558
 **/
559
void
560
fu_struct_id9_spi_cmd_set_size(FuStructId9SpiCmd *st, guint16 value)
561
0
{
562
0
    g_return_if_fail(st != NULL);
563
0
    fu_memwrite_uint16(st->buf->data + 5, value, G_BIG_ENDIAN);
564
0
}
565
/**
566
 * fu_struct_id9_spi_cmd_set_data: (skip):
567
 **/
568
gboolean
569
fu_struct_id9_spi_cmd_set_data(FuStructId9SpiCmd *st, const FuStructId9UnknownCmd *st_donor, GError **error)
570
0
{
571
0
    g_return_val_if_fail(st != NULL, FALSE);
572
0
    g_return_val_if_fail(st_donor != NULL, FALSE);
573
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
574
575
0
    if (st_donor->buf->len > FU_STRUCT_ID9_UNKNOWN_CMD_SIZE) {
576
0
        g_set_error(error,
577
0
                    FWUPD_ERROR,
578
0
                    FWUPD_ERROR_INVALID_DATA,
579
0
                    "donor 'FuStructId9UnknownCmd' (0x%x bytes) does not fit in "
580
0
                    "FuStructId9SpiCmd.data (0x%x bytes)",
581
0
                    (guint) st_donor->buf->len,
582
0
                    (guint) FU_STRUCT_ID9_UNKNOWN_CMD_SIZE);
583
0
        return FALSE;
584
0
    }
585
0
    memcpy(st->buf->data + FU_STRUCT_ID9_SPI_CMD_OFFSET_DATA, st_donor->buf->data, st_donor->buf->len);
586
0
    return TRUE;
587
0
}
588
/**
589
 * fu_struct_id9_spi_cmd_new: (skip):
590
 **/
591
FuStructId9SpiCmd *
592
fu_struct_id9_spi_cmd_new(void)
593
0
{
594
0
    FuStructId9SpiCmd *st = fu_struct_id9_spi_cmd_new_internal();
595
0
    st->buf = g_byte_array_sized_new(15);
596
0
    fu_byte_array_set_size(st->buf, 15, 0x0);
597
0
    {
598
0
        g_autoptr(FuStructId9UnknownCmd) st_donor = fu_struct_id9_unknown_cmd_new();
599
0
        memcpy(st->buf->data + 0x7, st_donor->buf->data, st_donor->buf->len); /* nocheck:blocked */
600
0
    }
601
0
    fu_struct_id9_spi_cmd_set_command(st, 0x91);
602
0
    fu_struct_id9_spi_cmd_set_start_addr(st, 0);
603
0
    return st;
604
0
}
605
static gboolean
606
fu_struct_id9_spi_cmd_validate_internal(FuStructId9SpiCmd *st, GError **error)
607
0
{
608
0
    g_return_val_if_fail(st != NULL, FALSE);
609
0
    if (fu_struct_id9_spi_cmd_get_command(st) != 0x91) {
610
0
        g_set_error_literal(error,
611
0
                            FWUPD_ERROR,
612
0
                            FWUPD_ERROR_INVALID_DATA,
613
0
                            "constant FuStructId9SpiCmd.command was not valid");
614
0
        return FALSE;
615
0
    }
616
0
    if (fu_struct_id9_spi_cmd_get_start_addr(st) != 0) {
617
0
        g_set_error(error,
618
0
                    FWUPD_ERROR,
619
0
                    FWUPD_ERROR_INVALID_DATA,
620
0
                    "constant FuStructId9SpiCmd.start_addr was not valid, "
621
0
                    "expected 0x%x and got 0x%x",
622
0
                    (guint) 0,
623
0
                    (guint) fu_struct_id9_spi_cmd_get_start_addr(st));
624
0
        return FALSE;
625
0
    }
626
0
    {
627
0
        GByteArray buf_tmp = {
628
0
            .data = (guint8*) st->buf->data + 0x7,
629
0
            .len = 8,
630
0
        };
631
0
        FuStructId9UnknownCmd st_tmp = { .buf = &buf_tmp };
632
0
        if (!fu_struct_id9_unknown_cmd_validate_internal(&st_tmp, error))
633
0
            return FALSE;
634
0
    }
635
0
    return TRUE;
636
0
}
637
/**
638
 * fu_struct_id9_loader_cmd_ref: (skip):
639
 **/
640
FuStructId9LoaderCmd *
641
fu_struct_id9_loader_cmd_ref(FuStructId9LoaderCmd *st)
642
0
{
643
0
    g_return_val_if_fail(st != NULL, NULL);
644
0
    st->refcount++;
645
0
    return st;
646
0
}
647
/**
648
 * fu_struct_id9_loader_cmd_unref: (skip):
649
 **/
650
void
651
fu_struct_id9_loader_cmd_unref(FuStructId9LoaderCmd *st)
652
0
{
653
0
    g_return_if_fail(st != NULL);
654
0
    if (st->refcount == 0) {
655
0
        g_critical("FuStructId9LoaderCmd refcount already zero");
656
0
        return;
657
0
    }
658
0
    if (--st->refcount > 0)
659
0
        return;
660
0
    if (st->buf != NULL)
661
0
        g_byte_array_unref(st->buf);
662
0
    g_free(st);
663
0
}
664
/**
665
 * fu_struct_id9_loader_cmd_new_internal: (skip):
666
 **/
667
static FuStructId9LoaderCmd *
668
fu_struct_id9_loader_cmd_new_internal(void)
669
0
{
670
0
    FuStructId9LoaderCmd *st = g_new0(FuStructId9LoaderCmd, 1);
671
0
    st->refcount = 1;
672
0
    return st;
673
0
}
674
675
/* getters */
676
677
/* setters */
678
/**
679
 * fu_struct_id9_loader_cmd_set_command: (skip):
680
 **/
681
void
682
fu_struct_id9_loader_cmd_set_command(FuStructId9LoaderCmd *st, guint8 value)
683
0
{
684
0
    g_return_if_fail(st != NULL);
685
0
    st->buf->data[0] = value;
686
0
}
687
/**
688
 * fu_struct_id9_loader_cmd_set_size: (skip):
689
 **/
690
void
691
fu_struct_id9_loader_cmd_set_size(FuStructId9LoaderCmd *st, guint16 value)
692
0
{
693
0
    g_return_if_fail(st != NULL);
694
0
    fu_memwrite_uint16(st->buf->data + 1, value, G_BIG_ENDIAN);
695
0
}
696
/**
697
 * fu_struct_id9_loader_cmd_set_crc: (skip):
698
 **/
699
void
700
fu_struct_id9_loader_cmd_set_crc(FuStructId9LoaderCmd *st, guint32 value)
701
0
{
702
0
    g_return_if_fail(st != NULL);
703
0
    fu_memwrite_uint32(st->buf->data + 3, value, G_BIG_ENDIAN);
704
0
}
705
/**
706
 * fu_struct_id9_loader_cmd_set_data: (skip):
707
 **/
708
gboolean
709
fu_struct_id9_loader_cmd_set_data(FuStructId9LoaderCmd *st, const FuStructId9SpiCmd *st_donor, GError **error)
710
0
{
711
0
    g_return_val_if_fail(st != NULL, FALSE);
712
0
    g_return_val_if_fail(st_donor != NULL, FALSE);
713
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
714
715
0
    if (st_donor->buf->len > FU_STRUCT_ID9_SPI_CMD_SIZE) {
716
0
        g_set_error(error,
717
0
                    FWUPD_ERROR,
718
0
                    FWUPD_ERROR_INVALID_DATA,
719
0
                    "donor 'FuStructId9SpiCmd' (0x%x bytes) does not fit in "
720
0
                    "FuStructId9LoaderCmd.data (0x%x bytes)",
721
0
                    (guint) st_donor->buf->len,
722
0
                    (guint) FU_STRUCT_ID9_SPI_CMD_SIZE);
723
0
        return FALSE;
724
0
    }
725
0
    memcpy(st->buf->data + FU_STRUCT_ID9_LOADER_CMD_OFFSET_DATA, st_donor->buf->data, st_donor->buf->len);
726
0
    return TRUE;
727
0
}
728
/**
729
 * fu_struct_id9_loader_cmd_new: (skip):
730
 **/
731
FuStructId9LoaderCmd *
732
fu_struct_id9_loader_cmd_new(void)
733
0
{
734
0
    FuStructId9LoaderCmd *st = fu_struct_id9_loader_cmd_new_internal();
735
0
    st->buf = g_byte_array_sized_new(22);
736
0
    fu_byte_array_set_size(st->buf, 22, 0x0);
737
0
    {
738
0
        g_autoptr(FuStructId9SpiCmd) st_donor = fu_struct_id9_spi_cmd_new();
739
0
        memcpy(st->buf->data + 0x7, st_donor->buf->data, st_donor->buf->len); /* nocheck:blocked */
740
0
    }
741
0
    return st;
742
0
}
743
/**
744
 * fu_struct_id9_loader_cmd_to_bytes: (skip):
745
 **/
746
GBytes *
747
fu_struct_id9_loader_cmd_to_bytes(const FuStructId9LoaderCmd *st)
748
0
{
749
0
    g_return_val_if_fail(st != NULL, NULL);
750
0
    return g_bytes_new(st->buf->data, st->buf->len);
751
0
}
752
static gboolean
753
fu_struct_id9_loader_cmd_validate_internal(FuStructId9LoaderCmd *st, GError **error)
754
0
{
755
0
    g_return_val_if_fail(st != NULL, FALSE);
756
0
    {
757
0
        GByteArray buf_tmp = {
758
0
            .data = (guint8*) st->buf->data + 0x7,
759
0
            .len = 15,
760
0
        };
761
0
        FuStructId9SpiCmd st_tmp = { .buf = &buf_tmp };
762
0
        if (!fu_struct_id9_spi_cmd_validate_internal(&st_tmp, error))
763
0
            return FALSE;
764
0
    }
765
0
    return TRUE;
766
0
}
767
/**
768
 * fu_struct_id9_loader_cmd_validate: (skip):
769
 **/
770
gboolean
771
fu_struct_id9_loader_cmd_validate(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
772
0
{
773
0
    GByteArray st_buf = {.data = (guint8 *) buf + offset, .len = bufsz - offset, };
774
0
    FuStructId9LoaderCmd st_tmp = {.buf = &st_buf };
775
0
    g_return_val_if_fail(buf != NULL, FALSE);
776
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
777
0
    if (!fu_memchk_read(bufsz, offset, 22, error)) {
778
0
        g_prefix_error_literal(error, "invalid struct FuStructId9LoaderCmd: ");
779
0
        return FALSE;
780
0
    }
781
0
    if (!fu_struct_id9_loader_cmd_validate_internal(&st_tmp, error))
782
0
        return FALSE;
783
0
    return TRUE;
784
0
}
785
/**
786
 * fu_struct_module_desc_ref: (skip):
787
 **/
788
FuStructModuleDesc *
789
fu_struct_module_desc_ref(FuStructModuleDesc *st)
790
0
{
791
0
    g_return_val_if_fail(st != NULL, NULL);
792
0
    st->refcount++;
793
0
    return st;
794
0
}
795
/**
796
 * fu_struct_module_desc_unref: (skip):
797
 **/
798
void
799
fu_struct_module_desc_unref(FuStructModuleDesc *st)
800
0
{
801
0
    g_return_if_fail(st != NULL);
802
0
    if (st->refcount == 0) {
803
0
        g_critical("FuStructModuleDesc refcount already zero");
804
0
        return;
805
0
    }
806
0
    if (--st->refcount > 0)
807
0
        return;
808
0
    if (st->buf != NULL)
809
0
        g_byte_array_unref(st->buf);
810
0
    g_free(st);
811
0
}
812
/**
813
 * fu_struct_module_desc_new_internal: (skip):
814
 **/
815
static FuStructModuleDesc *
816
fu_struct_module_desc_new_internal(void)
817
0
{
818
0
    FuStructModuleDesc *st = g_new0(FuStructModuleDesc, 1);
819
0
    st->refcount = 1;
820
0
    return st;
821
0
}
822
823
/* getters */
824
/**
825
 * fu_struct_module_desc_get_bootloader_version: (skip):
826
 **/
827
guint16
828
fu_struct_module_desc_get_bootloader_version(const FuStructModuleDesc *st)
829
0
{
830
0
    g_return_val_if_fail(st != NULL, 0x0);
831
0
    return fu_memread_uint16(st->buf->data + 1, G_BIG_ENDIAN);
832
0
}
833
/**
834
 * fu_struct_module_desc_get_number_modules: (skip):
835
 **/
836
guint8
837
fu_struct_module_desc_get_number_modules(const FuStructModuleDesc *st)
838
0
{
839
0
    g_return_val_if_fail(st != NULL, 0x0);
840
0
    return st->buf->data[3];
841
0
}
842
843
/* setters */
844
/**
845
 * fu_struct_module_desc_to_string: (skip):
846
 **/
847
static gchar *
848
fu_struct_module_desc_to_string(const FuStructModuleDesc *st)
849
0
{
850
0
    g_autoptr(GString) str = g_string_new("FuStructModuleDesc:\n");
851
0
    g_return_val_if_fail(st != NULL, NULL);
852
0
    g_string_append_printf(str, "  bootloader_version: 0x%x\n",
853
0
                           (guint) fu_struct_module_desc_get_bootloader_version(st));
854
0
    g_string_append_printf(str, "  number_modules: 0x%x\n",
855
0
                           (guint) fu_struct_module_desc_get_number_modules(st));
856
0
    if (str->len > 0)
857
0
        g_string_set_size(str, str->len - 1);
858
0
    return g_string_free(g_steal_pointer(&str), FALSE);
859
0
}
860
static gboolean
861
fu_struct_module_desc_validate_internal(FuStructModuleDesc *st, GError **error)
862
0
{
863
0
    g_return_val_if_fail(st != NULL, FALSE);
864
0
    return TRUE;
865
0
}
866
static gboolean
867
fu_struct_module_desc_parse_internal(FuStructModuleDesc *st, GError **error)
868
0
{
869
0
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
870
0
        g_autofree gchar *str = fu_struct_module_desc_to_string(st);
871
0
        g_debug("%s", str);
872
0
    }
873
0
    if (!fu_struct_module_desc_validate_internal(st, error))
874
0
        return FALSE;
875
0
    return TRUE;
876
0
}
877
878
/**
879
 * fu_struct_module_desc_parse: (skip):
880
 **/
881
FuStructModuleDesc *
882
fu_struct_module_desc_parse(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
883
0
{
884
0
    g_autoptr(FuStructModuleDesc) st = fu_struct_module_desc_new_internal();
885
0
    g_return_val_if_fail(buf != NULL, NULL);
886
0
    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
887
0
    if (!fu_memchk_read(bufsz, offset, 4, error)) {
888
0
        g_prefix_error_literal(error, "invalid struct FuStructModuleDesc: ");
889
0
        return NULL;
890
0
    }
891
0
    st->buf = g_byte_array_new();
892
0
    g_byte_array_append(st->buf, buf + offset, 4);
893
0
    if (!fu_struct_module_desc_parse_internal(st, error))
894
0
        return NULL;
895
0
    return g_steal_pointer(&st);
896
0
}
897
/**
898
 * fu_struct_module_item_ref: (skip):
899
 **/
900
FuStructModuleItem *
901
fu_struct_module_item_ref(FuStructModuleItem *st)
902
0
{
903
0
    g_return_val_if_fail(st != NULL, NULL);
904
0
    st->refcount++;
905
0
    return st;
906
0
}
907
/**
908
 * fu_struct_module_item_unref: (skip):
909
 **/
910
void
911
fu_struct_module_item_unref(FuStructModuleItem *st)
912
0
{
913
0
    g_return_if_fail(st != NULL);
914
0
    if (st->refcount == 0) {
915
0
        g_critical("FuStructModuleItem refcount already zero");
916
0
        return;
917
0
    }
918
0
    if (--st->refcount > 0)
919
0
        return;
920
0
    if (st->buf != NULL)
921
0
        g_byte_array_unref(st->buf);
922
0
    g_free(st);
923
0
}
924
/**
925
 * fu_struct_module_item_new_internal: (skip):
926
 **/
927
static FuStructModuleItem *
928
fu_struct_module_item_new_internal(void)
929
0
{
930
0
    FuStructModuleItem *st = g_new0(FuStructModuleItem, 1);
931
0
    st->refcount = 1;
932
0
    return st;
933
0
}
934
935
/* getters */
936
/**
937
 * fu_struct_module_item_get_kind: (skip):
938
 **/
939
FuWacModuleFwType
940
fu_struct_module_item_get_kind(const FuStructModuleItem *st)
941
0
{
942
0
    g_return_val_if_fail(st != NULL, 0x0);
943
0
    return st->buf->data[0];
944
0
}
945
/**
946
 * fu_struct_module_item_get_version: (skip):
947
 **/
948
guint16
949
fu_struct_module_item_get_version(const FuStructModuleItem *st)
950
0
{
951
0
    g_return_val_if_fail(st != NULL, 0x0);
952
0
    return fu_memread_uint16(st->buf->data + 1, G_BIG_ENDIAN);
953
0
}
954
/**
955
 * fu_struct_module_item_get_version2: (skip):
956
 **/
957
guint8
958
fu_struct_module_item_get_version2(const FuStructModuleItem *st)
959
0
{
960
0
    g_return_val_if_fail(st != NULL, 0x0);
961
0
    return st->buf->data[3];
962
0
}
963
964
/* setters */
965
/**
966
 * fu_struct_module_item_to_string: (skip):
967
 **/
968
static gchar *
969
fu_struct_module_item_to_string(const FuStructModuleItem *st)
970
0
{
971
0
    g_autoptr(GString) str = g_string_new("FuStructModuleItem:\n");
972
0
    g_return_val_if_fail(st != NULL, NULL);
973
0
    {
974
0
        const gchar *tmp = fu_wac_module_fw_type_to_string(fu_struct_module_item_get_kind(st));
975
0
        if (tmp != NULL) {
976
0
            g_string_append_printf(str, "  kind: 0x%x [%s]\n", (guint) fu_struct_module_item_get_kind(st), tmp);
977
0
        } else {
978
0
            g_string_append_printf(str, "  kind: 0x%x\n", (guint) fu_struct_module_item_get_kind(st));
979
0
        }
980
0
    }
981
0
    g_string_append_printf(str, "  version: 0x%x\n",
982
0
                           (guint) fu_struct_module_item_get_version(st));
983
0
    g_string_append_printf(str, "  version2: 0x%x\n",
984
0
                           (guint) fu_struct_module_item_get_version2(st));
985
0
    if (str->len > 0)
986
0
        g_string_set_size(str, str->len - 1);
987
0
    return g_string_free(g_steal_pointer(&str), FALSE);
988
0
}
989
static gboolean
990
fu_struct_module_item_validate_internal(FuStructModuleItem *st, GError **error)
991
0
{
992
0
    g_return_val_if_fail(st != NULL, FALSE);
993
0
    return TRUE;
994
0
}
995
static gboolean
996
fu_struct_module_item_parse_internal(FuStructModuleItem *st, GError **error)
997
0
{
998
0
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
999
0
        g_autofree gchar *str = fu_struct_module_item_to_string(st);
1000
0
        g_debug("%s", str);
1001
0
    }
1002
0
    if (!fu_struct_module_item_validate_internal(st, error))
1003
0
        return FALSE;
1004
0
    return TRUE;
1005
0
}
1006
1007
/**
1008
 * fu_struct_module_item_parse: (skip):
1009
 **/
1010
FuStructModuleItem *
1011
fu_struct_module_item_parse(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
1012
0
{
1013
0
    g_autoptr(FuStructModuleItem) st = fu_struct_module_item_new_internal();
1014
0
    g_return_val_if_fail(buf != NULL, NULL);
1015
0
    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
1016
0
    if (!fu_memchk_read(bufsz, offset, 4, error)) {
1017
0
        g_prefix_error_literal(error, "invalid struct FuStructModuleItem: ");
1018
0
        return NULL;
1019
0
    }
1020
0
    st->buf = g_byte_array_new();
1021
0
    g_byte_array_append(st->buf, buf + offset, 4);
1022
0
    if (!fu_struct_module_item_parse_internal(st, error))
1023
0
        return NULL;
1024
0
    return g_steal_pointer(&st);
1025
0
}