/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */ /* camel-stream.c : abstract class for a stream * * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) * * This library is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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, see . * * Authors: Michael Zucchi */ #ifdef HAVE_CONFIG_H #include #endif #include #include "camel-stream-null.h" static void camel_stream_null_seekable_init (GSeekableIface *iface); G_DEFINE_TYPE_WITH_CODE (CamelStreamNull, camel_stream_null, CAMEL_TYPE_STREAM, G_IMPLEMENT_INTERFACE (G_TYPE_SEEKABLE, camel_stream_null_seekable_init)) static gssize stream_null_write (CamelStream *stream, const gchar *buffer, gsize n, GCancellable *cancellable, GError **error) { CAMEL_STREAM_NULL (stream)->written += n; return n; } static gboolean stream_null_eos (CamelStream *stream) { return TRUE; } static goffset stream_null_tell (GSeekable *seekable) { return 0; } static gboolean stream_null_can_seek (GSeekable *seekable) { return TRUE; } static gboolean stream_null_seek (GSeekable *seekable, goffset offset, GSeekType type, GCancellable *cancellable, GError **error) { if (type != G_SEEK_SET || offset != 0) { g_set_error_literal ( error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, _("Only reset to beginning is supported with CamelHttpStream")); return FALSE; } CAMEL_STREAM_NULL (seekable)->written = 0; return TRUE; } static gboolean stream_null_can_truncate (GSeekable *seekable) { return FALSE; } static gboolean stream_null_truncate_fn (GSeekable *seekable, goffset offset, GCancellable *cancellable, GError **error) { /* XXX Don't bother translating this. Camel never calls it. */ g_set_error_literal ( error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, "Truncation is not supported"); return FALSE; } static void camel_stream_null_class_init (CamelStreamNullClass *class) { CamelStreamClass *stream_class; stream_class = CAMEL_STREAM_CLASS (class); stream_class->write = stream_null_write; stream_class->eos = stream_null_eos; } static void camel_stream_null_seekable_init (GSeekableIface *iface) { iface->tell = stream_null_tell; iface->can_seek = stream_null_can_seek; iface->seek = stream_null_seek; iface->can_truncate = stream_null_can_truncate; iface->truncate_fn = stream_null_truncate_fn; } static void camel_stream_null_init (CamelStreamNull *stream_null) { } /** * camel_stream_null_new: * * Returns a null stream. A null stream is always at eof, and * always returns success for all reads and writes. * * Returns: a new #CamelStreamNull **/ CamelStream * camel_stream_null_new (void) { return g_object_new (CAMEL_TYPE_STREAM_NULL, NULL); }