srec: Make FuIhexFirmware derivable for possible future use

An ABI change, so probably not a good idea to backport.
This commit is contained in:
Richard Hughes 2021-04-06 14:33:23 +01:00
parent 7f7e4437fc
commit 776a0890fe
2 changed files with 21 additions and 10 deletions

View File

@ -23,12 +23,13 @@
* See also: #FuFirmware * See also: #FuFirmware
*/ */
struct _FuSrecFirmware { typedef struct {
FuFirmware parent_instance; FuFirmware parent_instance;
GPtrArray *records; GPtrArray *records;
}; } FuSrecFirmwarePrivate;
G_DEFINE_TYPE (FuSrecFirmware, fu_srec_firmware, FU_TYPE_FIRMWARE) G_DEFINE_TYPE_WITH_PRIVATE (FuSrecFirmware, fu_srec_firmware, FU_TYPE_FIRMWARE)
#define GET_PRIVATE(o) (fu_srec_firmware_get_instance_private (o))
/** /**
* fu_srec_firmware_get_records: * fu_srec_firmware_get_records:
@ -46,8 +47,9 @@ G_DEFINE_TYPE (FuSrecFirmware, fu_srec_firmware, FU_TYPE_FIRMWARE)
GPtrArray * GPtrArray *
fu_srec_firmware_get_records (FuSrecFirmware *self) fu_srec_firmware_get_records (FuSrecFirmware *self)
{ {
FuSrecFirmwarePrivate *priv = GET_PRIVATE (self);
g_return_val_if_fail (FU_IS_SREC_FIRMWARE (self), NULL); g_return_val_if_fail (FU_IS_SREC_FIRMWARE (self), NULL);
return self->records; return priv->records;
} }
static void static void
@ -85,6 +87,7 @@ fu_srec_firmware_tokenize (FuFirmware *firmware, GBytes *fw,
FwupdInstallFlags flags, GError **error) FwupdInstallFlags flags, GError **error)
{ {
FuSrecFirmware *self = FU_SREC_FIRMWARE (firmware); FuSrecFirmware *self = FU_SREC_FIRMWARE (firmware);
FuSrecFirmwarePrivate *priv = GET_PRIVATE (self);
const gchar *data; const gchar *data;
gboolean got_eof = FALSE; gboolean got_eof = FALSE;
gsize sz = 0; gsize sz = 0;
@ -253,7 +256,7 @@ fu_srec_firmware_tokenize (FuFirmware *firmware, GBytes *fw,
fu_byte_array_append_uint8 (rcd->buf, tmp); fu_byte_array_append_uint8 (rcd->buf, tmp);
} }
} }
g_ptr_array_add (self->records, rcd); g_ptr_array_add (priv->records, rcd);
} }
/* no EOF */ /* no EOF */
@ -276,6 +279,7 @@ fu_srec_firmware_parse (FuFirmware *firmware,
GError **error) GError **error)
{ {
FuSrecFirmware *self = FU_SREC_FIRMWARE (firmware); FuSrecFirmware *self = FU_SREC_FIRMWARE (firmware);
FuSrecFirmwarePrivate *priv = GET_PRIVATE (self);
gboolean got_hdr = FALSE; gboolean got_hdr = FALSE;
guint16 data_cnt = 0; guint16 data_cnt = 0;
guint32 addr32_last = 0; guint32 addr32_last = 0;
@ -284,8 +288,8 @@ fu_srec_firmware_parse (FuFirmware *firmware,
g_autoptr(GByteArray) outbuf = g_byte_array_new (); g_autoptr(GByteArray) outbuf = g_byte_array_new ();
/* parse records */ /* parse records */
for (guint j = 0; j < self->records->len; j++) { for (guint j = 0; j < priv->records->len; j++) {
FuSrecFirmwareRecord *rcd = g_ptr_array_index (self->records, j); FuSrecFirmwareRecord *rcd = g_ptr_array_index (priv->records, j);
/* header */ /* header */
if (rcd->kind == FU_FIRMWARE_SREC_RECORD_KIND_S0_HEADER) { if (rcd->kind == FU_FIRMWARE_SREC_RECORD_KIND_S0_HEADER) {
@ -500,14 +504,16 @@ static void
fu_srec_firmware_finalize (GObject *object) fu_srec_firmware_finalize (GObject *object)
{ {
FuSrecFirmware *self = FU_SREC_FIRMWARE (object); FuSrecFirmware *self = FU_SREC_FIRMWARE (object);
g_ptr_array_unref (self->records); FuSrecFirmwarePrivate *priv = GET_PRIVATE (self);
g_ptr_array_unref (priv->records);
G_OBJECT_CLASS (fu_srec_firmware_parent_class)->finalize (object); G_OBJECT_CLASS (fu_srec_firmware_parent_class)->finalize (object);
} }
static void static void
fu_srec_firmware_init (FuSrecFirmware *self) fu_srec_firmware_init (FuSrecFirmware *self)
{ {
self->records = g_ptr_array_new_with_free_func ((GFreeFunc) fu_srec_firmware_record_free); FuSrecFirmwarePrivate *priv = GET_PRIVATE (self);
priv->records = g_ptr_array_new_with_free_func ((GFreeFunc) fu_srec_firmware_record_free);
fu_firmware_add_flag (FU_FIRMWARE (self), FU_FIRMWARE_FLAG_HAS_CHECKSUM); fu_firmware_add_flag (FU_FIRMWARE (self), FU_FIRMWARE_FLAG_HAS_CHECKSUM);
} }

View File

@ -9,7 +9,12 @@
#include "fu-firmware.h" #include "fu-firmware.h"
#define FU_TYPE_SREC_FIRMWARE (fu_srec_firmware_get_type ()) #define FU_TYPE_SREC_FIRMWARE (fu_srec_firmware_get_type ())
G_DECLARE_FINAL_TYPE (FuSrecFirmware, fu_srec_firmware, FU, SREC_FIRMWARE, FuFirmware) G_DECLARE_DERIVABLE_TYPE (FuSrecFirmware, fu_srec_firmware, FU, SREC_FIRMWARE, FuFirmware)
struct _FuSrecFirmwareClass
{
FuFirmwareClass parent_class;
};
typedef enum { typedef enum {
FU_FIRMWARE_SREC_RECORD_KIND_S0_HEADER, FU_FIRMWARE_SREC_RECORD_KIND_S0_HEADER,