Coverage Report

Created: 2025-07-11 06:31

/work/fu-wac-struct.c
Line
Count
Source (jump to first uncovered line)
1
/* auto-generated, do not modify */
2
#include "config.h"
3
4
#include "fu-wac-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
14
const gchar *
15
fu_wac_report_id_to_string(FuWacReportId val)
16
0
{
17
0
    if (val == FU_WAC_REPORT_ID_FW_DESCRIPTOR)
18
0
        return "fw-descriptor";
19
0
    if (val == FU_WAC_REPORT_ID_SWITCH_TO_FLASH_LOADER)
20
0
        return "switch-to-flash-loader";
21
0
    if (val == FU_WAC_REPORT_ID_QUIT_AND_RESET)
22
0
        return "quit-and-reset";
23
0
    if (val == FU_WAC_REPORT_ID_READ_BLOCK_DATA)
24
0
        return "read-block-data";
25
0
    if (val == FU_WAC_REPORT_ID_WRITE_BLOCK)
26
0
        return "write-block";
27
0
    if (val == FU_WAC_REPORT_ID_ERASE_BLOCK)
28
0
        return "erase-block";
29
0
    if (val == FU_WAC_REPORT_ID_SET_READ_ADDRESS)
30
0
        return "set-read-address";
31
0
    if (val == FU_WAC_REPORT_ID_GET_STATUS)
32
0
        return "get-status";
33
0
    if (val == FU_WAC_REPORT_ID_UPDATE_RESET)
34
0
        return "update-reset";
35
0
    if (val == FU_WAC_REPORT_ID_WRITE_WORD)
36
0
        return "write-word";
37
0
    if (val == FU_WAC_REPORT_ID_GET_PARAMETERS)
38
0
        return "get-parameters";
39
0
    if (val == FU_WAC_REPORT_ID_GET_FLASH_DESCRIPTOR)
40
0
        return "get-flash-descriptor";
41
0
    if (val == FU_WAC_REPORT_ID_GET_CHECKSUMS)
42
0
        return "get-checksums";
43
0
    if (val == FU_WAC_REPORT_ID_SET_CHECKSUM_FOR_BLOCK)
44
0
        return "set-checksum-for-block";
45
0
    if (val == FU_WAC_REPORT_ID_CALCULATE_CHECKSUM_FOR_BLOCK)
46
0
        return "calculate-checksum-for-block";
47
0
    if (val == FU_WAC_REPORT_ID_WRITE_CHECKSUM_TABLE)
48
0
        return "write-checksum-table";
49
0
    if (val == FU_WAC_REPORT_ID_GET_CURRENT_FIRMWARE_IDX)
50
0
        return "get-current-firmware-idx";
51
0
    if (val == FU_WAC_REPORT_ID_MODULE)
52
0
        return "module";
53
0
    return NULL;
54
0
}
55
56
const gchar *
57
fu_wac_module_fw_type_to_string(FuWacModuleFwType val)
58
0
{
59
0
    if (val == FU_WAC_MODULE_FW_TYPE_TOUCH)
60
0
        return "touch";
61
0
    if (val == FU_WAC_MODULE_FW_TYPE_BLUETOOTH)
62
0
        return "bluetooth";
63
0
    if (val == FU_WAC_MODULE_FW_TYPE_EMR_CORRECTION)
64
0
        return "emr-correction";
65
0
    if (val == FU_WAC_MODULE_FW_TYPE_BLUETOOTH_HID)
66
0
        return "bluetooth-hid";
67
0
    if (val == FU_WAC_MODULE_FW_TYPE_SCALER)
68
0
        return "scaler";
69
0
    if (val == FU_WAC_MODULE_FW_TYPE_BLUETOOTH_ID6)
70
0
        return "bluetooth-id6";
71
0
    if (val == FU_WAC_MODULE_FW_TYPE_TOUCH_ID7)
72
0
        return "touch-id7";
73
0
    if (val == FU_WAC_MODULE_FW_TYPE_BLUETOOTH_ID9)
74
0
        return "bluetooth-id9";
75
0
    if (val == FU_WAC_MODULE_FW_TYPE_SUB_CPU)
76
0
        return "sub-cpu";
77
0
    if (val == FU_WAC_MODULE_FW_TYPE_MAIN)
78
0
        return "main";
79
0
    return NULL;
80
0
}
81
82
const gchar *
83
fu_wac_module_command_to_string(FuWacModuleCommand val)
84
0
{
85
0
    if (val == FU_WAC_MODULE_COMMAND_START)
86
0
        return "start";
87
0
    if (val == FU_WAC_MODULE_COMMAND_DATA)
88
0
        return "data";
89
0
    if (val == FU_WAC_MODULE_COMMAND_END)
90
0
        return "end";
91
0
    return NULL;
92
0
}
93
94
const gchar *
95
fu_wac_module_status_to_string(FuWacModuleStatus val)
96
0
{
97
0
    if (val == FU_WAC_MODULE_STATUS_OK)
98
0
        return "ok";
99
0
    if (val == FU_WAC_MODULE_STATUS_BUSY)
100
0
        return "busy";
101
0
    if (val == FU_WAC_MODULE_STATUS_ERR_CRC)
102
0
        return "err-crc";
103
0
    if (val == FU_WAC_MODULE_STATUS_ERR_CMD)
104
0
        return "err-cmd";
105
0
    if (val == FU_WAC_MODULE_STATUS_ERR_HW_ACCESS_FAIL)
106
0
        return "err-hw-access-fail";
107
0
    if (val == FU_WAC_MODULE_STATUS_ERR_FLASH_NO_SUPPORT)
108
0
        return "err-flash-no-support";
109
0
    if (val == FU_WAC_MODULE_STATUS_ERR_MODE_WRONG)
110
0
        return "err-mode-wrong";
111
0
    if (val == FU_WAC_MODULE_STATUS_ERR_MPU_NO_SUPPORT)
112
0
        return "err-mpu-no-support";
113
0
    if (val == FU_WAC_MODULE_STATUS_ERR_VERSION_NO_SUPPORT)
114
0
        return "err-version-no-support";
115
0
    if (val == FU_WAC_MODULE_STATUS_ERR_ERASE)
116
0
        return "err-erase";
117
0
    if (val == FU_WAC_MODULE_STATUS_ERR_WRITE)
118
0
        return "err-write";
119
0
    if (val == FU_WAC_MODULE_STATUS_ERR_EXIT)
120
0
        return "err-exit";
121
0
    if (val == FU_WAC_MODULE_STATUS_ERR)
122
0
        return "err";
123
0
    if (val == FU_WAC_MODULE_STATUS_ERR_INVALID_OP)
124
0
        return "err-invalid-op";
125
0
    if (val == FU_WAC_MODULE_STATUS_ERR_WRONG_IMAGE)
126
0
        return "err-wrong-image";
127
0
    return NULL;
128
0
}
129
130
gchar *
131
fu_wac_device_status_to_string(FuWacDeviceStatus val)
132
0
{
133
0
    const gchar *data[6] = {0};
134
0
    guint idx = 0;
135
0
    if (val == FU_WAC_DEVICE_STATUS_UNKNOWN)
136
0
        return g_strdup("unknown");
137
0
    if (val & FU_WAC_DEVICE_STATUS_WRITING)
138
0
        data[idx++] = "writing";
139
0
    if (val & FU_WAC_DEVICE_STATUS_ERASING)
140
0
        data[idx++] = "erasing";
141
0
    if (val & FU_WAC_DEVICE_STATUS_ERROR_WRITE)
142
0
        data[idx++] = "error-write";
143
0
    if (val & FU_WAC_DEVICE_STATUS_ERROR_ERASE)
144
0
        data[idx++] = "error-erase";
145
0
    if (val & FU_WAC_DEVICE_STATUS_WRITE_PROTECTED)
146
0
        data[idx++] = "write-protected";
147
0
    return g_strjoinv(",", (gchar **)data);
148
0
}
149
/* getters */
150
/**
151
 * fu_struct_wac_firmware_hdr_get_magic: (skip):
152
 **/
