X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgfilteroutputstream.c;h=9089579e335530ab2f48031901934147cbccd0dd;hb=2e5bd8cf47f9e1559ccc44823a2f321b8ff8c1ea;hp=a5468361534b70ea1e45fe9dd0b9e4725f844bdb;hpb=5247f12f3649726471080440de0d37b78c1cec33;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gfilteroutputstream.c b/gio/gfilteroutputstream.c index a546836..9089579 100644 --- a/gio/gfilteroutputstream.c +++ b/gio/gfilteroutputstream.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 "gfilteroutputstream.h" #include "goutputstream.h" #include "glibintl.h" + /** * SECTION:gfilteroutputstream * @short_description: Filter Output Stream + * @include: gio/gio.h * - **/ + * Base class for output 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_output_stream_set_property (GObject *object, @@ -59,38 +64,13 @@ static gboolean g_filter_output_stream_flush (GOutputStream *stream, static gboolean g_filter_output_stream_close (GOutputStream *stream, GCancellable *cancellable, GError **error); -static void g_filter_output_stream_write_async (GOutputStream *stream, - const void *buffer, - gsize count, - int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer data); -static gssize g_filter_output_stream_write_finish (GOutputStream *stream, - GAsyncResult *result, - GError **error); -static void g_filter_output_stream_flush_async (GOutputStream *stream, - int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer data); -static gboolean g_filter_output_stream_flush_finish (GOutputStream *stream, - GAsyncResult *result, - GError **error); -static void g_filter_output_stream_close_async (GOutputStream *stream, - int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer data); -static gboolean g_filter_output_stream_close_finish (GOutputStream *stream, - GAsyncResult *result, - GError **error); - - - -G_DEFINE_TYPE (GFilterOutputStream, g_filter_output_stream, G_TYPE_OUTPUT_STREAM) +typedef struct +{ + gboolean close_base; +} GFilterOutputStreamPrivate; +G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GFilterOutputStream, g_filter_output_stream, G_TYPE_OUTPUT_STREAM) static void g_filter_output_stream_class_init (GFilterOutputStreamClass *klass) @@ -104,32 +84,33 @@ g_filter_output_stream_class_init (GFilterOutputStreamClass *klass) object_class->dispose = g_filter_output_stream_dispose; ostream_class = G_OUTPUT_STREAM_CLASS (klass); - ostream_class->write = g_filter_output_stream_write; + ostream_class->write_fn = g_filter_output_stream_write; ostream_class->flush = g_filter_output_stream_flush; - ostream_class->close = g_filter_output_stream_close; - ostream_class->write_async = g_filter_output_stream_write_async; - ostream_class->write_finish = g_filter_output_stream_write_finish; - ostream_class->flush_async = g_filter_output_stream_flush_async; - ostream_class->flush_finish = g_filter_output_stream_flush_finish; - ostream_class->close_async = g_filter_output_stream_close_async; - ostream_class->close_finish = g_filter_output_stream_close_finish; + ostream_class->close_fn = g_filter_output_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_OUTPUT_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_ONLY | + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); } static void -g_filter_output_stream_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) +g_filter_output_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) { GFilterOutputStream *filter_stream; GObject *obj; @@ -143,6 +124,11 @@ g_filter_output_stream_set_property (GObject *object, filter_stream->base_stream = G_OUTPUT_STREAM (obj); break; + case PROP_CLOSE_BASE: + g_filter_output_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 +143,10 @@ g_filter_output_stream_get_property (GObject *object, GParamSpec *pspec) { GFilterOutputStream *filter_stream; + GFilterOutputStreamPrivate *priv; filter_stream = G_FILTER_OUTPUT_STREAM (object); + priv = g_filter_output_stream_get_instance_private (filter_stream); switch (prop_id) { @@ -166,6 +154,10 @@ g_filter_output_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,7 +168,7 @@ g_filter_output_stream_get_property (GObject *object, static void g_filter_output_stream_dispose (GObject *object) { - GFilterOutputStream *stream; + GFilterOutputStream *stream; stream = G_FILTER_OUTPUT_STREAM (object); @@ -195,6 +187,14 @@ g_filter_output_stream_init (GFilterOutputStream *stream) { } +/** + * g_filter_output_stream_get_base_stream: + * @stream: a #GFilterOutputStream. + * + * Gets the base stream for the filter stream. + * + * Returns: (transfer none): a #GOutputStream. + **/ GOutputStream * g_filter_output_stream_get_base_stream (GFilterOutputStream *stream) { @@ -203,170 +203,106 @@ g_filter_output_stream_get_base_stream (GFilterOutputStream *stream) return stream->base_stream; } -static gssize -g_filter_output_stream_write (GOutputStream *stream, - const void *buffer, - gsize count, - GCancellable *cancellable, - GError **error) +/** + * g_filter_output_stream_get_close_base_stream: + * @stream: a #GFilterOutputStream. + * + * Returns whether the base stream will be closed when @stream is + * closed. + * + * Returns: %TRUE if the base stream will be closed. + **/ +gboolean +g_filter_output_stream_get_close_base_stream (GFilterOutputStream *stream) { - GFilterOutputStream *filter_stream; - gssize nwritten; + GFilterOutputStreamPrivate *priv; - filter_stream = G_FILTER_OUTPUT_STREAM (stream); + g_return_val_if_fail (G_IS_FILTER_OUTPUT_STREAM (stream), FALSE); - nwritten = g_output_stream_write (filter_stream->base_stream, - buffer, - count, - cancellable, - error); + priv = g_filter_output_stream_get_instance_private (stream); - return nwritten; + return priv->close_base; } -static gboolean -g_filter_output_stream_flush (GOutputStream *stream, - GCancellable *cancellable, - GError **error) +/** + * g_filter_output_stream_set_close_base_stream: + * @stream: a #GFilterOutputStream. + * @close_base: %TRUE to close the base stream. + * + * Sets whether the base stream will be closed when @stream is closed. + **/ +void +g_filter_output_stream_set_close_base_stream (GFilterOutputStream *stream, + gboolean close_base) { - GFilterOutputStream *filter_stream; - gboolean res; + GFilterOutputStreamPrivate *priv; - filter_stream = G_FILTER_OUTPUT_STREAM (stream); + g_return_if_fail (G_IS_FILTER_OUTPUT_STREAM (stream)); - res = g_output_stream_flush (filter_stream->base_stream, - cancellable, - error); + close_base = !!close_base; - return res; -} - -static gboolean -g_filter_output_stream_close (GOutputStream *stream, - GCancellable *cancellable, - GError **error) -{ - GFilterOutputStream *filter_stream; - gboolean res; - - filter_stream = G_FILTER_OUTPUT_STREAM (stream); - - res = g_output_stream_close (filter_stream->base_stream, - cancellable, - error); - - return res; -} - -static void -g_filter_output_stream_write_async (GOutputStream *stream, - const void *buffer, - gsize count, - int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer data) -{ - GFilterOutputStream *filter_stream; - - filter_stream = G_FILTER_OUTPUT_STREAM (stream); - - g_output_stream_write_async (filter_stream->base_stream, - buffer, - count, - io_priority, - cancellable, - callback, - data); + priv = g_filter_output_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_output_stream_write_finish (GOutputStream *stream, - GAsyncResult *result, - GError **error) +g_filter_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) { GFilterOutputStream *filter_stream; gssize nwritten; filter_stream = G_FILTER_OUTPUT_STREAM (stream); - nwritten = g_output_stream_write_finish (filter_stream->base_stream, - result, - error); + nwritten = g_output_stream_write (filter_stream->base_stream, + buffer, + count, + cancellable, + error); return nwritten; } -static void -g_filter_output_stream_flush_async (GOutputStream *stream, - int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer data) -{ - GFilterOutputStream *filter_stream; - - filter_stream = G_FILTER_OUTPUT_STREAM (stream); - - g_output_stream_flush_async (filter_stream->base_stream, - io_priority, - cancellable, - callback, - data); -} - static gboolean -g_filter_output_stream_flush_finish (GOutputStream *stream, - GAsyncResult *result, - GError **error) +g_filter_output_stream_flush (GOutputStream *stream, + GCancellable *cancellable, + GError **error) { GFilterOutputStream *filter_stream; gboolean res; filter_stream = G_FILTER_OUTPUT_STREAM (stream); - res = g_output_stream_flush_finish (filter_stream->base_stream, - result, - error); + res = g_output_stream_flush (filter_stream->base_stream, + cancellable, + error); return res; } -static void -g_filter_output_stream_close_async (GOutputStream *stream, - int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer data) -{ - GFilterOutputStream *filter_stream; - - filter_stream = G_FILTER_OUTPUT_STREAM (stream); - - g_output_stream_close_async (filter_stream->base_stream, - io_priority, - cancellable, - callback, - data); -} - static gboolean -g_filter_output_stream_close_finish (GOutputStream *stream, - GAsyncResult *result, - GError **error) +g_filter_output_stream_close (GOutputStream *stream, + GCancellable *cancellable, + GError **error) { - GFilterOutputStream *filter_stream; - gboolean res; + GFilterOutputStream *filter_stream = G_FILTER_OUTPUT_STREAM (stream); + GFilterOutputStreamPrivate *priv = g_filter_output_stream_get_instance_private (filter_stream); + gboolean res = TRUE; - filter_stream = G_FILTER_OUTPUT_STREAM (stream); - - res = g_output_stream_close_finish (filter_stream->base_stream, - result, - error); + if (priv->close_base) + { + res = g_output_stream_close (filter_stream->base_stream, + cancellable, + error); + } return res; } - - -/* vim: ts=2 sw=2 et */