Coverage Report

Created: 2025-12-14 06:56

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/fu-edid-struct.c
Line
Count
Source
1
/*
2
 * This file is auto-generated, do not modify!
3
 *
4
 * SPDX-License-Identifier: LGPL-2.1-or-later
5
 */
6
7
#include "config.h"
8
9
#include <glib.h>
10
11
#include "fu-edid-struct.h"
12
#include "fu-byte-array.h"
13
#include "fu-mem-private.h"
14
#include "fu-string.h"
15
16
#ifdef G_LOG_DOMAIN
17
  #undef G_LOG_DOMAIN
18
#endif
19
0
#define G_LOG_DOMAIN "FuStruct"
20
21
/**
22
 * fu_edid_descriptor_tag_to_string:
23
 * @val: value, e.g. %FU_EDID_DESCRIPTOR_TAG_ALPHANUMERIC_DATA_STRING
24
 *
25
 * Converts an enumerated value to a string.
26
 *
27
 * Returns: identifier string
28
 **/
29
static const gchar *
30
fu_edid_descriptor_tag_to_string(FuEdidDescriptorTag val)
31
0
{
32
0
    if (val == FU_EDID_DESCRIPTOR_TAG_DISPLAY_PRODUCT_SERIAL_NUMBER)
33
0
        return "display-product-serial-number";
34
0
    if (val == FU_EDID_DESCRIPTOR_TAG_ALPHANUMERIC_DATA_STRING)
35
0
        return "alphanumeric-data-string";
36
0
    if (val == FU_EDID_DESCRIPTOR_TAG_DISPLAY_RANGE_LIMITS)
37
0
        return "display-range-limits";
38
0
    if (val == FU_EDID_DESCRIPTOR_TAG_DISPLAY_PRODUCT_NAME)
39
0
        return "display-product-name";
40
0
    if (val == FU_EDID_DESCRIPTOR_TAG_COLOR_POINT_DATA)
41
0
        return "color-point-data";
42
0
    if (val == FU_EDID_DESCRIPTOR_TAG_STANDARD_TIMING_IDENTIFICATIONS)
43
0
        return "standard-timing-identifications";
44
0
    if (val == FU_EDID_DESCRIPTOR_TAG_DISPLAY_COLOR_MANAGEMENT_DATA)
45
0
        return "display-color-management-data";
46
0
    if (val == FU_EDID_DESCRIPTOR_TAG_CVT_TIMING_CODES)
47
0
        return "cvt-timing-codes";
48
0
    if (val == FU_EDID_DESCRIPTOR_TAG_ESTABLISHED_TIMINGS)
49
0
        return "established-timings";
50
0
    if (val == FU_EDID_DESCRIPTOR_TAG_DUMMY_DESCRIPTOR)
51
0
        return "dummy-descriptor";
52
0
    return NULL;
53
0
}
54
/**
55
 * fu_struct_edid_descriptor_ref: (skip):
56
 **/
57
FuStructEdidDescriptor *
58
fu_struct_edid_descriptor_ref(FuStructEdidDescriptor *st)
59
0
{
60
0
    g_return_val_if_fail(st != NULL, NULL);
61
0
    st->refcount++;
62
0
    return st;
63
0
}
64
/**
65
 * fu_struct_edid_descriptor_unref: (skip):
66
 **/
67
void
68
fu_struct_edid_descriptor_unref(FuStructEdidDescriptor *st)
69
964
{
70
964
    g_return_if_fail(st != NULL);
71
964
    if (st->refcount == 0) {
72
0
        g_critical("FuStructEdidDescriptor refcount already zero");
73
0
        return;
74
0
    }
75
964
    if (--st->refcount > 0)
76
0
        return;
77
964
    if (st->buf != NULL)
78
964
        g_byte_array_unref(st->buf);
79
964
    g_free(st);
80
964
}
81
/**
82
 * fu_struct_edid_descriptor_new_internal: (skip):
83
 **/
84
static FuStructEdidDescriptor *
85
fu_struct_edid_descriptor_new_internal(void)
86
964
{
87
964
    FuStructEdidDescriptor *st = g_new0(FuStructEdidDescriptor, 1);
88
964
    st->refcount = 1;
89
964
    return st;
90
964
}
91
92
/* getters */
93
/**
94
 * fu_struct_edid_descriptor_get_kind: (skip):
95
 **/
