X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgdataoutputstream.c;h=ea7deb139c6ce43506a117bcf69e64eca0e434ca;hb=25990eb2b6da94e1d03631eab8a952ef84cb9986;hp=e03003b3699f8d010c6d2f8d14485892cf3f1d1e;hpb=d8ca6404229e5b64d2bf2e1a3660ad9fe7feefdd;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);
+}