chiark / gitweb /
Infra: Rudimentary setup system.
[clg] / gio / alien / g_callback_input_stream.c
CommitLineData
ad4a2c4e 1#include "g_callback_input_stream.h"
2
3G_DEFINE_TYPE (GCallbackInputStream, g_callback_input_stream, G_TYPE_INPUT_STREAM);
4
5struct _GCallbackInputStreamPrivate {
6 GCallbackInputStreamReadFunc read_func;
7 GCallbackInputStreamCloseFunc close_func;
8 gpointer user_data;
9};
10
11static gssize g_callback_input_stream_read (GInputStream *stream,
12 void *buffer,
13 gsize count,
14 GCancellable *cancellable,
15 GError **error);
16static gssize g_callback_input_stream_skip (GInputStream *stream,
17 gsize count,
18 GCancellable *cancellable,
19 GError **error);
20static gboolean g_callback_input_stream_close (GInputStream *stream,
21 GCancellable *cancellable,
22 GError **error);
23
24
25static void
26g_callback_input_stream_finalize (GObject *object)
27{
28 GCallbackInputStream *stream;
29
30 stream = G_CALLBACK_INPUT_STREAM (object);
31
32 G_OBJECT_CLASS (g_callback_input_stream_parent_class)->finalize (object);
33}
34
35static void
36g_callback_input_stream_class_init (GCallbackInputStreamClass *klass)
37{
38 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
39 GInputStreamClass *stream_class = G_INPUT_STREAM_CLASS (klass);
40
41 g_type_class_add_private (klass, sizeof (GCallbackInputStreamPrivate));
42
43 gobject_class->finalize = g_callback_input_stream_finalize;
44
45 stream_class->read_fn = g_callback_input_stream_read;
46 stream_class->skip = g_callback_input_stream_skip;
47 stream_class->close_fn = g_callback_input_stream_close;
48}
49
50static void
51g_callback_input_stream_init (GCallbackInputStream *callback_stream)
52{
53 callback_stream->priv =
54 G_TYPE_INSTANCE_GET_PRIVATE (callback_stream,
55 G_TYPE_CALLBACK_INPUT_STREAM,
56 GCallbackInputStreamPrivate);
57}
58
59GInputStream*
60g_callback_input_stream_new (GCallbackInputStreamReadFunc read_func,
61 GCallbackInputStreamCloseFunc close_func,
62 gpointer user_data)
63{
64 GCallbackInputStream *stream;
65
66 stream = g_object_new (G_TYPE_CALLBACK_INPUT_STREAM, NULL);
67
68 stream->priv->read_func = read_func;
69 stream->priv->close_func = close_func;
70 stream->priv->user_data = user_data;
71
72 return G_INPUT_STREAM (stream);
73}
74
75static gssize
76g_callback_input_stream_read (GInputStream *stream,
77 void *buffer,
78 gsize count,
79 GCancellable *cancellable,
80 GError **error)
81{
82 GCallbackInputStream *callback_stream = G_CALLBACK_INPUT_STREAM (stream);
83 GCallbackInputStreamReadFunc read_func = callback_stream->priv->read_func;
84 gpointer user_data = callback_stream->priv->user_data;
85
86 return read_func (buffer, count, cancellable, error, user_data);
87}
88
89static gssize
90g_callback_input_stream_skip (GInputStream *stream,
91 gsize count,
92 GCancellable *cancellable,
93 GError **error)
94{
95 GCallbackInputStream *callback_stream = G_CALLBACK_INPUT_STREAM (stream);
96 GCallbackInputStreamReadFunc read_func = callback_stream->priv->read_func;
97 gpointer user_data = callback_stream->priv->user_data;
98
99 return read_func (NULL, count, cancellable, error, user_data);
100}
101
102static gboolean
103g_callback_input_stream_close (GInputStream *stream,
104 GCancellable *cancellable,
105 GError **error)
106{
107 GCallbackInputStream *callback_stream = G_CALLBACK_INPUT_STREAM (stream);
108 GCallbackInputStreamCloseFunc close_func = callback_stream->priv->close_func;
109 gpointer user_data = callback_stream->priv->user_data;
110
111 callback_stream = G_CALLBACK_INPUT_STREAM (stream);
112
113 if (callback_stream->priv->close_func)
114 return close_func (cancellable, error, user_data);
115
116 return TRUE;
117}
118
119#define __G_CALLBACK_INPUT_STREAM_C__
120