96
guint16
97
fu_struct_edid_descriptor_get_kind(const FuStructEdidDescriptor *st)
98
776
{
99
776
    g_return_val_if_fail(st != NULL, 0x0);
100
776
    return fu_memread_uint16(st->buf->data + 0, G_LITTLE_ENDIAN);
101
776
}
102
/**
103
 * fu_struct_edid_descriptor_get_subkind: (skip):
104
 **/
105
guint8
106
fu_struct_edid_descriptor_get_subkind(const FuStructEdidDescriptor *st)
107
344
{
108
344
    g_return_val_if_fail(st != NULL, 0x0);
109
344
    return st->buf->data[2];
110
344
}
111
/**
112
 * fu_struct_edid_descriptor_get_tag: (skip):
113
 **/
114
FuEdidDescriptorTag
115
fu_struct_edid_descriptor_get_tag(const FuStructEdidDescriptor *st)
116
654
{
117
654
    g_return_val_if_fail(st != NULL, 0x0);
118
654
    return st->buf->data[3];
119
654
}
120
/**
121
 * fu_struct_edid_descriptor_get_data: (skip):
122
 **/
123
const guint8 *
124
fu_struct_edid_descriptor_get_data(const FuStructEdidDescriptor *st, gsize *bufsz)
125
283
{
126
283
    g_return_val_if_fail(st != NULL, NULL);
127
283
    if (bufsz != NULL)
128
283
        *bufsz = 13;
129
283
    return st->buf->data + 5;
130
283
}
131
132
/* setters */
133
/**
134
 * fu_struct_edid_descriptor_set_kind: (skip):
135
 **/
136
void
137
fu_struct_edid_descriptor_set_kind(FuStructEdidDescriptor *st, guint16 value)
138
0
{
139
0
    g_return_if_fail(st != NULL);
140
0
    fu_memwrite_uint16(st->buf->data + 0, value, G_LITTLE_ENDIAN);
141
0
}
142
/**
143
 * fu_struct_edid_descriptor_set_subkind: (skip):
144
 **/
145
void
146
fu_struct_edid_descriptor_set_subkind(FuStructEdidDescriptor *st, guint8 value)
147
0
{
148
0
    g_return_if_fail(st != NULL);
149
0
    st->buf->data[2] = value;
150
0
}
151
/**
152
 * fu_struct_edid_descriptor_set_tag: (skip):
153
 **/
154
void
155
fu_struct_edid_descriptor_set_tag(FuStructEdidDescriptor *st, FuEdidDescriptorTag value)
156
188
{
157
188
    g_return_if_fail(st != NULL);
158
188
    st->buf->data[3] = value;
159
188
}
160
/**
161
 * fu_struct_edid_descriptor_set_data: (skip):
162
 **/
163
gboolean
164
fu_struct_edid_descriptor_set_data(FuStructEdidDescriptor *st, const guint8 *buf, gsize bufsz, GError **error)
165
188
{
166
188
    g_return_val_if_fail(st != NULL, FALSE);
167
188
    g_return_val_if_fail(buf != NULL, FALSE);
168
188
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
169
188
    return fu_memcpy_safe(st->buf->data, st->buf->len, 5, buf, bufsz, 0x0, bufsz, error);
170
188
}
171
/**
172
 * fu_struct_edid_descriptor_new: (skip):
173
 **/
174
FuStructEdidDescriptor *
175
fu_struct_edid_descriptor_new(void)
176
188
{
177
188
    FuStructEdidDescriptor *st = fu_struct_edid_descriptor_new_internal();
178
188
    st->buf = g_byte_array_sized_new(18);
179
188
    fu_byte_array_set_size(st->buf, 18, 0x0);
180
188
    return st;
181
188
}
182
/**
183
 * fu_struct_edid_descriptor_to_string: (skip):
184
 **/