153
static gchar *
154
fu_struct_wac_firmware_hdr_get_magic(const FuStructWacFirmwareHdr *st)
155
1.62M
{
156
1.62M
    g_return_val_if_fail(st != NULL, NULL);
157
1.62M
    return fu_memstrsafe(st->data, st->len, 0, 5, NULL);
158
1.62M
}
159
160
/* setters */
161
static gboolean
162
fu_struct_wac_firmware_hdr_validate_internal(FuStructWacFirmwareHdr *st, GError **error)
163
1.62M
{
164
1.62M
    g_return_val_if_fail(st != NULL, FALSE);
165
1.62M
    if (strncmp((const gchar *) (st->data + 0), "WACOM", 5) != 0) {
166
1.62M
        g_autofree gchar *str = fu_struct_wac_firmware_hdr_get_magic(st);
167
1.62M
        g_set_error(error,
168
1.62M
                    FWUPD_ERROR,
169
1.62M
                    FWUPD_ERROR_INVALID_DATA,
170
1.62M
                    "constant FuStructWacFirmwareHdr.magic was not valid, "
171
1.62M
                    "expected 'WACOM' and got '%s'",
172
1.62M
                    str);
173
1.62M
        return FALSE;
174
1.62M
    }
175
1.88k
    return TRUE;
176
1.62M
}
177
/**
178
 * fu_struct_wac_firmware_hdr_validate_stream: (skip):
179
 **/
