[glib] Add g_memory_input_stream_new_from_data_full/add_data_full() apis
- From: Murray Cumming <murrayc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib] Add g_memory_input_stream_new_from_data_full/add_data_full() apis
- Date: Fri, 16 Sep 2011 13:37:18 +0000 (UTC)
commit 42738469d15585791bd5613356c47bcc2c413c20
Author: Tristan Van Berkom <tristanvb openismus com>
Date: Fri Sep 16 13:46:01 2011 +0200
Add g_memory_input_stream_new_from_data_full/add_data_full() apis
Add an extra state pointer and an extra GDestroyNotify function
to the 'Chunk' definition... allowing bindings to attach some extra
state to memory chunks (to get memory management correctly from
language bindings).
Bug #589887
gio/gmemoryinputstream.c | 70 ++++++++++++++++++++++++++++++++++++++++++++-
gio/gmemoryinputstream.h | 29 +++++++++++++------
2 files changed, 88 insertions(+), 11 deletions(-)
---
diff --git a/gio/gmemoryinputstream.c b/gio/gmemoryinputstream.c
index 9107b22..ce4a71b 100644
--- a/gio/gmemoryinputstream.c
+++ b/gio/gmemoryinputstream.c
@@ -47,6 +47,8 @@ struct _Chunk {
guint8 *data;
gsize len;
GDestroyNotify destroy;
+ gpointer user_data;
+ GDestroyNotify user_data_destroy;
};
struct _GMemoryInputStreamPrivate {
@@ -148,6 +150,9 @@ free_chunk (gpointer data,
if (chunk->destroy)
chunk->destroy (chunk->data);
+ if (chunk->user_data_destroy)
+ chunk->user_data_destroy (chunk->user_data);
+
g_slice_free (Chunk, chunk);
}
@@ -216,12 +221,42 @@ g_memory_input_stream_new_from_data (const void *data,
gssize len,
GDestroyNotify destroy)
{
+ return g_memory_input_stream_new_from_data_full (data, len, destroy, NULL, NULL);
+}
+
+/**
+ * g_memory_input_stream_new_from_data_full:
+ * @data: (array length=len) (element-type guint8): input data
+ * @len: length of the data, may be -1 if @data is a nul-terminated string
+ * @destroy: (allow-none): function that is called to free @data, or %NULL
+ * @user_data: extra state pointer related to the chunk of data
+ * @user_data_destroy: function that is called to free @user_data, or %NULL
+ *
+ * Creates a new #GMemoryInputStream with data in memory of a given size.
+ *
+ * This function differs from g_memory_input_stream_new_from_data() only
+ * because it allows a pointer to some additional state related to
+ * the data chunk to be stored (this can be used to properly manage
+ * the life cycle of data chunks from language bindings).
+ *
+ * Returns: new #GInputStream read from @data of @len bytes.
+ *
+ * Since: 2.30
+ **/
+GInputStream *
+g_memory_input_stream_new_from_data_full (const void *data,
+ gssize len,
+ GDestroyNotify destroy,
+ gpointer user_data,
+ GDestroyNotify user_data_destroy)
+{
GInputStream *stream;
stream = g_memory_input_stream_new ();
- g_memory_input_stream_add_data (G_MEMORY_INPUT_STREAM (stream),
- data, len, destroy);
+ g_memory_input_stream_add_data_full (G_MEMORY_INPUT_STREAM (stream),
+ data, len, destroy,
+ user_data, user_data_destroy);
return stream;
}
@@ -241,6 +276,35 @@ g_memory_input_stream_add_data (GMemoryInputStream *stream,
gssize len,
GDestroyNotify destroy)
{
+ g_memory_input_stream_add_data_full (stream, data, len, destroy, NULL, NULL);
+}
+
+/**
+ * g_memory_input_stream_add_data_full:
+ * @stream: a #GMemoryInputStream
+ * @data: (array length=len) (element-type guint8): input data
+ * @len: length of the data, may be -1 if @data is a nul-terminated string
+ * @destroy: (allow-none): function that is called to free @data, or %NULL
+ * @user_data: extra state pointer related to the chunk of data
+ * @user_data_destroy: function that is called to free @user_data, or %NULL
+ *
+ * Appends @data to data that can be read from the input stream
+ *
+ * This function differs from g_memory_input_stream_add_data() only
+ * because it allows a pointer to some additional state related to
+ * the data chunk to be stored (this can be used to properly manage
+ * the life cycle of data chunks from language bindings).
+ *
+ * Since: 2.30
+ */
+void
+g_memory_input_stream_add_data_full (GMemoryInputStream *stream,
+ const void *data,
+ gssize len,
+ GDestroyNotify destroy,
+ gpointer user_data,
+ GDestroyNotify user_data_destroy)
+{
GMemoryInputStreamPrivate *priv;
Chunk *chunk;
@@ -256,6 +320,8 @@ g_memory_input_stream_add_data (GMemoryInputStream *stream,
chunk->data = (guint8 *)data;
chunk->len = len;
chunk->destroy = destroy;
+ chunk->user_data = user_data;
+ chunk->user_data_destroy = user_data_destroy;
priv->chunks = g_slist_append (priv->chunks, chunk);
priv->len += chunk->len;
diff --git a/gio/gmemoryinputstream.h b/gio/gmemoryinputstream.h
index e629db1..22444b4 100644
--- a/gio/gmemoryinputstream.h
+++ b/gio/gmemoryinputstream.h
@@ -67,15 +67,26 @@ struct _GMemoryInputStreamClass
};
-GType g_memory_input_stream_get_type (void) G_GNUC_CONST;
-GInputStream * g_memory_input_stream_new (void);
-GInputStream * g_memory_input_stream_new_from_data (const void *data,
- gssize len,
- GDestroyNotify destroy);
-void g_memory_input_stream_add_data (GMemoryInputStream *stream,
- const void *data,
- gssize len,
- GDestroyNotify destroy);
+GType g_memory_input_stream_get_type (void) G_GNUC_CONST;
+GInputStream * g_memory_input_stream_new (void);
+GInputStream * g_memory_input_stream_new_from_data (const void *data,
+ gssize len,
+ GDestroyNotify destroy);
+GInputStream * g_memory_input_stream_new_from_data_full (const void *data,
+ gssize len,
+ GDestroyNotify destroy,
+ gpointer user_data,
+ GDestroyNotify user_data_destroy);
+void g_memory_input_stream_add_data (GMemoryInputStream *stream,
+ const void *data,
+ gssize len,
+ GDestroyNotify destroy);
+void g_memory_input_stream_add_data_full (GMemoryInputStream *stream,
+ const void *data,
+ gssize len,
+ GDestroyNotify destroy,
+ gpointer user_data,
+ GDestroyNotify user_data_destroy);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]