185
static gchar *
186
fu_struct_edid_descriptor_to_string(const FuStructEdidDescriptor *st)
187
0
{
188
0
    g_autoptr(GString) str = g_string_new("FuStructEdidDescriptor:\n");
189
0
    g_return_val_if_fail(st != NULL, NULL);
190
0
    g_string_append_printf(str, "  kind: 0x%x\n",
191
0
                           (guint) fu_struct_edid_descriptor_get_kind(st));
192
0
    g_string_append_printf(str, "  subkind: 0x%x\n",
193
0
                           (guint) fu_struct_edid_descriptor_get_subkind(st));
194
0
    {
195
0
        const gchar *tmp = fu_edid_descriptor_tag_to_string(fu_struct_edid_descriptor_get_tag(st));
196
0
        if (tmp != NULL) {
197
0
            g_string_append_printf(str, "  tag: 0x%x [%s]\n", (guint) fu_struct_edid_descriptor_get_tag(st), tmp);
198
0
        } else {
199
0
            g_string_append_printf(str, "  tag: 0x%x\n", (guint) fu_struct_edid_descriptor_get_tag(st));
200
0
        }
201
0
    }
202
0
    {
203
0
        gsize bufsz = 0;
204
0
        const guint8 *buf = fu_struct_edid_descriptor_get_data(st, &bufsz);
205
0
        g_autoptr(GString) tmp = g_string_new(NULL);
206
0
        for (gsize i = 0; i < bufsz; i++)
207
0
            g_string_append_printf(tmp, "%02X", buf[i]);
208
0
        g_string_append_printf(str, "  data: 0x%s\n", tmp->str);
209
0
    }
210
0
    if (str->len > 0)
211
0
        g_string_set_size(str, str->len - 1);
212
0
    return g_string_free(g_steal_pointer(&str), FALSE);
213
0
}
214
static gboolean
215
fu_struct_edid_descriptor_validate_internal(FuStructEdidDescriptor *st, GError **error)
216
776
{
217
776
    g_return_val_if_fail(st != NULL, FALSE);
218
776
    return TRUE;
219
776
}
220
static gboolean
221
fu_struct_edid_descriptor_parse_internal(FuStructEdidDescriptor *st, GError **error)
222
776
{
223
776
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
224
0
        g_autofree gchar *str = fu_struct_edid_descriptor_to_string(st);
225
0
        g_debug("%s", str);
226
0
    }
227
776
    if (!fu_struct_edid_descriptor_validate_internal(st, error))
228
0
        return FALSE;
229
776
    return TRUE;
230
776
}
231
/**
232
 * fu_struct_edid_descriptor_parse_stream: (skip):
233
 **/
234
FuStructEdidDescriptor *
235
fu_struct_edid_descriptor_parse_stream(GInputStream *stream, gsize offset, GError **error)
236
776
{
237
776
    g_autoptr(FuStructEdidDescriptor) st = fu_struct_edid_descriptor_new_internal();
238
776
    st->buf = fu_input_stream_read_byte_array(stream, offset, 18, NULL, error);
239
776
    if (st->buf == NULL) {
240
0
        g_prefix_error(error, "FuStructEdidDescriptor failed read of 0x%x: ", (guint) 18);
241
0
        return NULL;
242
0
    }
243
776
    if (st->buf->len != 18) {
244
0
        g_set_error(error,
245
0
                    FWUPD_ERROR,
246
0
                    FWUPD_ERROR_INVALID_DATA,
247
0
                    "FuStructEdidDescriptor requested 0x%x and got 0x%x",
248
0
                    (guint) 18,
249
0
                    (guint) st->buf->len);
250
0
        return NULL;
251
0
    }
252
776
    if (!fu_struct_edid_descriptor_parse_internal(st, error))
253
0
        return NULL;
254
776
    return g_steal_pointer(&st);
255
776
}
256
/**
257
 * fu_struct_edid_ref: (skip):
258
 **/
259
FuStructEdid *
260
fu_struct_edid_ref(FuStructEdid *st)
261
0
{
262
0
    g_return_val_if_fail(st != NULL, NULL);
263
0
    st->refcount++;
264
0
    return st;
265
0
}
266
/**
267
 * fu_struct_edid_unref: (skip):
268
 **/
269
void
270
fu_struct_edid_unref(FuStructEdid *st)
271
480
{
272
480
    g_return_if_fail(st != NULL);
273
480
    if (st->refcount == 0) {
274
0
        g_critical("FuStructEdid refcount already zero");
275
0
        return;
276
0
    }
277
480
    if (--st->refcount > 0)
278
0
        return;
279
480
    if (st->buf != NULL)
280
286
        g_byte_array_unref(st->buf);
281
480
    g_free(st);
282
480
}
283
/**
284
 * fu_struct_edid_new_internal: (skip):
285
 **/
286
static FuStructEdid *
287
fu_struct_edid_new_internal(void)
288
480
{
289
480
    FuStructEdid *st = g_new0(FuStructEdid, 1);
290
480
    st->refcount = 1;
291
480
    return st;
292
480
}
293
294
/* getters */
295
/**
296
 * fu_struct_edid_get_manufacturer_name: (skip):
297
 **/
