Bumps documentation to 93% symbol coverage, touching most
[platform/upstream/glib.git] / gio / gfilterinputstream.c
1 /* GIO - GLib Input, Output and Streaming Library
2  * 
3  * Copyright (C) 2006-2007 Red Hat, Inc.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General
16  * Public License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18  * Boston, MA 02111-1307, USA.
19  *
20  * Author: Christian Kellner <gicmo@gnome.org> 
21  */
22
23 #include <config.h>
24 #include "gfilterinputstream.h"
25 #include "ginputstream.h"
26 #include "glibintl.h"
27
28 /**
29  * SECTION:gfilterinputstream
30  * @short_description: Filter Input Stream.
31  *
32  **/
33
34 enum {
35   PROP_0,
36   PROP_BASE_STREAM
37 };
38
39 static void     g_filter_input_stream_set_property (GObject      *object,
40                                                     guint         prop_id,
41                                                     const GValue *value,
42                                                     GParamSpec   *pspec);
43
44 static void     g_filter_input_stream_get_property (GObject      *object,
45                                                     guint         prop_id,
46                                                     GValue       *value,
47                                                     GParamSpec   *pspec);
48 static void     g_filter_input_stream_finalize     (GObject *object);
49
50
51 static gssize   g_filter_input_stream_read         (GInputStream         *stream,
52                                                     void                 *buffer,
53                                                     gsize                 count,
54                                                     GCancellable         *cancellable,
55                                                     GError              **error);
56 static gssize   g_filter_input_stream_skip         (GInputStream         *stream,
57                                                     gsize                 count,
58                                                     GCancellable         *cancellable,
59                                                     GError              **error);
60 static gboolean g_filter_input_stream_close        (GInputStream         *stream,
61                                                     GCancellable         *cancellable,
62                                                     GError              **error);
63 static void     g_filter_input_stream_read_async   (GInputStream         *stream,
64                                                     void                 *buffer,
65                                                     gsize                 count,
66                                                     int                   io_priority,
67                                                     GCancellable         *cancellable,
68                                                     GAsyncReadyCallback   callback,
69                                                     gpointer              user_data);
70 static gssize   g_filter_input_stream_read_finish  (GInputStream         *stream,
71                                                     GAsyncResult         *result,
72                                                     GError              **error);
73 static void     g_filter_input_stream_skip_async   (GInputStream         *stream,
74                                                     gsize                 count,
75                                                     int                   io_priority,
76                                                     GCancellable         *cancellabl,
77                                                     GAsyncReadyCallback   callback,
78                                                     gpointer              datae);
79 static gssize   g_filter_input_stream_skip_finish  (GInputStream         *stream,
80                                                     GAsyncResult         *result,
81                                                     GError              **error);
82 static void     g_filter_input_stream_close_async  (GInputStream         *stream,
83                                                     int                   io_priority,
84                                                     GCancellable         *cancellabl,
85                                                     GAsyncReadyCallback   callback,
86                                                     gpointer              data);
87 static gboolean g_filter_input_stream_close_finish (GInputStream         *stream,
88                                                     GAsyncResult         *result,
89                                                     GError              **error);
90
91 G_DEFINE_TYPE (GFilterInputStream, g_filter_input_stream, G_TYPE_INPUT_STREAM)
92
93
94 static void
95 g_filter_input_stream_class_init (GFilterInputStreamClass *klass)
96 {
97   GObjectClass *object_class;
98   GInputStreamClass *istream_class;
99
100   object_class = G_OBJECT_CLASS (klass);
101   object_class->get_property = g_filter_input_stream_get_property;
102   object_class->set_property = g_filter_input_stream_set_property;
103   object_class->finalize     = g_filter_input_stream_finalize;
104
105   istream_class = G_INPUT_STREAM_CLASS (klass);
106   istream_class->read  = g_filter_input_stream_read;
107   istream_class->skip  = g_filter_input_stream_skip;
108   istream_class->close = g_filter_input_stream_close;
109
110   istream_class->read_async   = g_filter_input_stream_read_async;
111   istream_class->read_finish  = g_filter_input_stream_read_finish;
112   istream_class->skip_async   = g_filter_input_stream_skip_async;
113   istream_class->skip_finish  = g_filter_input_stream_skip_finish;
114   istream_class->close_async  = g_filter_input_stream_close_async;
115   istream_class->close_finish = g_filter_input_stream_close_finish;
116
117   g_object_class_install_property (object_class,
118                                    PROP_BASE_STREAM,
119                                    g_param_spec_object ("base-stream",
120                                                          P_("The Filter Base Stream"),
121                                                          P_("The underlying base stream the io ops will be done on"),
122                                                          G_TYPE_INPUT_STREAM,
123                                                          G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | 
124                                                          G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
125
126 }
127
128 static void
129 g_filter_input_stream_set_property (GObject         *object,
130                                     guint            prop_id,
131                                     const GValue    *value,
132                                     GParamSpec      *pspec)
133 {
134   GFilterInputStream *filter_stream;
135   GObject *obj;
136
137   filter_stream = G_FILTER_INPUT_STREAM (object);
138
139   switch (prop_id) 
140     {
141     case PROP_BASE_STREAM:
142       obj = g_value_dup_object (value);
143       filter_stream->base_stream = G_INPUT_STREAM (obj); 
144       break;
145
146     default:
147       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
148       break;
149     }
150
151 }
152
153 static void
154 g_filter_input_stream_get_property (GObject    *object,
155                                     guint       prop_id,
156                                     GValue     *value,
157                                     GParamSpec *pspec)
158 {
159   GFilterInputStream *filter_stream;
160
161   filter_stream = G_FILTER_INPUT_STREAM (object);
162
163   switch (prop_id)
164     {
165     case PROP_BASE_STREAM:
166       g_value_set_object (value, filter_stream->base_stream);
167       break;
168
169     default:
170       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
171       break;
172     }
173
174 }
175
176 static void
177 g_filter_input_stream_finalize (GObject *object)
178 {
179   GFilterInputStream *stream;
180
181   stream = G_FILTER_INPUT_STREAM (object);
182
183   g_object_unref (stream->base_stream);
184
185   if (G_OBJECT_CLASS (g_filter_input_stream_parent_class)->finalize)
186     (*G_OBJECT_CLASS (g_filter_input_stream_parent_class)->finalize) (object);
187 }
188
189 static void
190 g_filter_input_stream_init (GFilterInputStream *stream)
191 {
192
193 }
194
195 /**
196  * g_filter_input_stream_get_base_stream:
197  * @stream: a #GFilterInputStream.
198  * 
199  * Returns: a #GInputStream.
200  **/
201 GInputStream *
202 g_filter_input_stream_get_base_stream (GFilterInputStream *stream)
203 {
204   g_return_val_if_fail (G_IS_FILTER_INPUT_STREAM (stream), NULL);
205
206   return stream->base_stream;
207 }
208
209 static gssize
210 g_filter_input_stream_read (GInputStream *stream,
211                             void         *buffer,
212                             gsize         count,
213                             GCancellable *cancellable,
214                             GError      **error)
215 {
216   GFilterInputStream *filter_stream;
217   GInputStream       *base_stream;
218   gssize              nread;
219
220   filter_stream = G_FILTER_INPUT_STREAM (stream);
221   base_stream = filter_stream->base_stream;
222
223   nread = g_input_stream_read (base_stream,
224                                buffer,
225                                count,
226                                cancellable,
227                                error);
228
229   return nread;
230 }
231
232 static gssize
233 g_filter_input_stream_skip (GInputStream              *stream,
234                             gsize                      count,
235                             GCancellable              *cancellable,
236                             GError                   **error)
237 {
238   GFilterInputStream *filter_stream;
239   GInputStream       *base_stream;
240   gssize              nskipped;
241
242   filter_stream = G_FILTER_INPUT_STREAM (stream);
243   base_stream = filter_stream->base_stream;
244
245   nskipped = g_input_stream_skip (base_stream,
246                                   count,
247                                   cancellable,
248                                   error);
249   return nskipped;
250 }
251
252 static gboolean
253 g_filter_input_stream_close (GInputStream  *stream,
254                              GCancellable  *cancellable,
255                              GError       **error)
256 {
257   GFilterInputStream *filter_stream;
258   GInputStream       *base_stream;
259   gboolean            res;
260
261   filter_stream = G_FILTER_INPUT_STREAM (stream);
262   base_stream = filter_stream->base_stream;
263
264   res = g_input_stream_close (base_stream,
265                               cancellable,
266                               error);
267
268   return res;
269 }
270
271 static void
272 g_filter_input_stream_read_async (GInputStream           *stream,
273                                   void                   *buffer,
274                                   gsize                   count,
275                                   int                     io_priority,
276                                   GCancellable           *cancellable,
277                                   GAsyncReadyCallback     callback,
278                                   gpointer                user_data)
279 {
280   GFilterInputStream *filter_stream;
281   GInputStream       *base_stream;
282
283   filter_stream = G_FILTER_INPUT_STREAM (stream);
284   base_stream = filter_stream->base_stream;
285
286   g_input_stream_read_async (base_stream,
287                              buffer,
288                              count,
289                              io_priority,
290                              cancellable,
291                              callback,
292                              user_data);
293 }
294
295 static gssize
296 g_filter_input_stream_read_finish (GInputStream  *stream,
297                                    GAsyncResult  *result,
298                                    GError       **error)
299 {
300   GFilterInputStream *filter_stream;
301   GInputStream       *base_stream;
302   gssize nread;
303
304   filter_stream = G_FILTER_INPUT_STREAM (stream);
305   base_stream = filter_stream->base_stream;
306
307   nread = g_input_stream_read_finish (base_stream,
308                                       result,
309                                       error);
310   
311   return nread;
312 }
313
314 static void
315 g_filter_input_stream_skip_async (GInputStream        *stream,
316                                   gsize                count,
317                                   int                  io_priority,
318                                   GCancellable        *cancellable,
319                                   GAsyncReadyCallback  callback,
320                                   gpointer             user_data)
321 {
322   GFilterInputStream *filter_stream;
323   GInputStream       *base_stream;
324
325   filter_stream = G_FILTER_INPUT_STREAM (stream);
326   base_stream = filter_stream->base_stream;
327
328   g_input_stream_skip_async (base_stream,
329                              count,
330                              io_priority,
331                              cancellable,
332                              callback,
333                              user_data);
334
335 }
336
337 static gssize
338 g_filter_input_stream_skip_finish (GInputStream  *stream,
339                                    GAsyncResult  *result,
340                                    GError       **error)
341 {
342   GFilterInputStream *filter_stream;
343   GInputStream       *base_stream;
344   gssize nskipped;
345
346   filter_stream = G_FILTER_INPUT_STREAM (stream);
347   base_stream = filter_stream->base_stream;
348
349   nskipped = g_input_stream_skip_finish (base_stream,
350                                          result,
351                                          error);
352
353   return nskipped;
354 }
355
356 static void
357 g_filter_input_stream_close_async (GInputStream         *stream,
358                                    int                   io_priority,
359                                    GCancellable         *cancellable,
360                                    GAsyncReadyCallback   callback,
361                                    gpointer              user_data)
362 {
363   GFilterInputStream *filter_stream;
364   GInputStream       *base_stream;
365
366   filter_stream = G_FILTER_INPUT_STREAM (stream);
367   base_stream = filter_stream->base_stream;
368
369   g_input_stream_close_async (base_stream,
370                               io_priority,
371                               cancellable,
372                               callback,
373                               user_data);
374
375
376 }
377
378 static gboolean
379 g_filter_input_stream_close_finish (GInputStream  *stream,
380                                     GAsyncResult  *result,
381                                     GError       **error)
382 {
383   GFilterInputStream *filter_stream;
384   GInputStream       *base_stream;
385   gboolean res;
386
387   filter_stream = G_FILTER_INPUT_STREAM (stream);
388   base_stream = filter_stream->base_stream;
389
390   res = g_input_stream_close_finish (stream,
391                                      result,
392                                      error);
393
394   return res;
395 }
396
397 /* vim: ts=2 sw=2 et */