blob: 5f81f324df2747fc5950412acd2486c29320eef8 [file] [log] [blame]
Richard Hughes7afd7cb2019-08-07 11:42:42 +01001/*
2 * Copyright (C) 2019 Richard Hughes <richard@hughsie.com>
3 *
4 * SPDX-License-Identifier: LGPL-2.1+
5 */
6
7#pragma once
8
9#include <glib-object.h>
10#include <fwupd.h>
Richard Hughes1981c632021-03-09 09:44:12 +000011#include <xmlb.h>
Richard Hughes7afd7cb2019-08-07 11:42:42 +010012
Richard Hughes1981c632021-03-09 09:44:12 +000013#include "fu-chunk.h"
14#include "fu-firmware.h"
Richard Hughes7afd7cb2019-08-07 11:42:42 +010015
Richard Hughes7afd7cb2019-08-07 11:42:42 +010016#define FU_TYPE_FIRMWARE (fu_firmware_get_type ())
17G_DECLARE_DERIVABLE_TYPE (FuFirmware, fu_firmware, FU, FIRMWARE, GObject)
18
19struct _FuFirmwareClass
20{
21 GObjectClass parent_class;
22 gboolean (*parse) (FuFirmware *self,
23 GBytes *fw,
24 guint64 addr_start,
25 guint64 addr_end,
26 FwupdInstallFlags flags,
Richard Hughesa2abc422020-12-22 09:38:59 +000027 GError **error)
28 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes7afd7cb2019-08-07 11:42:42 +010029 GBytes *(*write) (FuFirmware *self,
Richard Hughesa2abc422020-12-22 09:38:59 +000030 GError **error)
31 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughescea28de2019-08-09 11:16:40 +010032 void (*to_string) (FuFirmware *self,
Richard Hughes6e3e62b2019-08-14 10:43:08 +010033 guint indent,
Richard Hughescea28de2019-08-09 11:16:40 +010034 GString *str);
Richard Hughes6819f9e2019-09-19 17:37:30 +010035 gboolean (*tokenize) (FuFirmware *self,
36 GBytes *fw,
37 FwupdInstallFlags flags,
Richard Hughesa2abc422020-12-22 09:38:59 +000038 GError **error)
39 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes41400a82020-09-21 13:43:15 +010040 gboolean (*build) (FuFirmware *self,
41 XbNode *n,
Richard Hughesa2abc422020-12-22 09:38:59 +000042 GError **error)
43 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes1981c632021-03-09 09:44:12 +000044 gchar *(*get_checksum) (FuFirmware *self,
45 GChecksumType csum_kind,
46 GError **error)
47 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes7afd7cb2019-08-07 11:42:42 +010048 /*< private >*/
Richard Hughes1981c632021-03-09 09:44:12 +000049 gpointer padding[26];
Richard Hughes7afd7cb2019-08-07 11:42:42 +010050};
51
Richard Hughes6da96cd2020-09-17 10:28:42 +010052/**
53 * FuFirmwareFlags:
54 * @FU_FIRMWARE_FLAG_NONE: No flags set
55 * @FU_FIRMWARE_FLAG_DEDUPE_ID: Dedupe imges by ID
56 * @FU_FIRMWARE_FLAG_DEDUPE_IDX: Dedupe imges by IDX
Richard Hughes54bc5122021-02-11 09:29:03 +000057 * @FU_FIRMWARE_FLAG_HAS_CHECKSUM: Has a CRC or checksum to test internal consistency
58 * @FU_FIRMWARE_FLAG_HAS_VID_PID: Has a vendor or product ID in the firmware
Richard Hughes6da96cd2020-09-17 10:28:42 +010059 *
60 * The firmware flags.
61 **/
62#define FU_FIRMWARE_FLAG_NONE (0u) /* Since: 1.5.0 */
63#define FU_FIRMWARE_FLAG_DEDUPE_ID (1u << 0) /* Since: 1.5.0 */
64#define FU_FIRMWARE_FLAG_DEDUPE_IDX (1u << 1) /* Since: 1.5.0 */
Richard Hughes54bc5122021-02-11 09:29:03 +000065#define FU_FIRMWARE_FLAG_HAS_CHECKSUM (1u << 2) /* Since: 1.5.6 */
66#define FU_FIRMWARE_FLAG_HAS_VID_PID (1u << 3) /* Since: 1.5.6 */
Richard Hughes6da96cd2020-09-17 10:28:42 +010067typedef guint64 FuFirmwareFlags;
68
Richard Hughes1981c632021-03-09 09:44:12 +000069#define FU_FIRMWARE_ID_PAYLOAD "payload"
70#define FU_FIRMWARE_ID_SIGNATURE "signature"
71#define FU_FIRMWARE_ID_HEADER "header"
72
Richard Hughes6da96cd2020-09-17 10:28:42 +010073const gchar *fu_firmware_flag_to_string (FuFirmwareFlags flag);
74FuFirmwareFlags fu_firmware_flag_from_string (const gchar *flag);
75
Richard Hughes7afd7cb2019-08-07 11:42:42 +010076FuFirmware *fu_firmware_new (void);
77FuFirmware *fu_firmware_new_from_bytes (GBytes *fw);
Richard Hughes1d163522021-01-29 15:54:30 +000078FuFirmware *fu_firmware_new_from_gtypes (GBytes *fw,
79 FwupdInstallFlags flags,
80 GError **error,
81 ...);
Richard Hughes7afd7cb2019-08-07 11:42:42 +010082gchar *fu_firmware_to_string (FuFirmware *self);
Richard Hughesfd3c8ae2019-10-21 16:01:38 +010083const gchar *fu_firmware_get_version (FuFirmware *self);
84void fu_firmware_set_version (FuFirmware *self,
85 const gchar *version);
Richard Hughes86c6c2d2021-02-15 10:54:37 +000086guint64 fu_firmware_get_version_raw (FuFirmware *self);
87void fu_firmware_set_version_raw (FuFirmware *self,
88 guint64 version_raw);
Richard Hughes6da96cd2020-09-17 10:28:42 +010089void fu_firmware_add_flag (FuFirmware *firmware,
90 FuFirmwareFlags flag);
91gboolean fu_firmware_has_flag (FuFirmware *firmware,
92 FuFirmwareFlags flag);
Richard Hughes1981c632021-03-09 09:44:12 +000093const gchar *fu_firmware_get_filename (FuFirmware *self);
94void fu_firmware_set_filename (FuFirmware *self,
95 const gchar *filename);
96const gchar *fu_firmware_get_id (FuFirmware *self);
97void fu_firmware_set_id (FuFirmware *self,
98 const gchar *id);
99guint64 fu_firmware_get_addr (FuFirmware *self);
100void fu_firmware_set_addr (FuFirmware *self,
101 guint64 addr);
102guint64 fu_firmware_get_offset (FuFirmware *self);
103void fu_firmware_set_offset (FuFirmware *self,
104 guint64 offset);
Richard Hughes8f631802021-03-10 13:50:38 +0000105gsize fu_firmware_get_size (FuFirmware *self);
106void fu_firmware_set_size (FuFirmware *self,
Richard Hughes752c8de2021-03-13 16:23:26 +0000107 gsize size);
Richard Hughes1981c632021-03-09 09:44:12 +0000108guint64 fu_firmware_get_idx (FuFirmware *self);
109void fu_firmware_set_idx (FuFirmware *self,
110 guint64 idx);
111GBytes *fu_firmware_get_bytes (FuFirmware *self,
112 GError **error);
113void fu_firmware_set_bytes (FuFirmware *self,
114 GBytes *bytes);
Richard Hughes55853e32021-03-10 13:48:08 +0000115guint8 fu_firmware_get_alignment (FuFirmware *self);
116void fu_firmware_set_alignment (FuFirmware *self,
117 guint8 alignment);
Richard Hughes1981c632021-03-09 09:44:12 +0000118void fu_firmware_add_chunk (FuFirmware *self,
119 FuChunk *chk);
120GPtrArray *fu_firmware_get_chunks (FuFirmware *self,
121 GError **error);
Richard Hughes7afd7cb2019-08-07 11:42:42 +0100122
Richard Hughes6819f9e2019-09-19 17:37:30 +0100123gboolean fu_firmware_tokenize (FuFirmware *self,
124 GBytes *fw,
125 FwupdInstallFlags flags,
Richard Hughesa2abc422020-12-22 09:38:59 +0000126 GError **error)
127 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes41400a82020-09-21 13:43:15 +0100128gboolean fu_firmware_build (FuFirmware *self,
129 XbNode *n,
Richard Hughesa2abc422020-12-22 09:38:59 +0000130 GError **error)
131 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes7afd7cb2019-08-07 11:42:42 +0100132gboolean fu_firmware_parse (FuFirmware *self,
133 GBytes *fw,
134 FwupdInstallFlags flags,
Richard Hughesa2abc422020-12-22 09:38:59 +0000135 GError **error)
136 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughesf591a352019-10-10 15:30:44 +0100137gboolean fu_firmware_parse_file (FuFirmware *self,
138 GFile *file,
139 FwupdInstallFlags flags,
Richard Hughesa2abc422020-12-22 09:38:59 +0000140 GError **error)
141 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes7afd7cb2019-08-07 11:42:42 +0100142gboolean fu_firmware_parse_full (FuFirmware *self,
143 GBytes *fw,
144 guint64 addr_start,
145 guint64 addr_end,
146 FwupdInstallFlags flags,
Richard Hughesa2abc422020-12-22 09:38:59 +0000147 GError **error)
148 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes7afd7cb2019-08-07 11:42:42 +0100149GBytes *fu_firmware_write (FuFirmware *self,
Richard Hughesa2abc422020-12-22 09:38:59 +0000150 GError **error)
151 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes1981c632021-03-09 09:44:12 +0000152GBytes *fu_firmware_write_chunk (FuFirmware *self,
153 guint64 address,
154 guint64 chunk_sz_max,
155 GError **error)
156 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughesf591a352019-10-10 15:30:44 +0100157gboolean fu_firmware_write_file (FuFirmware *self,
158 GFile *file,
Richard Hughesa2abc422020-12-22 09:38:59 +0000159 GError **error)
160 G_GNUC_WARN_UNUSED_RESULT;
Richard Hughes1981c632021-03-09 09:44:12 +0000161gchar *fu_firmware_get_checksum (FuFirmware *self,
162 GChecksumType csum_kind,
163 GError **error);
Richard Hughes7afd7cb2019-08-07 11:42:42 +0100164
165void fu_firmware_add_image (FuFirmware *self,
Richard Hughes1981c632021-03-09 09:44:12 +0000166 FuFirmware *img);
Richard Hughes3e9fafc2020-09-24 13:08:21 +0100167gboolean fu_firmware_remove_image (FuFirmware *self,
Richard Hughes1981c632021-03-09 09:44:12 +0000168 FuFirmware *img,
Richard Hughes3e9fafc2020-09-24 13:08:21 +0100169 GError **error);
170gboolean fu_firmware_remove_image_by_idx (FuFirmware *self,
171 guint64 idx,
172 GError **error);
173gboolean fu_firmware_remove_image_by_id (FuFirmware *self,
174 const gchar *id,
175 GError **error);
Richard Hughes7afd7cb2019-08-07 11:42:42 +0100176GPtrArray *fu_firmware_get_images (FuFirmware *self);
Richard Hughes1981c632021-03-09 09:44:12 +0000177FuFirmware *fu_firmware_get_image_by_id (FuFirmware *self,
Richard Hughes7afd7cb2019-08-07 11:42:42 +0100178 const gchar *id,
179 GError **error);
180GBytes *fu_firmware_get_image_by_id_bytes (FuFirmware *self,
181 const gchar *id,
182 GError **error);
Richard Hughes1981c632021-03-09 09:44:12 +0000183FuFirmware *fu_firmware_get_image_by_idx (FuFirmware *self,
Richard Hughes7afd7cb2019-08-07 11:42:42 +0100184 guint64 idx,
185 GError **error);
186GBytes *fu_firmware_get_image_by_idx_bytes (FuFirmware *self,
187 guint64 idx,
188 GError **error);
Richard Hughes1981c632021-03-09 09:44:12 +0000189FuFirmware *fu_firmware_get_image_by_checksum (FuFirmware *self,
Richard Hughesac927582021-01-05 11:06:33 +0000190 const gchar *checksum,
191 GError **error);