298
const guint8 *
299
fu_struct_edid_get_manufacturer_name(const FuStructEdid *st, gsize *bufsz)
300
194
{
301
194
    g_return_val_if_fail(st != NULL, NULL);
302
194
    if (bufsz != NULL)
303
0
        *bufsz = 2;
304
194
    return st->buf->data + 8;
305
194
}
306
/**
307
 * fu_struct_edid_get_product_code: (skip):
308
 **/
309
guint16
310
fu_struct_edid_get_product_code(const FuStructEdid *st)
311
194
{
312
194
    g_return_val_if_fail(st != NULL, 0x0);
313
194
    return fu_memread_uint16(st->buf->data + 10, G_LITTLE_ENDIAN);
314
194
}
315
/**
316
 * fu_struct_edid_get_serial_number: (skip):
317
 **/
318
guint32
319
fu_struct_edid_get_serial_number(const FuStructEdid *st)
320
371
{
321
371
    g_return_val_if_fail(st != NULL, 0x0);
322
371
    return fu_memread_uint32(st->buf->data + 12, G_LITTLE_ENDIAN);
323
371
}
324
/**
325
 * fu_struct_edid_get_week_of_manufacture: (skip):
326
 **/
327
guint8
328
fu_struct_edid_get_week_of_manufacture(const FuStructEdid *st)
329
0
{
330
0
    g_return_val_if_fail(st != NULL, 0x0);
331
0
    return st->buf->data[16];
332
0
}
333
/**
334
 * fu_struct_edid_get_year_of_manufacture: (skip):
335
 **/
336
guint8
337
fu_struct_edid_get_year_of_manufacture(const FuStructEdid *st)
338
0
{
339
0
    g_return_val_if_fail(st != NULL, 0x0);
340
0
    return st->buf->data[17];
341
0
}
342
/**
343
 * fu_struct_edid_get_edid_version_number: (skip):
344
 **/
345
static guint8
346
fu_struct_edid_get_edid_version_number(const FuStructEdid *st)
347
199
{
348
199
    g_return_val_if_fail(st != NULL, 0x0);
349
199
    return st->buf->data[18];
350
199
}
351
/**
352
 * fu_struct_edid_get_revision_number: (skip):
353
 **/
354
guint8
355
fu_struct_edid_get_revision_number(const FuStructEdid *st)
356
0
{
357
0
    g_return_val_if_fail(st != NULL, 0x0);
358
0
    return st->buf->data[19];
359
0
}
360
/**
361
 * fu_struct_edid_get_data_blocks: (skip):
362
 **/
363
const guint8 *
364
fu_struct_edid_get_data_blocks(const FuStructEdid *st, gsize *bufsz)
365
0
{
366
0
    g_return_val_if_fail(st != NULL, NULL);
367
0
    if (bufsz != NULL)
368
0
        *bufsz = 72;
369
0
    return st->buf->data + 54;
370
0
}
371
/**
372
 * fu_struct_edid_get_extension_block_count: (skip):
373
 **/
374
guint8
375
fu_struct_edid_get_extension_block_count(const FuStructEdid *st)
376
0
{
377
0
    g_return_val_if_fail(st != NULL, 0x0);
378
0
    return st->buf->data[126];
379
0
}
380
/**
381
 * fu_struct_edid_get_checksum: (skip):
382
 **/
383
guint8
384
fu_struct_edid_get_checksum(const FuStructEdid *st)
385
0
{
386
0
    g_return_val_if_fail(st != NULL, 0x0);
387
0
    return st->buf->data[127];
388
0
}
389
390
/* setters */
391
/**
392
 * fu_struct_edid_set_manufacturer_name: (skip):
393
 **/
394
gboolean
395
fu_struct_edid_set_manufacturer_name(FuStructEdid *st, const guint8 *buf, gsize bufsz, GError **error)
396
0
{
397
0
    g_return_val_if_fail(st != NULL, FALSE);
398
0
    g_return_val_if_fail(buf != NULL, FALSE);
399
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
400
0
    return fu_memcpy_safe(st->buf->data, st->buf->len, 8, buf, bufsz, 0x0, bufsz, error);
401
0
}
402
/**
403
 * fu_struct_edid_set_product_code: (skip):
404
 **/
