Initial checkin
[clg] / gio / alien / g_callback_output_stream.c
1 #include "g_callback_output_stream.h"
2
3 G_DEFINE_TYPE (GCallbackOutputStream, g_callback_output_stream, G_TYPE_OUTPUT_STREAM);
4
5 struct _GCallbackOutputStreamPrivate {
6 GCallbackOutputStreamWriteFunc write_func;
7 GCallbackOutputStreamFlushFunc flush_func;
8 GCallbackOutputStreamCloseFunc close_func;
9 gpointer user_data;
10 };
11
12 static gssize g_callback_output_stream_write (GOutputStream *stream,
13 void const *buffer,
14 gsize count,
15 GCancellable *cancellable,
16 GError **error);
17 static gboolean g_callback_output_stream_flush (GOutputStream *stream,
18 GCancellable *cancellable,
19 GError **error);
20 static gboolean g_callback_output_stream_close (GOutputStream *stream,
21 GCancellable *cancellable,
22 GError **error);
23
24
25 static void
26 g_callback_output_stream_finalize (GObject *object)
27 {
28 GCallbackOutputStream *stream;
29
30 stream = G_CALLBACK_OUTPUT_STREAM (object);
31
32 G_OBJECT_CLASS (g_callback_output_stream_parent_class)->finalize (object);
33 }
34
35 static void
36 g_callback_output_stream_class_init (GCallbackOutputStreamClass *klass)
37 {
38 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
39 GOutputStreamClass *stream_class = G_OUTPUT_STREAM_CLASS (klass);
40
41 g_type_class_add_private (klass, sizeof (GCallbackOutputStreamPrivate));
42
43 gobject_class->finalize = g_callback_output_stream_finalize;
44
45 stream_class->write_fn = g_callback_output_stream_write;
46 stream_class->flush = g_callback_output_stream_flush;
47 stream_class->close_fn = g_callback_output_stream_close;
48 }
49
50 static void
51 g_callback_output_stream_init (GCallbackOutputStream *callback_stream)
52 {
53 callback_stream->priv =
54 G_TYPE_INSTANCE_GET_PRIVATE (callback_stream,
55 G_TYPE_CALLBACK_OUTPUT_STREAM,
56 GCallbackOutputStreamPrivate);
57 }
58
59 GOutputStream*
60 g_callback_output_stream_new (GCallbackOutputStreamWriteFunc write_func,
61 GCallbackOutputStreamFlushFunc flush_func,
62 GCallbackOutputStreamCloseFunc close_func,
63 gpointer user_data)
64 {
65 GCallbackOutputStream *stream;
66
67 stream = g_object_new (G_TYPE_CALLBACK_OUTPUT_STREAM, NULL);
68
69 stream->priv->write_func = write_func;
70 stream->priv->flush_func = flush_func;
71 stream->priv->close_func = close_func;
72 stream->priv->user_data = user_data;
73
74 return G_OUTPUT_STREAM (stream);
75 }
76
77 static gssize
78 g_callback_output_stream_write (GOutputStream *stream,
79 const void *buffer,
80 gsize count,
81 GCancellable *cancellable,
82 GError **error)
83 {
84 GCallbackOutputStream *callback_stream = G_CALLBACK_OUTPUT_STREAM (stream);
85 GCallbackOutputStreamWriteFunc write_func = callback_stream->priv->write_func;
86 gpointer user_data = callback_stream->priv->user_data;
87
88 return write_func (buffer, count, cancellable, error, user_data);
89 }
90
91 static gboolean
92 g_callback_output_stream_flush (GOutputStream *stream,
93 GCancellable *cancellable,
94 GError **error)
95 {
96 GCallbackOutputStream *callback_stream = G_CALLBACK_OUTPUT_STREAM (stream);
97 GCallbackOutputStreamFlushFunc flush_func = callback_stream->priv->flush_func;
98 gpointer user_data = callback_stream->priv->user_data;
99
100 if (callback_stream->priv->flush_func)
101 return flush_func (cancellable, error, user_data);
102
103 return TRUE;
104 }
105
106 static gboolean
107 g_callback_output_stream_close (GOutputStream *stream,
108 GCancellable *cancellable,
109 GError **error)
110 {
111 GCallbackOutputStream *callback_stream = G_CALLBACK_OUTPUT_STREAM (stream);
112 GCallbackOutputStreamCloseFunc close_func = callback_stream->priv->close_func;
113 gpointer user_data = callback_stream->priv->user_data;
114
115 callback_stream = G_CALLBACK_OUTPUT_STREAM (stream);
116
117 if (callback_stream->priv->close_func)
118 return close_func (cancellable, error, user_data);
119
120 return TRUE;
121 }
122
123 #define __G_CALLBACK_OUTPUT_STREAM_C__
124