+ base_stream_seekable = G_SEEKABLE (base_stream);
+ flushed = flush_buffer (bstream, cancellable, error);
+ if (!flushed)
+ return FALSE;
+
+ return g_seekable_seek (base_stream_seekable, offset, type, cancellable, error);
+}
+
+static gboolean
+g_buffered_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_buffered_output_stream_truncate (GSeekable *seekable,
+ goffset offset,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GBufferedOutputStream *bstream;
+ GOutputStream *base_stream;
+ GSeekable *base_stream_seekable;
+ gboolean flushed;
+
+ bstream = G_BUFFERED_OUTPUT_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);
+
+ flushed = flush_buffer (bstream, cancellable, error);
+ if (!flushed)
+ return FALSE;
+ return g_seekable_truncate (base_stream_seekable, offset, cancellable, error);