X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgfilterinputstream.c;h=d90dbac6b0d6b448b91cbb18aa3872d4987f9841;hb=54cc43630ddf724722ebdfc1d6906dc1986b773d;hp=6d2f99a33d170b0d4850deb0e719f55daf6f432e;hpb=3781343738de4abddf56982325a77bd70a98cd26;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gfilterinputstream.c b/gio/gfilterinputstream.c index 6d2f99a..d90dbac 100644 --- a/gio/gfilterinputstream.c +++ b/gio/gfilterinputstream.c @@ -20,14 +20,27 @@ * Author: Christian Kellner */ -#include +#include "config.h" #include "gfilterinputstream.h" #include "ginputstream.h" #include "glibintl.h" + +/** + * SECTION:gfilterinputstream + * @short_description: Filter Input Stream + * @include: gio/gio.h + * + * Base class for input stream implementations that perform some + * kind of filtering operation on a base stream. Typical examples + * of filtering operations are character set conversion, compression + * and byte order flipping. + **/ + enum { PROP_0, - PROP_BASE_STREAM + PROP_BASE_STREAM, + PROP_CLOSE_BASE }; static void g_filter_input_stream_set_property (GObject *object, @@ -54,36 +67,13 @@ static gssize g_filter_input_stream_skip (GInputStream *stream static gboolean g_filter_input_stream_close (GInputStream *stream, GCancellable *cancellable, GError **error); -static void g_filter_input_stream_read_async (GInputStream *stream, - void *buffer, - gsize count, - int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); -static gssize g_filter_input_stream_read_finish (GInputStream *stream, - GAsyncResult *result, - GError **error); -static void g_filter_input_stream_skip_async (GInputStream *stream, - gsize count, - int io_priority, - GCancellable *cancellabl, - GAsyncReadyCallback callback, - gpointer datae); -static gssize g_filter_input_stream_skip_finish (GInputStream *stream, - GAsyncResult *result, - GError **error); -static void g_filter_input_stream_close_async (GInputStream *stream, - int io_priority, - GCancellable *cancellabl, - GAsyncReadyCallback callback, - gpointer data); -static gboolean g_filter_input_stream_close_finish (GInputStream *stream, - GAsyncResult *result, - GError **error); -G_DEFINE_TYPE (GFilterInputStream, g_filter_input_stream, G_TYPE_INPUT_STREAM) +typedef struct +{ + gboolean close_base; +} GFilterInputStreamPrivate; +G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GFilterInputStream, g_filter_input_stream, G_TYPE_INPUT_STREAM) static void g_filter_input_stream_class_init (GFilterInputStreamClass *klass) @@ -97,26 +87,26 @@ g_filter_input_stream_class_init (GFilterInputStreamClass *klass) object_class->finalize = g_filter_input_stream_finalize; istream_class = G_INPUT_STREAM_CLASS (klass); - istream_class->read = g_filter_input_stream_read; + istream_class->read_fn = g_filter_input_stream_read; istream_class->skip = g_filter_input_stream_skip; - istream_class->close = g_filter_input_stream_close; - - istream_class->read_async = g_filter_input_stream_read_async; - istream_class->read_finish = g_filter_input_stream_read_finish; - istream_class->skip_async = g_filter_input_stream_skip_async; - istream_class->skip_finish = g_filter_input_stream_skip_finish; - istream_class->close_async = g_filter_input_stream_close_async; - istream_class->close_finish = g_filter_input_stream_close_finish; + istream_class->close_fn = g_filter_input_stream_close; g_object_class_install_property (object_class, PROP_BASE_STREAM, g_param_spec_object ("base-stream", P_("The Filter Base Stream"), - P_("The underlying base stream the io ops will be done on"), + P_("The underlying base stream on which the io ops will be done."), G_TYPE_INPUT_STREAM, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); + g_object_class_install_property (object_class, + PROP_CLOSE_BASE, + g_param_spec_boolean ("close-base-stream", + P_("Close Base Stream"), + P_("If the base stream should be closed when the filter stream is closed."), + TRUE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); } static void @@ -137,6 +127,11 @@ g_filter_input_stream_set_property (GObject *object, filter_stream->base_stream = G_INPUT_STREAM (obj); break; + case PROP_CLOSE_BASE: + g_filter_input_stream_set_close_base_stream (filter_stream, + g_value_get_boolean (value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -151,8 +146,10 @@ g_filter_input_stream_get_property (GObject *object, GParamSpec *pspec) { GFilterInputStream *filter_stream; + GFilterInputStreamPrivate *priv; filter_stream = G_FILTER_INPUT_STREAM (object); + priv = g_filter_input_stream_get_instance_private (filter_stream); switch (prop_id) { @@ -160,6 +157,10 @@ g_filter_input_stream_get_property (GObject *object, g_value_set_object (value, filter_stream->base_stream); break; + case PROP_CLOSE_BASE: + g_value_set_boolean (value, priv->close_base); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -176,21 +177,21 @@ g_filter_input_stream_finalize (GObject *object) g_object_unref (stream->base_stream); - if (G_OBJECT_CLASS (g_filter_input_stream_parent_class)->finalize) - (*G_OBJECT_CLASS (g_filter_input_stream_parent_class)->finalize) (object); + G_OBJECT_CLASS (g_filter_input_stream_parent_class)->finalize (object); } static void g_filter_input_stream_init (GFilterInputStream *stream) { - } /** * g_filter_input_stream_get_base_stream: * @stream: a #GFilterInputStream. * - * Returns: a #GInputStream. + * Gets the base stream for the filter stream. + * + * Returns: (transfer none): a #GInputStream. **/ GInputStream * g_filter_input_stream_get_base_stream (GFilterInputStream *stream) @@ -200,12 +201,59 @@ g_filter_input_stream_get_base_stream (GFilterInputStream *stream) return stream->base_stream; } +/** + * g_filter_input_stream_get_close_base_stream: + * @stream: a #GFilterInputStream. + * + * Returns whether the base stream will be closed when @stream is + * closed. + * + * Return value: %TRUE if the base stream will be closed. + **/ +gboolean +g_filter_input_stream_get_close_base_stream (GFilterInputStream *stream) +{ + GFilterInputStreamPrivate *priv; + + g_return_val_if_fail (G_IS_FILTER_INPUT_STREAM (stream), FALSE); + + priv = g_filter_input_stream_get_instance_private (stream); + + return priv->close_base; +} + +/** + * g_filter_input_stream_set_close_base_stream: + * @stream: a #GFilterInputStream. + * @close_base: %TRUE to close the base stream. + * + * Sets whether the base stream will be closed when @stream is closed. + **/ +void +g_filter_input_stream_set_close_base_stream (GFilterInputStream *stream, + gboolean close_base) +{ + GFilterInputStreamPrivate *priv; + + g_return_if_fail (G_IS_FILTER_INPUT_STREAM (stream)); + + close_base = !!close_base; + + priv = g_filter_input_stream_get_instance_private (stream); + + if (priv->close_base != close_base) + { + priv->close_base = close_base; + g_object_notify (G_OBJECT (stream), "close-base-stream"); + } +} + static gssize -g_filter_input_stream_read (GInputStream *stream, - void *buffer, - gsize count, - GCancellable *cancellable, - GError **error) +g_filter_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) { GFilterInputStream *filter_stream; GInputStream *base_stream; @@ -224,10 +272,10 @@ g_filter_input_stream_read (GInputStream *stream, } static gssize -g_filter_input_stream_skip (GInputStream *stream, - gsize count, - GCancellable *cancellable, - GError **error) +g_filter_input_stream_skip (GInputStream *stream, + gsize count, + GCancellable *cancellable, + GError **error) { GFilterInputStream *filter_stream; GInputStream *base_stream; @@ -248,144 +296,16 @@ g_filter_input_stream_close (GInputStream *stream, GCancellable *cancellable, GError **error) { - GFilterInputStream *filter_stream; - GInputStream *base_stream; - gboolean res; - - filter_stream = G_FILTER_INPUT_STREAM (stream); - base_stream = filter_stream->base_stream; - - res = g_input_stream_close (base_stream, - cancellable, - error); - - return res; -} - -static void -g_filter_input_stream_read_async (GInputStream *stream, - void *buffer, - gsize count, - int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GFilterInputStream *filter_stream; - GInputStream *base_stream; - - filter_stream = G_FILTER_INPUT_STREAM (stream); - base_stream = filter_stream->base_stream; + GFilterInputStream *filter_stream = G_FILTER_INPUT_STREAM (stream); + GFilterInputStreamPrivate *priv = g_filter_input_stream_get_instance_private (filter_stream); + gboolean res = TRUE; - g_input_stream_read_async (base_stream, - buffer, - count, - io_priority, - cancellable, - callback, - user_data); -} - -static gssize -g_filter_input_stream_read_finish (GInputStream *stream, - GAsyncResult *result, - GError **error) -{ - GFilterInputStream *filter_stream; - GInputStream *base_stream; - gssize nread; - - filter_stream = G_FILTER_INPUT_STREAM (stream); - base_stream = filter_stream->base_stream; - - nread = g_input_stream_read_finish (base_stream, - result, - error); - - return nread; -} - -static void -g_filter_input_stream_skip_async (GInputStream *stream, - gsize count, - int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GFilterInputStream *filter_stream; - GInputStream *base_stream; - - filter_stream = G_FILTER_INPUT_STREAM (stream); - base_stream = filter_stream->base_stream; - - g_input_stream_skip_async (base_stream, - count, - io_priority, - cancellable, - callback, - user_data); - -} - -static gssize -g_filter_input_stream_skip_finish (GInputStream *stream, - GAsyncResult *result, - GError **error) -{ - GFilterInputStream *filter_stream; - GInputStream *base_stream; - gssize nskipped; - - filter_stream = G_FILTER_INPUT_STREAM (stream); - base_stream = filter_stream->base_stream; - - nskipped = g_input_stream_skip_finish (base_stream, - result, - error); - - return nskipped; -} - -static void -g_filter_input_stream_close_async (GInputStream *stream, - int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GFilterInputStream *filter_stream; - GInputStream *base_stream; - - filter_stream = G_FILTER_INPUT_STREAM (stream); - base_stream = filter_stream->base_stream; - - g_input_stream_close_async (base_stream, - io_priority, - cancellable, - callback, - user_data); - - -} - -static gboolean -g_filter_input_stream_close_finish (GInputStream *stream, - GAsyncResult *result, - GError **error) -{ - GFilterInputStream *filter_stream; - GInputStream *base_stream; - gboolean res; - - filter_stream = G_FILTER_INPUT_STREAM (stream); - base_stream = filter_stream->base_stream; - - res = g_input_stream_close_finish (stream, - result, - error); + if (priv->close_base) + { + res = g_input_stream_close (filter_stream->base_stream, + cancellable, + error); + } return res; } - -/* vim: ts=2 sw=2 et */