X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgfilteroutputstream.c;h=9089579e335530ab2f48031901934147cbccd0dd;hb=4482977238ae80f64c2fe318d1500f4662c73980;hp=c9ec99865d1278e3b2ad8ec2c9d827aa65acd5bc;hpb=f3144c7efe8c84f7a00bff9b796d5e73efc151cf;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gfilteroutputstream.c b/gio/gfilteroutputstream.c index c9ec998..9089579 100644 --- a/gio/gfilteroutputstream.c +++ b/gio/gfilteroutputstream.c @@ -13,30 +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" -#include "gioalias.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, @@ -62,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) @@ -110,22 +87,23 @@ g_filter_output_stream_class_init (GFilterOutputStreamClass *klass) ostream_class->write_fn = g_filter_output_stream_write; ostream_class->flush = g_filter_output_stream_flush; ostream_class->close_fn = 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; 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 @@ -146,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; @@ -160,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) { @@ -169,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; @@ -204,7 +193,7 @@ g_filter_output_stream_init (GFilterOutputStream *stream) * * Gets the base stream for the filter stream. * - * Returns: a #GOutputStream. + * Returns: (transfer none): a #GOutputStream. **/ GOutputStream * g_filter_output_stream_get_base_stream (GFilterOutputStream *stream) @@ -214,6 +203,53 @@ g_filter_output_stream_get_base_stream (GFilterOutputStream *stream) return stream->base_stream; } +/** + * 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) +{ + GFilterOutputStreamPrivate *priv; + + g_return_val_if_fail (G_IS_FILTER_OUTPUT_STREAM (stream), FALSE); + + priv = g_filter_output_stream_get_instance_private (stream); + + return priv->close_base; +} + +/** + * 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) +{ + GFilterOutputStreamPrivate *priv; + + g_return_if_fail (G_IS_FILTER_OUTPUT_STREAM (stream)); + + close_base = !!close_base; + + 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 (GOutputStream *stream, const void *buffer, @@ -257,127 +293,16 @@ 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); + GFilterOutputStream *filter_stream = G_FILTER_OUTPUT_STREAM (stream); + GFilterOutputStreamPrivate *priv = g_filter_output_stream_get_instance_private (filter_stream); + gboolean res = TRUE; - g_output_stream_write_async (filter_stream->base_stream, - buffer, - count, - io_priority, - cancellable, - callback, - data); - -} - -static gssize -g_filter_output_stream_write_finish (GOutputStream *stream, - GAsyncResult *result, - 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); - - 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) -{ - GFilterOutputStream *filter_stream; - gboolean res; - - filter_stream = G_FILTER_OUTPUT_STREAM (stream); - - res = g_output_stream_flush_finish (filter_stream->base_stream, - result, - 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) -{ - GFilterOutputStream *filter_stream; - gboolean res; - - 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; } - -#define __G_FILTER_OUTPUT_STREAM_C__ -#include "gioaliasdef.c"