X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgdataoutputstream.c;h=ea7deb139c6ce43506a117bcf69e64eca0e434ca;hb=e608ec7b2e47d29fa189fca6e97f484f41c115a4;hp=e03003b3699f8d010c6d2f8d14485892cf3f1d1e;hpb=631d0c3534661e549f7df18fbb9832bdf19c5eaf;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gdataoutputstream.c b/gio/gdataoutputstream.c index e03003b..ea7deb1 100644 --- a/gio/gdataoutputstream.c +++ b/gio/gdataoutputstream.c @@ -13,9 +13,7 @@ * 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: Alexander Larsson */ @@ -23,7 +21,9 @@ #include "config.h" #include #include "gdataoutputstream.h" +#include "gseekable.h" #include "gioenumtypes.h" +#include "gioerror.h" #include "glibintl.h" @@ -58,9 +58,26 @@ static void g_data_output_stream_get_property (GObject *object, GValue *value, GParamSpec *pspec); -G_DEFINE_TYPE (GDataOutputStream, - g_data_output_stream, - G_TYPE_FILTER_OUTPUT_STREAM) +static void g_data_output_stream_seekable_iface_init (GSeekableIface *iface); +static goffset g_data_output_stream_tell (GSeekable *seekable); +static gboolean g_data_output_stream_can_seek (GSeekable *seekable); +static gboolean g_data_output_stream_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error); +static gboolean g_data_output_stream_can_truncate (GSeekable *seekable); +static gboolean g_data_output_stream_truncate (GSeekable *seekable, + goffset offset, + GCancellable *cancellable, + GError **error); + +G_DEFINE_TYPE_WITH_CODE (GDataOutputStream, + g_data_output_stream, + G_TYPE_FILTER_OUTPUT_STREAM, + G_ADD_PRIVATE (GDataOutputStream) + G_IMPLEMENT_INTERFACE (G_TYPE_SEEKABLE, + g_data_output_stream_seekable_iface_init)) static void @@ -68,8 +85,6 @@ g_data_output_stream_class_init (GDataOutputStreamClass *klass) { GObjectClass *object_class; - g_type_class_add_private (klass, sizeof (GDataOutputStreamPrivate)); - object_class = G_OBJECT_CLASS (klass); object_class->get_property = g_data_output_stream_get_property; object_class->set_property = g_data_output_stream_set_property; @@ -140,13 +155,20 @@ g_data_output_stream_get_property (GObject *object, static void g_data_output_stream_init (GDataOutputStream *stream) { - stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, - G_TYPE_DATA_OUTPUT_STREAM, - GDataOutputStreamPrivate); - + stream->priv = g_data_output_stream_get_instance_private (stream); stream->priv->byte_order = G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN; } +static void +g_data_output_stream_seekable_iface_init (GSeekableIface *iface) +{ + iface->tell = g_data_output_stream_tell; + iface->can_seek = g_data_output_stream_can_seek; + iface->seek = g_data_output_stream_seek; + iface->can_truncate = g_data_output_stream_can_truncate; + iface->truncate_fn = g_data_output_stream_truncate; +} + /** * g_data_output_stream_new: * @base_stream: a #GOutputStream. @@ -500,3 +522,77 @@ g_data_output_stream_put_string (GDataOutputStream *stream, &bytes_written, cancellable, error); } + +static goffset +g_data_output_stream_tell (GSeekable *seekable) +{ + GOutputStream *base_stream; + GSeekable *base_stream_seekable; + + base_stream = G_FILTER_OUTPUT_STREAM (seekable)->base_stream; + if (!G_IS_SEEKABLE (base_stream)) + return 0; + base_stream_seekable = G_SEEKABLE (base_stream); + return g_seekable_tell (base_stream_seekable); +} + +static gboolean +g_data_output_stream_can_seek (GSeekable *seekable) +{ + GOutputStream *base_stream; + + base_stream = G_FILTER_OUTPUT_STREAM (seekable)->base_stream; + return G_IS_SEEKABLE (base_stream) && g_seekable_can_seek (G_SEEKABLE (base_stream)); +} + +static gboolean +g_data_output_stream_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error) +{ + GOutputStream *base_stream; + GSeekable *base_stream_seekable; + + base_stream = G_FILTER_OUTPUT_STREAM (seekable)->base_stream; + if (!G_IS_SEEKABLE (base_stream)) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Seek not supported on base stream")); + return FALSE; + } + + base_stream_seekable = G_SEEKABLE (base_stream); + return g_seekable_seek (base_stream_seekable, offset, type, cancellable, error); +} + +static gboolean +g_data_output_stream_can_truncate (GSeekable *seekable) +{ + GOutputStream *base_stream; + + base_stream = G_FILTER_OUTPUT_STREAM (seekable)->base_stream; + return G_IS_SEEKABLE (base_stream) && g_seekable_can_truncate (G_SEEKABLE (base_stream)); +} + +static gboolean +g_data_output_stream_truncate (GSeekable *seekable, + goffset offset, + GCancellable *cancellable, + GError **error) +{ + GOutputStream *base_stream; + GSeekable *base_stream_seekable; + + base_stream = G_FILTER_OUTPUT_STREAM (seekable)->base_stream; + if (!G_IS_SEEKABLE (base_stream)) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Truncate not supported on base stream")); + return FALSE; + } + + base_stream_seekable = G_SEEKABLE (base_stream); + return g_seekable_truncate (base_stream_seekable, offset, cancellable, error); +}