From 14763d29cf1e5ec9628fd639034675e9b22aff1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Mon, 8 Jun 2026 14:11:09 +0200 Subject: [PATCH] fpi-byte-writer: Add APIs to write and get GBytes It makes it handier to handle data elements without having to keep size and data separated --- doc/libfprint-2-sections.txt | 2 ++ libfprint/fpi-byte-writer.c | 39 ++++++++++++++++++++++++++++++++++++ libfprint/fpi-byte-writer.h | 22 ++++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/doc/libfprint-2-sections.txt b/doc/libfprint-2-sections.txt index 9f3804f0..995ad50d 100644 --- a/doc/libfprint-2-sections.txt +++ b/doc/libfprint-2-sections.txt @@ -220,11 +220,13 @@ fpi_byte_writer_init fpi_byte_writer_init_with_size fpi_byte_writer_init_with_data fpi_byte_writer_reset +fpi_byte_writer_reset_and_get_bytes fpi_byte_writer_reset_and_get_data fpi_byte_writer_free fpi_byte_writer_free_and_get_data fpi_byte_writer_get_remaining fpi_byte_writer_ensure_free_space +fpi_byte_writer_put_bytes fpi_byte_writer_put_uint8 fpi_byte_writer_put_uint16_be fpi_byte_writer_put_uint24_be diff --git a/libfprint/fpi-byte-writer.c b/libfprint/fpi-byte-writer.c index cb3514a0..00ff4477 100644 --- a/libfprint/fpi-byte-writer.c +++ b/libfprint/fpi-byte-writer.c @@ -219,6 +219,36 @@ fpi_byte_writer_reset_and_get_data (FpiByteWriter * writer) return data; } +/** + * fpi_byte_writer_reset_and_get_bytes: + * @writer: #FpiByteWriter instance + * + * Resets @writer and returns the current data as a #GBytes. + * + * Returns: (transfer full): the current data as a #GBytes. + */ +GBytes * +fpi_byte_writer_reset_and_get_bytes (FpiByteWriter * writer) +{ + GBytes *bytes; + + g_return_val_if_fail (writer != NULL, NULL); + + if (!writer->owned) + { + bytes = g_bytes_new (g_steal_pointer (&writer->parent.data), + writer->parent.size); + } + else + { + bytes = g_bytes_new_take ((gpointer) g_steal_pointer (&writer->parent.data), + writer->parent.size); + } + + fpi_byte_writer_reset (writer); + return g_steal_pointer (&bytes); +} + /** * fpi_byte_writer_free: * @writer: (in) (transfer full): #FpiByteWriter instance @@ -602,6 +632,15 @@ CREATE_WRITE_STRING_FUNC (32, guint32); * * Returns: %TRUE if the value could be written */ +/** + * fpi_byte_writer_put_bytes: + * @writer: #FpiByteWriter instance + * @bytes: (transfer none): Data to write + * + * Writes the contents of @bytes to @writer. + * + * Returns: %TRUE if the value could be written + */ /** * fpi_byte_writer_fill: * @writer: #FpiByteWriter instance diff --git a/libfprint/fpi-byte-writer.h b/libfprint/fpi-byte-writer.h index 9b21b5f8..699e85e3 100644 --- a/libfprint/fpi-byte-writer.h +++ b/libfprint/fpi-byte-writer.h @@ -77,6 +77,9 @@ void fpi_byte_writer_reset (FpiByteWriter *writer); guint8 * fpi_byte_writer_reset_and_get_data (FpiByteWriter *writer); + +GBytes * fpi_byte_writer_reset_and_get_bytes (FpiByteWriter *writer); + /** * fpi_byte_writer_get_pos: * @writer: #FpiByteWriter instance @@ -204,6 +207,9 @@ gboolean fpi_byte_writer_put_float64_le (FpiByteWriter *writer, gdoubl gboolean fpi_byte_writer_put_data (FpiByteWriter *writer, const guint8 *data, guint size); +gboolean fpi_byte_writer_put_bytes (FpiByteWriter *writer, const GBytes *bytes); + + gboolean fpi_byte_writer_fill (FpiByteWriter *writer, guint8 value, guint size); @@ -338,6 +344,18 @@ fpi_byte_writer_put_data_inline (FpiByteWriter * writer, const guint8 * data, return TRUE; } +static inline gboolean +fpi_byte_writer_put_bytes_inline (FpiByteWriter * writer, const GBytes * bytes) +{ + g_return_val_if_fail (writer != NULL, FALSE); + g_return_val_if_fail (bytes != NULL, FALSE); + const guint8 *data; + gsize size; + + data = g_bytes_get_data ((GBytes *) bytes, &size); + return fpi_byte_writer_put_data_inline (writer, data, size); +} + static inline void fpi_byte_writer_fill_unchecked (FpiByteWriter * writer, guint8 value, guint size) { @@ -413,6 +431,10 @@ fpi_byte_writer_fill_inline (FpiByteWriter * writer, guint8 value, guint size) #define fpi_byte_writer_put_data(writer, data, size) \ G_LIKELY (fpi_byte_writer_put_data_inline (writer, data, size)) +#define fpi_byte_writer_put_data_static(writer, data) \ + G_LIKELY (fpi_byte_writer_put_data_inline (writer, data, sizeof (data))) +#define fpi_byte_writer_put_bytes(writer, bytes) \ + G_LIKELY (fpi_byte_writer_put_bytes_inline (writer, bytes)) #define fpi_byte_writer_fill(writer, val, size) \ G_LIKELY (fpi_byte_writer_fill_inline (writer, val, size))