1 /* GIO - GLib Input, Output and Streaming Library
3 * Copyright (C) 2006-2007 Red Hat, Inc.
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.
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.
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.
20 * Author: Christian Kellner <gicmo@gnome.org>
24 #include "gfilterinputstream.h"
25 #include "ginputstream.h"
29 * SECTION:gfilterinputstream
30 * @short_description: Filter Input Stream
39 static void g_filter_input_stream_set_property (GObject *object,
44 static void g_filter_input_stream_get_property (GObject *object,
48 static void g_filter_input_stream_finalize (GObject *object);
51 static gssize g_filter_input_stream_read (GInputStream *stream,
54 GCancellable *cancellable,
56 static gssize g_filter_input_stream_skip (GInputStream *stream,
58 GCancellable *cancellable,
60 static gboolean g_filter_input_stream_close (GInputStream *stream,
61 GCancellable *cancellable,
63 static void g_filter_input_stream_read_async (GInputStream *stream,
67 GCancellable *cancellable,
68 GAsyncReadyCallback callback,
70 static gssize g_filter_input_stream_read_finish (GInputStream *stream,
73 static void g_filter_input_stream_skip_async (GInputStream *stream,
76 GCancellable *cancellabl,
77 GAsyncReadyCallback callback,
79 static gssize g_filter_input_stream_skip_finish (GInputStream *stream,
82 static void g_filter_input_stream_close_async (GInputStream *stream,
84 GCancellable *cancellabl,
85 GAsyncReadyCallback callback,
87 static gboolean g_filter_input_stream_close_finish (GInputStream *stream,
91 G_DEFINE_TYPE (GFilterInputStream, g_filter_input_stream, G_TYPE_INPUT_STREAM)
95 g_filter_input_stream_class_init (GFilterInputStreamClass *klass)
97 GObjectClass *object_class;
98 GInputStreamClass *istream_class;
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;
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;
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;
117 g_object_class_install_property (object_class,
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"),
123 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
124 G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
129 g_filter_input_stream_set_property (GObject *object,
134 GFilterInputStream *filter_stream;
137 filter_stream = G_FILTER_INPUT_STREAM (object);
141 case PROP_BASE_STREAM:
142 obj = g_value_dup_object (value);
143 filter_stream->base_stream = G_INPUT_STREAM (obj);
147 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
154 g_filter_input_stream_get_property (GObject *object,
159 GFilterInputStream *filter_stream;
161 filter_stream = G_FILTER_INPUT_STREAM (object);
165 case PROP_BASE_STREAM:
166 g_value_set_object (value, filter_stream->base_stream);
170 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
177 g_filter_input_stream_finalize (GObject *object)
179 GFilterInputStream *stream;
181 stream = G_FILTER_INPUT_STREAM (object);
183 g_object_unref (stream->base_stream);
185 if (G_OBJECT_CLASS (g_filter_input_stream_parent_class)->finalize)
186 (*G_OBJECT_CLASS (g_filter_input_stream_parent_class)->finalize) (object);
190 g_filter_input_stream_init (GFilterInputStream *stream)
196 * g_filter_input_stream_get_base_stream:
197 * @stream: a #GFilterInputStream.
199 * Gets the base stream for the filter stream.
201 * Returns: a #GInputStream.
204 g_filter_input_stream_get_base_stream (GFilterInputStream *stream)
206 g_return_val_if_fail (G_IS_FILTER_INPUT_STREAM (stream), NULL);
208 return stream->base_stream;
212 g_filter_input_stream_read (GInputStream *stream,
215 GCancellable *cancellable,
218 GFilterInputStream *filter_stream;
219 GInputStream *base_stream;
222 filter_stream = G_FILTER_INPUT_STREAM (stream);
223 base_stream = filter_stream->base_stream;
225 nread = g_input_stream_read (base_stream,
235 g_filter_input_stream_skip (GInputStream *stream,
237 GCancellable *cancellable,
240 GFilterInputStream *filter_stream;
241 GInputStream *base_stream;
244 filter_stream = G_FILTER_INPUT_STREAM (stream);
245 base_stream = filter_stream->base_stream;
247 nskipped = g_input_stream_skip (base_stream,
255 g_filter_input_stream_close (GInputStream *stream,
256 GCancellable *cancellable,
259 GFilterInputStream *filter_stream;
260 GInputStream *base_stream;
263 filter_stream = G_FILTER_INPUT_STREAM (stream);
264 base_stream = filter_stream->base_stream;
266 res = g_input_stream_close (base_stream,
274 g_filter_input_stream_read_async (GInputStream *stream,
278 GCancellable *cancellable,
279 GAsyncReadyCallback callback,
282 GFilterInputStream *filter_stream;
283 GInputStream *base_stream;
285 filter_stream = G_FILTER_INPUT_STREAM (stream);
286 base_stream = filter_stream->base_stream;
288 g_input_stream_read_async (base_stream,
298 g_filter_input_stream_read_finish (GInputStream *stream,
299 GAsyncResult *result,
302 GFilterInputStream *filter_stream;
303 GInputStream *base_stream;
306 filter_stream = G_FILTER_INPUT_STREAM (stream);
307 base_stream = filter_stream->base_stream;
309 nread = g_input_stream_read_finish (base_stream,
317 g_filter_input_stream_skip_async (GInputStream *stream,
320 GCancellable *cancellable,
321 GAsyncReadyCallback callback,
324 GFilterInputStream *filter_stream;
325 GInputStream *base_stream;
327 filter_stream = G_FILTER_INPUT_STREAM (stream);
328 base_stream = filter_stream->base_stream;
330 g_input_stream_skip_async (base_stream,
340 g_filter_input_stream_skip_finish (GInputStream *stream,
341 GAsyncResult *result,
344 GFilterInputStream *filter_stream;
345 GInputStream *base_stream;
348 filter_stream = G_FILTER_INPUT_STREAM (stream);
349 base_stream = filter_stream->base_stream;
351 nskipped = g_input_stream_skip_finish (base_stream,
359 g_filter_input_stream_close_async (GInputStream *stream,
361 GCancellable *cancellable,
362 GAsyncReadyCallback callback,
365 GFilterInputStream *filter_stream;
366 GInputStream *base_stream;
368 filter_stream = G_FILTER_INPUT_STREAM (stream);
369 base_stream = filter_stream->base_stream;
371 g_input_stream_close_async (base_stream,
381 g_filter_input_stream_close_finish (GInputStream *stream,
382 GAsyncResult *result,
385 GFilterInputStream *filter_stream;
386 GInputStream *base_stream;
389 filter_stream = G_FILTER_INPUT_STREAM (stream);
390 base_stream = filter_stream->base_stream;
392 res = g_input_stream_close_finish (stream,
399 /* vim: ts=2 sw=2 et */