180
gboolean
181
fu_struct_wac_firmware_hdr_validate_stream(GInputStream *stream, gsize offset, GError **error)
182
1.62M
{
183
1.62M
    g_autoptr(GByteArray) st = NULL;
184
1.62M
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
185
1.62M
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
186
1.62M
    st = fu_input_stream_read_byte_array(stream, offset, 5, NULL, error);
187
1.62M
    if (st == NULL) {
188
0
        g_prefix_error(error, "FuStructWacFirmwareHdr failed read of 0x%x: ", (guint) 5);
189
0
        return FALSE;
190
0
    }
191
1.62M
    if (st->len != 5) {
192
523
        g_set_error(error,
193
523
                    FWUPD_ERROR,
194
523
                    FWUPD_ERROR_INVALID_DATA,
195
523
                    "FuStructWacFirmwareHdr requested 0x%x and got 0x%x",
196
523
                    (guint) 5,
197
523
                    (guint) st->len);
198
523
        return FALSE;
199
523
    }
200
1.62M
    return fu_struct_wac_firmware_hdr_validate_internal(st, error);
201
1.62M
}
202
/* getters */
203
/**
204
 * fu_struct_wta_block_header_get_block_start: (skip):
205
 **/
206
guint32
207
fu_struct_wta_block_header_get_block_start(const FuStructWtaBlockHeader *st)
208
0
{
209
0
    g_return_val_if_fail(st != NULL, 0x0);
210
0
    return fu_memread_uint32(st->data + 0, G_LITTLE_ENDIAN);
211
0
}
212
/**
213
 * fu_struct_wta_block_header_get_block_size: (skip):
214
 **/
215
guint32
216
fu_struct_wta_block_header_get_block_size(const FuStructWtaBlockHeader *st)
217
0
{
218
0
    g_return_val_if_fail(st != NULL, 0x0);
219
0
    return fu_memread_uint32(st->data + 4, G_LITTLE_ENDIAN);
220
0
}
221
222
/* setters */
223
/**
224
 * fu_struct_wta_block_header_to_string: (skip):
225
 **/
226
static gchar *
227
fu_struct_wta_block_header_to_string(const FuStructWtaBlockHeader *st)
228
0
{
229
0
    g_autoptr(GString) str = g_string_new("FuStructWtaBlockHeader:\n");
230
0
    g_return_val_if_fail(st != NULL, NULL);
231
0
    g_string_append_printf(str, "  block_start: 0x%x\n",
232
0
                           (guint) fu_struct_wta_block_header_get_block_start(st));
233
0
    g_string_append_printf(str, "  block_size: 0x%x\n",
234
0
                           (guint) fu_struct_wta_block_header_get_block_size(st));
235
0
    if (str->len > 0)
236
0
        g_string_set_size(str, str->len - 1);
237
0
    return g_string_free(g_steal_pointer(&str), FALSE);
238
0
}
239
static gboolean
240
fu_struct_wta_block_header_validate_internal(FuStructWtaBlockHeader *st, GError **error)
241
0
{
242
0
    g_return_val_if_fail(st != NULL, FALSE);
243
0
    return TRUE;
244
0
}
245
static gboolean
246
fu_struct_wta_block_header_parse_internal(FuStructWtaBlockHeader *st, GError **error)
247
0
{
248
0
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
249
0
        g_autofree gchar *str = fu_struct_wta_block_header_to_string(st);
250
0
        g_debug("%s", str);
251
0
    }
252
0
    if (!fu_struct_wta_block_header_validate_internal(st, error))
253
0
        return FALSE;
254
0
    return TRUE;
255
0
}
256
257
/**
258
 * fu_struct_wta_block_header_parse: (skip):
259
 **/
