From 48661ab9a456c8590f2f83b4c6591e43e680f734 Mon Sep 17 00:00:00 2001 From: bertrand Date: Tue, 25 Jan 2000 01:09:56 +0000 Subject: [PATCH] parent class is now CamelSeekableStream idem idem idem idem (_seek): 2000-01-24 bertrand * camel/camel-seekable-stream.c: * camel/camel-seekable-stream.h: * camel/camel-simple-data-wrapper-stream.h: parent class is now CamelSeekableStream * camel/camel-stream-buffered-fs.h: idem * camel/camel-stream-buffered-fs.c: idem * camel/camel-stream-mem.h: idem * camel/camel-stream-mem.c: idem (_seek): change declaration * camel/camel-stream-fs.c: parent class is now CamelSeekableStream (_seek): change declaration * camel/camel-stream-fs.h: parent class is now CamelSeekableStream Major compatible change in the stream hierarchy. Removed the seek method from the general streams so that we can use them as "DataSources". --- camel/Makefile.am | 2 + camel/camel-seekable-stream.c | 112 +++++++++++++++++++++++++++++++ camel/camel-seekable-stream.h | 87 ++++++++++++++++++++++++ camel/camel-simple-data-wrapper-stream.c | 2 +- camel/camel-simple-data-wrapper-stream.h | 4 +- camel/camel-stream-buffered-fs.c | 4 +- camel/camel-stream-fs.c | 14 ++-- camel/camel-stream-fs.h | 7 +- camel/camel-stream-mem.c | 12 ++-- camel/camel-stream-mem.h | 7 +- camel/camel-stream.c | 24 ------- camel/camel-stream.h | 8 --- 12 files changed, 230 insertions(+), 53 deletions(-) create mode 100644 camel/camel-seekable-stream.c create mode 100644 camel/camel-seekable-stream.h diff --git a/camel/Makefile.am b/camel/Makefile.am index 9e46826..2003a95 100644 --- a/camel/Makefile.am +++ b/camel/Makefile.am @@ -52,6 +52,7 @@ libcamel_la_SOURCES = \ camel-op-queue.c \ camel-provider.c \ camel-recipient.c \ + camel-seekable-stream.c \ camel-service.c \ camel-session.c \ camel-store.c \ @@ -92,6 +93,7 @@ libcamelinclude_HEADERS = \ camel-op-queue.h \ camel-provider.h \ camel-recipient.h \ + camel-seekable-stream.h \ camel-service.h \ camel-session.h \ camel-store.h \ diff --git a/camel/camel-seekable-stream.c b/camel/camel-seekable-stream.c new file mode 100644 index 0000000..00cca3e --- /dev/null +++ b/camel/camel-seekable-stream.c @@ -0,0 +1,112 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + +/* + * + * Author : + * Bertrand Guiheneuf + * + * Copyright 1999, 2000 HelixCode (http://www.helixcode.com) . + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + + + +#include +#include "camel-seekable-stream.h" +#include "camel-log.h" + +static CamelStreamClass *parent_class=NULL; + + +/* Returns the class for a CamelSeekableStream */ +#define CSS_CLASS(so) CAMEL_SEEKABLE_STREAM_CLASS (GTK_OBJECT(so)->klass) + +static gint _seek (CamelSeekableStream *stream, gint offset, CamelStreamSeekPolicy policy); + + +static void +camel_seekable_stream_class_init (CamelSeekableStreamClass *camel_seekable_stream_class) +{ + CamelStreamClass *camel_stream_class = CAMEL_STREAM_CLASS (camel_seekable_stream_class); + GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_seekable_stream_class); + + parent_class = gtk_type_class (camel_stream_get_type ()); + + camel_seekable_stream_class->seek = _seek; + +} + +GtkType +camel_seekable_stream_get_type (void) +{ + static GtkType camel_seekable_stream_type = 0; + + if (!camel_seekable_stream_type) { + GtkTypeInfo camel_seekable_stream_info = + { + "CamelSeekableStream", + sizeof (CamelSeekableStream), + sizeof (CamelSeekableStreamClass), + (GtkClassInitFunc) camel_seekable_stream_class_init, + (GtkObjectInitFunc) NULL, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL, + }; + + camel_seekable_stream_type = gtk_type_unique (camel_stream_get_type (), &camel_seekable_stream_info); + } + + return camel_seekable_stream_type; +} + + + + +static gint +_seek (CamelSeekableStream *stream, gint offset, CamelStreamSeekPolicy policy) +{ + return -1; +} + + + + + + + +/** + * camel_stream_seek: + * @stream: a CamelStream object. + * @offset: offset value + * @policy: what to do with the offset + * + * + * + * Return value: new position, -1 if operation failed. + **/ +gint +camel_stream_seek (CamelSeekableStream *stream, gint offset, CamelStreamSeekPolicy policy) +{ + return CSS_CLASS (stream)->seek (stream, offset, policy); +} + + + + + + diff --git a/camel/camel-seekable-stream.h b/camel/camel-seekable-stream.h new file mode 100644 index 0000000..7f00edc --- /dev/null +++ b/camel/camel-seekable-stream.h @@ -0,0 +1,87 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* camel-stream-fs.h :stream based on unix filesystem */ + +/* + * + * Author : + * Bertrand Guiheneuf + * + * Copyright 1999, 2000 HelixCode (http://www.helixcode.com) . + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + + +#ifndef CAMEL_SEEKABLE_STREAM_H +#define CAMEL_SEEKABLE_STREAM_H 1 + + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus }*/ + +#include +#include +#include "camel-stream.h" + +#define CAMEL_SEEKABLE_STREAM_TYPE (camel_seekable_stream_get_type ()) +#define CAMEL_SEEKABLE_STREAM(obj) (GTK_CHECK_CAST((obj), CAMEL_SEEKABLE_STREAM_TYPE, CamelSeekableStream)) +#define CAMEL_SEEKABLE_STREAM_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_SEEKABLE_STREAM_TYPE, CamelSeekableStreamClass)) +#define CAMEL_IS_SEEKABLE_STREAM(o) (GTK_CHECK_TYPE((o), CAMEL_SEEKABLE_STREAM_TYPE)) + + +typedef enum +{ + CAMEL_STREAM_SET, + CAMEL_STREAM_CUR, + CAMEL_STREAM_END + +} CamelStreamSeekPolicy; + + +typedef struct +{ + CamelStream parent_object; + +} CamelSeekableStream; + + + +typedef struct { + CamelStreamClass parent_class; + + /* Virtual methods */ + gint (*seek) (CamelSeekableStream *stream, gint offset, CamelStreamSeekPolicy policy); + + +} CamelSeekableStreamClass; + + + +/* Standard Gtk function */ +GtkType camel_seekable_stream_get_type (void); + + +/* public methods */ +gint camel_stream_seek (CamelSeekableStream *stream, gint offset, CamelStreamSeekPolicy policy); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* CAMEL_SEEKABLE_STREAM_H */ diff --git a/camel/camel-simple-data-wrapper-stream.c b/camel/camel-simple-data-wrapper-stream.c index 2b5704b..5103e13 100644 --- a/camel/camel-simple-data-wrapper-stream.c +++ b/camel/camel-simple-data-wrapper-stream.c @@ -144,7 +144,7 @@ close (CamelStream *stream) } static gint -seek (CamelStream *stream, +seek (CamelSeekableStream *stream, gint offset, CamelStreamSeekPolicy policy) { diff --git a/camel/camel-simple-data-wrapper-stream.h b/camel/camel-simple-data-wrapper-stream.h index 094f15f..9c756a5 100644 --- a/camel/camel-simple-data-wrapper-stream.h +++ b/camel/camel-simple-data-wrapper-stream.h @@ -31,6 +31,8 @@ #include #include "camel-simple-data-wrapper.h" +#include "camel-seekable-stream.h" + #ifdef __cplusplus extern "C" { @@ -53,7 +55,7 @@ typedef struct _CamelSimpleDataWrapperStream CamelSimpleDataWrapperStream; typedef struct _CamelSimpleDataWrapperStreamClass CamelSimpleDataWrapperStreamClass; struct _CamelSimpleDataWrapperStream { - CamelStream parent; + CamelSeekableStream parent; CamelSimpleDataWrapper *wrapper; gint current_position; diff --git a/camel/camel-stream-buffered-fs.c b/camel/camel-stream-buffered-fs.c index c42f47a..0aba2e2 100644 --- a/camel/camel-stream-buffered-fs.c +++ b/camel/camel-stream-buffered-fs.c @@ -47,7 +47,7 @@ static void _flush (CamelStream *stream); static gint _available (CamelStream *stream); static gboolean _eos (CamelStream *stream); static void _close (CamelStream *stream); -static gint _seek (CamelStream *stream, gint offset, CamelStreamSeekPolicy policy); +static gint _seek (CamelSeekableStream *stream, gint offset, CamelStreamSeekPolicy policy); static void _finalize (GtkObject *object); static void _destroy (GtkObject *object); @@ -259,7 +259,7 @@ _close (CamelStream *stream) static gint -_seek (CamelStream *stream, gint offset, CamelStreamSeekPolicy policy) +_seek (CamelSeekableStream *stream, gint offset, CamelStreamSeekPolicy policy) { return 0; } diff --git a/camel/camel-stream-fs.c b/camel/camel-stream-fs.c index 905582a..acff587 100644 --- a/camel/camel-stream-fs.c +++ b/camel/camel-stream-fs.c @@ -34,7 +34,7 @@ #include #include "camel-log.h" -static CamelStreamClass *parent_class=NULL; +static CamelSeekableStreamClass *parent_class=NULL; /* Returns the class for a CamelStreamFS */ @@ -46,7 +46,7 @@ static void _flush (CamelStream *stream); static gint _available (CamelStream *stream); static gboolean _eos (CamelStream *stream); static void _close (CamelStream *stream); -static gint _seek (CamelStream *stream, gint offset, CamelStreamSeekPolicy policy); +static gint _seek (CamelSeekableStream *stream, gint offset, CamelStreamSeekPolicy policy); static void _finalize (GtkObject *object); static void _destroy (GtkObject *object); @@ -60,6 +60,7 @@ static void _init_with_name_and_bounds (CamelStreamFs *stream_fs, const gchar *n static void camel_stream_fs_class_init (CamelStreamFsClass *camel_stream_fs_class) { + CamelSeekableStreamClass *camel_seekable_stream_class = CAMEL_SEEKABLE_STREAM_CLASS (camel_stream_fs_class); CamelStreamClass *camel_stream_class = CAMEL_STREAM_CLASS (camel_stream_fs_class); GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_stream_fs_class); @@ -78,7 +79,8 @@ camel_stream_fs_class_init (CamelStreamFsClass *camel_stream_fs_class) camel_stream_class->available = _available; camel_stream_class->eos = _eos; camel_stream_class->close = _close; - camel_stream_class->seek = _seek; + + camel_seekable_stream_class->seek = _seek; gtk_object_class->finalize = _finalize; gtk_object_class->destroy = _destroy; @@ -112,7 +114,7 @@ camel_stream_fs_get_type (void) (GtkClassInitFunc) NULL, }; - camel_stream_fs_type = gtk_type_unique (camel_stream_get_type (), &camel_stream_fs_info); + camel_stream_fs_type = gtk_type_unique (camel_seekable_stream_get_type (), &camel_stream_fs_info); } return camel_stream_fs_type; @@ -375,7 +377,7 @@ _write (CamelStream *stream, const gchar *buffer, gint n) CAMEL_LOG_FULL_DEBUG ( "CamelStreamFs:: entering write. n=%d\n", n); if (stream_fs->sup_bound != -1) - nb_to_write = MIN (stream_fs->sup_bound - stream_fs->cur_pos, n);; + nb_to_write = MIN (stream_fs->sup_bound - stream_fs->cur_pos, n); else nb_to_write = n; @@ -459,7 +461,7 @@ _close (CamelStream *stream) static gint -_seek (CamelStream *stream, gint offset, CamelStreamSeekPolicy policy) +_seek (CamelSeekableStream *stream, gint offset, CamelStreamSeekPolicy policy) { int whence; gint return_position; diff --git a/camel/camel-stream-fs.h b/camel/camel-stream-fs.h index 7b5e701..4910abb 100644 --- a/camel/camel-stream-fs.h +++ b/camel/camel-stream-fs.h @@ -36,7 +36,7 @@ extern "C" { #include #include -#include "camel-stream.h" +#include "camel-seekable-stream.h" #define CAMEL_STREAM_FS_TYPE (camel_stream_fs_get_type ()) #define CAMEL_STREAM_FS(obj) (GTK_CHECK_CAST((obj), CAMEL_STREAM_FS_TYPE, CamelStreamFs)) @@ -53,7 +53,8 @@ typedef enum typedef struct { - CamelStream parent_object; + CamelSeekableStream parent_object; + gchar *name; /* name of the underlying file */ gint fd; /* file descriptor on the underlying file */ guint32 cur_pos; /* current postion in the stream */ @@ -65,7 +66,7 @@ typedef struct typedef struct { - CamelStreamClass parent_class; + CamelSeekableStreamClass parent_class; /* Virtual methods */ void (*init_with_fd) (CamelStreamFs *stream_fs, int fd); diff --git a/camel/camel-stream-mem.c b/camel/camel-stream-mem.c index df69fc0..6dd1b80 100644 --- a/camel/camel-stream-mem.c +++ b/camel/camel-stream-mem.c @@ -36,7 +36,7 @@ static CamelStreamClass *parent_class=NULL; /* Returns the class for a CamelStreamMEM */ -#define CS_CLASS(so) CAMEL_STREAM_MEM_CLASS (GTK_OBJECT(so)->klass) +#define CSM_CLASS(so) CAMEL_STREAM_MEM_CLASS (GTK_OBJECT(so)->klass) static gint _read (CamelStream *stream, gchar *buffer, gint n); static gint _write (CamelStream *stream, const gchar *buffer, gint n); @@ -44,13 +44,14 @@ static void _flush (CamelStream *stream); static gint _available (CamelStream *stream); static gboolean _eos (CamelStream *stream); static void _close (CamelStream *stream); -static gint _seek (CamelStream *stream, gint offset, CamelStreamSeekPolicy policy); +static gint _seek (CamelSeekableStream *stream, gint offset, CamelStreamSeekPolicy policy); static void _finalize (GtkObject *object); static void camel_stream_mem_class_init (CamelStreamMemClass *camel_stream_mem_class) { + CamelSeekableStreamClass *camel_seekable_stream_class = CAMEL_SEEKABLE_STREAM_CLASS (camel_stream_mem_class); CamelStreamClass *camel_stream_class = CAMEL_STREAM_CLASS (camel_stream_mem_class); GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_stream_mem_class); @@ -65,7 +66,8 @@ camel_stream_mem_class_init (CamelStreamMemClass *camel_stream_mem_class) camel_stream_class->available = _available; camel_stream_class->eos = _eos; camel_stream_class->close = _close; - camel_stream_class->seek = _seek; + + camel_seekable_stream_class->seek = _seek; gtk_object_class->finalize = _finalize; @@ -96,7 +98,7 @@ camel_stream_mem_get_type (void) (GtkClassInitFunc) NULL, }; - camel_stream_mem_type = gtk_type_unique (camel_stream_get_type (), &camel_stream_mem_info); + camel_stream_mem_type = gtk_type_unique (camel_seekable_stream_get_type (), &camel_stream_mem_info); } return camel_stream_mem_type; @@ -258,7 +260,7 @@ _close (CamelStream *stream) static gint -_seek (CamelStream *stream, gint offset, CamelStreamSeekPolicy policy) +_seek (CamelSeekableStream *stream, gint offset, CamelStreamSeekPolicy policy) { gint position; CamelStreamMem *camel_stream_mem = CAMEL_STREAM_MEM (stream); diff --git a/camel/camel-stream-mem.h b/camel/camel-stream-mem.h index 0ebcfea..fa8c051 100644 --- a/camel/camel-stream-mem.h +++ b/camel/camel-stream-mem.h @@ -36,7 +36,7 @@ extern "C" { #include #include -#include "camel-stream.h" +#include "camel-seekable-stream.h" #define CAMEL_STREAM_MEM_TYPE (camel_stream_mem_get_type ()) #define CAMEL_STREAM_MEM(obj) (GTK_CHECK_CAST((obj), CAMEL_STREAM_MEM_TYPE, CamelStreamMem)) @@ -53,17 +53,18 @@ typedef enum typedef struct { - CamelStream parent_object; + CamelSeekableStream parent_object; GByteArray *buffer; gint position; CamelStreamMemMode mode; + } CamelStreamMem; typedef struct { - CamelStreamClass parent_class; + CamelSeekableStreamClass parent_class; /* Virtual methods */ diff --git a/camel/camel-stream.c b/camel/camel-stream.c index 26c346e..5128d03 100644 --- a/camel/camel-stream.c +++ b/camel/camel-stream.c @@ -45,12 +45,6 @@ default_camel_close (CamelStream *stream) /* nothing */ } -static gint -default_camel_seek (CamelStream *stream, gint offset, CamelStreamSeekPolicy policy) -{ - /* nothing */ - return -1; -} static void camel_stream_class_init (CamelStreamClass *camel_stream_class) @@ -65,7 +59,6 @@ camel_stream_class_init (CamelStreamClass *camel_stream_class) camel_stream_class->available = NULL; camel_stream_class->eos = NULL; camel_stream_class->close = default_camel_close; - camel_stream_class->seek = default_camel_seek; /* virtual method overload */ } @@ -181,23 +174,6 @@ camel_stream_close (CamelStream *stream) } -/** - * camel_stream_seek: - * @stream: a CamelStream object. - * @offset: offset value - * @policy: what to do with the offset - * - * - * - * Return value: new position, -1 if operation failed. - **/ -gint -camel_stream_seek (CamelStream *stream, gint offset, CamelStreamSeekPolicy policy) -{ - return CS_CLASS (stream)->seek (stream, offset, policy); -} - - /***************** Utility functions ********************/ diff --git a/camel/camel-stream.h b/camel/camel-stream.h index b866dd5..73b4c31 100644 --- a/camel/camel-stream.h +++ b/camel/camel-stream.h @@ -41,12 +41,6 @@ extern "C" { #define CAMEL_STREAM_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_STREAM_TYPE, CamelStreamClass)) #define CAMEL_IS_STREAM(o) (GTK_CHECK_TYPE((o), CAMEL_STREAM_TYPE)) -typedef enum -{ - CAMEL_STREAM_SET, - CAMEL_STREAM_CUR, - CAMEL_STREAM_END -} CamelStreamSeekPolicy; typedef struct { @@ -66,7 +60,6 @@ typedef struct { gint (*available) (CamelStream *stream); gboolean (*eos) (CamelStream *stream); void (*close) (CamelStream *stream); - gint (*seek) (CamelStream *stream, gint offset, CamelStreamSeekPolicy policy); } CamelStreamClass; @@ -82,7 +75,6 @@ void camel_stream_flush (CamelStream *stream); gint camel_stream_available (CamelStream *stream); gboolean camel_stream_eos (CamelStream *stream); void camel_stream_close (CamelStream *stream); -gint camel_stream_seek (CamelStream *stream, gint offset, CamelStreamSeekPolicy policy); /* utility macros and funcs */ #define camel_stream_write_string(stream, string) camel_stream_write ((stream), (string), strlen (string)) -- 2.7.4