405
void
406
fu_struct_edid_set_product_code(FuStructEdid *st, guint16 value)
407
194
{
408
194
    g_return_if_fail(st != NULL);
409
194
    fu_memwrite_uint16(st->buf->data + 10, value, G_LITTLE_ENDIAN);
410
194
}
411
/**
412
 * fu_struct_edid_set_serial_number: (skip):
413
 **/
414
void
415
fu_struct_edid_set_serial_number(FuStructEdid *st, guint32 value)
416
76
{
417
76
    g_return_if_fail(st != NULL);
418
76
    fu_memwrite_uint32(st->buf->data + 12, value, G_LITTLE_ENDIAN);
419
76
}
420
/**
421
 * fu_struct_edid_set_week_of_manufacture: (skip):
422
 **/
423
void
424
fu_struct_edid_set_week_of_manufacture(FuStructEdid *st, guint8 value)
425
0
{
426
0
    g_return_if_fail(st != NULL);
427
0
    st->buf->data[16] = value;
428
0
}
429
/**
430
 * fu_struct_edid_set_year_of_manufacture: (skip):
431
 **/
432
void
433
fu_struct_edid_set_year_of_manufacture(FuStructEdid *st, guint8 value)
434
0
{
435
0
    g_return_if_fail(st != NULL);
436
0
    st->buf->data[17] = value;
437
0
}
438
/**
439
 * fu_struct_edid_set_edid_version_number: (skip):
440
 **/
441
static void
442
fu_struct_edid_set_edid_version_number(FuStructEdid *st, guint8 value)
443
194
{
444
194
    g_return_if_fail(st != NULL);
445
194
    st->buf->data[18] = value;
446
194
}
447
/**
448
 * fu_struct_edid_set_revision_number: (skip):
449
 **/
450
void
451
fu_struct_edid_set_revision_number(FuStructEdid *st, guint8 value)
452
194
{
453
194
    g_return_if_fail(st != NULL);
454
194
    st->buf->data[19] = value;
455
194
}
456
/**
457
 * fu_struct_edid_set_data_blocks: (skip):
458
 **/
459
gboolean
460
fu_struct_edid_set_data_blocks(FuStructEdid *st, const guint8 *buf, gsize bufsz, GError **error)
461
0
{
462
0
    g_return_val_if_fail(st != NULL, FALSE);
463
0
    g_return_val_if_fail(buf != NULL, FALSE);
464
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
465
0
    return fu_memcpy_safe(st->buf->data, st->buf->len, 54, buf, bufsz, 0x0, bufsz, error);
466
0
}
467
/**
468
 * fu_struct_edid_set_extension_block_count: (skip):
469
 **/
470
void
471
fu_struct_edid_set_extension_block_count(FuStructEdid *st, guint8 value)
472
0
{
473
0
    g_return_if_fail(st != NULL);
474
0
    st->buf->data[126] = value;
475
0
}
476
/**
477
 * fu_struct_edid_set_checksum: (skip):
478
 **/
479
void
480
fu_struct_edid_set_checksum(FuStructEdid *st, guint8 value)
481
0
{
482
0
    g_return_if_fail(st != NULL);
483
0
    st->buf->data[127] = value;
484
0
}
485
/**
486
 * fu_struct_edid_new: (skip):
487
 **/
488
FuStructEdid *
489
fu_struct_edid_new(void)
490
194
{
491
194
    FuStructEdid *st = fu_struct_edid_new_internal();
492
194
    st->buf = g_byte_array_sized_new(128);
493
194
    fu_byte_array_set_size(st->buf, 128, 0x0);
494
194
    memcpy(st->buf->data + 0x0, "\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00", 8); /* nocheck:blocked */
495
194
    fu_struct_edid_set_edid_version_number(st, 0x1);
496
194
    fu_struct_edid_set_revision_number(st, 0x3);
497
194
    return st;
498
194
}
499
/**
500
 * fu_struct_edid_to_string: (skip):
501
 **/
