Coverage Report

Created: 2026-07-16 07:10

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/fwupd/plugins/genesys/fu-genesys-usbhub-dev-firmware.c
Line
Count
Source
1
/*
2
 * Copyright 2023 Adam.Chen <Adam.Chen@genesyslogic.com.tw>
3
 *
4
 * SPDX-License-Identifier: LGPL-2.1-or-later
5
 */
6
7
#include "config.h"
8
9
#include "fu-genesys-common.h"
10
#include "fu-genesys-usbhub-dev-firmware.h"
11
#include "fu-genesys-usbhub-firmware.h"
12
#include "fu-genesys-usbhub-struct.h"
13
14
struct _FuGenesysUsbhubDevFirmware {
15
  FuFirmware parent_instance;
16
};
17
18
23.8k
G_DEFINE_TYPE(FuGenesysUsbhubDevFirmware, fu_genesys_usbhub_dev_firmware, FU_TYPE_FIRMWARE)
19
23.8k
20
23.8k
static gboolean
21
23.8k
fu_genesys_usbhub_dev_firmware_validate(FuFirmware *firmware,
22
23.8k
          FuInputStream *stream,
23
23.8k
          gsize offset,
24
23.8k
          GError **error)
25
23.8k
{
26
23.8k
  return fu_struct_genesys_dev_firmware_hdr_validate_stream(stream, offset, error);
27
23.8k
}
28
29
static gboolean
30
fu_genesys_usbhub_dev_firmware_parse(FuFirmware *firmware,
31
             FuInputStream *stream,
32
             FuFirmwareParseFlags flags,
33
             GError **error)
34
12.4k
{
35
12.4k
  gsize code_size = 0;
36
12.4k
  g_autoptr(FuInputStream) stream_trunc = NULL;
37
38
12.4k
  fu_firmware_set_id(firmware, fu_genesys_fw_type_to_string(FU_GENESYS_FW_TYPE_DEV_BRIDGE));
39
12.4k
  fu_firmware_set_idx(firmware, FU_GENESYS_FW_TYPE_DEV_BRIDGE);
40
12.4k
  fu_firmware_set_alignment(firmware, FU_FIRMWARE_ALIGNMENT_1K);
41
42
  /* truncate to correct size */
43
12.4k
  if (!fu_genesys_usbhub_firmware_calculate_size(stream, &code_size, error)) {
44
16
    g_prefix_error_literal(error, "not valid for dev: ");
45
16
    return FALSE;
46
16
  }
47
12.3k
  stream_trunc = fu_partial_input_stream_new(stream, 0x0, code_size, error);
48
12.3k
  if (stream_trunc == NULL)
49
48
    return FALSE;
50
12.3k
  if (!fu_firmware_set_stream(firmware, stream_trunc, error))
51
0
    return FALSE;
52
53
  /* calculate checksum */
54
12.3k
  if ((flags & FU_FIRMWARE_PARSE_FLAG_IGNORE_CHECKSUM) == 0) {
55
0
    if (!fu_genesys_usbhub_firmware_verify_checksum(stream_trunc, error)) {
56
0
      g_prefix_error_literal(error, "not valid for dev: ");
57
0
      return FALSE;
58
0
    }
59
0
  }
60
61
  /* get firmware version */
62
12.3k
  if (!fu_genesys_usbhub_firmware_ensure_version(firmware, error)) {
63
0
    g_prefix_error_literal(error, "not valid for dev: ");
64
0
    return FALSE;
65
0
  }
66
67
  /* success */
68
12.3k
  return TRUE;
69
12.3k
}
70
71
static void
72
fu_genesys_usbhub_dev_firmware_init(FuGenesysUsbhubDevFirmware *self)
73
23.8k
{
74
23.8k
  fu_firmware_add_flag(FU_FIRMWARE(self), FU_FIRMWARE_FLAG_HAS_CHECKSUM);
75
23.8k
}
76
77
static void
78
fu_genesys_usbhub_dev_firmware_class_init(FuGenesysUsbhubDevFirmwareClass *klass)
79
1
{
80
1
  FuFirmwareClass *firmware_class = FU_FIRMWARE_CLASS(klass);
81
1
  firmware_class->validate = fu_genesys_usbhub_dev_firmware_validate;
82
1
  firmware_class->parse = fu_genesys_usbhub_dev_firmware_parse;
83
1
  fu_firmware_set_size_max(firmware_class, 16 * FU_MB);
84
1
}