260
FuStructWtaBlockHeader *
261
fu_struct_wta_block_header_parse(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
262
0
{
263
0
    g_autoptr(GByteArray) st = g_byte_array_new();
264
0
    g_return_val_if_fail(buf != NULL, NULL);
265
0
    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
266
0
    if (!fu_memchk_read(bufsz, offset, 8, error)) {
267
0
        g_prefix_error(error, "invalid struct FuStructWtaBlockHeader: ");
268
0
        return NULL;
269
0
    }
270
0
    g_byte_array_append(st, buf + offset, 8);
271
0
    if (!fu_struct_wta_block_header_parse_internal(st, error))
272
0
        return NULL;
273
0
    return g_steal_pointer(&st);
274
0
}
275
/* getters */
276
/**
277
 * fu_struct_id9_unknown_cmd_get_unknown1: (skip):
278
 **/
279
static guint16
280
fu_struct_id9_unknown_cmd_get_unknown1(const FuStructId9UnknownCmd *st)
281
0
{
282
0
    g_return_val_if_fail(st != NULL, 0x0);
283
0
    return fu_memread_uint16(st->data + 0, G_BIG_ENDIAN);
284
0
}
285
/**
286
 * fu_struct_id9_unknown_cmd_get_unknown2: (skip):
287
 **/
288
static guint32
289
fu_struct_id9_unknown_cmd_get_unknown2(const FuStructId9UnknownCmd *st)
290
0
{
291
0
    g_return_val_if_fail(st != NULL, 0x0);
292
0
    return fu_memread_uint32(st->data + 2, G_BIG_ENDIAN);
293
0
}
294
295
/* setters */
296
/**
297
 * fu_struct_id9_unknown_cmd_set_unknown1: (skip):
298
 **/
299
static void
300
fu_struct_id9_unknown_cmd_set_unknown1(FuStructId9UnknownCmd *st, guint16 value)
301
0
{
302
0
    g_return_if_fail(st != NULL);
303
0
    fu_memwrite_uint16(st->data + 0, value, G_BIG_ENDIAN);
304
0
}
305
/**
306
 * fu_struct_id9_unknown_cmd_set_unknown2: (skip):
307
 **/
308
static void
309
fu_struct_id9_unknown_cmd_set_unknown2(FuStructId9UnknownCmd *st, guint32 value)
310
0
{
311
0
    g_return_if_fail(st != NULL);
312
0
    fu_memwrite_uint32(st->data + 2, value, G_BIG_ENDIAN);
313
0
}
314
/**
315
 * fu_struct_id9_unknown_cmd_set_size: (skip):
316
 **/
317
void
318
fu_struct_id9_unknown_cmd_set_size(FuStructId9UnknownCmd *st, guint16 value)
319
0
{
320
0
    g_return_if_fail(st != NULL);
321
0
    fu_memwrite_uint16(st->data + 6, value, G_BIG_ENDIAN);
322
0
}
323
/**
324
 * fu_struct_id9_unknown_cmd_new: (skip):
325
 **/
326
FuStructId9UnknownCmd *
327
fu_struct_id9_unknown_cmd_new(void)
328
0
{
329
0
    FuStructId9UnknownCmd *st = g_byte_array_sized_new(8);
330
0
    fu_byte_array_set_size(st, 8, 0x0);
331
0
    fu_struct_id9_unknown_cmd_set_unknown1(st, 0x7050);
332
0
    fu_struct_id9_unknown_cmd_set_unknown2(st, 0);
333
0
    return st;
334
0
}
335
static gboolean
336
fu_struct_id9_unknown_cmd_validate_internal(FuStructId9UnknownCmd *st, GError **error)
337
0
{
338
0
    g_return_val_if_fail(st != NULL, FALSE);
339
0
    if (fu_struct_id9_unknown_cmd_get_unknown1(st) != 0x7050) {
340
0
        g_set_error(error,
341
0
                    FWUPD_ERROR,
342
0
                    FWUPD_ERROR_INVALID_DATA,
343
0
                    "constant FuStructId9UnknownCmd.unknown1 was not valid, "
344
0
                    "expected 0x%x and got 0x%x",
345
0
                    (guint) 0x7050,
346
0
                    (guint) fu_struct_id9_unknown_cmd_get_unknown1(st));
347
0
        return FALSE;
348
0
    }
349
0
    if (fu_struct_id9_unknown_cmd_get_unknown2(st) != 0) {
350
0
        g_set_error(error,
351
0
                    FWUPD_ERROR,
352
0
                    FWUPD_ERROR_INVALID_DATA,
353
0
                    "constant FuStructId9UnknownCmd.unknown2 was not valid, "
354
0
                    "expected 0x%x and got 0x%x",
355
0
                    (guint) 0,
356
0
                    (guint) fu_struct_id9_unknown_cmd_get_unknown2(st));
357
0
        return FALSE;
358
0
    }
359
0
    return TRUE;
360
0
}
361
/* getters */
362
/**
363
 * fu_struct_id9_spi_cmd_get_command: (skip):
364
 **/
365
static guint8
366
fu_struct_id9_spi_cmd_get_command(const FuStructId9SpiCmd *st)
367
0
{
368
0
    g_return_val_if_fail(st != NULL, 0x0);
369
0
    return st->data[0];
370
0
}
371
/**
372
 * fu_struct_id9_spi_cmd_get_start_addr: (skip):
373
 **/
374
static guint32
375
fu_struct_id9_spi_cmd_get_start_addr(const FuStructId9SpiCmd *st)
376
0
{
377
0
    g_return_val_if_fail(st != NULL, 0x0);
378
0
    return fu_memread_uint32(st->data + 1, G_BIG_ENDIAN);
379
0
}
380
381
/* setters */
382
/**
383
 * fu_struct_id9_spi_cmd_set_command: (skip):
384
 **/
385
static void
386
fu_struct_id9_spi_cmd_set_command(FuStructId9SpiCmd *st, guint8 value)
387
0
{
388
0
    g_return_if_fail(st != NULL);
389
0
    st->data[0] = value;
390
0
}
391
/**
392
 * fu_struct_id9_spi_cmd_set_start_addr: (skip):
393
 **/
394
static void
395
fu_struct_id9_spi_cmd_set_start_addr(FuStructId9SpiCmd *st, guint32 value)
396
0
{
397
0
    g_return_if_fail(st != NULL);
398
0
    fu_memwrite_uint32(st->data + 1, value, G_BIG_ENDIAN);
399
0
}
400
/**
401
 * fu_struct_id9_spi_cmd_set_size: (skip):
402
 **/
403
void
404
fu_struct_id9_spi_cmd_set_size(FuStructId9SpiCmd *st, guint16 value)
405
0
{
406
0
    g_return_if_fail(st != NULL);
407
0
    fu_memwrite_uint16(st->data + 5, value, G_BIG_ENDIAN);
408
0
}
409
/**
410
 * fu_struct_id9_spi_cmd_set_data: (skip):
411
 **/
412
gboolean
413
fu_struct_id9_spi_cmd_set_data(FuStructId9SpiCmd *st, const FuStructId9UnknownCmd *st_donor, GError **error)
414
0
{
415
0
    g_return_val_if_fail(st != NULL, FALSE);
416
0
    g_return_val_if_fail(st_donor != NULL, FALSE);
417
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
418
419
0
    if (st_donor->len > FU_STRUCT_ID9_UNKNOWN_CMD_SIZE) {
420
0
        g_set_error(error,
421
0
                    FWUPD_ERROR,
422
0
                    FWUPD_ERROR_INVALID_DATA,
423
0
                    "donor 'FuStructId9UnknownCmd' (0x%x bytes) does not fit in "
424
0
                    "FuStructId9SpiCmd.data (0x%x bytes)",
425
0
                    (guint) st_donor->len,
426
0
                    (guint) FU_STRUCT_ID9_UNKNOWN_CMD_SIZE);
427
0
        return FALSE;
428
0
    }
429
0
    memcpy(st->data + FU_STRUCT_ID9_SPI_CMD_OFFSET_DATA, st_donor->data, st_donor->len);
430
0
    return TRUE;
431
0
}
432
/**
433
 * fu_struct_id9_spi_cmd_new: (skip):
434
 **/
435
FuStructId9SpiCmd *
436
fu_struct_id9_spi_cmd_new(void)
437
0
{
438
0
    FuStructId9SpiCmd *st = g_byte_array_sized_new(15);
439
0
    fu_byte_array_set_size(st, 15, 0x0);
440
0
    {
441
0
        g_autoptr(GByteArray) st_donor = fu_struct_id9_unknown_cmd_new();
442
0
        memcpy(st->data + 0x7, st_donor->data, st_donor->len); /* nocheck:blocked */
443
0
    }
444
0
    fu_struct_id9_spi_cmd_set_command(st, 0x91);
445
0
    fu_struct_id9_spi_cmd_set_start_addr(st, 0);
446
0
    return st;
447
0
}
448
static gboolean
449
fu_struct_id9_spi_cmd_validate_internal(FuStructId9SpiCmd *st, GError **error)
450
0
{
451
0
    g_return_val_if_fail(st != NULL, FALSE);
452
0
    if (fu_struct_id9_spi_cmd_get_command(st) != 0x91) {
453
0
        g_set_error_literal(error,
454
0
                            FWUPD_ERROR,
455
0
                            FWUPD_ERROR_INVALID_DATA,
456
0
                            "constant FuStructId9SpiCmd.command was not valid");
457
0
        return FALSE;
458
0
    }
459
0
    if (fu_struct_id9_spi_cmd_get_start_addr(st) != 0) {
460
0
        g_set_error(error,
461
0
                    FWUPD_ERROR,
462
0
                    FWUPD_ERROR_INVALID_DATA,
463
0
                    "constant FuStructId9SpiCmd.start_addr was not valid, "
464
0
                    "expected 0x%x and got 0x%x",
465
0
                    (guint) 0,
466
0
                    (guint) fu_struct_id9_spi_cmd_get_start_addr(st));
467
0
        return FALSE;
468
0
    }
469
0
    {
470
0
        GByteArray st_tmp = {
471
0
            .data = (guint8*) st->data + 0x7,
472
0
            .len = 8,
473
0
        };
474
0
        if (!fu_struct_id9_unknown_cmd_validate_internal(&st_tmp, error))
475
0
            return FALSE;
476
0
    }
477
0
    return TRUE;
478
0
}
479
/* getters */
480
481
/* setters */
482
/**
483
 * fu_struct_id9_loader_cmd_set_command: (skip):
484
 **/
485
void
486
fu_struct_id9_loader_cmd_set_command(FuStructId9LoaderCmd *st, guint8 value)
487
0
{
488
0
    g_return_if_fail(st != NULL);
489
0
    st->data[0] = value;
490
0
}
491
/**
492
 * fu_struct_id9_loader_cmd_set_size: (skip):
493
 **/
494
void
495
fu_struct_id9_loader_cmd_set_size(FuStructId9LoaderCmd *st, guint16 value)
496
0
{
497
0
    g_return_if_fail(st != NULL);
498
0
    fu_memwrite_uint16(st->data + 1, value, G_BIG_ENDIAN);
499
0
}
500
/**
501
 * fu_struct_id9_loader_cmd_set_crc: (skip):
502
 **/
503
void
504
fu_struct_id9_loader_cmd_set_crc(FuStructId9LoaderCmd *st, guint32 value)
505
0
{
506
0
    g_return_if_fail(st != NULL);
507
0
    fu_memwrite_uint32(st->data + 3, value, G_BIG_ENDIAN);
508
0
}
509
/**
510
 * fu_struct_id9_loader_cmd_set_data: (skip):
511
 **/
512
gboolean
513
fu_struct_id9_loader_cmd_set_data(FuStructId9LoaderCmd *st, const FuStructId9SpiCmd *st_donor, GError **error)
514
0
{
515
0
    g_return_val_if_fail(st != NULL, FALSE);
516
0
    g_return_val_if_fail(st_donor != NULL, FALSE);
517
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
518
519
0
    if (st_donor->len > FU_STRUCT_ID9_SPI_CMD_SIZE) {
520
0
        g_set_error(error,
521
0
                    FWUPD_ERROR,
522
0
                    FWUPD_ERROR_INVALID_DATA,
523
0
                    "donor 'FuStructId9SpiCmd' (0x%x bytes) does not fit in "
524
0
                    "FuStructId9LoaderCmd.data (0x%x bytes)",
525
0
                    (guint) st_donor->len,
526
0
                    (guint) FU_STRUCT_ID9_SPI_CMD_SIZE);
527
0
        return FALSE;
528
0
    }
529
0
    memcpy(st->data + FU_STRUCT_ID9_LOADER_CMD_OFFSET_DATA, st_donor->data, st_donor->len);
530
0
    return TRUE;
531
0
}
532
/**
533
 * fu_struct_id9_loader_cmd_new: (skip):
534
 **/
535
FuStructId9LoaderCmd *
536
fu_struct_id9_loader_cmd_new(void)
537
0
{
538
0
    FuStructId9LoaderCmd *st = g_byte_array_sized_new(22);
539
0
    fu_byte_array_set_size(st, 22, 0x0);
540
0
    {
541
0
        g_autoptr(GByteArray) st_donor = fu_struct_id9_spi_cmd_new();
542
0
        memcpy(st->data + 0x7, st_donor->data, st_donor->len); /* nocheck:blocked */
543
0
    }
544
0
    return st;
545
0
}
546
static gboolean
547
fu_struct_id9_loader_cmd_validate_internal(FuStructId9LoaderCmd *st, GError **error)
548
0
{
549
0
    g_return_val_if_fail(st != NULL, FALSE);
550
0
    {
551
0
        GByteArray st_tmp = {
552
0
            .data = (guint8*) st->data + 0x7,
553
0
            .len = 15,
554
0
        };
555
0
        if (!fu_struct_id9_spi_cmd_validate_internal(&st_tmp, error))
556
0
            return FALSE;
557
0
    }
558
0
    return TRUE;
559
0
}
560
/**
561
 * fu_struct_id9_loader_cmd_validate: (skip):
562
 **/
563
gboolean
564
fu_struct_id9_loader_cmd_validate(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
565
0
{
566
0
    GByteArray st = {.data = (guint8 *) buf + offset, .len = bufsz - offset, };
567
0
    g_return_val_if_fail(buf != NULL, FALSE);
568
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
569
0
    if (!fu_memchk_read(bufsz, offset, 22, error)) {
570
0
        g_prefix_error(error, "invalid struct FuStructId9LoaderCmd: ");
571
0
        return FALSE;
572
0
    }
573
0
    if (!fu_struct_id9_loader_cmd_validate_internal(&st, error))
574
0
        return FALSE;
575
0
    return TRUE;
576
0
}
577
/* getters */
578
/**
579
 * fu_struct_module_desc_get_bootloader_version: (skip):
580
 **/
581
guint16
582
fu_struct_module_desc_get_bootloader_version(const FuStructModuleDesc *st)
583
0
{
584
0
    g_return_val_if_fail(st != NULL, 0x0);
585
0
    return fu_memread_uint16(st->data + 1, G_BIG_ENDIAN);
586
0
}
587
/**
588
 * fu_struct_module_desc_get_number_modules: (skip):
589
 **/
590
guint8
591
fu_struct_module_desc_get_number_modules(const FuStructModuleDesc *st)
592
0
{
593
0
    g_return_val_if_fail(st != NULL, 0x0);
594
0
    return st->data[3];
595
0
}
596
597
/* setters */
598
/**
599
 * fu_struct_module_desc_to_string: (skip):
600
 **/
601
static gchar *
602
fu_struct_module_desc_to_string(const FuStructModuleDesc *st)
603
0
{
604
0
    g_autoptr(GString) str = g_string_new("FuStructModuleDesc:\n");
605
0
    g_return_val_if_fail(st != NULL, NULL);
606
0
    g_string_append_printf(str, "  bootloader_version: 0x%x\n",
607
0
                           (guint) fu_struct_module_desc_get_bootloader_version(st));
608
0
    g_string_append_printf(str, "  number_modules: 0x%x\n",
609
0
                           (guint) fu_struct_module_desc_get_number_modules(st));
610
0
    if (str->len > 0)
611
0
        g_string_set_size(str, str->len - 1);
612
0
    return g_string_free(g_steal_pointer(&str), FALSE);
613
0
}
614
static gboolean
615
fu_struct_module_desc_validate_internal(FuStructModuleDesc *st, GError **error)
616
0
{
617
0
    g_return_val_if_fail(st != NULL, FALSE);
618
0
    return TRUE;
619
0
}
620
static gboolean
621
fu_struct_module_desc_parse_internal(FuStructModuleDesc *st, GError **error)
622
0
{
623
0
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
624
0
        g_autofree gchar *str = fu_struct_module_desc_to_string(st);
625
0
        g_debug("%s", str);
626
0
    }
627
0
    if (!fu_struct_module_desc_validate_internal(st, error))
628
0
        return FALSE;
629
0
    return TRUE;
630
0
}
631
632
/**
633
 * fu_struct_module_desc_parse: (skip):
634
 **/
635
FuStructModuleDesc *
636
fu_struct_module_desc_parse(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
637
0
{
638
0
    g_autoptr(GByteArray) st = g_byte_array_new();
639
0
    g_return_val_if_fail(buf != NULL, NULL);
640
0
    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
641
0
    if (!fu_memchk_read(bufsz, offset, 4, error)) {
642
0
        g_prefix_error(error, "invalid struct FuStructModuleDesc: ");
643
0
        return NULL;
644
0
    }
645
0
    g_byte_array_append(st, buf + offset, 4);
646
0
    if (!fu_struct_module_desc_parse_internal(st, error))
647
0
        return NULL;
648
0
    return g_steal_pointer(&st);
649
0
}
650
/* getters */
651
/**
652
 * fu_struct_module_item_get_kind: (skip):
653
 **/
654
FuWacModuleFwType
655
fu_struct_module_item_get_kind(const FuStructModuleItem *st)
656
0
{
657
0
    g_return_val_if_fail(st != NULL, 0x0);
658
0
    return st->data[0];
659
0
}
660
/**
661
 * fu_struct_module_item_get_version: (skip):
662
 **/
663
guint16
664
fu_struct_module_item_get_version(const FuStructModuleItem *st)
665
0
{
666
0
    g_return_val_if_fail(st != NULL, 0x0);
667
0
    return fu_memread_uint16(st->data + 1, G_BIG_ENDIAN);
668
0
}
669
/**
670
 * fu_struct_module_item_get_version2: (skip):
671
 **/
672
guint8
673
fu_struct_module_item_get_version2(const FuStructModuleItem *st)
674
0
{
675
0
    g_return_val_if_fail(st != NULL, 0x0);
676
0
    return st->data[3];
677
0
}
678
679
/* setters */
680
/**
681
 * fu_struct_module_item_to_string: (skip):
682
 **/
683
static gchar *
684
fu_struct_module_item_to_string(const FuStructModuleItem *st)
685
0
{
686
0
    g_autoptr(GString) str = g_string_new("FuStructModuleItem:\n");
687
0
    g_return_val_if_fail(st != NULL, NULL);
688
0
    {
689
0
        const gchar *tmp = fu_wac_module_fw_type_to_string(fu_struct_module_item_get_kind(st));
690
0
        if (tmp != NULL) {
691
0
            g_string_append_printf(str, "  kind: 0x%x [%s]\n", (guint) fu_struct_module_item_get_kind(st), tmp);
692
0
        } else {
693
0
            g_string_append_printf(str, "  kind: 0x%x\n", (guint) fu_struct_module_item_get_kind(st));
694
0
        }
695
0
    }
696
0
    g_string_append_printf(str, "  version: 0x%x\n",
697
0
                           (guint) fu_struct_module_item_get_version(st));
698
0
    g_string_append_printf(str, "  version2: 0x%x\n",
699
0
                           (guint) fu_struct_module_item_get_version2(st));
700
0
    if (str->len > 0)
701
0
        g_string_set_size(str, str->len - 1);
702
0
    return g_string_free(g_steal_pointer(&str), FALSE);
703
0
}
704
static gboolean
705
fu_struct_module_item_validate_internal(FuStructModuleItem *st, GError **error)
706
0
{
707
0
    g_return_val_if_fail(st != NULL, FALSE);
708
0
    return TRUE;
709
0
}
710
static gboolean
711
fu_struct_module_item_parse_internal(FuStructModuleItem *st, GError **error)
712
0
{
713
0
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
714
0
        g_autofree gchar *str = fu_struct_module_item_to_string(st);
715
0
        g_debug("%s", str);
716
0
    }
717
0
    if (!fu_struct_module_item_validate_internal(st, error))
718
0
        return FALSE;
719
0
    return TRUE;
720
0
}
721
722
/**
723
 * fu_struct_module_item_parse: (skip):
724
 **/
725
FuStructModuleItem *
726
fu_struct_module_item_parse(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
727
0
{
728
0
    g_autoptr(GByteArray) st = g_byte_array_new();
729
0
    g_return_val_if_fail(buf != NULL, NULL);
730
0
    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
731
0
    if (!fu_memchk_read(bufsz, offset, 4, error)) {
732
0
        g_prefix_error(error, "invalid struct FuStructModuleItem: ");
733
0
        return NULL;
734
0
    }
735
0
    g_byte_array_append(st, buf + offset, 4);
736
0
    if (!fu_struct_module_item_parse_internal(st, error))
737
0
        return NULL;
738
0
    return g_steal_pointer(&st);
739
0
}