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"
33 static void g_filter_input_stream_set_property (GObject *object,
38 static void g_filter_input_stream_get_property (GObject *object,
42 static void g_filter_input_stream_finalize (GObject *object);
45 static gssize g_filter_input_stream_read (GInputStream *stream,
48 GCancellable *cancellable,
50 static gssize g_filter_input_stream_skip (GInputStream *stream,
52 GCancellable *cancellable,
54 static gboolean g_filter_input_stream_close (GInputStream *stream,
55 GCancellable *cancellable,
57 static void g_filter_input_stream_read_async (GInputStream *stream,
61 GCancellable *cancellable,
62 GAsyncReadyCallback callback,
64 static gssize g_filter_input_stream_read_finish (GInputStream *stream,
67 static void g_filter_input_stream_skip_async (GInputStream *stream,
70 GCancellable *cancellabl,
71 GAsyncReadyCallback callback,
73 static gssize g_filter_input_stream_skip_finish (GInputStream *stream,
76 static void g_filter_input_stream_close_async (GInputStream *stream,
78 GCancellable *cancellabl,
79 GAsyncReadyCallback callback,
81 static gboolean g_filter_input_stream_close_finish (GInputStream *stream,
85 G_DEFINE_TYPE (GFilterInputStream, g_filter_input_stream, G_TYPE_INPUT_STREAM)
89 g_filter_input_stream_class_init (GFilterInputStreamClass *klass)
91 GObjectClass *object_class;
92 GInputStreamClass *istream_class;
94 object_class = G_OBJECT_CLASS (klass);
95 object_class->get_property = g_filter_input_stream_get_property;
96 object_class->set_property = g_filter_input_stream_set_property;
97 object_class->finalize = g_filter_input_stream_finalize;
99 istream_class = G_INPUT_STREAM_CLASS (klass);
100 istream_class->read = g_filter_input_stream_read;
101 istream_class->skip = g_filter_input_stream_skip;
102 istream_class->close = g_filter_input_stream_close;
104 istream_class->read_async = g_filter_input_stream_read_async;
105 istream_class->read_finish = g_filter_input_stream_read_finish;
106 istream_class->skip_async = g_filter_input_stream_skip_async;
107 istream_class->skip_finish = g_filter_input_stream_skip_finish;
108 istream_class->close_async = g_filter_input_stream_close_async;
109 istream_class->close_finish = g_filter_input_stream_close_finish;
111 g_object_class_install_property (object_class,
113 g_param_spec_object ("base-stream",
114 P_("The Filter Base Stream"),
115 P_("The underlying base stream the io ops will be done on"),
117 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
118 G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
123 g_filter_input_stream_set_property (GObject *object,
128 GFilterInputStream *filter_stream;
131 filter_stream = G_FILTER_INPUT_STREAM (object);
135 case PROP_BASE_STREAM:
136 obj = g_value_dup_object (value);
137 filter_stream->base_stream = G_INPUT_STREAM (obj);
141 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
148 g_filter_input_stream_get_property (GObject *object,
153 GFilterInputStream *filter_stream;
155 filter_stream = G_FILTER_INPUT_STREAM (object);
159 case PROP_BASE_STREAM:
160 g_value_set_object (value, filter_stream->base_stream);
164 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
171 g_filter_input_stream_finalize (GObject *object)
173 GFilterInputStream *stream;
175 stream = G_FILTER_INPUT_STREAM (object);
177 g_object_unref (stream->base_stream);
179 if (G_OBJECT_CLASS (g_filter_input_stream_parent_class)->finalize)
180 (*G_OBJECT_CLASS (g_filter_input_stream_parent_class)->finalize) (object);
184 g_filter_input_stream_init (GFilterInputStream *stream)
190 * g_filter_input_stream_get_base_stream:
191 * @stream: a #GFilterInputStream.
193 * Returns: a #GInputStream.
196 g_filter_input_stream_get_base_stream (GFilterInputStream *stream)
198 g_return_val_if_fail (G_IS_FILTER_INPUT_STREAM (stream), NULL);
200 return stream->base_stream;
204 g_filter_input_stream_read (GInputStream *stream,
207 GCancellable *cancellable,
210 GFilterInputStream *filter_stream;
211 GInputStream *base_stream;
214 filter_stream = G_FILTER_INPUT_STREAM (stream);
215 base_stream = filter_stream->base_stream;
217 nread = g_input_stream_read (base_stream,
227 g_filter_input_stream_skip (GInputStream *stream,
229 GCancellable *cancellable,
232 GFilterInputStream *filter_stream;
233 GInputStream *base_stream;
236 filter_stream = G_FILTER_INPUT_STREAM (stream);
237 base_stream = filter_stream->base_stream;
239 nskipped = g_input_stream_skip (base_stream,
247 g_filter_input_stream_close (GInputStream *stream,
248 GCancellable *cancellable,
251 GFilterInputStream *filter_stream;
252 GInputStream *base_stream;
255 filter_stream = G_FILTER_INPUT_STREAM (stream);
256 base_stream = filter_stream->base_stream;
258 res = g_input_stream_close (base_stream,
266 g_filter_input_stream_read_async (GInputStream *stream,
270 GCancellable *cancellable,
271 GAsyncReadyCallback callback,
274 GFilterInputStream *filter_stream;
275 GInputStream *base_stream;
277 filter_stream = G_FILTER_INPUT_STREAM (stream);
278 base_stream = filter_stream->base_stream;
280 g_input_stream_read_async (base_stream,
290 g_filter_input_stream_read_finish (GInputStream *stream,
291 GAsyncResult *result,
294 GFilterInputStream *filter_stream;
295 GInputStream *base_stream;
298 filter_stream = G_FILTER_INPUT_STREAM (stream);
299 base_stream = filter_stream->base_stream;
301 nread = g_input_stream_read_finish (base_stream,
309 g_filter_input_stream_skip_async (GInputStream *stream,
312 GCancellable *cancellable,
313 GAsyncReadyCallback callback,
316 GFilterInputStream *filter_stream;
317 GInputStream *base_stream;
319 filter_stream = G_FILTER_INPUT_STREAM (stream);
320 base_stream = filter_stream->base_stream;
322 g_input_stream_skip_async (base_stream,
332 g_filter_input_stream_skip_finish (GInputStream *stream,
333 GAsyncResult *result,
336 GFilterInputStream *filter_stream;
337 GInputStream *base_stream;
340 filter_stream = G_FILTER_INPUT_STREAM (stream);
341 base_stream = filter_stream->base_stream;
343 nskipped = g_input_stream_skip_finish (base_stream,
351 g_filter_input_stream_close_async (GInputStream *stream,
353 GCancellable *cancellable,
354 GAsyncReadyCallback callback,
357 GFilterInputStream *filter_stream;
358 GInputStream *base_stream;
360 filter_stream = G_FILTER_INPUT_STREAM (stream);
361 base_stream = filter_stream->base_stream;
363 g_input_stream_close_async (base_stream,
373 g_filter_input_stream_close_finish (GInputStream *stream,
374 GAsyncResult *result,
377 GFilterInputStream *filter_stream;
378 GInputStream *base_stream;
381 filter_stream = G_FILTER_INPUT_STREAM (stream);
382 base_stream = filter_stream->base_stream;
384 res = g_input_stream_close_finish (stream,
391 /* vim: ts=2 sw=2 et */