502
static gchar *
503
fu_struct_edid_to_string(const FuStructEdid *st)
504
0
{
505
0
    g_autoptr(GString) str = g_string_new("FuStructEdid:\n");
506
0
    g_return_val_if_fail(st != NULL, NULL);
507
0
    {
508
0
        gsize bufsz = 0;
509
0
        const guint8 *buf = fu_struct_edid_get_manufacturer_name(st, &bufsz);
510
0
        g_autoptr(GString) tmp = g_string_new(NULL);
511
0
        for (gsize i = 0; i < bufsz; i++)
512
0
            g_string_append_printf(tmp, "%02X", buf[i]);
513
0
        g_string_append_printf(str, "  manufacturer_name: 0x%s\n", tmp->str);
514
0
    }
515
0
    g_string_append_printf(str, "  product_code: 0x%x\n",
516
0
                           (guint) fu_struct_edid_get_product_code(st));
517
0
    g_string_append_printf(str, "  serial_number: 0x%x\n",
518
0
                           (guint) fu_struct_edid_get_serial_number(st));
519
0
    g_string_append_printf(str, "  week_of_manufacture: 0x%x\n",
520
0
                           (guint) fu_struct_edid_get_week_of_manufacture(st));
521
0
    g_string_append_printf(str, "  year_of_manufacture: 0x%x\n",
522
0
                           (guint) fu_struct_edid_get_year_of_manufacture(st));
523
0
    g_string_append_printf(str, "  revision_number: 0x%x\n",
524
0
                           (guint) fu_struct_edid_get_revision_number(st));
525
0
    {
526
0
        gsize bufsz = 0;
527
0
        const guint8 *buf = fu_struct_edid_get_data_blocks(st, &bufsz);
528
0
        g_autoptr(GString) tmp = g_string_new(NULL);
529
0
        for (gsize i = 0; i < bufsz; i++)
530
0
            g_string_append_printf(tmp, "%02X", buf[i]);
531
0
        g_string_append_printf(str, "  data_blocks: 0x%s\n", tmp->str);
532
0
    }
533
0
    g_string_append_printf(str, "  extension_block_count: 0x%x\n",
534
0
                           (guint) fu_struct_edid_get_extension_block_count(st));
535
0
    g_string_append_printf(str, "  checksum: 0x%x\n",
536
0
                           (guint) fu_struct_edid_get_checksum(st));
537
0
    if (str->len > 0)
538
0
        g_string_set_size(str, str->len - 1);
539
0
    return g_string_free(g_steal_pointer(&str), FALSE);
540
0
}
541
static gboolean
542
fu_struct_edid_validate_internal(FuStructEdid *st, GError **error)
543
263
{
544
263
    g_return_val_if_fail(st != NULL, FALSE);
545
263
    if (memcmp(st->buf->data + 0, "\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00", 8) != 0) {
546
64
        g_set_error_literal(error,
547
64
                            FWUPD_ERROR,
548
64
                            FWUPD_ERROR_INVALID_DATA,
549
64
                            "constant FuStructEdid.header was not valid");
550
64
        return FALSE;
551
64
    }
552
199
    if (fu_struct_edid_get_edid_version_number(st) != 0x1) {
553
5
        g_set_error_literal(error,
554
5
                            FWUPD_ERROR,
555
5
                            FWUPD_ERROR_INVALID_DATA,
556
5
                            "constant FuStructEdid.edid_version_number was not valid");
557
5
        return FALSE;
558
5
    }
559
194
    return TRUE;
560
199
}
561
static gboolean
562
fu_struct_edid_parse_internal(FuStructEdid *st, GError **error)
563
263
{
564
263
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
565
0
        g_autofree gchar *str = fu_struct_edid_to_string(st);
566
0
        g_debug("%s", str);
567
0
    }
568
263
    if (!fu_struct_edid_validate_internal(st, error))
569
69
        return FALSE;
570
194
    return TRUE;
571
263
}
572
/**
573
 * fu_struct_edid_parse_stream: (skip):
574
 **/
575
FuStructEdid *
576
fu_struct_edid_parse_stream(GInputStream *stream, gsize offset, GError **error)
577
286
{
578
286
    g_autoptr(FuStructEdid) st = fu_struct_edid_new_internal();
579
286
    st->buf = fu_input_stream_read_byte_array(stream, offset, 128, NULL, error);
580
286
    if (st->buf == NULL) {
581
0
        g_prefix_error(error, "FuStructEdid failed read of 0x%x: ", (guint) 128);
582
0
        return NULL;
583
0
    }
584
286
    if (st->buf->len != 128) {
585
23
        g_set_error(error,
586
23
                    FWUPD_ERROR,
587
23
                    FWUPD_ERROR_INVALID_DATA,
588
23
                    "FuStructEdid requested 0x%x and got 0x%x",
589
23
                    (guint) 128,
590
23
                    (guint) st->buf->len);
591
23
        return NULL;
592
23
    }
593
263
    if (!fu_struct_edid_parse_internal(st, error))
594
69
        return NULL;
595
194
    return g_steal_pointer(&st);
596
263
}