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"
26 #include "gsimpleasyncresult.h"
32 * SECTION:gfilterinputstream
33 * @short_description: Filter Input Stream
44 static void g_filter_input_stream_set_property (GObject *object,
49 static void g_filter_input_stream_get_property (GObject *object,
53 static void g_filter_input_stream_finalize (GObject *object);
56 static gssize g_filter_input_stream_read (GInputStream *stream,
59 GCancellable *cancellable,
61 static gssize g_filter_input_stream_skip (GInputStream *stream,
63 GCancellable *cancellable,
65 static gboolean g_filter_input_stream_close (GInputStream *stream,
66 GCancellable *cancellable,
68 static void g_filter_input_stream_read_async (GInputStream *stream,
72 GCancellable *cancellable,
73 GAsyncReadyCallback callback,
75 static gssize g_filter_input_stream_read_finish (GInputStream *stream,
78 static void g_filter_input_stream_skip_async (GInputStream *stream,
81 GCancellable *cancellabl,
82 GAsyncReadyCallback callback,
84 static gssize g_filter_input_stream_skip_finish (GInputStream *stream,
87 static void g_filter_input_stream_close_async (GInputStream *stream,
89 GCancellable *cancellabl,
90 GAsyncReadyCallback callback,
92 static gboolean g_filter_input_stream_close_finish (GInputStream *stream,
96 G_DEFINE_TYPE (GFilterInputStream, g_filter_input_stream, G_TYPE_INPUT_STREAM)
98 #define GET_PRIVATE(inst) G_TYPE_INSTANCE_GET_PRIVATE (inst, \
99 G_TYPE_FILTER_INPUT_STREAM, GFilterInputStreamPrivate)
104 } GFilterInputStreamPrivate;
107 g_filter_input_stream_class_init (GFilterInputStreamClass *klass)
109 GObjectClass *object_class;
110 GInputStreamClass *istream_class;
112 object_class = G_OBJECT_CLASS (klass);
113 object_class->get_property = g_filter_input_stream_get_property;
114 object_class->set_property = g_filter_input_stream_set_property;
115 object_class->finalize = g_filter_input_stream_finalize;
117 istream_class = G_INPUT_STREAM_CLASS (klass);
118 istream_class->read_fn = g_filter_input_stream_read;
119 istream_class->skip = g_filter_input_stream_skip;
120 istream_class->close_fn = g_filter_input_stream_close;
122 istream_class->read_async = g_filter_input_stream_read_async;
123 istream_class->read_finish = g_filter_input_stream_read_finish;
124 istream_class->skip_async = g_filter_input_stream_skip_async;
125 istream_class->skip_finish = g_filter_input_stream_skip_finish;
126 istream_class->close_async = g_filter_input_stream_close_async;
127 istream_class->close_finish = g_filter_input_stream_close_finish;
129 g_type_class_add_private (klass, sizeof (GFilterInputStreamPrivate));
131 g_object_class_install_property (object_class,
133 g_param_spec_object ("base-stream",
134 P_("The Filter Base Stream"),
135 P_("The underlying base stream on which the io ops will be done."),
137 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
138 G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
140 g_object_class_install_property (object_class,
142 g_param_spec_boolean ("close-base-stream",
143 P_("Close Base Stream"),
144 P_("If the base stream should be closed when the filter stream is closed."),
145 TRUE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
146 G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
150 g_filter_input_stream_set_property (GObject *object,
155 GFilterInputStream *filter_stream;
158 filter_stream = G_FILTER_INPUT_STREAM (object);
162 case PROP_BASE_STREAM:
163 obj = g_value_dup_object (value);
164 filter_stream->base_stream = G_INPUT_STREAM (obj);
167 case PROP_CLOSE_BASE:
168 g_filter_input_stream_set_close_base_stream (filter_stream,
169 g_value_get_boolean (value));
173 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
180 g_filter_input_stream_get_property (GObject *object,
185 GFilterInputStream *filter_stream;
187 filter_stream = G_FILTER_INPUT_STREAM (object);
191 case PROP_BASE_STREAM:
192 g_value_set_object (value, filter_stream->base_stream);
195 case PROP_CLOSE_BASE:
196 g_value_set_boolean (value, GET_PRIVATE (filter_stream)->close_base);
200 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
207 g_filter_input_stream_finalize (GObject *object)
209 GFilterInputStream *stream;
211 stream = G_FILTER_INPUT_STREAM (object);
213 g_object_unref (stream->base_stream);
215 G_OBJECT_CLASS (g_filter_input_stream_parent_class)->finalize (object);
219 g_filter_input_stream_init (GFilterInputStream *stream)
225 * g_filter_input_stream_get_base_stream:
226 * @stream: a #GFilterInputStream.
228 * Gets the base stream for the filter stream.
230 * Returns: a #GInputStream.
233 g_filter_input_stream_get_base_stream (GFilterInputStream *stream)
235 g_return_val_if_fail (G_IS_FILTER_INPUT_STREAM (stream), NULL);
237 return stream->base_stream;
241 * g_filter_input_stream_get_close_base_stream:
242 * @stream: a #GFilterInputStream.
244 * Returns whether the base stream will be closed when @stream is
247 * Return value: %TRUE if the base stream will be closed.
250 g_filter_input_stream_get_close_base_stream (GFilterInputStream *stream)
252 g_return_val_if_fail (G_IS_FILTER_INPUT_STREAM (stream), FALSE);
254 return GET_PRIVATE (stream)->close_base;
258 * g_filter_input_stream_set_close_base_stream:
259 * @stream: a #GFilterInputStream.
260 * @close_base: %TRUE to close the base stream.
262 * Sets whether the base stream will be closed when @stream is closed.
265 g_filter_input_stream_set_close_base_stream (GFilterInputStream *stream,
268 GFilterInputStreamPrivate *priv;
270 g_return_if_fail (G_IS_FILTER_INPUT_STREAM (stream));
272 close_base = !!close_base;
274 priv = GET_PRIVATE (stream);
276 if (priv->close_base != close_base)
278 priv->close_base = close_base;
279 g_object_notify (G_OBJECT (stream), "close-base-stream");
284 g_filter_input_stream_read (GInputStream *stream,
287 GCancellable *cancellable,
290 GFilterInputStream *filter_stream;
291 GInputStream *base_stream;
294 filter_stream = G_FILTER_INPUT_STREAM (stream);
295 base_stream = filter_stream->base_stream;
297 nread = g_input_stream_read (base_stream,
307 g_filter_input_stream_skip (GInputStream *stream,
309 GCancellable *cancellable,
312 GFilterInputStream *filter_stream;
313 GInputStream *base_stream;
316 filter_stream = G_FILTER_INPUT_STREAM (stream);
317 base_stream = filter_stream->base_stream;
319 nskipped = g_input_stream_skip (base_stream,
327 g_filter_input_stream_close (GInputStream *stream,
328 GCancellable *cancellable,
333 if (GET_PRIVATE (stream)->close_base)
335 GFilterInputStream *filter_stream;
336 GInputStream *base_stream;
338 filter_stream = G_FILTER_INPUT_STREAM (stream);
339 base_stream = filter_stream->base_stream;
341 res = g_input_stream_close (base_stream,
350 g_filter_input_stream_read_async (GInputStream *stream,
354 GCancellable *cancellable,
355 GAsyncReadyCallback callback,
358 GFilterInputStream *filter_stream;
359 GInputStream *base_stream;
361 filter_stream = G_FILTER_INPUT_STREAM (stream);
362 base_stream = filter_stream->base_stream;
364 g_input_stream_read_async (base_stream,
374 g_filter_input_stream_read_finish (GInputStream *stream,
375 GAsyncResult *result,
378 GFilterInputStream *filter_stream;
379 GInputStream *base_stream;
382 filter_stream = G_FILTER_INPUT_STREAM (stream);
383 base_stream = filter_stream->base_stream;
385 nread = g_input_stream_read_finish (base_stream,
393 g_filter_input_stream_skip_async (GInputStream *stream,
396 GCancellable *cancellable,
397 GAsyncReadyCallback callback,
400 GFilterInputStream *filter_stream;
401 GInputStream *base_stream;
403 filter_stream = G_FILTER_INPUT_STREAM (stream);
404 base_stream = filter_stream->base_stream;
406 g_input_stream_skip_async (base_stream,
416 g_filter_input_stream_skip_finish (GInputStream *stream,
417 GAsyncResult *result,
420 GFilterInputStream *filter_stream;
421 GInputStream *base_stream;
424 filter_stream = G_FILTER_INPUT_STREAM (stream);
425 base_stream = filter_stream->base_stream;
427 nskipped = g_input_stream_skip_finish (base_stream,
435 g_filter_input_stream_close_ready (GObject *object,
436 GAsyncResult *result,
439 GSimpleAsyncResult *simple = user_data;
440 GError *error = NULL;
442 g_input_stream_close_finish (G_INPUT_STREAM (object), result, &error);
446 g_simple_async_result_set_from_error (simple, error);
447 g_error_free (error);
450 g_simple_async_result_complete (simple);
451 g_object_unref (simple);
455 g_filter_input_stream_close_async (GInputStream *stream,
457 GCancellable *cancellable,
458 GAsyncReadyCallback callback,
461 GSimpleAsyncResult *simple;
463 simple = g_simple_async_result_new (G_OBJECT (stream),
465 g_filter_input_stream_close_async);
467 if (GET_PRIVATE (stream)->close_base)
469 GFilterInputStream *filter_stream = G_FILTER_INPUT_STREAM (stream);
471 g_input_stream_close_async (filter_stream->base_stream,
472 io_priority, cancellable,
473 g_filter_input_stream_close_ready,
474 g_object_ref (simple));
478 g_simple_async_result_complete_in_idle (simple);
480 g_object_unref (simple);
484 g_filter_input_stream_close_finish (GInputStream *stream,
485 GAsyncResult *result,
488 GSimpleAsyncResult *simple;
490 g_return_val_if_fail (g_simple_async_result_is_valid (
491 result, G_OBJECT (stream), g_filter_input_stream_close_async), FALSE);
493 simple = G_SIMPLE_ASYNC_RESULT (result);
495 return !g_simple_async_result_propagate_error (simple, error);
498 #define __G_FILTER_INPUT_STREAM_C__
499 #include "gioaliasdef.c"