X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/clg/blobdiff_plain/7797f30aaefe7f4a3a323683ae4aeebcace08ca2..aaa96f27c8401d06c2009af9a8a2c1eb788d2539:/gio/alien/g_callback_output_stream.c diff --git a/gio/alien/g_callback_output_stream.c b/gio/alien/g_callback_output_stream.c new file mode 100644 index 0000000..f4432cd --- /dev/null +++ b/gio/alien/g_callback_output_stream.c @@ -0,0 +1,124 @@ +#include "g_callback_output_stream.h" + +G_DEFINE_TYPE (GCallbackOutputStream, g_callback_output_stream, G_TYPE_OUTPUT_STREAM); + +struct _GCallbackOutputStreamPrivate { + GCallbackOutputStreamWriteFunc write_func; + GCallbackOutputStreamFlushFunc flush_func; + GCallbackOutputStreamCloseFunc close_func; + gpointer user_data; +}; + +static gssize g_callback_output_stream_write (GOutputStream *stream, + void const *buffer, + gsize count, + GCancellable *cancellable, + GError **error); +static gboolean g_callback_output_stream_flush (GOutputStream *stream, + GCancellable *cancellable, + GError **error); +static gboolean g_callback_output_stream_close (GOutputStream *stream, + GCancellable *cancellable, + GError **error); + + +static void +g_callback_output_stream_finalize (GObject *object) +{ + GCallbackOutputStream *stream; + + stream = G_CALLBACK_OUTPUT_STREAM (object); + + G_OBJECT_CLASS (g_callback_output_stream_parent_class)->finalize (object); +} + +static void +g_callback_output_stream_class_init (GCallbackOutputStreamClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GOutputStreamClass *stream_class = G_OUTPUT_STREAM_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GCallbackOutputStreamPrivate)); + + gobject_class->finalize = g_callback_output_stream_finalize; + + stream_class->write_fn = g_callback_output_stream_write; + stream_class->flush = g_callback_output_stream_flush; + stream_class->close_fn = g_callback_output_stream_close; +} + +static void +g_callback_output_stream_init (GCallbackOutputStream *callback_stream) +{ + callback_stream->priv = + G_TYPE_INSTANCE_GET_PRIVATE (callback_stream, + G_TYPE_CALLBACK_OUTPUT_STREAM, + GCallbackOutputStreamPrivate); +} + +GOutputStream* +g_callback_output_stream_new (GCallbackOutputStreamWriteFunc write_func, + GCallbackOutputStreamFlushFunc flush_func, + GCallbackOutputStreamCloseFunc close_func, + gpointer user_data) +{ + GCallbackOutputStream *stream; + + stream = g_object_new (G_TYPE_CALLBACK_OUTPUT_STREAM, NULL); + + stream->priv->write_func = write_func; + stream->priv->flush_func = flush_func; + stream->priv->close_func = close_func; + stream->priv->user_data = user_data; + + return G_OUTPUT_STREAM (stream); +} + +static gssize +g_callback_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GCallbackOutputStream *callback_stream = G_CALLBACK_OUTPUT_STREAM (stream); + GCallbackOutputStreamWriteFunc write_func = callback_stream->priv->write_func; + gpointer user_data = callback_stream->priv->user_data; + + return write_func (buffer, count, cancellable, error, user_data); +} + +static gboolean +g_callback_output_stream_flush (GOutputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GCallbackOutputStream *callback_stream = G_CALLBACK_OUTPUT_STREAM (stream); + GCallbackOutputStreamFlushFunc flush_func = callback_stream->priv->flush_func; + gpointer user_data = callback_stream->priv->user_data; + + if (callback_stream->priv->flush_func) + return flush_func (cancellable, error, user_data); + + return TRUE; +} + +static gboolean +g_callback_output_stream_close (GOutputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GCallbackOutputStream *callback_stream = G_CALLBACK_OUTPUT_STREAM (stream); + GCallbackOutputStreamCloseFunc close_func = callback_stream->priv->close_func; + gpointer user_data = callback_stream->priv->user_data; + + callback_stream = G_CALLBACK_OUTPUT_STREAM (stream); + + if (callback_stream->priv->close_func) + return close_func (cancellable, error, user_data); + + return TRUE; +} + +#define __G_CALLBACK_OUTPUT_STREAM_C__ +