diff --git a/doc/libfprint-2-sections.txt b/doc/libfprint-2-sections.txt
index 995ad50d..52ddb426 100644
--- a/doc/libfprint-2-sections.txt
+++ b/doc/libfprint-2-sections.txt
@@ -139,8 +139,10 @@ fpi_assemble_lines
FpiByteReader
FpiByteReader
fpi_byte_reader_new
+fpi_byte_reader_new_bytes
fpi_byte_reader_free
fpi_byte_reader_init
+fpi_byte_reader_init_bytes
fpi_byte_reader_peek_sub_reader
fpi_byte_reader_get_sub_reader
fpi_byte_reader_set_pos
@@ -148,6 +150,8 @@ fpi_byte_reader_get_pos
fpi_byte_reader_get_remaining
fpi_byte_reader_get_size
fpi_byte_reader_skip
+fpi_byte_reader_get_bytes
+fpi_byte_reader_peek_bytes
fpi_byte_reader_get_uint8
fpi_byte_reader_get_int8
fpi_byte_reader_peek_uint8
diff --git a/libfprint/fpi-byte-reader.c b/libfprint/fpi-byte-reader.c
index 23bc5e7c..15918256 100644
--- a/libfprint/fpi-byte-reader.c
+++ b/libfprint/fpi-byte-reader.c
@@ -65,6 +65,31 @@ fpi_byte_reader_new (const guint8 * data, guint size)
return ret;
}
+/**
+ * fpi_byte_reader_new_bytes: (skip)
+ * @bytes: (in) (transfer none): a #GBytes instance from which the
+ * #FpiByteReader should read
+ *
+ * Create a new #FpiByteReader instance, which will read from @bytes.
+ *
+ * Free-function: fpi_byte_reader_free
+ *
+ * Returns: (transfer full): a new #FpiByteReader instance
+ */
+FpiByteReader *
+fpi_byte_reader_new_bytes (GBytes * bytes)
+{
+ const guint8 *data;
+ gsize size = 0;
+
+ g_return_val_if_fail (bytes != NULL, NULL);
+
+ data = g_bytes_get_data (bytes, &size);
+ g_return_val_if_fail (size <= G_MAXUINT, NULL);
+
+ return fpi_byte_reader_new (data, (guint) size);
+}
+
/**
* fpi_byte_reader_free:
* @reader: (in) (transfer full): a #FpiByteReader instance
@@ -100,6 +125,30 @@ fpi_byte_reader_init (FpiByteReader * reader, const guint8 * data, guint size)
reader->byte = 0;
}
+/**
+ * fpi_byte_reader_init_bytes:
+ * @reader: a #FpiByteReader instance
+ * @bytes: (in) (transfer none): a #GBytes instance from which
+ * the #FpiByteReader should read
+ *
+ * Initializes a #FpiByteReader instance to read from @bytes. This function
+ * can be called on already initialized instances.
+ */
+FpiByteReader *
+fpi_byte_reader_init_bytes (FpiByteReader * reader, GBytes * bytes)
+{
+ g_return_val_if_fail (reader != NULL, NULL);
+ g_return_val_if_fail (bytes != NULL, NULL);
+
+ gsize size = 0;
+ const guint8 *data = g_bytes_get_data (bytes, &size);
+
+ g_return_val_if_fail (size <= G_MAXUINT, NULL);
+ fpi_byte_reader_init (reader, data, (guint) size);
+
+ return reader;
+}
+
/**
* fpi_byte_reader_peek_sub_reader: (skip)
* @reader: an existing and initialized #FpiByteReader instance
diff --git a/libfprint/fpi-byte-reader.h b/libfprint/fpi-byte-reader.h
index c4e64d20..05a3989e 100644
--- a/libfprint/fpi-byte-reader.h
+++ b/libfprint/fpi-byte-reader.h
@@ -50,6 +50,7 @@ typedef struct {
FpiByteReader * fpi_byte_reader_new (const guint8 *data, guint size) G_GNUC_MALLOC;
+FpiByteReader * fpi_byte_reader_new_bytes (GBytes *bytes) G_GNUC_MALLOC;
void fpi_byte_reader_free (FpiByteReader *reader);
@@ -57,6 +58,9 @@ void fpi_byte_reader_free (FpiByteReader *reader);
void fpi_byte_reader_init (FpiByteReader *reader, const guint8 *data, guint size);
+FpiByteReader * fpi_byte_reader_init_bytes (FpiByteReader *reader, GBytes *bytes);
+
+
gboolean fpi_byte_reader_peek_sub_reader (FpiByteReader * reader,
FpiByteReader * sub_reader,
guint size);
@@ -220,6 +224,13 @@ gboolean fpi_byte_reader_get_data (FpiByteReader * reader, guint s
gboolean fpi_byte_reader_peek_data (const FpiByteReader * reader, guint size, const guint8 ** val);
+
+GBytes * fpi_byte_reader_get_bytes (FpiByteReader *reader, guint size);
+
+
+GBytes * fpi_byte_reader_peek_bytes (const FpiByteReader *reader, guint size);
+
+
#define fpi_byte_reader_dup_string(reader,str) \
fpi_byte_reader_dup_string_utf8(reader,str)
@@ -642,6 +653,34 @@ fpi_byte_reader_peek_data_inline (const FpiByteReader * reader, guint size, cons
return TRUE;
}
+static inline GBytes *
+fpi_byte_reader_peek_bytes_inline (const FpiByteReader *reader, guint size)
+{
+ const guint8 *data;
+
+ g_return_val_if_fail (reader != NULL, NULL);
+
+ if (G_UNLIKELY (size > reader->size || fpi_byte_reader_get_remaining_unchecked (reader) < size))
+ return NULL;
+
+ data = fpi_byte_reader_peek_data_unchecked (reader);
+ return g_bytes_new_static (data, size);
+}
+
+static inline GBytes *
+fpi_byte_reader_get_bytes_inline (FpiByteReader *reader, guint size)
+{
+ const guint8 *data;
+
+ g_return_val_if_fail (reader != NULL, NULL);
+
+ if (G_UNLIKELY (size > reader->size || fpi_byte_reader_get_remaining_unchecked (reader) < size))
+ return NULL;
+
+ data = fpi_byte_reader_get_data_unchecked (reader, size);
+ return g_bytes_new_static (data, size);
+}
+
static inline guint
fpi_byte_reader_get_pos_inline (const FpiByteReader * reader)
{
@@ -672,6 +711,10 @@ fpi_byte_reader_skip_inline (FpiByteReader * reader, guint nbytes)
G_LIKELY(fpi_byte_reader_peek_data_inline(reader,size,val))
#define fpi_byte_reader_skip(reader,nbytes) \
G_LIKELY(fpi_byte_reader_skip_inline(reader,nbytes))
+#define fpi_byte_reader_get_bytes(reader,size) \
+ fpi_byte_reader_get_bytes_inline(reader,size)
+#define fpi_byte_reader_peek_bytes(reader,size) \
+ fpi_byte_reader_peek_bytes_inline(reader,size)
#endif /* FPI_BYTE_READER_DISABLE_INLINES */