X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgfilterinputstream.c;h=1c69560e7f7147921c8ff6497a01db9b27820b81;hb=2138deb07ebb7d7e541c0cd35b966e107d1bf800;hp=9b40cbe3d593a0286955267b007b85a396f449f7;hpb=54e52e099e11e0fd6541ce97c16b9f2dd381eb91;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gfilterinputstream.c b/gio/gfilterinputstream.c index 9b40cbe..1c69560 100644 --- a/gio/gfilterinputstream.c +++ b/gio/gfilterinputstream.c @@ -13,27 +13,32 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General - * Public License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. + * Public License along with this library; if not, see . * * Author: Christian Kellner */ -#include +#include "config.h" #include "gfilterinputstream.h" #include "ginputstream.h" #include "glibintl.h" + /** * SECTION:gfilterinputstream - * @short_description: Filter Input Stream. + * @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, @@ -60,36 +65,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) @@ -103,26 +85,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 @@ -143,6 +125,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; @@ -157,8 +144,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) { @@ -166,6 +155,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; @@ -182,14 +175,12 @@ 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) { - } /** @@ -198,7 +189,7 @@ g_filter_input_stream_init (GFilterInputStream *stream) * * Gets the base stream for the filter stream. * - * Returns: a #GInputStream. + * Returns: (transfer none): a #GInputStream. **/ GInputStream * g_filter_input_stream_get_base_stream (GFilterInputStream *stream) @@ -208,12 +199,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. + * + * Returns: %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; @@ -232,10 +270,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; @@ -256,144 +294,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; - - 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; + GFilterInputStream *filter_stream = G_FILTER_INPUT_STREAM (stream); + GFilterInputStreamPrivate *priv = g_filter_input_stream_get_instance_private (filter_stream); + gboolean res = TRUE; - 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 */