diff options
Diffstat (limited to 'camel')
116 files changed, 0 insertions, 21466 deletions
diff --git a/camel/.cvsignore b/camel/.cvsignore deleted file mode 100644 index fd6b811c68..0000000000 --- a/camel/.cvsignore +++ /dev/null @@ -1,7 +0,0 @@ -.deps -Makefile -Makefile.in -.libs -.deps -*.lo -*.la diff --git a/camel/CODING.STYLE b/camel/CODING.STYLE deleted file mode 100644 index a236f0060f..0000000000 --- a/camel/CODING.STYLE +++ /dev/null @@ -1,19 +0,0 @@ -Note to hackers ---------------- - -When hacking on camel (and on the gnome mailer in general), -be sure to follow the same coding style as the intial authors. -Please read the file HACKING in gnumeric and follow the -general guidelines explained in it. - -Please take a look at camel source files and try to exactly -imitate the coding style. We are perfectly aware that this -is not the best and unique style, but it is absolutely -mandatory that Camel is homogeneous. If you find the current -coding style to have some weaknesses, please contact the -authors to discuss this matter. - -Thanks. - - Bertrand. - diff --git a/camel/Makefile.am b/camel/Makefile.am deleted file mode 100644 index b61bb5bef7..0000000000 --- a/camel/Makefile.am +++ /dev/null @@ -1,120 +0,0 @@ -## Process this file with automake to produce Makefile.in - -SUBDIRS = providers - -libcamelincludedir = $(includedir)/camel - - -lib_LTLIBRARIES = libcamel.la - -INCLUDES = -I.. -I$(srcdir)/.. -I$(includedir) \ - -I$(top_srcdir)/intl \ - $(GTK_INCLUDEDIR) - - -if HAVE_PTHREAD - -pthread_SRC = \ - camel-folder-pt-proxy.c \ - camel-thread-proxy.c - -pthread_HDR = \ - camel-folder-pt-proxy.h \ - camel-thread-proxy.h - -else - -libcamel_pthread_SRC = -libcamel_pthread_HDR= - -endif - - -libcamel_la_SOURCES = \ - camel.c \ - camel-log.c \ - camel-data-wrapper.c \ - camel-exception.c \ - camel-simple-data-wrapper.c \ - camel-simple-data-wrapper-stream.c \ - camel-stream-data-wrapper.c \ - camel-folder.c \ - camel-folder-summary.c \ - camel-folder-utils.c \ - camel-medium.c \ - camel-marshal-utils.c \ - camel-mime-body-part.c \ - camel-mime-message.c \ - camel-mime-part.c \ - camel-mime-part-utils.c \ - camel-multipart.c \ - camel-op-queue.c \ - camel-provider.c \ - camel-recipient.c \ - camel-service.c \ - camel-session.c \ - camel-store.c \ - camel-stream.c \ - camel-stream-buffered-fs.c \ - camel-stream-fs.c \ - camel-stream-mem.c \ - data-wrapper-repository.c \ - gmime-base64.c \ - gmime-content-field.c \ - gmime-rfc2047.c \ - gmime-utils.c \ - gstring-util.c \ - hash-table-utils.c \ - md5-utils.c \ - string-utils.c \ - url-util.c \ - $(pthread_SRC) - -libcamelinclude_HEADERS = \ - camel.h \ - camel-log.h \ - camel-data-wrapper.h \ - camel-exception.h \ - camel-simple-data-wrapper.h \ - camel-simple-data-wrapper-stream.h \ - camel-stream-data-wrapper.h \ - camel-folder.h \ - camel-folder-summary.h \ - camel-folder-utils.h \ - camel-mime-body-part.h \ - camel-marshal-utils.h \ - camel-medium.h \ - camel-mime-message.h \ - camel-mime-part.h \ - camel-mime-part-utils.h \ - camel-multipart.h \ - camel-op-queue.h \ - camel-provider.h \ - camel-recipient.h \ - camel-service.h \ - camel-session.h \ - camel-store.h \ - camel-stream.h \ - camel-stream-buffered-fs.h \ - camel-stream-fs.h \ - camel-stream-mem.h \ - data-wrapper-repository.h \ - gmime-base64.h \ - gmime-content-field.h \ - gmime-utils.h \ - gstring-util.h \ - hash-table-utils.h \ - md5-utils.h \ - string-utils.h \ - url-util.h \ - camel-exception-list.def \ - $(pthread_HDR) - -libcamel_extra_sources = \ - camel-arg-collector.c - -libcamel_la_LDFLAGS = -version-info 0:0:0 -rpath $(libdir) - -EXTRA_DIST = \ - $(libcamel_extra_sources) \ - README diff --git a/camel/README b/camel/README deleted file mode 100644 index 44f93fa6d8..0000000000 --- a/camel/README +++ /dev/null @@ -1,57 +0,0 @@ - - CAMEL - - - A generic Messaging Library - - - ---- - - -Introduction: -------------- - -Camel will be a generic messaging library. It will evntually support -the standard messaging system for receiving and sending messages. -It aims at being the backend for the future gnome-mailer system. - -The name "camel" stands for ... nothing. Open area of developpement there. -You know, that "bazaar" thing. Maybe could we organize a big contest on -gnome-list to find the best signification :) - -Camel draws heacily from JavaMail and the IMAP4rev1 RFC. -people wanting to hack on a provider are recommended to read the JavaMail -API specification but CMC and MAPI are of interest too. - -Please, before starting anything, wait for me to finish the abstract classes. -Some parts are not definitive yet. - - -Organization: -------------- - -The library is roughly a set of abstract classes, some kind of generic -"interfaces" (idl interfaces, not java interfaces ). - -Particular implementations are called providers. - -Here are the basic objects: - -* CamelService : an abstract class representing an access to a server. -Handles the connection and authentication to any server. - -* CamelStore (CamelService): A hierarchy of folders on a server. - -* CamelFolder : An object containing messages. A folder is always associated -to a store. - -* CamelMessage : An object contained in folders. Is defined by a set of -attribute and a content. (Attributes are generally: The date it was received, -the sender address, .....) - -* CamelTransport (CamelService): A way to send messages. - -.... -... - - diff --git a/camel/README.COPYRIGHT b/camel/README.COPYRIGHT deleted file mode 100644 index 307013bedc..0000000000 --- a/camel/README.COPYRIGHT +++ /dev/null @@ -1,47 +0,0 @@ -Important note for Camel hackers: ---------------------------------- - -Camel has been a lot of work, and has been conceived to be general -enough to be used outside the gnome-mailer. It is possible in the -future that it is used in softwares with licenses incompatible with the -LGPL. For this reason, the copyright has to be owned by a unique -person. Be sure, however, that Camel will always be available under -the LGPL. Significant authors will always be consulted before any -special use of Camel. Moreover, in special situations, they may be -given the authorization to use Camel with a license different than the -LGPL. - -Thus, when adding code in Camel, always add the following lines at the -begining of the file: - -/* - * - * Copyright 199x, 200x 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 - */ - -You may also want to add your name to the author name list after this -header. - -Please contact me (Bertrand.Guiheneuf@aful.org) if you want to discuss -this copyright issue. - -Happy hacking, - -Bertrand. - - diff --git a/camel/README.HACKING b/camel/README.HACKING deleted file mode 100644 index a4742ee7b8..0000000000 --- a/camel/README.HACKING +++ /dev/null @@ -1,14 +0,0 @@ -You want to hack on Camel ? - -Thanks. Camel aims at being the best messaging -library for Linux and your help is welcome. -Please be sure to read the following files before -commiting any change or sending any patch: - -CODING.STYLE -README.COPYRIGHT - - -Thanks. - - Bertrand <Bertrand.Guiheneuf@aful.org>
\ No newline at end of file diff --git a/camel/camel-arg-collector.c b/camel/camel-arg-collector.c deleted file mode 100644 index 44b9e2d99b..0000000000 --- a/camel/camel-arg-collector.c +++ /dev/null @@ -1,186 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library 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. - */ - -/* - * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * included in camel because it is not exported - * by gtk - * - * Bertrand Guiheneuf <bertrand@helixcode.com> - */ - -/* collect a single argument value from a va_list. - * this is implemented as a huge macro <shrug>, because we can't - * pass va_list variables by reference on some systems. - * the corresponding prototype would be: - * static inline gchar* - * gtk_arg_collect_value (GtkArg *arg, - * va_list var_args); - */ -#define CAMEL_ARG_COLLECT_VALUE(arg, var_args, _error) \ -G_STMT_START { \ - gchar *error_msg; \ - GtkType fundamental_type; \ - \ - fundamental_type = GTK_FUNDAMENTAL_TYPE (arg->type); \ - if (fundamental_type > GTK_TYPE_FUNDAMENTAL_LAST) \ - { \ - fundamental_type = gtk_type_get_varargs_type (fundamental_type); \ - if (!fundamental_type) \ - fundamental_type = GTK_FUNDAMENTAL_TYPE (arg->type); \ - } \ - \ - error_msg = NULL; \ - switch (fundamental_type) \ - { \ - case GTK_TYPE_INVALID: \ - error_msg = g_strdup ("invalid untyped argument"); \ - break; \ - \ - case GTK_TYPE_NONE: \ - /* we just ignore this type, since it arithmetically just requires \ - * us to not move the var_args pointer any further. callers need to \ - * check for the validity of GTK_TYPE_NONE themselves. \ - * \ - * error_msg = g_strdup ("invalid argument type `void'"); \ - */ \ - break; \ - \ - /* everything smaller than an int is guarranteed to be \ - * passed as an int \ - */ \ - case GTK_TYPE_CHAR: \ - GTK_VALUE_CHAR (*arg) = va_arg (var_args, gint); \ - break; \ - case GTK_TYPE_UCHAR: \ - GTK_VALUE_UCHAR (*arg) = va_arg (var_args, guint); \ - break; \ - case GTK_TYPE_BOOL: \ - GTK_VALUE_BOOL (*arg) = va_arg (var_args, gint); \ - break; \ - case GTK_TYPE_INT: \ - GTK_VALUE_INT (*arg) = va_arg (var_args, gint); \ - break; \ - case GTK_TYPE_UINT: \ - GTK_VALUE_UINT (*arg) = va_arg (var_args, guint); \ - break; \ - case GTK_TYPE_ENUM: \ - GTK_VALUE_ENUM (*arg) = va_arg (var_args, gint); \ - break; \ - case GTK_TYPE_FLAGS: \ - GTK_VALUE_FLAGS (*arg) = va_arg (var_args, guint); \ - break; \ - \ - /* we collect longs as glongs since they differ in size with \ - * integers on some platforms \ - */ \ - case GTK_TYPE_LONG: \ - GTK_VALUE_LONG (*arg) = va_arg (var_args, glong); \ - break; \ - case GTK_TYPE_ULONG: \ - GTK_VALUE_ULONG (*arg) = va_arg (var_args, gulong); \ - break; \ - \ - /* floats are always passed as doubles \ - */ \ - case GTK_TYPE_FLOAT: \ - /* GTK_VALUE_FLOAT (*arg) = va_arg (var_args, gfloat); */ \ - GTK_VALUE_FLOAT (*arg) = va_arg (var_args, gdouble); \ - break; \ - case GTK_TYPE_DOUBLE: \ - GTK_VALUE_DOUBLE (*arg) = va_arg (var_args, gdouble); \ - break; \ - \ - /* collect pointer values \ - */ \ - case GTK_TYPE_STRING: \ - GTK_VALUE_STRING (*arg) = va_arg (var_args, gchar*); \ - break; \ - case GTK_TYPE_POINTER: \ - GTK_VALUE_POINTER (*arg) = va_arg (var_args, gpointer); \ - break; \ - case GTK_TYPE_BOXED: \ - GTK_VALUE_BOXED (*arg) = va_arg (var_args, gpointer); \ - break; \ - \ - /* structured types \ - */ \ - case GTK_TYPE_SIGNAL: \ - GTK_VALUE_SIGNAL (*arg).f = va_arg (var_args, GtkSignalFunc); \ - GTK_VALUE_SIGNAL (*arg).d = va_arg (var_args, gpointer); \ - break; \ - case GTK_TYPE_ARGS: \ - GTK_VALUE_ARGS (*arg).n_args = va_arg (var_args, gint); \ - GTK_VALUE_ARGS (*arg).args = va_arg (var_args, GtkArg*); \ - break; \ - case GTK_TYPE_FOREIGN: \ - GTK_VALUE_FOREIGN (*arg).data = va_arg (var_args, gpointer); \ - GTK_VALUE_FOREIGN (*arg).notify = va_arg (var_args, GtkDestroyNotify); \ - break; \ - case GTK_TYPE_CALLBACK: \ - GTK_VALUE_CALLBACK (*arg).marshal = va_arg (var_args, GtkCallbackMarshal); \ - GTK_VALUE_CALLBACK (*arg).data = va_arg (var_args, gpointer); \ - GTK_VALUE_CALLBACK (*arg).notify = va_arg (var_args, GtkDestroyNotify); \ - break; \ - case GTK_TYPE_C_CALLBACK: \ - GTK_VALUE_C_CALLBACK (*arg).func = va_arg (var_args, GtkFunction); \ - GTK_VALUE_C_CALLBACK (*arg).func_data = va_arg (var_args, gpointer); \ - break; \ - \ - /* we do some extra sanity checking when collecting objects, \ - * i.e. if the object pointer is not NULL, we check whether we \ - * actually got an object pointer within the desired class branch. \ - */ \ - case GTK_TYPE_OBJECT: \ - GTK_VALUE_OBJECT (*arg) = va_arg (var_args, GtkObject*); \ - if (GTK_VALUE_OBJECT (*arg) != NULL) \ - { \ - register GtkObject *object = GTK_VALUE_OBJECT (*arg); \ - \ - if (object->klass == NULL) \ - error_msg = g_strconcat ("invalid unclassed object pointer for argument type `", \ - gtk_type_name (arg->type), \ - "'", \ - NULL); \ - else if (!gtk_type_is_a (GTK_OBJECT_TYPE (object), arg->type)) \ - error_msg = g_strconcat ("invalid object `", \ - gtk_type_name (GTK_OBJECT_TYPE (object)), \ - "' for argument type `", \ - gtk_type_name (arg->type), \ - "'", \ - NULL); \ - } \ - break; \ - \ - default: \ - error_msg = g_strconcat ("unsupported argument type `", \ - gtk_type_name (arg->type), \ - "'", \ - NULL); \ - break; \ - } \ - \ - _error = error_msg; /* return error_msg; */ \ -} G_STMT_END diff --git a/camel/camel-data-wrapper.c b/camel/camel-data-wrapper.c deleted file mode 100644 index 061225b03a..0000000000 --- a/camel/camel-data-wrapper.c +++ /dev/null @@ -1,252 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camelDataWrapper.c : Abstract class for a data_wrapper */ - -/** THIS IS MOSTLY AN ABSTRACT CLASS THAT SHOULD HAVE BEEN AN - INTERFACE. **/ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel-data-wrapper.h" -#include "camel-log.h" - -static GtkObjectClass *parent_class=NULL; - -/* Returns the class for a CamelDataWrapper */ -#define CDW_CLASS(so) CAMEL_DATA_WRAPPER_CLASS (GTK_OBJECT(so)->klass) - -static void _construct_from_stream (CamelDataWrapper *data_wrapper, CamelStream *stream); -static void _write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream); -static void _set_mime_type (CamelDataWrapper *data_wrapper, gchar *mime_type); -static gchar *_get_mime_type (CamelDataWrapper *data_wrapper); -static GMimeContentField *_get_mime_type_field (CamelDataWrapper *data_wrapper); -static void _set_mime_type_field (CamelDataWrapper *data_wrapper, GMimeContentField *mime_type); -static CamelStream *_get_stream (CamelDataWrapper *data_wrapper); -static void _finalize (GtkObject *object); - -static void -camel_data_wrapper_class_init (CamelDataWrapperClass *camel_data_wrapper_class) -{ - GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_data_wrapper_class); - - parent_class = gtk_type_class (gtk_object_get_type ()); - - /* virtual method definition */ - camel_data_wrapper_class->write_to_stream = _write_to_stream; - camel_data_wrapper_class->construct_from_stream = _construct_from_stream; - camel_data_wrapper_class->set_mime_type = _set_mime_type; - camel_data_wrapper_class->get_mime_type = _get_mime_type; - camel_data_wrapper_class->get_mime_type_field = _get_mime_type_field; - camel_data_wrapper_class->set_mime_type_field = _set_mime_type_field; - camel_data_wrapper_class->get_stream = _get_stream; - - /* virtual method overload */ - gtk_object_class->finalize = _finalize; -} - - - - - -static void -camel_data_wrapper_init (gpointer object, gpointer klass) -{ - CamelDataWrapper *camel_data_wrapper = CAMEL_DATA_WRAPPER (object); - - CAMEL_LOG_FULL_DEBUG ( "camel_data_wrapper_init:: Entering\n"); - camel_data_wrapper->mime_type = gmime_content_field_new (NULL, NULL); - CAMEL_LOG_FULL_DEBUG ( "camel_data_wrapper_init:: Leaving\n"); -} - - - -GtkType -camel_data_wrapper_get_type (void) -{ - static GtkType camel_data_wrapper_type = 0; - - if (!camel_data_wrapper_type) { - GtkTypeInfo camel_data_wrapper_info = - { - "CamelDataWrapper", - sizeof (CamelDataWrapper), - sizeof (CamelDataWrapperClass), - (GtkClassInitFunc) camel_data_wrapper_class_init, - (GtkObjectInitFunc) camel_data_wrapper_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_data_wrapper_type = gtk_type_unique (gtk_object_get_type (), &camel_data_wrapper_info); - } - - return camel_data_wrapper_type; -} - - -static void -_finalize (GtkObject *object) -{ - CamelDataWrapper *camel_data_wrapper = CAMEL_DATA_WRAPPER (object); - - CAMEL_LOG_FULL_DEBUG ("Entering CamelDataWrapper::finalize\n"); - CAMEL_LOG_FULL_DEBUG ("CamelDataWrapper::finalize, finalizing object %p\n", object); - if (camel_data_wrapper->mime_type) - gmime_content_field_unref (camel_data_wrapper->mime_type); - - parent_class->finalize (object); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelDataWrapper::finalize\n"); -} - - -/** - * _write_to_stream: write data content in a byte stream - * @data_wrapper: the data wrapper object - * @stream byte stream where data will be written - * - * This method must be overriden by subclasses - * Data must be written in the bytes stream - * in a architecture independant fashion. - * If data is a standard data (for example an jpg image) - * it must be serialized in the strea exactly as it - * would be saved on disk. A simple dump of the stream in - * a file should be sufficient for the data to be - * re-read by a foreign application. - * - **/ -static void -_write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream) -{ - /* nothing */ -} - - -/** - * camel_data_wrapper_write_to_stream: write data in a stream - * @data_wrapper: the data wrapper object - * @stream: byte stream where data will be written - * - * Write data content in a stream. Data is stored in a machine - * independant format. - * - **/ -void -camel_data_wrapper_write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream) -{ - CAMEL_LOG_FULL_DEBUG ( "camel_data_wrapper_write_to_stream:: Entering\n"); - CDW_CLASS(data_wrapper)->write_to_stream (data_wrapper, stream); - CAMEL_LOG_FULL_DEBUG ( "camel_data_wrapper_write_to_stream:: Leaving\n"); -} - - - - - - -static void -_construct_from_stream (CamelDataWrapper *data_wrapper, CamelStream *stream) -{ - /* nothing */ -} - -void -camel_data_wrapper_construct_from_stream (CamelDataWrapper *data_wrapper, CamelStream *stream) -{ - CAMEL_LOG_FULL_DEBUG ( "camel_data_wrapper_construct_from_stream:: Entering\n"); - CDW_CLASS(data_wrapper)->construct_from_stream (data_wrapper, stream); - CAMEL_LOG_FULL_DEBUG ( "camel_data_wrapper_construct_from_stream:: Leaving\n"); -} - - - -static void -_set_mime_type (CamelDataWrapper *data_wrapper, gchar *mime_type) -{ - CAMEL_LOG_FULL_DEBUG ( "CamelDataWrapper::set_mime_type Entering\n"); - g_assert (mime_type); - gmime_content_field_construct_from_string (data_wrapper->mime_type, mime_type); - CAMEL_LOG_FULL_DEBUG ( "CamelDataWrapper::set_mime_type Leaving\n"); -} - -void -camel_data_wrapper_set_mime_type (CamelDataWrapper *data_wrapper, gchar *mime_type) -{ - CDW_CLASS(data_wrapper)->set_mime_type (data_wrapper, mime_type); -} - -static gchar * -_get_mime_type (CamelDataWrapper *data_wrapper) -{ - gchar *mime_type; - - mime_type = gmime_content_field_get_mime_type (data_wrapper->mime_type); - return mime_type; -} - -gchar * -camel_data_wrapper_get_mime_type (CamelDataWrapper *data_wrapper) -{ - CAMEL_LOG_FULL_DEBUG ( "camel_data_wrapper_get_mime_type:: Entering before returning\n"); - return CDW_CLASS(data_wrapper)->get_mime_type (data_wrapper); -} - - -static GMimeContentField * -_get_mime_type_field (CamelDataWrapper *data_wrapper) -{ - return data_wrapper->mime_type; -} - -GMimeContentField * -camel_data_wrapper_get_mime_type_field (CamelDataWrapper *data_wrapper) -{ - return CDW_CLASS(data_wrapper)->get_mime_type_field (data_wrapper); -} - - -static void -_set_mime_type_field (CamelDataWrapper *data_wrapper, GMimeContentField *mime_type) -{ - if (data_wrapper->mime_type) gmime_content_field_free (data_wrapper->mime_type); - data_wrapper->mime_type = mime_type; -} - -void -camel_data_wrapper_set_mime_type_field (CamelDataWrapper *data_wrapper, GMimeContentField *mime_type) -{ - CDW_CLASS(data_wrapper)->set_mime_type_field (data_wrapper, mime_type); -} - -static CamelStream * -_get_stream (CamelDataWrapper *data_wrapper) -{ - /* This needs to be implemented in subclasses. */ - return NULL; -} - -CamelStream * -camel_data_wrapper_get_stream (CamelDataWrapper *data_wrapper) -{ - CDW_CLASS(data_wrapper)->get_stream (data_wrapper); -} diff --git a/camel/camel-data-wrapper.h b/camel/camel-data-wrapper.h deleted file mode 100644 index 90d0cb4ad4..0000000000 --- a/camel/camel-data-wrapper.h +++ /dev/null @@ -1,92 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camelDataWrapper.h : Abstract class for a data wrapper */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_DATA_WRAPPER_H -#define CAMEL_DATA_WRAPPER_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include <stdio.h> -#include "gmime-content-field.h" -#include "camel-stream.h" - - - -#define CAMEL_DATA_WRAPPER_TYPE (camel_data_wrapper_get_type ()) -#define CAMEL_DATA_WRAPPER(obj) (GTK_CHECK_CAST((obj), CAMEL_DATA_WRAPPER_TYPE, CamelDataWrapper)) -#define CAMEL_DATA_WRAPPER_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_DATA_WRAPPER_TYPE, CamelDataWrapperClass)) -#define CAMEL_IS_DATA_WRAPPER(o) (GTK_CHECK_TYPE((o), CAMEL_DATA_WRAPPER_TYPE)) - - -typedef struct -{ - GtkObject parent_object; - - GMimeContentField *mime_type; -} CamelDataWrapper; - - - -typedef struct { - GtkObjectClass parent_class; - - /* Virtual methods */ - void (*write_to_stream) (CamelDataWrapper *data_wrapper, CamelStream *stream); - void (*construct_from_stream) (CamelDataWrapper *data_wrapper, CamelStream *stream); - void (*set_mime_type) (CamelDataWrapper *data_wrapper, gchar * mime_type); - gchar * (*get_mime_type) (CamelDataWrapper *data_wrapper); - GMimeContentField * (*get_mime_type_field) (CamelDataWrapper *data_wrapper); - void (*set_mime_type_field) (CamelDataWrapper *data_wrapper, GMimeContentField *mime_type_field); - CamelStream * (*get_stream) (CamelDataWrapper *data_wrapper); -} CamelDataWrapperClass; - - - -/* Standard Gtk function */ -GtkType camel_data_wrapper_get_type (void); - - -/* public methods */ - -void camel_data_wrapper_write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream); -void camel_data_wrapper_construct_from_stream (CamelDataWrapper *data_wrapper, CamelStream *stream); -void camel_data_wrapper_set_mime_type (CamelDataWrapper *data_wrapper, gchar *mime_type); -gchar *camel_data_wrapper_get_mime_type (CamelDataWrapper *data_wrapper); -GMimeContentField *camel_data_wrapper_get_mime_type_field (CamelDataWrapper *data_wrapper); -void camel_data_wrapper_set_mime_type_field (CamelDataWrapper *data_wrapper, GMimeContentField *mime_type); -CamelStream *camel_data_wrapper_get_stream (CamelDataWrapper *data_wrapper); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_DATA_WRAPPER_H */ diff --git a/camel/camel-exception-list.def b/camel/camel-exception-list.def deleted file mode 100644 index b13655e35a..0000000000 --- a/camel/camel-exception-list.def +++ /dev/null @@ -1,16 +0,0 @@ -CAMEL_EXCEPTION_NONE = 0, - -/* Generic exceptions */ -CAMEL_EXCEPTION_INVALID_PARAM, -CAMEL_EXCEPTION_SYSTEM, - -/* CamelFolderException */ -CAMEL_EXCEPTION_FOLDER_NULL, -CAMEL_EXCEPTION_FOLDER_INVALID, -CAMEL_EXCEPTION_FOLDER_INVALID_STATE, -CAMEL_EXCEPTION_FOLDER_NON_EMPTY, -CAMEL_EXCEPTION_FOLDER_NON_UID, -CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION, -CAMEL_EXCEPTION_FOLDER_INVALID_PATH, - - diff --git a/camel/camel-exception.c b/camel/camel-exception.c deleted file mode 100644 index 0a4b92b8ef..0000000000 --- a/camel/camel-exception.c +++ /dev/null @@ -1,252 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-execpetion.c : exception utils */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel-exception.h" - - - -/** - * camel_exception_new: allocate a new exception object. - * - * Create and returns a new exception object. - * - * - * Return value: The newly allocated exception object. - **/ -CamelException * -camel_exception_new () -{ - CamelException *ex; - - ex = g_new (CamelException, 1); - return ex; -} - - -/** - * camel_exception_clear: Clear an exception - * @exception: the exception object - * - * Clear an exception, that is, set the - * exception ID to CAMEL_EXCEPTION_NONE and - * free the description text. - * If the exception is NULL, this funtion just - * returns. - **/ -void -camel_exception_clear (CamelException *exception) -{ - if (!exception) return; - - /* free the description text */ - if (exception->desc) - g_free (exception->desc); - exception->desc = NULL; - - /* set the Exception Id to NULL */ - exception->id = CAMEL_EXCEPTION_NONE; -} - - - - -/** - * camel_exception_free: Free an exception - * @exception: The exception object to free - * - * Free an exception object. If the exception - * is NULL, nothing is done, the routine simply - * returns. - **/ -void -camel_exception_free (CamelException *exception) -{ - if (!exception) return; - - /* free the description text */ - if (exception->desc) - g_free (exception->desc); - /* free the exeption itself */ - g_free (exception); -} - -/** - * camel_exception_set: set an exception - * @ex: exception object - * @id: exception id - * @desc: textual description of the exception - * - * Set the value of an exception. The exception id is - * a unique number representing the exception. The - * textual description is a small text explaining - * what happened and provoked the exception. - * - * When @ex is NULL, nothing is done, this routine - * simply returns. - * - **/ -void -camel_exception_set (CamelException *ex, - ExceptionId id, - const char *desc) -{ - /* if no exception is given, do nothing */ - if (!ex) return; - - ex->id = id; - - /* remove the previous exception description */ - if (ex->desc) - g_free (ex->desc); - ex->desc = g_strdup (desc); -} - - -/** - * camel_exception_setv: set an exception - * @ex: exception object - * @id: exception id - * @format: format of the description string. The format string is used as in printf(). - * - * Set the value of an exception. The exception id is - * a unique number representing the exception. The - * textual description is a small text explaining - * what happened and provoked the exception. - * In this version, the string is created from the format - * string and the variable argument list. - * - * When @ex is NULL, nothing is done, this routine - * simply returns. - * - **/ -void -camel_exception_setv (CamelException *ex, - ExceptionId id, - const char *format, - ...) -{ - va_list args; - gchar *tmp_desc_string; - - - /* if no exception is given, do nothing */ - if (!ex) return; - - - /* create the temporary exception string */ - va_start(args, format); - tmp_desc_string = g_strdup_vprintf (format, args); - va_end (args); - - - /* now set the exception. We don't call - camel_exception_set because we want to - avoid a useless strdup () */ - ex->id = id; - - /* remove the previous exception description */ - if (ex->desc) - g_free (ex->desc); - ex->desc = g_strdup (tmp_desc_string); - -} - - - - - - - -/** - * camel_exception_xfer: transfer an exception - * @ex_dst: Destination exception object - * @ex_src: Source exception object - * - * Transfer the content of an exception from - * an exception object to another. - * The destination exception receives the id and - * the description text of the source exception. - **/ -void -camel_exception_xfer (CamelException *ex_dst, - CamelException *ex_src) -{ - if (ex_dst->desc) - g_free (ex_dst->desc); - - ex_dst->id = ex_src->id; - ex_dst->desc = ex_src->desc; - - ex_src->desc = NULL; - ex_src->id = CAMEL_EXCEPTION_NONE; -} - - - - - - - -/** - * camel_exception_get_id: get the exception id - * @ex: The exception object - * - * Return the id of an exception. - * If @ex is NULL, return CAMEL_EXCEPTION_NONE; - * - * Return value: Exception ID. - **/ -ExceptionId -camel_exception_get_id (CamelException *ex) -{ - if (ex) - return ex->id; - else - return CAMEL_EXCEPTION_NONE; -} - - - - -/** - * camel_exception_get_description: get the description of an exception. - * @ex: The exception object - * - * Return the exception description text. - * If @ex is NULL, return NULL; - * - * - * Return value: Exception description text. - **/ -const gchar * -camel_exception_get_description (CamelException *ex) -{ - if (ex) - return ex->desc; - else - return NULL; -} diff --git a/camel/camel-exception.h b/camel/camel-exception.h deleted file mode 100644 index 1284608e91..0000000000 --- a/camel/camel-exception.h +++ /dev/null @@ -1,88 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-execpetion.h : exception utils */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_EXCEPTION_H -#define CAMEL_EXCEPTION_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <glib.h> - - -typedef enum { -#include "camel-exception-list.def" - -} ExceptionId; - - -typedef struct { - /* do not access the fields directly */ - ExceptionId id; - char *desc; - -} CamelException; - - - -/* creation and destruction functions */ -CamelException *camel_exception_new (); -void camel_exception_free (CamelException *exception); - - -/* exception content manipulation */ -void camel_exception_clear (CamelException *exception); -void camel_exception_set (CamelException *ex, - ExceptionId id, - const char *desc); -void camel_exception_setv (CamelException *ex, - ExceptionId id, - const char *format, - ...); - - -/* exception content transfer */ -void camel_exception_xfer (CamelException *ex_dst, - CamelException *ex_src); - - -/* exception content retrieval */ -ExceptionId camel_exception_get_id (CamelException *ex); -const gchar *camel_exception_get_description (CamelException *ex); - - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_EXCEPTION_H */ - diff --git a/camel/camel-folder-pt-proxy.c b/camel/camel-folder-pt-proxy.c deleted file mode 100644 index e21c2bcd9a..0000000000 --- a/camel/camel-folder-pt-proxy.c +++ /dev/null @@ -1,821 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-folder-pt-proxy.c : proxy folder using posix threads */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel-folder-pt-proxy.h" -#include "camel-log.h" -#include "camel-marshal-utils.h" -#include "camel-exception.h" -#include <pthread.h> -#include <unistd.h> -#include <string.h> -#include <errno.h> - - -static CamelFolderClass *parent_class=NULL; - -/* Returns the class for CamelFolderPtProxy and CamelFolder objects */ -#define CFPP_CLASS(so) CAMEL_FOLDER_PT_PROXY_CLASS (GTK_OBJECT(so)->klass) -#define CF_CLASS(so) CAMEL_FOLDER_CLASS (GTK_OBJECT(so)->klass) - - -enum CamelFolderFunc { - CAMEL_FOLDER_OPEN, - CAMEL_FOLDER_CLOSE, - CAMEL_FOLDER__LAST_FUNC -}; - -static CamelFuncDef _camel_func_def [CAMEL_FOLDER__LAST_FUNC]; - - -static void _init_with_store (CamelFolder *folder, - CamelStore *parent_store, - CamelException *ex); -static void _open_async (CamelFolder *folder, - CamelFolderOpenMode mode, - CamelFolderAsyncCallback callback, - gpointer user_data, - CamelException *ex); -static void _close_async (CamelFolder *folder, - gboolean expunge, - CamelFolderAsyncCallback callback, - gpointer user_data, - CamelException *ex); -static void _open (CamelFolder *folder, - CamelFolderOpenMode mode, - CamelException *ex); -static void _close (CamelFolder *folder, - gboolean expunge, - CamelException *ex); -static void _set_name (CamelFolder *folder, - const gchar *name, - CamelException *ex); - -static const gchar *_get_name (CamelFolder *folder, CamelException *ex); -static const gchar *_get_full_name (CamelFolder *folder, CamelException *ex); -static gboolean _can_hold_folders (CamelFolder *folder, CamelException *ex); -static gboolean _can_hold_messages(CamelFolder *folder, CamelException *ex); -static gboolean _exists (CamelFolder *folder, CamelException *ex); -static gboolean _is_open (CamelFolder *folder, CamelException *ex); -static CamelFolder *_get_subfolder (CamelFolder *folder, const gchar *folder_name, CamelException *ex); -static gboolean _create (CamelFolder *folder, CamelException *ex); -static gboolean _delete (CamelFolder *folder, gboolean recurse, CamelException *ex); -static gboolean _delete_messages (CamelFolder *folder, CamelException *ex); -static CamelFolder *_get_parent_folder (CamelFolder *folder, CamelException *ex); -static CamelStore *_get_parent_store (CamelFolder *folder, CamelException *ex); -static CamelFolderOpenMode _get_mode (CamelFolder *folder, CamelException *ex); -static GList *_list_subfolders (CamelFolder *folder, CamelException *ex); -static GList *_expunge (CamelFolder *folder, CamelException *ex); -static CamelMimeMessage *_get_message_by_number (CamelFolder *folder, gint number, CamelException *ex); -static gint _get_message_count (CamelFolder *folder, CamelException *ex); -static void _append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex); -static const GList *_list_permanent_flags (CamelFolder *folder, CamelException *ex); -static void _copy_message_to (CamelFolder *folder, CamelMimeMessage *message, CamelFolder *dest_folder, CamelException *ex); - -static const gchar *_get_message_uid (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex); -static CamelMimeMessage *_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex); -static GList *_get_uid_list (CamelFolder *folder, CamelException *ex); - -static void _finalize (GtkObject *object); - - -static void -camel_folder_pt_proxy_class_init (CamelFolderPtProxyClass *camel_folder_pt_proxy_class) -{ - GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_folder_pt_proxy_class); - CamelFolderClass *camel_folder_class = CAMEL_FOLDER_CLASS (camel_folder_pt_proxy_class); - CamelFolderPtProxyClass *proxy_class = camel_folder_pt_proxy_class; - - parent_class = gtk_type_class (camel_folder_get_type ()); - - /* virtual method definition */ - camel_folder_class->init_with_store = _init_with_store; - camel_folder_class->open = _open; - camel_folder_class->close = _close; - camel_folder_class->open_async = _open_async; - camel_folder_class->close_async = _close_async; - camel_folder_class->set_name = _set_name; - camel_folder_class->get_name = _get_name; - camel_folder_class->can_hold_folders = _can_hold_folders; - camel_folder_class->can_hold_messages = _can_hold_messages; - camel_folder_class->exists = _exists; - camel_folder_class->is_open = _is_open; - camel_folder_class->get_subfolder = _get_subfolder; - camel_folder_class->create = _create; - camel_folder_class->delete = _delete; - camel_folder_class->delete_messages = _delete_messages; - camel_folder_class->get_parent_folder = _get_parent_folder; - camel_folder_class->get_parent_store = _get_parent_store; - camel_folder_class->get_mode = _get_mode; - camel_folder_class->list_subfolders = _list_subfolders; - camel_folder_class->expunge = _expunge; - camel_folder_class->get_message_by_number = _get_message_by_number; - camel_folder_class->get_message_count = _get_message_count; - camel_folder_class->append_message = _append_message; - camel_folder_class->list_permanent_flags = _list_permanent_flags; - camel_folder_class->copy_message_to; - camel_folder_class->get_message_uid = _get_message_uid; - camel_folder_class->get_message_by_uid = _get_message_by_uid; - camel_folder_class->get_uid_list = _get_uid_list; - - /* virtual method overload */ - gtk_object_class->finalize = _finalize; - - /* function definition for proxying */ - proxy_class->open_func_def = - camel_func_def_new (camel_marshal_NONE__POINTER_INT_POINTER_POINTER, - 4, - GTK_TYPE_POINTER, - GTK_TYPE_INT, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER); - proxy_class->open_cb_def = - camel_func_def_new (camel_marshal_NONE__POINTER_POINTER_POINTER, - 3, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER); - - proxy_class->close_func_def = - camel_func_def_new (camel_marshal_NONE__POINTER_BOOL_POINTER_POINTER, - 4, - GTK_TYPE_POINTER, - GTK_TYPE_BOOL, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER); - proxy_class->close_cb_def = - camel_func_def_new (camel_marshal_NONE__POINTER_POINTER_POINTER, - 3, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER); - - proxy_class->set_name_func_def = - camel_func_def_new (camel_marshal_NONE__POINTER_BOOL_POINTER_POINTER, - 4, - GTK_TYPE_POINTER, - GTK_TYPE_BOOL, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER); - proxy_class->set_name_cb_def = - camel_func_def_new (camel_marshal_NONE__POINTER_POINTER_POINTER, - 3, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER, - GTK_TYPE_POINTER); - -} - - - - -static void -camel_folder_pt_proxy_init (CamelFolderPtProxy *folder_pt_proxy) -{ - folder_pt_proxy->thread_ex = camel_exception_new (); - folder_pt_proxy->pud = g_new (_ProxyCbUserData, 1); -} - - - - -GtkType -camel_folder_pt_proxy_get_type (void) -{ - static GtkType camel_folder_pt_proxy_type = 0; - - if (!camel_folder_pt_proxy_type) { - GtkTypeInfo camel_folder_pt_proxy_info = - { - "CamelFolderPtProxy", - sizeof (CamelFolderPtProxy), - sizeof (CamelFolderPtProxyClass), - (GtkClassInitFunc) camel_folder_pt_proxy_class_init, - (GtkObjectInitFunc) camel_folder_pt_proxy_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_folder_pt_proxy_type = gtk_type_unique (gtk_object_get_type (), &camel_folder_pt_proxy_info); - } - - return camel_folder_pt_proxy_type; -} - - -static void -_finalize (GtkObject *object) -{ - CamelFolder *camel_folder = CAMEL_FOLDER (object); - CamelFolderPtProxy *camel_folder_pt_proxy = CAMEL_FOLDER_PT_PROXY (camel_folder); - GList *message_node; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelFolderPtProxy::finalize\n"); - - camel_exception_free (camel_folder_pt_proxy->thread_ex); - g_free (camel_folder_pt_proxy->pud); - GTK_OBJECT_CLASS (parent_class)->finalize (object); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelFolderPtProxy::finalize\n"); -} - - - - - - -/*********/ - -/**** Operations implementation ****/ - - - -static gpointer -_proxy_cb_user_data (_ProxyCbUserData *pud, - CamelFolderAsyncCallback real_callback, - CamelFolderPtProxy *proxy_folder, - CamelException *ex, - gpointer real_user_data) -{ - pud->real_callback = real_callback; - pud->proxy_folder = proxy_folder; - pud->ex = ex; - pud->real_user_data = real_user_data; - return (gpointer)pud; -} - - -/* ******** */ - -/* thread->init_with_store implementation */ -static void -_init_with_store (CamelFolder *folder, - CamelStore *parent_store, - CamelException *ex) -{ - - parent_class->init_with_store (folder, parent_store, ex); - if (ex->id != CAMEL_EXCEPTION_NONE) - return; -#warning use proxy store here - CF_CLASS (folder)->init_with_store (CAMEL_FOLDER_PT_PROXY (folder)->real_folder, - parent_store, - ex); -} - - - -/* a little bit of explanation for the folder_class->open - * method implementation : - * - * the proxy object "open" method is called by the client - * program in the main thread. This method creates a - * CamelOp object containing all the necessary informations - * to call the corresponding "open" method on the real - * folder object in the child thread. This CamelOp object - * is thus pushed in a queue in the main thread (see the - * CamelThreadProxy structure for more details). - * The operations in this queue are executed one by one - * in a child thread. - * Once the "open" method of the real object is finished, - * it calls a callback. This callback is not the one supplied - * by the client object. Instead, the _folder_open_cb() - * function is called (in the child thread) which pushes - * the real callback function in another operation queue. - * The real callback is then called in the main thread. - */ - -/* folder->open implementation */ - -/* - * proxy callback. Called in the child thread by the - * real folder "open" method when it is completed - */ -static void -_folder_open_cb (CamelFolder *folder, - gpointer user_data, - CamelException *ex) -{ - CamelOp *cb; - _ProxyCbUserData *pud; - CamelFuncDef *cb_def; - - /* transfer the exception information from "ex" to the - * client supplied exception (kept in pud->ex) */ - camel_exception_xfer (pud->ex, ex); - - /* create an operation which will call the real client - * supplied callback in the main thread */ - cb_def = CAMEL_FOLDER_PT_PROXY_CLASS(pud->proxy_folder)->open_cb_def; - cb = camel_marshal_create_op (cb_def, - pud->real_callback, - pud->proxy_folder, - pud->real_user_data, - pud->ex); - camel_thread_proxy_push_cb (pud->proxy_folder->proxy_object, cb); - -} - -static void -_open_async (CamelFolder *folder, - CamelFolderOpenMode mode, - CamelFolderAsyncCallback callback, - gpointer user_data, - CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - CamelOp *op; - CamelFuncDef *func_def; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - - /* create an operation corresponding to the "open" - * method of the real object. The operation definition - * is common to all instances of the CamelFolderPtProxy - * class so it is contained in the CamelFolderPtProxyClass - * structure. */ - func_def = CAMEL_FOLDER_PT_PROXY_CLASS(proxy_folder)->open_func_def; - if (callback) - op = camel_marshal_create_op (func_def, - CAMEL_FOLDER_CLASS (proxy_folder->real_folder)->open_async, - proxy_folder->real_folder, - mode, - _folder_open_cb, - _proxy_cb_user_data (proxy_folder->pud, callback, proxy_folder, ex, user_data), - proxy_folder->thread_ex); - else - op = camel_marshal_create_op (func_def, - CAMEL_FOLDER_CLASS (proxy_folder->real_folder)->open_async, - proxy_folder->real_folder, - mode, - NULL, - NULL, - NULL); - /* push the operation in the operation queue. This operation - * will be executed in a child thread but only one operation - * will be executed at a time, so that folder implementations - * don't have to be MultiThread safe. */ - camel_thread_proxy_push_op (proxy_folder->proxy_object, op); -} - - - -static void _open (CamelFolder *folder, - CamelFolderOpenMode mode, - CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - CF_CLASS (proxy_folder->real_folder)-> - open (proxy_folder->real_folder, mode, ex); -} - - - -/* folder->close implementation */ - -static void -_folder_close_cb (CamelFolder *folder, - gpointer user_data, - CamelException *ex) -{ - CamelOp *cb; - _ProxyCbUserData *pud; - CamelFuncDef *cb_def; - - camel_exception_xfer (pud->ex, ex); - cb_def = CAMEL_FOLDER_PT_PROXY_CLASS(pud->proxy_folder)->close_cb_def; - cb = camel_marshal_create_op (cb_def, - pud->real_callback, - pud->proxy_folder, - pud->real_user_data, - pud->ex); - camel_thread_proxy_push_cb (pud->proxy_folder->proxy_object, cb); - -} - -static void -_close_async (CamelFolder *folder, - gboolean expunge, - CamelFolderAsyncCallback callback, - gpointer user_data, - CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - CamelOp *op; - CamelFuncDef *func_def; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - - func_def = CAMEL_FOLDER_PT_PROXY_CLASS(proxy_folder)->close_func_def; - if (callback) - op = camel_marshal_create_op (func_def, - CAMEL_FOLDER_CLASS (proxy_folder->real_folder)->close_async, - proxy_folder->real_folder, - expunge, - _folder_close_cb, - _proxy_cb_user_data (proxy_folder->pud, callback, proxy_folder, ex, user_data), - proxy_folder->thread_ex); - else - op = camel_marshal_create_op (func_def, - CAMEL_FOLDER_CLASS (proxy_folder->real_folder)->close_async, - proxy_folder->real_folder, - expunge, - NULL, - NULL, - NULL); - camel_thread_proxy_push_op (proxy_folder->proxy_object, op); - -} - - -static void _close (CamelFolder *folder, - gboolean expunge, - CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - CF_CLASS (proxy_folder->real_folder)-> - close (proxy_folder->real_folder, expunge, ex); -} - - - - - -/* folder->set_name implementation */ - -static void -_set_name (CamelFolder *folder, - const gchar *name, - CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - CF_CLASS (proxy_folder->real_folder)-> - set_name (proxy_folder->real_folder, name, ex); - -} - - -/* folder->get_name implementation */ -/* this one is not executed in a thread */ -static const gchar * -_get_name (CamelFolder *folder, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - get_name (proxy_folder->real_folder, ex); -} - - - -/* folder->get_full_name implementation */ -/* this one is not executed in a thread */ - -static const gchar * -_get_full_name (CamelFolder *folder, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - get_full_name (proxy_folder->real_folder, ex); -} - - - - -static gboolean -_can_hold_folders (CamelFolder *folder, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - can_hold_folders (proxy_folder->real_folder, ex); -} - - - - -static gboolean -_can_hold_messages (CamelFolder *folder, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - can_hold_messages (proxy_folder->real_folder, ex); -} - - - -static gboolean -_exists (CamelFolder *folder, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - exists (proxy_folder->real_folder, ex); -} - - - - -static gboolean -_is_open (CamelFolder *folder, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - is_open (proxy_folder->real_folder, ex); -} - - - - - -static CamelFolder * -_get_subfolder (CamelFolder *folder, const gchar *folder_name, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - get_subfolder (proxy_folder->real_folder, folder_name, ex); -} - - - - - - -static gboolean -_create(CamelFolder *folder, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - create (proxy_folder->real_folder, ex); -} - - - - - - - - -static gboolean -_delete (CamelFolder *folder, gboolean recurse, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - delete (proxy_folder->real_folder, recurse, ex); -} - - - - - - - -static gboolean -_delete_messages (CamelFolder *folder, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - delete_messages (proxy_folder->real_folder, ex); -} - - - - - - -static CamelFolder * -_get_parent_folder (CamelFolder *folder, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; -#warning return proxy parent folder if any - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - get_parent_folder (proxy_folder->real_folder, ex); -} - - - - - -static CamelStore * -_get_parent_store (CamelFolder *folder, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - get_parent_store (proxy_folder->real_folder, ex); -} - - - - -static CamelFolderOpenMode -_get_mode (CamelFolder *folder, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - get_mode (proxy_folder->real_folder, ex); -} - - - - -static GList * -_list_subfolders (CamelFolder *folder, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - list_subfolders (proxy_folder->real_folder, ex); -} - - - - -static GList * -_expunge (CamelFolder *folder, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - expunge (proxy_folder->real_folder, ex); -} - - - - -static CamelMimeMessage * -_get_message_by_number (CamelFolder *folder, gint number, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - get_message_by_number (proxy_folder->real_folder, number, ex); -} - - - - - -static gint -_get_message_count (CamelFolder *folder, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - get_message_count (proxy_folder->real_folder, ex); -} - - - - -static void -_append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - CF_CLASS (proxy_folder->real_folder)-> - append_message (proxy_folder->real_folder, message, ex); -} - - - -static const GList * -_list_permanent_flags (CamelFolder *folder, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - list_permanent_flags (proxy_folder->real_folder, ex); -} - - - -static void -_copy_message_to (CamelFolder *folder, CamelMimeMessage *message, CamelFolder *dest_folder, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - CF_CLASS (proxy_folder->real_folder)-> - copy_message_to (proxy_folder->real_folder, message, dest_folder, ex); -} - - - - - - -/* UIDs stuff */ - - -static const gchar * -_get_message_uid (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - get_message_uid (proxy_folder->real_folder, message, ex); -} - - -/* the next two func are left there temporarily */ -#if 0 -static const gchar * -_get_message_uid_by_number (CamelFolder *folder, gint message_number, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - get_message_uid_by_number (proxy_folder->real_folder, message_number, ex); -} - -#endif - -static CamelMimeMessage * -_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - get_message_by_uid (proxy_folder->real_folder, uid, ex); -} - - -static GList * -_get_uid_list (CamelFolder *folder, CamelException *ex) -{ - CamelFolderPtProxy *proxy_folder; - - proxy_folder = CAMEL_FOLDER_PT_PROXY (folder); - return CF_CLASS (proxy_folder->real_folder)-> - get_uid_list (proxy_folder->real_folder, ex); -} - - -/* **** */ - - - - - diff --git a/camel/camel-folder-pt-proxy.h b/camel/camel-folder-pt-proxy.h deleted file mode 100644 index 35c0965f45..0000000000 --- a/camel/camel-folder-pt-proxy.h +++ /dev/null @@ -1,90 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-folder-pt-proxy.h : proxy folder using posix threads */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_FOLDER_PT_PROXY_H -#define CAMEL_FOLDER_PT_PROXY_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include "camel-folder.h" -#include "camel-op-queue.h" -#include "camel-thread-proxy.h" - - -#define CAMEL_FOLDER_PT_PROXY_TYPE (camel_folder_pt_proxy_get_type ()) -#define CAMEL_FOLDER_PT_PROXY(obj) (GTK_CHECK_CAST((obj), CAMEL_FOLDER_PT_PROXY_TYPE, CamelFolderPtProxy)) -#define CAMEL_FOLDER_PT_PROXY_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_FOLDER_PT_PROXY_TYPE, CamelFolderPtProxyClass)) -#define CAMEL_IS_FOLDER_PT_PROXY(o) (GTK_CHECK_TYPE((o), CAMEL_FOLDER_PT_PROXY_TYPE)) - -typedef struct _CamelFolderPtProxy CamelFolderPtProxy; - -typedef struct { - CamelFolderAsyncCallback real_callback; - CamelFolderPtProxy *proxy_folder; - CamelException *ex; - gpointer real_user_data; -} _ProxyCbUserData; - -struct _CamelFolderPtProxy { - CamelFolder parent; - - /* private fields */ - CamelFolder *real_folder; - CamelThreadProxy *proxy_object; - CamelException *thread_ex; - _ProxyCbUserData *pud; - -}; - - - -typedef struct { - CamelFolderClass parent_class; - - /* functions and callbacks definition (for marshalling) */ - CamelFuncDef *open_func_def; - CamelFuncDef *open_cb_def; - CamelFuncDef *close_func_def; - CamelFuncDef *close_cb_def; - CamelFuncDef *set_name_func_def; - CamelFuncDef *set_name_cb_def; - -} CamelFolderPtProxyClass; - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_FOLDER_PT_PROXY_H */ diff --git a/camel/camel-folder-summary.c b/camel/camel-folder-summary.c deleted file mode 100644 index 2c6b45b718..0000000000 --- a/camel/camel-folder-summary.c +++ /dev/null @@ -1,147 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camelFolderSummary.c : Abstract class for a folder_summary */ - - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel-folder-summary.h" -#include "camel-log.h" - -static GtkObjectClass *parent_class=NULL; - -/* Returns the class for a CamelFolderSummary */ -#define CFS_CLASS(so) CAMEL_FOLDER_SUMMARY_CLASS (GTK_OBJECT(so)->klass) - - -static const GList *_get_subfolder_info_list (CamelFolderSummary *summary); -static const GList *_get_message_info_list (CamelFolderSummary *summary); - -static void _finalize (GtkObject *object); - -static void -camel_folder_summary_class_init (CamelFolderSummaryClass *camel_folder_summary_class) -{ - GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_folder_summary_class); - - parent_class = gtk_type_class (gtk_object_get_type ()); - - /* virtual method definition */ - camel_folder_summary_class->get_subfolder_info_list = _get_subfolder_info_list; - camel_folder_summary_class->get_message_info_list = _get_message_info_list; - - - /* virtual method overload */ - gtk_object_class->finalize = _finalize; -} - - - - - -static void -camel_folder_summary_init (gpointer object, gpointer klass) -{ - CamelFolderSummary *summary = CAMEL_FOLDER_SUMMARY (object); - - CAMEL_LOG_FULL_DEBUG ( "camel_folder_summary_init:: Entering\n"); - summary->subfolder_info_list = NULL; - summary->message_info_list = NULL; - CAMEL_LOG_FULL_DEBUG ( "camel_folder_summary_init:: Leaving\n"); -} - - - -GtkType -camel_folder_summary_get_type (void) -{ - static GtkType camel_folder_summary_type = 0; - - if (!camel_folder_summary_type) { - GtkTypeInfo camel_folder_summary_info = - { - "CamelFolderSummary", - sizeof (CamelFolderSummary), - sizeof (CamelFolderSummaryClass), - (GtkClassInitFunc) camel_folder_summary_class_init, - (GtkObjectInitFunc) camel_folder_summary_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_folder_summary_type = gtk_type_unique (gtk_object_get_type (), &camel_folder_summary_info); - } - - return camel_folder_summary_type; -} - - -static void -_finalize (GtkObject *object) -{ - CamelFolderSummary *camel_folder_summary = CAMEL_FOLDER_SUMMARY (object); - - CAMEL_LOG_FULL_DEBUG ("Entering CamelFolderSummary::finalize\n"); - CAMEL_LOG_FULL_DEBUG ("CamelFolderSummary::finalize, finalizing object %p\n", object); - - parent_class->finalize (object); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelFolderSummary::finalize\n"); -} - - -CamelFolderSummary * -camel_folder_summary_new () -{ - return gtk_type_new (CAMEL_FOLDER_SUMMARY_TYPE); -} - -static const GList * -_get_subfolder_info_list (CamelFolderSummary *summary) -{ - return summary->subfolder_info_list; -} - - -const GList * -camel_folder_summary_get_subfolder_info_list (CamelFolderSummary *summary) -{ - return CFS_CLASS (summary)->get_subfolder_info_list (summary); -} - - - - -static const GList * -_get_message_info_list (CamelFolderSummary *summary) -{ - return summary->message_info_list; -} - -const GList * -camel_folder_summary_get_message_info_list (CamelFolderSummary *summary) -{ - return CFS_CLASS (summary)->get_message_info_list (summary); -} - - diff --git a/camel/camel-folder-summary.h b/camel/camel-folder-summary.h deleted file mode 100644 index acb3ba5f01..0000000000 --- a/camel/camel-folder-summary.h +++ /dev/null @@ -1,102 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camelFolderSummary.h : Abstract class for a folder summary */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_FOLDER_SUMMARY_H -#define CAMEL_FOLDER_SUMMARY_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> - - - -#define CAMEL_FOLDER_SUMMARY_TYPE (camel_folder_summary_get_type ()) -#define CAMEL_FOLDER_SUMMARY(obj) (GTK_CHECK_CAST((obj), CAMEL_FOLDER_SUMMARY_TYPE, CamelFolderSummary)) -#define CAMEL_FOLDER_SUMMARY_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_FOLDER_SUMMARY_TYPE, CamelFolderSummaryClass)) -#define CAMEL_IS_FOLDER_SUMMARY(o) (GTK_CHECK_TYPE((o), CAMEL_FOLDER_SUMMARY_TYPE)) - -typedef struct { - gchar *name; - gint nb_message; - gint nb_unread_message; - gint nb_deleted_message; - - GHashTable *extended_fields; -} CamelFolderInfo; - -typedef struct { - gchar *subject; - gchar *uid; - gchar *date; - gchar *sender; - - GHashTable *extended_fields; -} CamelMessageInfo; - - -typedef struct -{ - GtkObject parent_object; - - GList *subfolder_info_list; /* informations on subfolders */ - GList *message_info_list; /* informations on messages */ - -} CamelFolderSummary; - - - -typedef struct { - GtkObjectClass parent_class; - - /* Virtual methods */ - const GList * (*get_subfolder_info_list) (CamelFolderSummary *summary); - const GList * (*get_message_info_list) (CamelFolderSummary *summary); - -} CamelFolderSummaryClass; - - - -/* Standard Gtk function */ -GtkType camel_folder_summary_get_type (void); - - -/* public methods */ -CamelFolderSummary *camel_folder_summary_new (); -const GList *camel_folder_summary_get_subfolder_info_list (CamelFolderSummary *summary); -const GList *camel_folder_summary_get_message_info_list (CamelFolderSummary *summary); - - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_FOLDER_SUMMARY_H */ diff --git a/camel/camel-folder-utils.c b/camel/camel-folder-utils.c deleted file mode 100644 index 601966ab02..0000000000 --- a/camel/camel-folder-utils.c +++ /dev/null @@ -1,102 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-folder-utils : Utility for camel folders */ - - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel-folder-utils.h" -#include "camel-log.h" -#include "camel-mime-message.h" - - - -/* Active Message List utilities */ - -/* */ -gint -camel_mime_message_number_cmp (gconstpointer a, gconstpointer b) -{ - CamelMimeMessage *m_a = CAMEL_MIME_MESSAGE (a); - CamelMimeMessage *m_b = CAMEL_MIME_MESSAGE (b); - - return (m_a->message_number - (m_b->message_number)); -} - - -/** - * camel_aml_expunge_messages: Expunge the message marked as deleted in an Active Message List - * @aml: active message list - * @folder: folder object - * - * Expunge the message flagged as "DELETED" in an active message list. - * The messages are not freed nor really expunged on the disk, they - * are just removed from the active message list and marked as - * "EXPUNGED". The list of the message which have been expunged is - * return in a GList which must be freed by the caller. - * To be really expunged the providers must provide or call - * folder specific methods. - * - * Return value: the list of expunged messages. - **/ -GList * -camel_aml_expunge_messages (GList *aml, - CamelFolder *folder) -{ - CamelMimeMessage *message; - GList *message_node; - GList *next_message_node; - guint nb_expunged = 0; - GList *expunged_messages; - - - message_node = aml; - /* look in folder message list which messages - * need to be expunged */ - while ( message_node) { - message = CAMEL_MIME_MESSAGE (message_node->data); - - /* we may free message_node so get the next node now */ - next_message_node = message_node->next; - - if (message) { - if (camel_mime_message_get_flag (message, "DELETED")) { - - /* remove the message from active message list */ - g_list_remove_link (aml, message_node); - g_list_free_1 (message_node); - camel_mime_message_set_flag (message, "EXPUNGED", TRUE); - expunged_messages = g_list_prepend (expunged_messages, message); - - } - } - else { - CAMEL_LOG_WARNING ("CamelFolder::expunge warning message_node contains no message\n"); - } - message_node = next_message_node; - CAMEL_LOG_FULL_DEBUG ("CamelFolder::expunge, examined message node %p\n", message_node); - } - - return expunged_messages; -} diff --git a/camel/camel-folder-utils.h b/camel/camel-folder-utils.h deleted file mode 100644 index 1d6823e771..0000000000 --- a/camel/camel-folder-utils.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-folder-utils : Utility for camel folders */ - - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_MIME_PART_UTILS_H -#define CAMEL_MIME_PART_UTILS_H 1 - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include "camel-folder.h" - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MIME_PART_UTILS_H */ - diff --git a/camel/camel-folder.c b/camel/camel-folder.c deleted file mode 100644 index 4efae9544f..0000000000 --- a/camel/camel-folder.c +++ /dev/null @@ -1,1781 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camelFolder.c : Abstract class for an email folder */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel-folder.h" -#include "camel-log.h" -#include "string-utils.h" - -static GtkObjectClass *parent_class=NULL; - -/* Returns the class for a CamelFolder */ -#define CF_CLASS(so) CAMEL_FOLDER_CLASS (GTK_OBJECT(so)->klass) - - - - -static void _init_with_store (CamelFolder *folder, - CamelStore *parent_store, - CamelException *ex); -static void _finalize (GtkObject *object); - - -static void _open (CamelFolder *folder, - CamelFolderOpenMode mode, - CamelException *ex); -static void _close (CamelFolder *folder, - gboolean expunge, - CamelException *ex); - -/* Async operations are not used for the moment */ -static void _open_async (CamelFolder *folder, - CamelFolderOpenMode mode, - CamelFolderAsyncCallback callback, - gpointer user_data, - CamelException *ex); -static void _close_async (CamelFolder *folder, - gboolean expunge, - CamelFolderAsyncCallback callback, - gpointer user_data, - CamelException *ex); - - -static void _set_name (CamelFolder *folder, - const gchar *name, - CamelException *ex); -static const gchar *_get_name (CamelFolder *folder, - CamelException *ex); -static const gchar *_get_full_name (CamelFolder *folder, CamelException *ex); -/* static void _set_full_name (CamelFolder *folder, const gchar *name); */ - - -static gboolean _can_hold_folders (CamelFolder *folder, CamelException *ex); -static gboolean _can_hold_messages (CamelFolder *folder, CamelException *ex); -static gboolean _exists (CamelFolder *folder, CamelException *ex); -static gboolean _is_open (CamelFolder *folder, CamelException *ex); -static const GList *_list_permanent_flags (CamelFolder *folder, CamelException *ex); -static CamelFolderOpenMode _get_mode (CamelFolder *folder, CamelException *ex); - - -static gboolean _create (CamelFolder *folder, CamelException *ex); -static gboolean _delete (CamelFolder *folder, gboolean recurse, CamelException *ex); - - -static GList *_list_subfolders (CamelFolder *folder, CamelException *ex); -static CamelFolder *_get_subfolder (CamelFolder *folder, - const gchar *folder_name, CamelException *ex); -static CamelFolder *_get_parent_folder (CamelFolder *folder, CamelException *ex); -static CamelStore * _get_parent_store (CamelFolder *folder, CamelException *ex); - - -static gboolean _has_message_number_capability (CamelFolder *folder, CamelException *ex); -static CamelMimeMessage *_get_message_by_number (CamelFolder *folder, - gint number, - CamelException *ex); -static gint _get_message_count (CamelFolder *folder, - CamelException *ex); - - -static gboolean _delete_messages (CamelFolder *folder, - CamelException *ex); -static GList * _expunge (CamelFolder *folder, - CamelException *ex); -static void _append_message (CamelFolder *folder, - CamelMimeMessage *message, - CamelException *ex); -static void _copy_message_to (CamelFolder *folder, - CamelMimeMessage *message, - CamelFolder *dest_folder, - CamelException *ex); - - -static GList *_get_uid_list (CamelFolder *folder, CamelException *ex); -static const gchar *_get_message_uid (CamelFolder *folder, - CamelMimeMessage *message, - CamelException *ex); -static CamelMimeMessage *_get_message_by_uid (CamelFolder *folder, - const gchar *uid, - CamelException *ex); - - - - -static void -camel_folder_class_init (CamelFolderClass *camel_folder_class) -{ - GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_folder_class); - - parent_class = gtk_type_class (gtk_object_get_type ()); - - /* virtual method definition */ - camel_folder_class->init_with_store = _init_with_store; - camel_folder_class->open = _open; - camel_folder_class->open_async = _open_async; - camel_folder_class->close = _close; - camel_folder_class->close_async = _close_async; - camel_folder_class->set_name = _set_name; - camel_folder_class->get_name = _get_name; - camel_folder_class->get_full_name = _get_full_name; - camel_folder_class->can_hold_folders = _can_hold_folders; - camel_folder_class->can_hold_messages = _can_hold_messages; - camel_folder_class->exists = _exists; - camel_folder_class->is_open = _is_open; - camel_folder_class->get_subfolder = _get_subfolder; - camel_folder_class->create = _create; - camel_folder_class->delete = _delete; - camel_folder_class->delete_messages = _delete_messages; - camel_folder_class->get_parent_folder = _get_parent_folder; - camel_folder_class->get_parent_store = _get_parent_store; - camel_folder_class->get_mode = _get_mode; - camel_folder_class->list_subfolders = _list_subfolders; - camel_folder_class->expunge = _expunge; - camel_folder_class->has_message_number_capability = _has_message_number_capability; - camel_folder_class->get_message_by_number = _get_message_by_number; - camel_folder_class->get_message_count = _get_message_count; - camel_folder_class->append_message = _append_message; - camel_folder_class->list_permanent_flags = _list_permanent_flags; - camel_folder_class->copy_message_to; - camel_folder_class->get_message_uid = _get_message_uid; - camel_folder_class->get_message_by_uid = _get_message_by_uid; - camel_folder_class->get_uid_list = _get_uid_list; - - /* virtual method overload */ - gtk_object_class->finalize = _finalize; -} - - - - - - - -GtkType -camel_folder_get_type (void) -{ - static GtkType camel_folder_type = 0; - - if (!camel_folder_type) { - GtkTypeInfo camel_folder_info = - { - "CamelFolder", - sizeof (CamelFolder), - sizeof (CamelFolderClass), - (GtkClassInitFunc) camel_folder_class_init, - (GtkObjectInitFunc) NULL, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_folder_type = gtk_type_unique (gtk_object_get_type (), &camel_folder_info); - } - - return camel_folder_type; -} - - -static void -_finalize (GtkObject *object) -{ - CamelFolder *camel_folder = CAMEL_FOLDER (object); - GList *message_node; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelFolder::finalize\n"); - - g_free (camel_folder->name); - g_free (camel_folder->full_name); - g_free (camel_folder->permanent_flags); - - GTK_OBJECT_CLASS (parent_class)->finalize (object); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelFolder::finalize\n"); -} - - -/** - * _init_with_store: init the folder by setting its parent store. - * @folder: folder object to initialize - * @parent_store: parent store object of the folder - * - * - **/ -static void -_init_with_store (CamelFolder *folder, CamelStore *parent_store, CamelException *ex) -{ - - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return; - } - - if (!parent_store) { - camel_exception_set (ex, - CAMEL_EXCEPTION_INVALID_PARAM, - "parent_store parameter is NULL"); - return; - } - - if (folder->parent_store) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_INVALID, - "folder already has a parent store"); - return; - } - - folder->parent_store = parent_store; - gtk_object_ref (GTK_OBJECT (parent_store)); - - folder->open_mode = FOLDER_OPEN_UNKNOWN; - folder->open_state = FOLDER_CLOSE; - folder->name = NULL; - folder->full_name = NULL; -} - - - - - -static void -_open (CamelFolder *folder, - CamelFolderOpenMode mode, - CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return; - } - - folder->open_state = FOLDER_OPEN; - folder->open_mode = mode; -} - - - - -/** - * camel_folder_open: Open a folder - * @folder: The folder object - * @mode: open mode (R/W/RW ?) - * @ex: exception object - * - * Open a folder in a given mode. - * - **/ -void -camel_folder_open (CamelFolder *folder, - CamelFolderOpenMode mode, - CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return; - } - CF_CLASS(folder)->open (folder, mode, ex); -} - - - - - - -static void -_open_async (CamelFolder *folder, - CamelFolderOpenMode mode, - CamelFolderAsyncCallback callback, - gpointer user_data, - CamelException *ex) -{ - CAMEL_LOG_WARNING ("Calling CamelFolder::open_async directly. " - "Should be overloaded\n"); -} - - - -/** - * camel_folder_open: Open a folder - * @folder: The folder object - * @mode: open mode (R/W/RW ?) - * @callback: function to call when the operation is over - * @user_data: data to pass to the callback - * @ex: exception object - * - * Open a folder in a given mode. When the operation is over - * the callback is called and the client program can determine - * if the operation suceeded by examining the exception. - * - **/ -void -camel_folder_open_async (CamelFolder *folder, - CamelFolderOpenMode mode, - CamelFolderAsyncCallback callback, - gpointer user_data, - CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return; - } - CF_CLASS(folder)->open_async (folder, mode, callback, user_data, ex); -} - - - - - - -static void -_close (CamelFolder *folder, - gboolean expunge, - CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return; - } - folder->open_state = FOLDER_CLOSE; -} - -/** - * camel_folder_close: Close a folder. - * @folder: The folder object - * @expunge: if TRUE, the flagged message are deleted. - * @ex: exception object - * - * Put a folder in its closed state, and possibly - * expunge the flagged messages. - * - **/ -void -camel_folder_close (CamelFolder *folder, - gboolean expunge, - CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return; - } - CF_CLASS(folder)->close (folder, expunge, ex); -} - - - - - - -static void -_close_async (CamelFolder *folder, - gboolean expunge, - CamelFolderAsyncCallback callback, - gpointer user_data, - CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return; - } - CAMEL_LOG_WARNING ("Calling CamelFolder::close_async directly. " - "Should be overloaded\n"); -} - -/** - * camel_folder_close_async: Close a folder. - * @folder: The folder object - * @expunge: if TRUE, the flagged message are deleted. - * @callback: function to call when the operation is over - * @user_data: data to pass to the callback - * @ex: exception object - * - * Put a folder in its closed state, and possibly - * expunge the flagged messages. The callback is called - * when the operation is over and the client program can determine - * if the operation suceeded by examining the exception. - * - **/ -void -camel_folder_close_async (CamelFolder *folder, - gboolean expunge, - CamelFolderAsyncCallback callback, - gpointer user_data, - CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return; - } - CF_CLASS(folder)->close_async (folder, expunge, callback, user_data, ex); -} - - - - - -static void -_set_name (CamelFolder *folder, - const gchar *name, - CamelException *ex) -{ - gchar separator; - gchar *full_name; - const gchar *parent_full_name; - - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return; - } - - /* if the folder already has a name, free it */ - g_free (folder->name); - g_free (folder->full_name); - - /* set those fields to NULL now, so that if an - exception occurs, they will be set anyway */ - folder->name = NULL; - folder->full_name = NULL; - - if (!name) { - camel_exception_set (ex, - CAMEL_EXCEPTION_INVALID_PARAM, - "name parameter is NULL"); - return; - } - - - if (!folder->parent_store) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_INVALID, - "folder has no parent store"); - return; - } - - /* the set_name method is valid only only on - close folders */ - - if (camel_folder_get_mode (folder, ex) != FOLDER_CLOSE) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_INVALID, - "CamelFolder::set_name is valid only on closed folders"); - return; - } - - separator = camel_store_get_separator (folder->parent_store); - camel_exception_clear (ex); - if (folder->parent_folder) { - parent_full_name = camel_folder_get_full_name (folder->parent_folder, ex); - if (camel_exception_get_id (ex)) return; - - full_name = g_strdup_printf ("%s%d%s", parent_full_name, separator, name); - } - - folder->name = g_strdup (name); - folder->full_name = full_name; - -} - - -/** - * camel_folder_set_name:set the (short) name of the folder - * @folder: folder - * @name: new name of the folder - * @ex: exception object - **/ -void -camel_folder_set_name (CamelFolder *folder, const gchar *name, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - } - - CF_CLASS(folder)->set_name (folder, name, ex); -} - - - - - -/* not used for the moment, I don't know if it it is - a good idea or not to use it */ -#if 0 -static void -_set_full_name (CamelFolder *folder, const gchar *name, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return; - } - g_free(folder->full_name); - folder->full_name = g_strdup (name); -} - - -/** - * camel_folder_set_full_name:set the (full) name of the folder - * @folder: folder - * @name: new name of the folder - * - * set the name of the folder. - * - **/ -void -camel_folder_set_full_name (CamelFolder *folder, const gchar *name, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return; - } - - CF_CLASS(folder)->set_full_name (folder, name, ex); -} -#endif - - - - -static const gchar * -_get_name (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - return folder->name; -} - - -/** - * camel_folder_get_name: get the (short) name of the folder - * @folder: - * - * get the name of the folder. The fully qualified name - * can be obtained with the get_full_ame method (not implemented) - * - * Return value: name of the folder - **/ -const gchar * -camel_folder_get_name (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - return CF_CLASS(folder)->get_name (folder, ex); -} - - - -static const gchar * -_get_full_name (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - return folder->full_name; -} - -/** - * camel_folder_get_full_name:get the (full) name of the folder - * @folder: folder to get the name - * - * get the name of the folder. - * - * Return value: full name of the folder - **/ -const gchar * -camel_folder_get_full_name (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - return CF_CLASS(folder)->get_full_name (folder, ex); -} - - -/** - * _can_hold_folders: tests if the folder can contain other folders - * @folder: The folder object - * - * Tests if a folder can contain other folder - * (as for example MH folders) - * - * Return value: - **/ -static gboolean -_can_hold_folders (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FALSE; - } - - return folder->can_hold_folders; -} - - - - -/** - * _can_hold_messages: tests if the folder can contain messages - * @folder: The folder object - * - * Tests if a folder object can contain messages. - * In the case it can not, it most surely can only - * contain folders (rare). - * - * Return value: true if it can contain messages false otherwise - **/ -static gboolean -_can_hold_messages (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FALSE; - } - - return folder->can_hold_messages; -} - - - -static gboolean -_exists (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FALSE; - } - - return FALSE; -} - - -/** - * _exists: tests if the folder object exists in its parent store. - * @folder: folder object - * - * Test if a folder exists on a store. A folder can be - * created without physically on a store. In that case, - * use CamelFolder::create to create it - * - * Return value: true if the folder exists on the store false otherwise - **/ -gboolean -camel_folder_exists (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FALSE; - } - - return (CF_CLASS(folder)->exists (folder, ex)); -} - - - -/** - * _is_open: test if the folder is open - * @folder: The folder object - * - * Tests if a folder is open. If not open it can be opened - * CamelFolder::open - * - * Return value: true if the folder exists, false otherwise - **/ -static gboolean -_is_open (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FALSE; - } - - return (folder->open_state == FOLDER_OPEN); -} - - - - - -static CamelFolder * -_get_subfolder (CamelFolder *folder, - const gchar *folder_name, - CamelException *ex) -{ - CamelFolder *new_folder; - gchar *full_name; - const gchar *current_folder_full_name; - gchar separator; - - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return; - } - - - if (!folder_name) { - camel_exception_set (ex, - CAMEL_EXCEPTION_INVALID_PARAM, - "folder_name parameter is NULL"); - return; - } - - if (!folder->parent_store) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_INVALID, - "folder has no parent store"); - return; - } - - current_folder_full_name = camel_folder_get_full_name (folder, ex); - if (camel_exception_get_id (ex)) return NULL; - - - separator = camel_store_get_separator (folder->parent_store); - full_name = g_strdup_printf ("%s%d%s", current_folder_full_name, separator, folder_name); - - new_folder = camel_store_get_folder (folder->parent_store, full_name); - return new_folder; -} - - - -/** - * camel_folder_get_subfolder: return the (sub)folder object that is specified - * @folder: the folder - * @folder_name: subfolder path - * - * This method returns a folder objects. This folder - * is necessarily a subfolder of the current folder. - * It is an error to ask a folder begining with the - * folder separator character. - * - * Return value: Required folder. NULL if the subfolder object could not be obtained - **/ -CamelFolder * -camel_folder_get_subfolder (CamelFolder *folder, gchar *folder_name, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FALSE; - } - - return (CF_CLASS(folder)->get_subfolder(folder,folder_name, ex)); -} - - - - -/** - * _create: creates a folder on its store - * @folder: a CamelFolder object. - * - * this routine handles the recursion mechanism. - * Children classes have to implement the actual - * creation mechanism. They must call this method - * before physically creating the folder in order - * to be sure the parent folder exists. - * Calling this routine on an existing folder is - * not an error, and returns %TRUE. - * - * Return value: %TRUE if the folder exists, %FALSE otherwise - **/ -static gboolean -_create (CamelFolder *folder, CamelException *ex) -{ - gchar *prefix; - gchar dich_result; - CamelFolder *parent; - gchar sep; - - g_assert (folder); - g_assert (folder->parent_store); - g_assert (folder->name); - - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FALSE; - } - - - if (!folder->name) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_INVALID, - "folder has no name"); - return FALSE; - } - - if (!folder->parent_store) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_INVALID, - "folder has no parent store"); - return FALSE; - } - - /* if the folder already exists on the - store, do nothing and return true */ - if (CF_CLASS(folder)->exists (folder, ex)) - return TRUE; - - - sep = camel_store_get_separator (folder->parent_store); - if (folder->parent_folder) { - camel_folder_create (folder->parent_folder, ex); - if (camel_exception_get_id (ex)) return FALSE; - } - else { - if (folder->full_name) { - dich_result = string_dichotomy ( - folder->full_name, sep, &prefix, NULL, - STRING_DICHOTOMY_STRIP_TRAILING | STRING_DICHOTOMY_RIGHT_DIR); - if (dich_result!='o') { - g_warning("have to handle the case where the path is not OK\n"); - return FALSE; - } else { - parent = camel_store_get_folder (folder->parent_store, prefix); - camel_folder_create (parent, ex); - if (camel_exception_get_id (ex)) return FALSE; - } - } - } - return TRUE; -} - - -/** - * camel_folder_create: create the folder object on the physical store - * @folder: folder object to create - * - * This routine physically creates the folder object on - * the store. Having created the object does not - * mean the folder physically exists. If it does not - * exists, this routine will create it. - * if the folder full name contains more than one level - * of hierarchy, all folders between the current folder - * and the last folder name will be created if not existing. - * - * Return value: - **/ -gboolean -camel_folder_create (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FALSE; - } - - return (CF_CLASS(folder)->create(folder, ex)); -} - - - - - -/** - * _delete: delete folder - * @folder: folder to delete - * @recurse: true is subfolders must also be deleted - * - * Delete a folder and its subfolders (if recurse is TRUE). - * The scheme is the following: - * 1) delete all messages in the folder - * 2) if recurse is FALSE, and if there are subfolders - * return FALSE, else delete current folder and retuen TRUE - * if recurse is TRUE, delete subfolders, delete - * current folder and return TRUE - * - * subclasses implementing a protocol with a different - * deletion behaviour must emulate this one or implement - * empty folders deletion and call this routine which - * will do all the works for them. - * Opertions must be done in the folllowing order: - * - call this routine - * - delete empty folder - * - * Return value: true if the folder has been deleted - **/ -static gboolean -_delete (CamelFolder *folder, gboolean recurse, CamelException *ex) -{ - GList *subfolders=NULL; - GList *sf; - gboolean ok; - - g_assert(folder); - - /* method valid only on closed folders */ - if (folder->open_state != FOLDER_CLOSE) { - camel_exception_set (ex, CAMEL_EXCEPTION_FOLDER_INVALID_STATE, - "Delete operation invalid on opened folders"); - return FALSE; - } - - /* delete all messages in the folder */ - CF_CLASS(folder)->delete_messages(folder, ex); - if (camel_exception_get_id (ex)) return FALSE; - - subfolders = CF_CLASS(folder)->list_subfolders(folder, ex); - if (camel_exception_get_id (ex)) { - if (subfolders) g_list_free (subfolders); - return FALSE; - } - - ok = TRUE; - if (recurse) { /* delete subfolders */ - if (subfolders) { - sf = subfolders; - do { - CF_CLASS(sf->data)->delete(CAMEL_FOLDER(sf->data), TRUE, ex); - if (camel_exception_get_id (ex)) ok = FALSE; - } while (ok && (sf = sf->next)); - } - } else if (subfolders) { - camel_exception_set (ex, CAMEL_EXCEPTION_FOLDER_NON_EMPTY, - "folder has subfolders"); - ok = FALSE; - } - - if (subfolders) g_list_free (subfolders); - - return ok; -} - - - -/** - * camel_folder_delete: delete a folder - * @folder: folder to delete - * @recurse: TRUE if subfolders must be deleted - * - * Delete a folder. All messages in the folder - * are deleted before the folder is deleted. - * When recurse is true, all subfolders are - * deleted too. When recurse is FALSE and folder - * contains subfolders, all messages are deleted, - * but folder deletion fails. - * - * Return value: TRUE if deletion was successful - **/ -gboolean camel_folder_delete (CamelFolder *folder, gboolean recurse, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FALSE; - } - - return CF_CLASS(folder)->delete(folder, recurse, ex); -} - - - - - -/** - * _delete_messages: delete all messages in the folder - * @folder: - * - * - * - * Return value: - **/ -static gboolean -_delete_messages (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FALSE; - } - - CAMEL_LOG_WARNING ("Calling CamelFolder::delete_messages directly. " - "Should be overloaded\n"); - return FALSE; -} - - -/** - * camel_folder_delete_messages: delete all messages in the folder - * @folder: folder - * - * delete all messages stored in a folder - * - * Return value: TRUE if the messages could be deleted - **/ -gboolean -camel_folder_delete_messages (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FALSE; - } - - return CF_CLASS(folder)->delete_messages(folder, ex); -} - - - - - - -/** - * _get_parent_folder: return parent folder - * @folder: folder to get the parent - * - * - * - * Return value: - **/ -static CamelFolder * -_get_parent_folder (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - return folder->parent_folder; -} - - -/** - * camel_folder_get_parent_folder:return parent folder - * @folder: folder to get the parent - * - * - * - * Return value: - **/ -CamelFolder * -camel_folder_get_parent_folder (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - return CF_CLASS(folder)->get_parent_folder(folder, ex); -} - - -/** - * _get_parent_store: return parent store - * @folder: folder to get the parent - * - * - * - * Return value: - **/ -static CamelStore * -_get_parent_store (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - return folder->parent_store; -} - - -/** - * camel_folder_get_parent_store: return parent store - * @folder: folder to get the parent - * - * Return the parent store of a folder - * - * Return value: the parent store. - **/ -CamelStore * -camel_folder_get_parent_store (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - return CF_CLASS(folder)->get_parent_store(folder, ex); -} - - - - -static CamelFolderOpenMode -_get_mode (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FOLDER_OPEN_UNKNOWN; - } - - return folder->open_mode; -} - - -/** - * camel_folder_get_mode: return the open mode of a folder - * @folder: - * - * - * - * Return value: open mode of the folder - **/ -CamelFolderOpenMode -camel_folder_get_mode (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FOLDER_OPEN_UNKNOWN; - } - - return CF_CLASS(folder)->get_mode(folder, ex); -} - - - - -static GList * -_list_subfolders (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - CAMEL_LOG_WARNING ("Calling CamelFolder::list_subfolders directly. " - "Should be overloaded\n"); - return NULL; -} - - -/** - * camel_folder_list_subfolders: list subfolders in a folder - * @folder: the folder - * - * List subfolders in a folder. - * - * Return value: list of subfolders - **/ -GList * -camel_folder_list_subfolders (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - return CF_CLASS(folder)->list_subfolders(folder, ex); -} - - - - -static GList * -_expunge (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - CAMEL_LOG_WARNING ("Calling CamelFolder::expunge directly. " - "Should be overloaded\n"); - return NULL; -} - - -/** - * camel_folder_expunge: physically delete messages marked as "DELETED" - * @folder: the folder - * - * Delete messages which have been marked as "DELETED" - * - * Return value: list of expunged messages - **/ -GList * -camel_folder_expunge (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - CF_CLASS (folder)->expunge (folder, ex); -} - - -static gboolean -_has_message_number_capability (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FALSE; - } - - CAMEL_LOG_WARNING ("Calling CamelFolder::has_message_number_capability directly. " - "Should be overloaded\n"); - return FALSE; - -} - - -/** - * camel_folder_has_message_number_capability: tests if the message can be numbered within the folder - * @folder: folder to test - * - * Test if the message in this folder can be - * obtained via the get_by_number method. - * Usually, when the folder has the UID - * capability, messages should be referred to - * by their UID rather than by their number - * as the UID is more reliable. - * - * Return value: TRUE if the folder supports message numbering, FALSE otherwise. - **/ -gboolean -camel_folder_has_message_number_capability (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FALSE; - } - - return CF_CLASS(folder)->has_message_number_capability (folder, ex); -} - - - - -static CamelMimeMessage * -_get_message_by_number (CamelFolder *folder, gint number, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - CAMEL_LOG_WARNING ("Calling CamelFolder::get_message_by_number directly. " - "Should be overloaded\n"); - return NULL; -} - - - - -/** - * camel_folder_get_message_by_number: return the message corresponding to that number in the folder - * @folder: a CamelFolder object - * @number: the number of the message within the folder. - * - * Return the message corresponding to that number within the folder. - * - * Return value: A pointer on the corresponding message or NULL if no corresponding message exists - **/ -CamelMimeMessage * -camel_folder_get_message_by_number (CamelFolder *folder, gint number, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - return CF_CLASS (folder)->get_message_by_number (folder, number, ex); -} - - -static gint -_get_message_count (CamelFolder *folder, CamelException *ex) -{ - CAMEL_LOG_WARNING ("Calling CamelFolder::get_message_count directly. " - "Should be overloaded\n"); - return -1; -} - - - -/** - * camel_folder_get_message_count: get the number of messages in the folder - * @folder: A CamelFolder object - * - * Returns the number of messages in the folder. - * - * Return value: the number of messages or -1 if unknown. - **/ -gint -camel_folder_get_message_count (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return -1; - } - - return CF_CLASS (folder)->get_message_count (folder, ex); -} - - -static void -_append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return; - } - - CAMEL_LOG_WARNING ("Calling CamelFolder::append_message directly. " - "Should be overloaded\n"); - return; - -} - - -/** - * camel_folder_append_message: add a message to a folder - * @folder: folder object to add the message to - * @message: message object - * @ex: exception object - * - * Add a message to a folder. - * - **/ -void -camel_folder_append_message (CamelFolder *folder, - CamelMimeMessage *message, - CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return; - } - - CF_CLASS (folder)->append_message (folder, message, ex); -} - - -static const GList * -_list_permanent_flags (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - return folder->permanent_flags; -} - - -const GList * -camel_folder_list_permanent_flags (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - return CF_CLASS (folder)->list_permanent_flags (folder, ex); -} - - - - -static void -_copy_message_to (CamelFolder *folder, CamelMimeMessage *message, CamelFolder *dest_folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return; - } - - camel_folder_append_message (dest_folder, message, ex); -} - - -void -camel_folder_copy_message_to (CamelFolder *folder, - CamelMimeMessage *message, - CamelFolder *dest_folder, - CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return; - } - - CF_CLASS (folder)->copy_message_to (folder, message, dest_folder, ex);; -} - - - - - -/* summary stuff */ - -gboolean -camel_folder_has_summary_capability (CamelFolder *folder, - CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FALSE; - } - - return folder->has_summary_capability; -} - - -/** - * camel_folder_get_summary: return the summary of a folder - * @folder: folder object - * @ex: exception object - * - * Return a CamelFolderSummary object from - * which the main informations about a folder - * can be retrieved. - * - * Return value: the folder summary object. - **/ -CamelFolderSummary * -camel_folder_get_summary (CamelFolder *folder, - CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - return folder->summary; -} - - - - -/* UIDs stuff */ - -/** - * camel_folder_has_uid_capability: detect if the folder support UIDs - * @folder: Folder object - * - * Detects if a folder supports UID operations, that is - * reference messages by a Unique IDentifier instead - * of by message number. - * - * Return value: TRUE if the folder supports UIDs - **/ -gboolean -camel_folder_has_uid_capability (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FALSE; - } - - return folder->has_uid_capability; -} - - - -static const gchar * -_get_message_uid (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex) -{ - CAMEL_LOG_WARNING ("Calling CamelFolder::get_message_uid directly. " - "Should be overloaded\n"); - return NULL; -} - -/** - * camel_folder_get_message_uid: get the UID of a message in a folder - * @folder: Folder in which the UID must refer to - * @message: Message object - * - * Return the UID of a message relatively to a folder. - * A message can have different UID, each one corresponding - * to a different folder, if the message is referenced in - * several folders. - * - * Return value: The UID of the message in the folder - **/ -const gchar * -camel_folder_get_message_uid (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - if (!folder->has_uid_capability) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NON_UID, - "folder is not UID capable"); - return NULL; - } - - return CF_CLASS (folder)->get_message_uid (folder, message, ex); -} - - - -/* the next two func are left there temporarily */ -static const gchar * -_get_message_uid_by_number (CamelFolder *folder, gint message_number, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - CAMEL_LOG_WARNING ("Calling CamelFolder::get_message_uid_by_number directly. " - "Should be overloaded\n"); - return NULL; -} - -/** - * camel_folder_get_message_uid_by_number: get the UID corresponding to a message number - * @folder: Folder object - * @message_number: Message number - * - * get the UID corresponding to a message number. - * Use of this routine should be avoiding, as on - * folders supporting UIDs, message numbers should - * not been used. - * - * Return value: - **/ -const gchar * -camel_folder_get_message_uid_by_number (CamelFolder *folder, gint message_number, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - /* if (!folder->has_uid_capability) return NULL; */ - /* return CF_CLASS (folder)->get_message_uid_by_number (folder, message_number, ex); */ -} - - -static CamelMimeMessage * -_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex) -{ - CAMEL_LOG_WARNING ("Calling CamelFolder::get_message_by_uid directly. " - "Should be overloaded\n"); - return NULL; -} - - -/** - * camel_folder_get_message_by_uid: Get a message by its UID in a folder - * @folder: the folder object - * @uid: the UID - * - * Get a message from its UID in the folder. Messages - * are cached within a folder, that is, asking twice - * for the same UID returns the same message object. - * - * Return value: Message corresponding to the UID - **/ -CamelMimeMessage * -camel_folder_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - if (!folder->has_uid_capability) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NON_UID, - "folder is not UID capable"); - return NULL; - } - - return CF_CLASS (folder)->get_message_by_uid (folder, uid, ex); -} - -static GList * -_get_uid_list (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - if (!folder->has_uid_capability) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NON_UID, - "folder is not UID capable"); - return NULL; - } - - CAMEL_LOG_WARNING ("Calling CamelFolder::get_uid_list directly. " - "Should be overloaded\n"); - return NULL; -} - -/** - * camel_folder_get_uid_list: get the list of UID in a folder - * @folder: folder object - * - * get the list of UID available in a folder. This - * routine is usefull to know what messages are - * available when the folder does not support - * summaries. The UIDs in the list must not be freed, - * the folder object caches them. - * - * Return value: Glist of UID correspondind to the messages available in the folder. - **/ -GList * -camel_folder_get_uid_list (CamelFolder *folder, CamelException *ex) -{ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return NULL; - } - - if (!folder->has_uid_capability) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NON_UID, - "folder is not UID capable"); - return NULL; - } - - return CF_CLASS (folder)->get_uid_list (folder, ex); -} - - -/* **** */ diff --git a/camel/camel-folder.h b/camel/camel-folder.h deleted file mode 100644 index c00a17d8b6..0000000000 --- a/camel/camel-folder.h +++ /dev/null @@ -1,299 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camelFolder.h : Abstract class for an email folder */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_FOLDER_H -#define CAMEL_FOLDER_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> - -typedef struct _CamelFolder CamelFolder; - -#include "camel-store.h" -#include "camel-mime-message.h" -#include "camel-folder-summary.h" -#include "camel-exception.h" - -#define CAMEL_FOLDER_TYPE (camel_folder_get_type ()) -#define CAMEL_FOLDER(obj) (GTK_CHECK_CAST((obj), CAMEL_FOLDER_TYPE, CamelFolder)) -#define CAMEL_FOLDER_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_FOLDER_TYPE, CamelFolderClass)) -#define CAMEL_IS_FOLDER(o) (GTK_CHECK_TYPE((o), CAMEL_FOLDER_TYPE)) - -typedef enum { - FOLDER_OPEN, - FOLDER_CLOSE -} CamelFolderState; - -typedef enum { - FOLDER_OPEN_UNKNOWN = 0, /* folder open mode is unknown */ - FOLDER_OPEN_READ = 1, /* folder is read only */ - FOLDER_OPEN_WRITE = 2, /* folder is write only */ - FOLDER_OPEN_RW = 3 /* folder is read/write */ -} CamelFolderOpenMode; - -typedef void (*CamelFolderAsyncCallback) (); - -struct _CamelFolder -{ - GtkObject parent_object; - - gboolean can_hold_folders; - gboolean can_hold_messages; - CamelFolderOpenMode open_mode; - CamelFolderState open_state; - gchar *name; - gchar *full_name; - CamelStore *parent_store; - CamelFolder *parent_folder; - GList *permanent_flags; - - gboolean has_summary_capability; - CamelFolderSummary *summary; - - gboolean has_uid_capability; - -}; - - - -typedef struct { - GtkObjectClass parent_class; - - /* Virtual methods */ - void (*init_with_store) (CamelFolder *folder, - CamelStore *parent_store, - CamelException *ex); - - void (*open) (CamelFolder *folder, - CamelFolderOpenMode mode, - CamelException *ex); - - void (*close) (CamelFolder *folder, - gboolean expunge, - CamelException *ex); - - void (*open_async) (CamelFolder *folder, - CamelFolderOpenMode mode, - CamelFolderAsyncCallback callback, - gpointer user_data, - CamelException *ex); - - void (*close_async) (CamelFolder *folder, - gboolean expunge, - CamelFolderAsyncCallback callback, - gpointer user_data, - CamelException *ex); - - void (*set_name) (CamelFolder *folder, - const gchar *name, - CamelException *ex); - - /* void (*set_full_name) (CamelFolder *folder, const gchar *name); */ - - const gchar * (*get_name) (CamelFolder *folder, - CamelException *ex); - - const gchar * (*get_full_name) (CamelFolder *folder, - CamelException *ex); - - gboolean (*can_hold_folders) (CamelFolder *folder, - CamelException *ex); - - gboolean (*can_hold_messages) (CamelFolder *folder, - CamelException *ex); - - gboolean (*exists) (CamelFolder *folder, - CamelException *ex); - - gboolean (*is_open) (CamelFolder *folder, - CamelException *ex); - - CamelFolder * (*get_subfolder) (CamelFolder *folder, - const gchar *folder_name, - CamelException *ex); - - gboolean (*create) (CamelFolder *folder, - CamelException *ex); - - gboolean (*delete) (CamelFolder *folder, - gboolean recurse, - CamelException *ex); - - gboolean (*delete_messages) (CamelFolder *folder, - CamelException *ex); - - CamelFolder * (*get_parent_folder) (CamelFolder *folder, - CamelException *ex); - - CamelStore * (*get_parent_store) (CamelFolder *folder, - CamelException *ex); - - CamelFolderOpenMode (*get_mode) (CamelFolder *folder, - CamelException *ex); - - GList * (*list_subfolders) (CamelFolder *folder, - CamelException *ex); - - GList * (*expunge) (CamelFolder *folder, - CamelException *ex); - - gboolean (*has_message_number_capability) (CamelFolder *folder, CamelException *ex); - - CamelMimeMessage * (*get_message_by_number) (CamelFolder *folder, - gint number, - CamelException *ex); - - gint (*get_message_count) (CamelFolder *folder, - CamelException *ex); - - void (*append_message) (CamelFolder *folder, - CamelMimeMessage *message, - CamelException *ex); - - const GList * (*list_permanent_flags) (CamelFolder *folder, - CamelException *ex); - - void (*copy_message_to) (CamelFolder *folder, - CamelMimeMessage *message, - CamelFolder *dest_folder, - CamelException *ex); - - gboolean (*has_uid_capability) (CamelFolder *folder); - - const gchar * (*get_message_uid) (CamelFolder *folder, - CamelMimeMessage *message, - CamelException *ex); - - CamelMimeMessage * (*get_message_by_uid) (CamelFolder *folder, - const gchar *uid, - CamelException *ex); - - GList * (*get_uid_list) (CamelFolder *folder, - CamelException *ex); - -} CamelFolderClass; - - - -/* Standard Gtk function */ -GtkType camel_folder_get_type (void); - - -/* public methods */ - - - -CamelFolder *camel_folder_get_subfolder (CamelFolder *folder, - gchar *folder_name, - CamelException *ex); - -void camel_folder_open (CamelFolder *folder, - CamelFolderOpenMode mode, - CamelException *ex); - -void camel_folder_open_async (CamelFolder *folder, - CamelFolderOpenMode mode, - CamelFolderAsyncCallback callback, - gpointer user_data, - CamelException *ex); - -void camel_folder_close_async (CamelFolder *folder, - gboolean expunge, - CamelFolderAsyncCallback callback, - gpointer user_data, - CamelException *ex); - -gboolean camel_folder_create (CamelFolder *folder, CamelException *ex); -CamelFolder *camel_folder_get_parent_folder (CamelFolder *folder, CamelException *ex); -CamelStore *camel_folder_get_parent_store (CamelFolder *folder, CamelException *ex); -GList *camel_folder_list_subfolders (CamelFolder *folder, CamelException *ex); - - -/* delete operations */ -gboolean camel_folder_delete (CamelFolder *folder, gboolean recurse, CamelException *ex); -gboolean camel_folder_delete_messages (CamelFolder *folder, CamelException *ex); -GList *camel_folder_expunge (CamelFolder *folder, CamelException *ex); - - -/* folder name manipulation operations */ -void camel_folder_set_name (CamelFolder *folder, - const gchar *name, - CamelException *ex); -const gchar *camel_folder_get_name (CamelFolder *folder, CamelException *ex); -const gchar *camel_folder_get_full_name (CamelFolder *folder, CamelException *ex); - - -/* various properties accessors */ -gboolean camel_folder_exists (CamelFolder *folder, CamelException *ex); -const GList *camel_folder_list_permanent_flags (CamelFolder *folder, CamelException *ex); -CamelFolderOpenMode camel_folder_get_mode (CamelFolder *folder, CamelException *ex); - - - -/* message manipulation */ -void camel_folder_append_message (CamelFolder *folder, - CamelMimeMessage *message, CamelException *ex); -void camel_folder_copy_message_to (CamelFolder *folder, - CamelMimeMessage *message, - CamelFolder *dest_folder, - CamelException *ex); - - -/* summary related operations */ -gboolean camel_folder_has_summary_capability (CamelFolder *folder, CamelException *ex); -CamelFolderSummary *camel_folder_get_summary (CamelFolder *folder, CamelException *ex); - - -/* number based access operations */ -gboolean camel_folder_has_message_number_capability (CamelFolder *folder, CamelException *ex); -CamelMimeMessage *camel_folder_get_message_by_number (CamelFolder *folder, - gint number, CamelException *ex); -gint camel_folder_get_message_count (CamelFolder *folder, CamelException *ex); - - -/* uid based access operations */ -gboolean camel_folder_has_uid_capability (CamelFolder *folder, CamelException *ex); -const gchar * camel_folder_get_message_uid (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex); -CamelMimeMessage *camel_folder_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex); -GList *camel_folder_get_uid_list (CamelFolder *folder, CamelException *ex); - - - - - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_FOLDER_H */ - diff --git a/camel/camel-log.c b/camel/camel-log.c deleted file mode 100644 index 970986a5ad..0000000000 --- a/camel/camel-log.c +++ /dev/null @@ -1,45 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel-log.h" - -int camel_debug_level = CAMEL_LOG_LEVEL_FULL_DEBUG; -FILE *camel_log_file_descriptor = NULL; - -void -camel_log(guint level, const gchar *format, ... ) -{ - va_list args; - if (camel_log_file_descriptor == NULL) - camel_log_file_descriptor = stdout; - - if (level<=camel_debug_level) - { - va_start(args, format); - vfprintf(camel_log_file_descriptor, format, args); - va_end (args); - } -} diff --git a/camel/camel-log.h b/camel/camel-log.h deleted file mode 100644 index 5337c79f4d..0000000000 --- a/camel/camel-log.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_LOG_H -#define CAMEL_LOG_H - - -#include <stdarg.h> -#include <glib.h> -#include <stdio.h> - -extern int camel_debug_level; -extern FILE *camel_log_file_descriptor; - -#define CAMEL_LOG_LEVEL_NO_LOG 0 -#define CAMEL_LOG_LEVEL_STRANGE 5 -#define CAMEL_LOG_LEVEL_WARNING 6 -#define CAMEL_LOG_LEVEL_TRACE 8 -#define CAMEL_LOG_LEVEL_FULL_DEBUG 10 - -/* #define CAMEL_HARD_LOG_LEVEL CAMEL_LOG_LEVEL_TRACE */ - -/* the idea here is to be able to have a hard maximum log -level, given at compilation time, and a soft one, given at -runtime (with camel_debug_level) */ - -#if CAMEL_HARD_LOG_LEVEL>=CAMEL_LOG_LEVEL_STRANGE -#define CAMEL_LOG_STRANGE(args...) camel_log(CAMEL_LOG_LEVEL_STRANGE, ##args) -#else /* CAMEL_LOG_LEVEL_STRANGE */ -#define CAMEL_LOG_STRANGE(args...) -#endif /* CAMEL_LOG_LEVEL_STRANGE */ - -#if CAMEL_HARD_LOG_LEVEL>=CAMEL_LOG_LEVEL_WARNING -#define CAMEL_LOG_WARNING(args...) camel_log(CAMEL_LOG_LEVEL_WARNING, ##args) -#else /* CAMEL_LOG_LEVEL_WARNING */ -#define CAMEL_LOG_WARNING(args...) -#endif /* CAMEL_LOG_LEVEL_WARNING */ - -#if CAMEL_HARD_LOG_LEVEL>=CAMEL_LOG_LEVEL_TRACE -#define CAMEL_LOG_TRACE(args...) camel_log(CAMEL_LOG_LEVEL_TRACE, ##args) -#else /* CAMEL_LOG_LEVEL_TRACE */ -#define CAMEL_LOG_TRACE(args...) -#endif /* CAMEL_LOG_LEVEL_TRACE */ - -#if CAMEL_HARD_LOG_LEVEL>=CAMEL_LOG_LEVEL_FULL_DEBUG -#define CAMEL_LOG_FULL_DEBUG(args...) camel_log(CAMEL_LOG_LEVEL_FULL_DEBUG, ##args) -#else /* CAMEL_LOG_LEVEL_FULL_DEBUG */ -#define CAMEL_LOG_FULL_DEBUG(args...) -#endif /* CAMEL_LOG_LEVEL_FULL_DEBUG */ - - - - -extern void camel_log(guint level, const gchar *format, ... ); - -#endif /* CAMEL_LOG_H */ diff --git a/camel/camel-marshal-utils.c b/camel/camel-marshal-utils.c deleted file mode 100644 index ece61d79fc..0000000000 --- a/camel/camel-marshal-utils.c +++ /dev/null @@ -1,374 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-marshal-utils.c : marshal utils */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 "config.h" -#include "camel-log.h" -#include "camel-marshal-utils.h" -#include "camel-arg-collector.c" - - -#define NB_OP_CHUNKS 20 -static GMemChunk *op_chunk=NULL; -static GStaticMutex op_chunk_mutex = G_STATIC_MUTEX_INIT; - -CamelFuncDef * -camel_func_def_new (CamelMarshal marshal, guint n_params, ...) -{ - CamelFuncDef *func_def; - va_list args; - GtkType type; - int i; - - func_def = g_new (CamelFuncDef, 1); - func_def->marshal = marshal; - func_def->n_params = n_params; - func_def->params_type = g_new (GtkType, n_params); - - va_start (args, n_params); - for (i=0; i<n_params; i++) { - type = va_arg (args, GtkType); - func_def->params_type [i] = type; - } - va_end (args); - - return func_def; -} - - - - -static gboolean -_collect_params (GtkArg *params, - CamelFuncDef *func_def, - va_list var_args) -{ - GtkArg *last_param; - int i; - gboolean failed = FALSE; - - - for (i=0; - i<func_def->n_params; - i++, params++) - { - gchar *error; - - params->name = NULL; - params->type = (func_def->params_type) [i]; - CAMEL_ARG_COLLECT_VALUE (params, - var_args, - error); - if (error) - { - failed = TRUE; - CAMEL_LOG_FULL_DEBUG ("CamelMarshall::_collect_params(): %s", error); - g_free (error); - } - } - return (failed); -} - - - -/** - * camel_marshal_create_op: create an operation - * @func_def: function definition object - * @func: function to call - * - * create a function ready to be executed. The - * vari - * - * - * Return value: operation ready to be executed - **/ -CamelOp * -camel_marshal_create_op (CamelFuncDef *func_def, CamelFunc func, ...) -{ - GtkArg *params; - gboolean error; - CamelOp *op; - va_list args; - - g_assert (func_def); - - op = camel_op_new (func_def); - op->func = func; - - va_start (args, func); - error = _collect_params (op->params, func_def, args); - va_end (args); - - if (error) { - camel_op_free (op); - return NULL; - } else - return (op); -} - - - - -/** - * camel_op_new: return a new CamelOp object - * - * The obtained object must be destroyed with - * camel_op_free () - * - * Return value: the newly allocated CamelOp object - **/ -CamelOp * -camel_op_new (CamelFuncDef *func_def) -{ - CamelOp *op; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelOp::new\n"); - g_static_mutex_lock (&op_chunk_mutex); - if (!op_chunk) - op_chunk = g_mem_chunk_create (CamelOp, - NB_OP_CHUNKS, - G_ALLOC_AND_FREE); - g_static_mutex_unlock (&op_chunk_mutex); - - op = g_chunk_new (CamelOp, op_chunk); - op->func_def = func_def; - op->params = g_new (GtkArg, func_def->n_params); - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelOp::new\n"); - return op; -} - -/** - * camel_op_free: free a CamelOp object allocated with camel_op_new - * @op: CamelOp object to free - * - * Free a CamelOp object allocated with camel_op_new () - * this routine won't work with CamelOp objects allocated - * with other allocators. - **/ -void -camel_op_free (CamelOp *op) -{ - CAMEL_LOG_FULL_DEBUG ("Entering CamelOp::free\n"); - g_free (op->params); - g_chunk_free (op, op_chunk); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelOp::free\n"); -} - - -/** - * camel_op_run: run an operation - * @op: the operation object - * - * run an operation - * - **/ -void -camel_op_run (CamelOp *op) -{ - GtkArg *params; - gboolean error; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelOp::run\n"); - g_assert (op); - g_assert (op->func_def); - g_assert (op->params); - - op->func_def->marshal (op->func, op->params); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelOp::run\n"); -} - - - - -/** - * camel_op_set_user_data: set the private field - * @op: operation - * @user_data: private field - * - * associate a field to an operation object - **/ -void -camel_op_set_user_data (CamelOp *op, gpointer user_data) -{ - CAMEL_LOG_FULL_DEBUG ("Entering CamelOp::set_user_data\n"); - g_assert (op); - op->user_data = user_data; - CAMEL_LOG_FULL_DEBUG ("Leaving CamelOp::set_user_data\n"); -} - - -/** - * camel_op_get_user_data: return the private field - * @op: operation object - * - * return the private field associated to - * an operation object. - * - * Return value: - **/ -gpointer -camel_op_get_user_data (CamelOp *op) -{ - CAMEL_LOG_FULL_DEBUG ("Entering CamelOp::get_user_data\n"); - g_assert (op); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelOp::get_user_data\n"); - return op->user_data; -} - - - -/* misc marshaller */ - - -typedef void (*CamelMarshal_NONE__POINTER_INT) (gpointer arg1, - gint arg2); -void camel_marshal_NONE__POINTER_INT (CamelFunc func, - GtkArg *args) -{ - CamelMarshal_NONE__POINTER_INT rfunc; - - CAMEL_LOG_FULL_DEBUG ("Entering camel_marshal_NONE__POINTER_INT\n"); - rfunc = (CamelMarshal_NONE__POINTER_INT) func; - (* rfunc) (GTK_VALUE_POINTER(args[0]), - GTK_VALUE_INT(args[1])); - CAMEL_LOG_FULL_DEBUG ("Leaving camel_marshal_NONE__POINTER_INT\n"); -} - - - - - -typedef void (*CamelMarshal_NONE__POINTER_INT_POINTER) (gpointer arg1, - gint arg2, - gpointer arg3); -void camel_marshal_NONE__POINTER_INT_POINTER (CamelFunc func, - GtkArg *args) -{ - CamelMarshal_NONE__POINTER_INT_POINTER rfunc; - - CAMEL_LOG_FULL_DEBUG ("Entering camel_marshal_NONE__POINTER_INT_POINTER\n"); - rfunc = (CamelMarshal_NONE__POINTER_INT_POINTER) func; - (* rfunc) (GTK_VALUE_POINTER(args[0]), - GTK_VALUE_INT(args[1]), - GTK_VALUE_POINTER(args[2])); - CAMEL_LOG_FULL_DEBUG ("Leaving camel_marshal_NONE__POINTER_INT_POINTER\n"); -} - - -typedef void (*CamelMarshal_NONE__POINTER_BOOL_POINTER) (gpointer arg1, - gboolean arg2, - gpointer arg3); -void camel_marshal_NONE__POINTER_BOOL_POINTER (CamelFunc func, - GtkArg *args) -{ - CamelMarshal_NONE__POINTER_BOOL_POINTER rfunc; - - CAMEL_LOG_FULL_DEBUG ("Entering camel_marshal_NONE__POINTER_BOOL_POINTER\n"); - rfunc = (CamelMarshal_NONE__POINTER_BOOL_POINTER) func; - (* rfunc) (GTK_VALUE_POINTER(args[0]), - GTK_VALUE_BOOL(args[1]), - GTK_VALUE_POINTER(args[2])); - CAMEL_LOG_FULL_DEBUG ("Leaving camel_marshal_NONE__POINTER_BOOL_POINTER\n"); -} - - -typedef void (*CamelMarshal_NONE__POINTER_INT_POINTER_POINTER) (gpointer arg1, - gint arg2, - gpointer arg3, - gpointer arg4); -void camel_marshal_NONE__POINTER_INT_POINTER_POINTER (CamelFunc func, - GtkArg *args) -{ - CamelMarshal_NONE__POINTER_INT_POINTER_POINTER rfunc; - - CAMEL_LOG_FULL_DEBUG ("Entering camel_marshal_NONE__POINTER_INT_POINTER_POINTER\n"); - rfunc = (CamelMarshal_NONE__POINTER_INT_POINTER_POINTER) func; - (* rfunc) (GTK_VALUE_POINTER(args[0]), - GTK_VALUE_INT(args[1]), - GTK_VALUE_POINTER(args[2]), - GTK_VALUE_POINTER(args[3])); - CAMEL_LOG_FULL_DEBUG ("Leaving camel_marshal_NONE__POINTER_INT_POINTER_POINTER\n"); -} - - - -typedef void (*CamelMarshal_NONE__POINTER_BOOL_POINTER_POINTER) (gpointer arg1, - gboolean arg2, - gpointer arg3, - gpointer arg4); -void camel_marshal_NONE__POINTER_BOOL_POINTER_POINTER (CamelFunc func, - GtkArg *args) -{ - CamelMarshal_NONE__POINTER_BOOL_POINTER_POINTER rfunc; - - CAMEL_LOG_FULL_DEBUG ("Entering camel_marshal_NONE__POINTER_BOOL_POINTER_POINTER\n"); - rfunc = (CamelMarshal_NONE__POINTER_BOOL_POINTER_POINTER) func; - (* rfunc) (GTK_VALUE_POINTER(args[0]), - GTK_VALUE_BOOL(args[1]), - GTK_VALUE_POINTER(args[2]), - GTK_VALUE_POINTER(args[3])); - CAMEL_LOG_FULL_DEBUG ("Leaving camel_marshal_NONE__POINTER_BOOL_POINTER_POINTER\n"); -} - - - -typedef void (*CamelMarshal_NONE__POINTER_POINTER_POINTER) (gpointer arg1, - gpointer arg2, - gpointer arg3); -void camel_marshal_NONE__POINTER_POINTER_POINTER (CamelFunc func, - GtkArg *args) -{ - CamelMarshal_NONE__POINTER_POINTER_POINTER rfunc; - - CAMEL_LOG_FULL_DEBUG ("Entering camel_marshal_NONE__POINTER_POINTER_POINTER\n"); - rfunc = (CamelMarshal_NONE__POINTER_POINTER_POINTER) func; - (* rfunc) (GTK_VALUE_POINTER(args[0]), - GTK_VALUE_POINTER(args[1]), - GTK_VALUE_POINTER(args[2])); - CAMEL_LOG_FULL_DEBUG ("Leaving camel_marshal_NONE__POINTER_POINTER_POINTER\n"); -} - - -typedef void (*CamelMarshal_NONE__INT) (gint arg1); -void camel_marshal_NONE__INT (CamelFunc func, - GtkArg *args) -{ - CamelMarshal_NONE__INT rfunc; - - CAMEL_LOG_FULL_DEBUG ("Entering camel_marshal_NONE__INT\n"); - rfunc = (CamelMarshal_NONE__INT) func; - (* rfunc) (GTK_VALUE_INT (args[0])); - CAMEL_LOG_FULL_DEBUG ("Leaving camel_marshal_NONE__INT\n"); -} - - - - - - diff --git a/camel/camel-marshal-utils.h b/camel/camel-marshal-utils.h deleted file mode 100644 index 8ca9901ba2..0000000000 --- a/camel/camel-marshal-utils.h +++ /dev/null @@ -1,102 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-maeshal-utils.h : marshal utils */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_MARSHAL_UTILS_H -#define CAMEL_MARSHAL_UTILS_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> - - -typedef void (*CamelFunc) (); - -typedef void ( *CamelMarshal) (CamelFunc func, - GtkArg *args); - - - - - -typedef struct { - - CamelMarshal marshal; - guint n_params; - GtkType *params_type; - -} CamelFuncDef; - - - -typedef struct { - CamelFuncDef *func_def; - CamelFunc func; - GtkArg *params; - gpointer user_data; -} CamelOp; - - -CamelFuncDef * -camel_func_def_new (CamelMarshal marshal, - guint n_params, - ...); - - -CamelOp *camel_op_new (CamelFuncDef *func_def); -void camel_op_free (CamelOp *op); -void camel_op_run (CamelOp *op); -void camel_op_run_and_free (CamelOp *op); -void camel_op_set_user_data (CamelOp *op, gpointer user_data); -gpointer camel_op_get_user_data (CamelOp *op); - -CamelOp *camel_marshal_create_op (CamelFuncDef *func_def, CamelFunc func, ...); - -/* marshallers */ -void camel_marshal_NONE__POINTER_INT_POINTER (CamelFunc func, - GtkArg *args); -void camel_marshal_NONE__POINTER_BOOL_POINTER (CamelFunc func, - GtkArg *args); -void camel_marshal_NONE__POINTER_INT_POINTER_POINTER (CamelFunc func, - GtkArg *args); -void camel_marshal_NONE__POINTER_BOOL_POINTER_POINTER (CamelFunc func, - GtkArg *args); -void camel_marshal_NONE__POINTER_POINTER_POINTER (CamelFunc func, - GtkArg *args); -void camel_marshal_NONE__INT (CamelFunc func, - GtkArg *args); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MARSHAL_UTILS_H */ - diff --git a/camel/camel-medium.c b/camel/camel-medium.c deleted file mode 100644 index 95d00280e1..0000000000 --- a/camel/camel-medium.c +++ /dev/null @@ -1,257 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camelMedium.c : Abstract class for a medium */ - - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel-medium.h" -#include <stdio.h> -#include "gmime-content-field.h" -#include "string-utils.h" -#include "camel-log.h" -#include "gmime-utils.h" -#include "camel-simple-data-wrapper.h" - - - - - -static CamelDataWrapperClass *parent_class=NULL; - -/* Returns the class for a CamelMedium */ -#define CM_CLASS(so) CAMEL_MEDIUM_CLASS (GTK_OBJECT(so)->klass) - -static void _add_header (CamelMedium *medium, gchar *header_name, gchar *header_value); -static void _remove_header (CamelMedium *medium, const gchar *header_name); -static const gchar *_get_header (CamelMedium *medium, const gchar *header_name); - -static CamelDataWrapper *_get_content_object(CamelMedium *medium); -static void _set_content_object(CamelMedium *medium, CamelDataWrapper *content); - -static void _finalize (GtkObject *object); - -static void -camel_medium_class_init (CamelMediumClass *camel_medium_class) -{ - CamelDataWrapperClass *camel_data_wrapper_class = CAMEL_DATA_WRAPPER_CLASS (camel_medium_class); - GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_data_wrapper_class); - - parent_class = gtk_type_class (camel_data_wrapper_get_type ()); - - /* virtual method definition */ - camel_medium_class->add_header = _add_header; - camel_medium_class->remove_header = _remove_header; - camel_medium_class->get_header = _get_header; - - camel_medium_class->set_content_object = _set_content_object; - camel_medium_class->get_content_object = _get_content_object; - - /* virtual method overload */ - /* camel_data_wrapper_class->write_to_stream = _write_to_stream; */ - /* camel_data_wrapper_class->construct_from_stream = _construct_from_stream; */ - - gtk_object_class->finalize = _finalize; -} - -static void -camel_medium_init (gpointer object, gpointer klass) -{ - CamelMedium *camel_medium = CAMEL_MEDIUM (object); - - camel_medium->headers = g_hash_table_new (g_str_hash, g_str_equal); - camel_medium->content = NULL; -} - - - - -GtkType -camel_medium_get_type (void) -{ - static GtkType camel_medium_type = 0; - - if (!camel_medium_type) { - GtkTypeInfo camel_medium_info = - { - "CamelMedium", - sizeof (CamelMedium), - sizeof (CamelMediumClass), - (GtkClassInitFunc) camel_medium_class_init, - (GtkObjectInitFunc) camel_medium_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_medium_type = gtk_type_unique (camel_data_wrapper_get_type (), &camel_medium_info); - } - - return camel_medium_type; -} - - -static void -_finalize (GtkObject *object) -{ - CamelMedium *medium = CAMEL_MEDIUM (object); - - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMedium::finalize\n"); - - if (medium->headers) { -#warning Free hash table elements - g_hash_table_destroy (medium->headers); - } - - GTK_OBJECT_CLASS (parent_class)->finalize (object); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMedium::finalize\n"); -} - - - -/* **** */ - -static void -_add_header (CamelMedium *medium, gchar *header_name, gchar *header_value) -{ - gboolean header_exists; - gchar *old_header_name; - gchar *old_header_value; - - - header_exists = g_hash_table_lookup_extended (medium->headers, header_name, - (gpointer *) &old_header_name, - (gpointer *) &old_header_value); - if (header_exists) { - g_free (old_header_name); - g_free (old_header_value); - } - - g_hash_table_insert (medium->headers, header_name, header_value); -} - - -void -camel_medium_add_header (CamelMedium *medium, gchar *header_name, gchar *header_value) -{ - CM_CLASS(medium)->add_header(medium, header_name, header_value); -} - - -/* **** */ - - -static void -_remove_header (CamelMedium *medium, const gchar *header_name) -{ - - gboolean header_exists; - gchar *old_header_name; - gchar *old_header_value; - - header_exists = g_hash_table_lookup_extended (medium->headers, header_name, - (gpointer *) &old_header_name, - (gpointer *) &old_header_value); - if (header_exists) { - g_free (old_header_name); - g_free (old_header_value); - } - - g_hash_table_remove (medium->headers, header_name); - -} - -void -camel_medium_remove_header (CamelMedium *medium, const gchar *header_name) -{ - CM_CLASS(medium)->remove_header(medium, header_name); -} - - -/* **** */ - - -static const gchar * -_get_header (CamelMedium *medium, const gchar *header_name) -{ - - gchar *old_header_name; - gchar *old_header_value; - gchar *header_value; - - header_value = (gchar *)g_hash_table_lookup (medium->headers, header_name); - return header_value; -} - -const gchar * -camel_medium_get_header (CamelMedium *medium, const gchar *header_name) -{ - return CM_CLASS(medium)->get_header (medium, header_name); -} - - -/* **** */ - - -static CamelDataWrapper * -_get_content_object (CamelMedium *medium) -{ - return medium->content; - -} - - -CamelDataWrapper * -camel_medium_get_content_object (CamelMedium *medium) -{ - return CM_CLASS(medium)->get_content_object (medium); -} - - -/* **** */ - - -static void -_set_content_object (CamelMedium *medium, CamelDataWrapper *content) -{ - GMimeContentField *object_content_field; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMedium::set_content_object\n"); - if (medium->content) { - CAMEL_LOG_FULL_DEBUG ("CamelMedium::set_content_object unreferencing old content object\n"); - gtk_object_unref (GTK_OBJECT (medium->content)); - } - gtk_object_ref (GTK_OBJECT (content)); - medium->content = content; - -} - -void -camel_medium_set_content_object (CamelMedium *medium, CamelDataWrapper *content) -{ - CM_CLASS(medium)->set_content_object (medium, content); -} - - -/* **** */ diff --git a/camel/camel-medium.h b/camel/camel-medium.h deleted file mode 100644 index 5a228ecbde..0000000000 --- a/camel/camel-medium.h +++ /dev/null @@ -1,94 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-medium.h : class for a medium object */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_MEDIUM_H -#define CAMEL_MEDIUM_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include "camel-data-wrapper.h" -#include "camel-stream.h" - - -#define CAMEL_MEDIUM_TYPE (camel_medium_get_type ()) -#define CAMEL_MEDIUM(obj) (GTK_CHECK_CAST((obj), CAMEL_MEDIUM_TYPE, CamelMedium)) -#define CAMEL_MEDIUM_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_MEDIUM_TYPE, CamelMediumClass)) -#define CAMEL_IS_MEDIUM(o) (GTK_CHECK_TYPE((o), CAMEL_MEDIUM_TYPE)) - - -typedef struct -{ - CamelDataWrapper parent_object; - - GHashTable *headers; - - CamelDataWrapper *content; /* part real content */ - -} CamelMedium; - - - -typedef struct { - CamelDataWrapperClass parent_class; - - /* Virtual methods */ - void (*add_header) (CamelMedium *medium, gchar *header_name, gchar *header_value); - void (*remove_header) (CamelMedium *medium, const gchar *header_name); - const gchar * (*get_header) (CamelMedium *medium, const gchar *header_name); - - CamelDataWrapper * (*get_content_object) (CamelMedium *medium); - void (*set_content_object) (CamelMedium *medium, CamelDataWrapper *content); - -} CamelMediumClass; - - - -/* Standard Gtk function */ -GtkType camel_medium_get_type (void); - - -/* public methods */ -void camel_medium_add_header (CamelMedium *medium, gchar *header_name, gchar *header_value); -void camel_medium_remove_header (CamelMedium *medium, const gchar *header_name); -const gchar *camel_medium_get_header (CamelMedium *medium, const gchar *header_name); - - -CamelDataWrapper *camel_medium_get_content_object (CamelMedium *medium); -void camel_medium_set_content_object (CamelMedium *medium, CamelDataWrapper *content); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MEDIUM_H */ - diff --git a/camel/camel-mime-body-part.c b/camel/camel-mime-body-part.c deleted file mode 100644 index 77d245349b..0000000000 --- a/camel/camel-mime-body-part.c +++ /dev/null @@ -1,128 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mime-body-part.c : Abstract class for a mime body part */ - - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel-mime-body-part.h" -#include "camel-log.h" - - -static void _set_parent (CamelMimeBodyPart *mime_body_part, CamelMultipart *multipart); -static const CamelMultipart *_get_parent (CamelMimeBodyPart *mime_body_part); - - -static CamelMimePartClass *parent_class=NULL; - -/* Returns the class for a CamelMimeBodyPart */ -#define CMBP_CLASS(so) CAMEL_MIME_BODY_PART_CLASS (GTK_OBJECT(so)->klass) - - - -static void -camel_mime_body_part_class_init (CamelMimeBodyPartClass *camel_mime_body_part_class) -{ - CamelMimePartClass *camel_mime_part_class = CAMEL_MIME_PART_CLASS (camel_mime_body_part_class); - parent_class = gtk_type_class (camel_mime_part_get_type ()); - - /* virtual method definition */ - camel_mime_body_part_class->set_parent = _set_parent; - camel_mime_body_part_class->get_parent = _get_parent; -} - -static void -camel_mime_body_part_init (gpointer object, gpointer klass) -{ - CamelMimeBodyPart *camel_mime_body_part = CAMEL_MIME_BODY_PART (object); -} - - - - -GtkType -camel_mime_body_part_get_type (void) -{ - static GtkType camel_mime_body_part_type = 0; - - if (!camel_mime_body_part_type) { - GtkTypeInfo camel_mime_body_part_info = - { - "CamelMimeBodyPart", - sizeof (CamelMimeBodyPart), - sizeof (CamelMimeBodyPartClass), - (GtkClassInitFunc) camel_mime_body_part_class_init, - (GtkObjectInitFunc) camel_mime_body_part_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_mime_body_part_type = gtk_type_unique (camel_mime_part_get_type (), &camel_mime_body_part_info); - } - - return camel_mime_body_part_type; -} - -CamelMimeBodyPart * -camel_mime_body_part_new () -{ - CamelMimeBodyPart *mime_body_part; - CAMEL_LOG_FULL_DEBUG ("CamelMimeBodyPart:: Entering new()\n"); - - mime_body_part = (CamelMimeBodyPart *)gtk_type_new (CAMEL_MIME_BODY_PART_TYPE); - CAMEL_LOG_FULL_DEBUG ("CamelMimeBodyPart:: Leaving new()\n"); - return mime_body_part; -} - - -static void -_set_parent (CamelMimeBodyPart *mime_body_part, CamelMultipart *multipart) -{ - if (mime_body_part->parent) gtk_object_unref (GTK_OBJECT (mime_body_part->parent)); - mime_body_part->parent = multipart; - if (multipart) gtk_object_ref (GTK_OBJECT (multipart)); -} - - -void -camel_mime_body_part_set_parent (CamelMimeBodyPart *mime_body_part, CamelMultipart *multipart) -{ - CMBP_CLASS (mime_body_part)->set_parent (mime_body_part, multipart); -} - - -static const CamelMultipart * -_get_parent (CamelMimeBodyPart *mime_body_part) -{ - return mime_body_part->parent; -} - - -const CamelMultipart * -camel_mime_body_part_get_parent (CamelMimeBodyPart *mime_body_part) -{ - return CMBP_CLASS (mime_body_part)->get_parent (mime_body_part); -} - - diff --git a/camel/camel-mime-body-part.h b/camel/camel-mime-body-part.h deleted file mode 100644 index d2ae4908fb..0000000000 --- a/camel/camel-mime-body-part.h +++ /dev/null @@ -1,85 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mime-body-part.h : class for a mime body part */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_MIME_BODY_PART_H -#define CAMEL_MIME_BODY_PART_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -typedef struct _CamelMimeBodyPart CamelMimeBodyPart; - -#include <gtk/gtk.h> -#include "camel-mime-part.h" -#include "camel-multipart.h" - - - -#define CAMEL_MIME_BODY_PART_TYPE (camel_mime_body_part_get_type ()) -#define CAMEL_MIME_BODY_PART(obj) (GTK_CHECK_CAST((obj), CAMEL_MIME_BODY_PART_TYPE, CamelMimeBodyPart)) -#define CAMEL_MIME_BODY_PART_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_MIME_BODY_PART_TYPE, CamelMimeBodyPartClass)) -#define CAMEL_IS_MIME_BODY_PART(o) (GTK_CHECK_TYPE((o), CAMEL_MIME_BODY_PART_TYPE)) - - -struct _CamelMimeBodyPart -{ - CamelMimePart parent_object; - CamelMultipart *parent; - -}; - - - -typedef struct { - CamelMimePartClass parent_class; - - /* Virtual methods */ - void (*set_parent) (CamelMimeBodyPart *mime_body_part, CamelMultipart *multipart); - const CamelMultipart * (*get_parent) (CamelMimeBodyPart *mime_body_part); - -} CamelMimeBodyPartClass; - - -/* Standard Gtk function */ -GtkType camel_mime_body_part_get_type (void); - - -/* public methods */ -CamelMimeBodyPart *camel_mime_body_part_new (); -void camel_mime_body_part_set_parent (CamelMimeBodyPart *mime_body_part, CamelMultipart *multipart); -const CamelMultipart *camel_mime_body_part_get_parent (CamelMimeBodyPart *mime_body_part); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MIME_BODY_PART_H */ - diff --git a/camel/camel-mime-message.c b/camel/camel-mime-message.c deleted file mode 100644 index d9fd90cfc7..0000000000 --- a/camel/camel-mime-message.c +++ /dev/null @@ -1,705 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camelMimeMessage.c : class for a mime_message */ - - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel-mime-message.h" -#include <stdio.h> -#include "gmime-content-field.h" -#include "string-utils.h" -#include "camel-log.h" -#include "gmime-utils.h" -#include "hash-table-utils.h" - -typedef enum { - HEADER_UNKNOWN, - HEADER_FROM, - HEADER_REPLY_TO, - HEADER_SUBJECT, - HEADER_TO, - HEADER_CC, - HEADER_BCC -} CamelHeaderType; - -static GHashTable *header_name_table; - - - -static CamelMimePartClass *parent_class=NULL; - -static gchar *received_date_str; -static gchar *sent_date_str; -static gchar *reply_to_str; -static gchar *subject_str; -static gchar *from_str; - -static void _set_received_date (CamelMimeMessage *mime_message, const gchar *received_date); -static const gchar *_get_received_date (CamelMimeMessage *mime_message); -static const gchar *_get_sent_date (CamelMimeMessage *mime_message); -static void _set_reply_to (CamelMimeMessage *mime_message, const gchar *reply_to); -static const gchar *_get_reply_to (CamelMimeMessage *mime_message); -static void _set_subject (CamelMimeMessage *mime_message, const gchar *subject); -static const gchar *_get_subject (CamelMimeMessage *mime_message); -static void _set_from (CamelMimeMessage *mime_message, const gchar *from); -static const gchar *_get_from (CamelMimeMessage *mime_message); -static void _add_recipient (CamelMimeMessage *mime_message, const gchar *recipient_type, const gchar *recipient); -static void _remove_recipient (CamelMimeMessage *mime_message, const gchar *recipient_type, const gchar *recipient); -static const GList *_get_recipients (CamelMimeMessage *mime_message, const gchar *recipient_type); -static void _set_flag (CamelMimeMessage *mime_message, const gchar *flag, gboolean value); -static gboolean _get_flag (CamelMimeMessage *mime_message, const gchar *flag); -static GList *_get_flag_list (CamelMimeMessage *mime_message); -static void _set_message_number (CamelMimeMessage *mime_message, guint number); -static guint _get_message_number (CamelMimeMessage *mime_message); -static void _write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream); -static gboolean _parse_header_pair (CamelMimePart *mime_part, gchar *header_name, gchar *header_value); -static void _finalize (GtkObject *object); - -/* Returns the class for a CamelMimeMessage */ -#define CMM_CLASS(so) CAMEL_MIME_MESSAGE_CLASS (GTK_OBJECT(so)->klass) -#define CDW_CLASS(so) CAMEL_DATA_WRAPPER_CLASS (GTK_OBJECT(so)->klass) - - -static void -_init_header_name_table() -{ - header_name_table = g_hash_table_new (g_str_hash, g_str_equal); - g_hash_table_insert (header_name_table, "From", (gpointer)HEADER_FROM); - g_hash_table_insert (header_name_table, "Reply-To", (gpointer)HEADER_REPLY_TO); - g_hash_table_insert (header_name_table, "Subject", (gpointer)HEADER_SUBJECT); - g_hash_table_insert (header_name_table, "To", (gpointer)HEADER_TO); - g_hash_table_insert (header_name_table, "Cc", (gpointer)HEADER_CC); - g_hash_table_insert (header_name_table, "Bcc", (gpointer)HEADER_BCC); - -} - -static void -camel_mime_message_class_init (CamelMimeMessageClass *camel_mime_message_class) -{ - CamelDataWrapperClass *camel_data_wrapper_class = CAMEL_DATA_WRAPPER_CLASS (camel_mime_message_class); - CamelMimePartClass *camel_mime_part_class = CAMEL_MIME_PART_CLASS (camel_mime_message_class); - GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_mime_message_class); - - parent_class = gtk_type_class (camel_mime_part_get_type ()); - _init_header_name_table(); - - received_date_str = ""; - sent_date_str = ""; - reply_to_str = "Reply-To"; - subject_str = "Subject"; - from_str = "From"; - - /* virtual method definition */ - camel_mime_message_class->set_received_date = _set_received_date; - camel_mime_message_class->get_received_date = _get_received_date; - camel_mime_message_class->get_sent_date = _get_sent_date; - camel_mime_message_class->set_reply_to = _set_reply_to; - camel_mime_message_class->get_reply_to = _get_reply_to; - camel_mime_message_class->set_subject = _set_subject; - camel_mime_message_class->get_subject = _get_subject; - camel_mime_message_class->set_from = _set_from; - camel_mime_message_class->get_from = _get_from; - camel_mime_message_class->add_recipient = _add_recipient; - camel_mime_message_class->remove_recipient = _remove_recipient; - camel_mime_message_class->get_recipients = _get_recipients; - camel_mime_message_class->set_flag = _set_flag; - camel_mime_message_class->get_flag = _get_flag; - camel_mime_message_class->get_flag_list = _get_flag_list; - camel_mime_message_class->set_message_number = _set_message_number; - camel_mime_message_class->get_message_number = _get_message_number; - - /* virtual method overload */ - camel_data_wrapper_class->write_to_stream = _write_to_stream; - camel_mime_part_class->parse_header_pair = _parse_header_pair; - - gtk_object_class->finalize = _finalize; -} - - - - -static void -camel_mime_message_init (gpointer object, gpointer klass) -{ - CamelMimeMessage *camel_mime_message = CAMEL_MIME_MESSAGE (object); - - camel_mime_message->recipients = camel_recipient_table_new (); - camel_mime_message->flags = g_hash_table_new (g_strcase_hash, g_strcase_equal); - - camel_mime_message->received_date = NULL; - camel_mime_message->sent_date = NULL; - camel_mime_message->subject = NULL; - camel_mime_message->reply_to = NULL; - camel_mime_message->from = NULL; - camel_mime_message->folder = NULL; - camel_mime_message->session = NULL; -} - -GtkType -camel_mime_message_get_type (void) -{ - static GtkType camel_mime_message_type = 0; - - if (!camel_mime_message_type) { - GtkTypeInfo camel_mime_message_info = - { - "CamelMimeMessage", - sizeof (CamelMimeMessage), - sizeof (CamelMimeMessageClass), - (GtkClassInitFunc) camel_mime_message_class_init, - (GtkObjectInitFunc) camel_mime_message_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_mime_message_type = gtk_type_unique (camel_mime_part_get_type (), &camel_mime_message_info); - } - - return camel_mime_message_type; -} - - -static void -_finalize (GtkObject *object) -{ - CamelMimeMessage *message = CAMEL_MIME_MESSAGE (object); - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMimeMessage::finalize\n"); - g_free (message->received_date); - g_free (message->sent_date); - g_free (message->subject); - g_free (message->reply_to); - g_free (message->from); - - if (message->recipients) camel_recipient_table_unref (message->recipients); - if (message->folder) gtk_object_unref (GTK_OBJECT (message->folder)); - if (message->session) gtk_object_unref (GTK_OBJECT (message->session)); - - if (message->flags) - g_hash_table_foreach (message->flags, g_hash_table_generic_free, NULL); - - GTK_OBJECT_CLASS (parent_class)->finalize (object); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMimeMessage::finalize\n"); -} - - - -CamelMimeMessage * -camel_mime_message_new_with_session (CamelSession *session) -{ - CamelMimeMessage *mime_message; - mime_message = gtk_type_new (CAMEL_MIME_MESSAGE_TYPE); - mime_message->session = session; - if (session) gtk_object_ref (GTK_OBJECT (session)); - - return mime_message; -} - - -/* some utils func */ - -static void -_set_field (CamelMimeMessage *mime_message, gchar *name, const gchar *value, gchar **variable) -{ - if (variable) { - g_free (*variable); - *variable = g_strdup (value); - } -} - -/* for future use */ -/* for the moment, only @variable is used */ -static gchar * -_get_field (CamelMimeMessage *mime_message, gchar *name, gchar *variable) -{ - return variable; -} - -static gboolean -_check_not_expunged (CamelMimeMessage *mime_message) -{ - if (mime_message->expunged) { - CAMEL_LOG_WARNING ("CamelMimeMessage:: An invalid operation has been tempted on an expunged message\n"); - } - return (!mime_message->expunged); -} - -/* * */ - - -static void -_set_received_date (CamelMimeMessage *mime_message, const gchar *received_date) -{ - _set_field (mime_message, received_date_str, received_date, &(mime_message->received_date)); -} - -void -camel_mime_message_set_received_date (CamelMimeMessage *mime_message, const gchar *received_date) -{ - g_assert (mime_message); - g_return_if_fail (_check_not_expunged (mime_message)); - CMM_CLASS (mime_message)->set_received_date (mime_message, received_date); -} - - -static const gchar * -_get_received_date (CamelMimeMessage *mime_message) -{ - return _get_field (mime_message, received_date_str, mime_message->received_date); -} - -const gchar * -camel_mime_message_get_received_date (CamelMimeMessage *mime_message) -{ - g_assert (mime_message); - g_return_val_if_fail (_check_not_expunged (mime_message), NULL); - return CMM_CLASS (mime_message)->get_received_date (mime_message); -} - - -static const gchar * -_get_sent_date (CamelMimeMessage *mime_message) -{ - return _get_field (mime_message, sent_date_str, mime_message->sent_date); -} - -const gchar * -camel_mime_message_get_sent_date (CamelMimeMessage *mime_message) -{ - g_assert (mime_message); - g_return_val_if_fail (_check_not_expunged (mime_message), NULL); - return CMM_CLASS (mime_message)->get_sent_date (mime_message); -} - - -static void -_set_reply_to (CamelMimeMessage *mime_message, const gchar *reply_to) -{ - _set_field (mime_message, reply_to_str, reply_to, &(mime_message->reply_to)); -} - -void -camel_mime_message_set_reply_to (CamelMimeMessage *mime_message, const gchar *reply_to) -{ - g_assert (mime_message); - g_return_if_fail (_check_not_expunged (mime_message)); - CMM_CLASS (mime_message)->set_reply_to (mime_message, reply_to); -} - - -static const gchar * -_get_reply_to (CamelMimeMessage *mime_message) -{ - return _get_field (mime_message, reply_to_str, mime_message->reply_to); -} - -const gchar * -camel_mime_message_get_reply_to (CamelMimeMessage *mime_message) -{ - g_assert (mime_message); - g_return_val_if_fail (_check_not_expunged (mime_message), NULL); - return CMM_CLASS (mime_message)->get_reply_to (mime_message); -} - - - - -static void -_set_subject (CamelMimeMessage *mime_message, const gchar *subject) -{ - _set_field (mime_message, subject_str, subject, &(mime_message->subject)); -} - -void -camel_mime_message_set_subject (CamelMimeMessage *mime_message, - const gchar *subject) -{ - g_assert (mime_message); - g_return_if_fail (_check_not_expunged (mime_message)); - CMM_CLASS (mime_message)->set_subject (mime_message, subject); -} - - -static const gchar * -_get_subject (CamelMimeMessage *mime_message) -{ - return _get_field (mime_message, subject_str, mime_message->subject); -} - -const gchar * -camel_mime_message_get_subject (CamelMimeMessage *mime_message) -{ - g_assert (mime_message); - g_return_val_if_fail (_check_not_expunged (mime_message), NULL); - return CMM_CLASS (mime_message)->get_subject (mime_message); -} - - - - -static void -_set_from (CamelMimeMessage *mime_message, const gchar *from) -{ - _set_field (mime_message, from_str, from, &(mime_message->from)); -} - -void -camel_mime_message_set_from (CamelMimeMessage *mime_message, const gchar *from) -{ - g_assert (mime_message); - g_return_if_fail (_check_not_expunged (mime_message)); - CMM_CLASS (mime_message)->set_from (mime_message, from); -} - - -static const gchar * -_get_from (CamelMimeMessage *mime_message) -{ - return _get_field (mime_message, from_str, mime_message->from); -} - -const gchar * -camel_mime_message_get_from (CamelMimeMessage *mime_message) -{ - g_assert (mime_message); - g_return_val_if_fail (_check_not_expunged (mime_message), NULL); - return CMM_CLASS (mime_message)->get_from (mime_message); -} - - - - - - - -/* **** */ - - - - - -static void -_add_recipient (CamelMimeMessage *mime_message, - const gchar *recipient_type, - const gchar *recipient) -{ - camel_recipient_table_add (mime_message->recipients, recipient_type, recipient); -} - - - -void -camel_mime_message_add_recipient (CamelMimeMessage *mime_message, - const gchar *recipient_type, - const gchar *recipient) -{ - g_assert (mime_message); - g_return_if_fail (_check_not_expunged (mime_message)); - CMM_CLASS (mime_message)->add_recipient (mime_message, recipient_type, recipient); -} - - -static void -_remove_recipient (CamelMimeMessage *mime_message, - const gchar *recipient_type, - const gchar *recipient) -{ - camel_recipient_table_remove (mime_message->recipients, recipient_type, recipient); -} - - -void -camel_mime_message_remove_recipient (CamelMimeMessage *mime_message, - const gchar *recipient_type, - const gchar *recipient) -{ - g_assert (mime_message); - g_return_if_fail (_check_not_expunged (mime_message)); - CMM_CLASS (mime_message)->remove_recipient (mime_message, recipient_type, recipient); -} - - -static const GList * -_get_recipients (CamelMimeMessage *mime_message, - const gchar *recipient_type) -{ - return camel_recipient_table_get (mime_message->recipients, recipient_type); -} - - -const GList * -camel_mime_message_get_recipients (CamelMimeMessage *mime_message, - const gchar *recipient_type) -{ - g_assert (mime_message); - g_return_val_if_fail (_check_not_expunged (mime_message), NULL); - return CMM_CLASS (mime_message)->get_recipients (mime_message, recipient_type); -} - - - -/* **** */ - - - -static void -_set_flag (CamelMimeMessage *mime_message, const gchar *flag, gboolean value) -{ - gchar *old_flags; - gboolean ptr_value; - - if (! g_hash_table_lookup_extended (mime_message->flags, - flag, - (gpointer)&(old_flags), - (gpointer)&(ptr_value)) ) { - - g_hash_table_insert (mime_message->flags, g_strdup (flag), GINT_TO_POINTER (value)); - } else - g_hash_table_insert (mime_message->flags, old_flags, GINT_TO_POINTER (value)); - -} - -void -camel_mime_message_set_flag (CamelMimeMessage *mime_message, const gchar *flag, gboolean value) -{ - g_assert (mime_message); - g_return_if_fail (_check_not_expunged (mime_message)); - CMM_CLASS (mime_message)->set_flag (mime_message, flag, value); -} - - - -static gboolean -_get_flag (CamelMimeMessage *mime_message, const gchar *flag) -{ - return GPOINTER_TO_INT (g_hash_table_lookup (mime_message->flags, flag)); -} - -gboolean -camel_mime_message_get_flag (CamelMimeMessage *mime_message, const gchar *flag) -{ - g_assert (mime_message); - g_return_val_if_fail (_check_not_expunged (mime_message), FALSE); - return CMM_CLASS (mime_message)->get_flag (mime_message, flag); -} - - - -static void -_add_flag_to_list (gpointer key, gpointer value, gpointer user_data) -{ - GList **flag_list = (GList **)user_data; - gchar *flag_name = (gchar *)key; - - if ((flag_name) && (flag_name[0] != '\0')) - *flag_list = g_list_append (*flag_list, flag_name); -} - -static GList * -_get_flag_list (CamelMimeMessage *mime_message) -{ - GList *flag_list = NULL; - - if (mime_message->flags) - g_hash_table_foreach (mime_message->flags, _add_flag_to_list, &flag_list); - return flag_list; -} - - -GList * -camel_mime_message_get_flag_list (CamelMimeMessage *mime_message) -{ - g_assert (mime_message); - g_return_val_if_fail (_check_not_expunged (mime_message), NULL); - return CMM_CLASS (mime_message)->get_flag_list (mime_message); -} - - - -static void -_set_message_number (CamelMimeMessage *mime_message, guint number) -{ - mime_message->message_number = number; -} - -static guint -_get_message_number (CamelMimeMessage *mime_message) -{ - return mime_message->message_number; -} - - - -guint -camel_mime_message_get_message_number (CamelMimeMessage *mime_message) -{ - return CMM_CLASS (mime_message)->get_message_number (mime_message); -} - - - - -#ifdef WHPT -#warning : WHPT is already defined !!!!!! -#endif -#define WHPT gmime_write_header_pair_to_stream - -static void -_write_one_recipient_to_stream (gchar *recipient_type, - GList *recipient_list, - gpointer user_data) -{ - - CamelStream *stream = (CamelStream *)user_data; - if (recipient_type) - gmime_write_header_with_glist_to_stream (stream, recipient_type, recipient_list, ", "); -} - -static void -_write_recipients_to_stream (CamelMimeMessage *mime_message, CamelStream *stream) -{ - camel_recipient_foreach_recipient_type (mime_message->recipients, - _write_one_recipient_to_stream, - (gpointer)stream); -} - -static void -_write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream) -{ - CamelMimeMessage *mm = CAMEL_MIME_MESSAGE (data_wrapper); - CAMEL_LOG_FULL_DEBUG ( "CamelMimeMessage::write_to_stream\n"); - CAMEL_LOG_FULL_DEBUG ( "CamelMimeMessage:: Writing \"From\"\n"); - WHPT (stream, "From", mm->from); - CAMEL_LOG_FULL_DEBUG ( "CamelMimeMessage:: Writing \"Reply-To\"\n"); - WHPT (stream, "Reply-To", mm->reply_to); - CAMEL_LOG_FULL_DEBUG ( "CamelMimeMessage:: Writing recipients\n"); - _write_recipients_to_stream (mm, stream); - CAMEL_LOG_FULL_DEBUG ( "CamelMimeMessage:: Writing \"Date\"\n"); - WHPT (stream, "Date", mm->received_date); - CAMEL_LOG_FULL_DEBUG ( "CamelMimeMessage:: Writing \"Subject\"\n"); - WHPT (stream, "Subject", mm->subject); - - /* FIXME correct to do it here? */ - CAMEL_LOG_FULL_DEBUG ( "CamelMimeMessage:: Writing \"Mime-Version\"\n"); - WHPT (stream, "Mime-Version", "1.0"); - - CAMEL_DATA_WRAPPER_CLASS (parent_class)->write_to_stream (data_wrapper, stream); - -} - -/*******************************/ -/* mime message header parsing */ - -static void -_set_recipient_list_from_string (CamelMimeMessage *message, gchar *recipient_type, gchar *recipients_string) -{ - GList *recipients_list; - CAMEL_LOG_FULL_DEBUG ("CamelMimeMessage::_set_recipient_list_from_string parsing ##%s##\n", recipients_string); - recipients_list = string_split ( - recipients_string, ',', "\t ", - STRING_TRIM_STRIP_TRAILING | STRING_TRIM_STRIP_LEADING); - camel_recipient_table_add_list (message->recipients, recipient_type, recipients_list); - -} - -static gboolean -_parse_header_pair (CamelMimePart *mime_part, gchar *header_name, gchar *header_value) -{ - CamelHeaderType header_type; - CamelMimeMessage *message = CAMEL_MIME_MESSAGE (mime_part); - gboolean header_handled = FALSE; - - - header_type = (CamelHeaderType) g_hash_table_lookup (header_name_table, header_name); - switch (header_type) { - - case HEADER_FROM: - CAMEL_LOG_FULL_DEBUG ( - "CamelMimeMessage::parse_header_pair found HEADER_FROM : %s\n", - header_value ); - - camel_mime_message_set_from (message, header_value); - header_handled = TRUE; - break; - - case HEADER_REPLY_TO: - CAMEL_LOG_FULL_DEBUG ( - "CamelMimeMessage::parse_header_pair found HEADER_REPLY_YO : %s\n", - header_value ); - - camel_mime_message_set_reply_to (message, header_value); - header_handled = TRUE; - break; - - case HEADER_SUBJECT: - CAMEL_LOG_FULL_DEBUG ( - "CamelMimeMessage::parse_header_pair found HEADER_SUBJECT : %s\n", - header_value ); - - camel_mime_message_set_subject (message, header_value); - header_handled = TRUE; - break; - - case HEADER_TO: - CAMEL_LOG_FULL_DEBUG ( - "CamelMimeMessage::parse_header_pair found HEADER_TO : %s\n", - header_value ); - - _set_recipient_list_from_string (message, "To", header_value); - g_free (header_value); - header_handled = TRUE; - break; - - case HEADER_CC: - CAMEL_LOG_FULL_DEBUG ( - "CamelMimeMessage::parse_header_pair found HEADER_CC : %s\n", - header_value ); - - _set_recipient_list_from_string (message, "Cc", header_value); - g_free (header_value); - header_handled = TRUE; - break; - - case HEADER_BCC: - CAMEL_LOG_FULL_DEBUG ( - "CamelMimeMessage::parse_header_pair found HEADER_BCC : %s\n", - header_value ); - - _set_recipient_list_from_string (message, "Bcc", header_value); - g_free (header_value); - header_handled = TRUE; - break; - - - } - if (header_handled) { - g_free (header_name); - return TRUE; - } else - return parent_class->parse_header_pair (mime_part, header_name, header_value); - - -} - diff --git a/camel/camel-mime-message.h b/camel/camel-mime-message.h deleted file mode 100644 index 69cf840a62..0000000000 --- a/camel/camel-mime-message.h +++ /dev/null @@ -1,143 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camelMimeMessage.h : class for a mime message */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_MIME_MESSAGE_H -#define CAMEL_MIME_MESSAGE_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -typedef struct _CamelMimeMessage CamelMimeMessage; - -#include <gtk/gtk.h> -#include "camel-mime-part.h" -#include "camel-folder.h" -#include "camel-session.h" -#include "camel-recipient.h" - - -#define CAMEL_RECIPIENT_TYPE_TO "To" -#define CAMEL_RECIPIENT_TYPE_CC "Cc" -#define CAMEL_RECIPIENT_TYPE_BCC "Bcc" - - -#define CAMEL_MIME_MESSAGE_TYPE (camel_mime_message_get_type ()) -#define CAMEL_MIME_MESSAGE(obj) (GTK_CHECK_CAST((obj), CAMEL_MIME_MESSAGE_TYPE, CamelMimeMessage)) -#define CAMEL_MIME_MESSAGE_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_MIME_MESSAGE_TYPE, CamelMimeMessageClass)) -#define CAMEL_IS_MIME_MESSAGE(o) (GTK_CHECK_TYPE((o), CAMEL_MIME_MESSAGE_TYPE)) - - - -struct _CamelMimeMessage -{ - CamelMimePart parent_object; - - /* header fields */ - gchar *received_date; - gchar *sent_date; - - gchar *subject; - gchar *reply_to; - - gchar *from; - CamelRecipientTable *recipients; - - /* other fields */ - GHashTable *flags; /* boolean values */ - gboolean expunged; - - guint message_number; /* set by folder object when retrieving message */ - gchar *message_uid; - - CamelFolder *folder; - CamelSession *session; - -}; - - - -typedef struct { - CamelMimePartClass parent_class; - - /* Virtual methods */ - void (*set_received_date) (CamelMimeMessage *mime_message, gchar *received_date); - const gchar * (*get_received_date) (CamelMimeMessage *mime_message); - const gchar * (*get_sent_date) (CamelMimeMessage *mime_message); - void (*set_reply_to) (CamelMimeMessage *mime_message, const gchar *reply_to); - const gchar * (*get_reply_to) (CamelMimeMessage *mime_message); - void (*set_subject) (CamelMimeMessage *mime_message, const gchar *subject); - const gchar * (*get_subject) (CamelMimeMessage *mime_message); - void (*set_from) (CamelMimeMessage *mime_message, const gchar *from); - const gchar * (*get_from) (CamelMimeMessage *mime_message); - void (*add_recipient) (CamelMimeMessage *mime_message, const gchar *recipient_type, const gchar *recipient); - void (*remove_recipient) (CamelMimeMessage *mime_message, const gchar *recipient_type, const gchar *recipient); - const GList * (*get_recipients) (CamelMimeMessage *mime_message, const gchar *recipient_type); - void (*set_flag) (CamelMimeMessage *mime_message, const gchar *flag, gboolean value); - gboolean (*get_flag) (CamelMimeMessage *mime_message, const gchar *flag); - GList * (*get_flag_list) (CamelMimeMessage *mime_message); - void (*set_message_number)(CamelMimeMessage *mime_message, guint number); - guint (*get_message_number)(CamelMimeMessage *mime_message); -} CamelMimeMessageClass; - - - -/* Standard Gtk function */ -GtkType camel_mime_message_get_type (void); - - -/* public methods */ -CamelMimeMessage *camel_mime_message_new_with_session (CamelSession *session); - - -void camel_mime_message_set_received_date (CamelMimeMessage *mime_message, const gchar *received_date); -const gchar *camel_mime_message_get_received_date (CamelMimeMessage *mime_message); -const gchar *camel_mime_message_get_sent_date (CamelMimeMessage *mime_message); -void camel_mime_message_set_reply_to (CamelMimeMessage *mime_message, const gchar *reply_to); -const gchar *camel_mime_message_get_reply_to (CamelMimeMessage *mime_message); -void camel_mime_message_set_subject (CamelMimeMessage *mime_message, const gchar *subject); -const gchar *camel_mime_message_get_subject (CamelMimeMessage *mime_message); -void camel_mime_message_set_from (CamelMimeMessage *mime_message, const gchar *from); -const gchar *camel_mime_message_get_from (CamelMimeMessage *mime_message); - -void camel_mime_message_add_recipient (CamelMimeMessage *mime_message, const gchar *recipient_type, const gchar *recipient); -void camel_mime_message_remove_recipient (CamelMimeMessage *mime_message, const gchar *recipient_type, const gchar *recipient); -const GList *camel_mime_message_get_recipients (CamelMimeMessage *mime_message, const gchar *recipient_type); - -void camel_mime_message_set_flag (CamelMimeMessage *mime_message, const gchar *flag, gboolean value); -gboolean camel_mime_message_get_flag (CamelMimeMessage *mime_message, const gchar *flag); -GList *camel_mime_message_get_flag_list (CamelMimeMessage *mime_message); - -guint camel_mime_message_get_message_number (CamelMimeMessage *mime_message); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MIME_MESSAGE_H */ diff --git a/camel/camel-mime-part-utils.c b/camel/camel-mime-part-utils.c deleted file mode 100644 index 5e6d187a11..0000000000 --- a/camel/camel-mime-part-utils.c +++ /dev/null @@ -1,171 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mime-part-utils : Utility for mime parsing and so on */ - - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "gmime-content-field.h" -#include "string-utils.h" -#include "camel-log.h" -#include "gmime-utils.h" -#include "camel-simple-data-wrapper.h" - -#include "camel-mime-part-utils.h" - - -void -camel_mime_part_construct_headers_from_stream (CamelMimePart *mime_part, - CamelStream *stream) -{ - GArray *header_array; - Rfc822Header *cur_header; - int i; - - CAMEL_LOG_FULL_DEBUG ("CamelMimePartUtils:: " - "Entering _construct_headers_from_stream\n"); - g_assert (stream); - CAMEL_LOG_FULL_DEBUG ("CamelMimePartUtils::construct_headers_from_stream " - "parsing headers\n"); - /* - * parse all header lines - */ - header_array = get_header_array_from_stream (stream); - if (header_array) { - for (i=0; i<header_array->len; i++) { - cur_header = (Rfc822Header *)header_array->data + i; - camel_medium_add_header ( CAMEL_MEDIUM (mime_part), - cur_header->name, - cur_header->value); - } - - g_array_free (header_array, TRUE); - - CAMEL_LOG_FULL_DEBUG ("CamelMimePartUtils::construct_headers_from_stream " - "headers parsed. Leaving \n"); - } -} - - - - - -void -camel_mime_part_construct_content_from_stream (CamelMimePart *mime_part, - CamelStream *stream) -{ - GMimeContentField *content_type = NULL; - gchar *mime_type = NULL; - GtkType content_object_type; - CamelDataWrapper *content_object = NULL; - - /* - * find content mime type - */ - CAMEL_LOG_FULL_DEBUG ("CamelMimePartUtils::construct_content_from_stream " - "parsing content\n"); - - content_type = camel_mime_part_get_content_type (mime_part); - if (content_type) - mime_type = gmime_content_field_get_mime_type (content_type); - - /* - * no mime type found for the content, - * using text/plain is the default - */ - if (!mime_type) { - CAMEL_LOG_FULL_DEBUG ("CamelMimePartUtils::construct_content_from_stream " - "content type field not found " - "using default \"text/plain\"\n"); - mime_type = g_strdup ("text/plain"); - camel_mime_part_set_content_type (mime_part, mime_type); - } - - /* - * find in the repository what particular data wrapper is - * associated to this mime type - */ - content_object_type = - data_wrapper_repository_get_data_wrapper_type (mime_type); - - CAMEL_LOG_FULL_DEBUG ("CamelMimePartUtils::construct_content_from_stream content" - " type object type used: %s\n", - gtk_type_name (content_object_type)); - - g_free (mime_type); - - content_object = CAMEL_DATA_WRAPPER (gtk_type_new (content_object_type)); - camel_data_wrapper_set_mime_type_field (content_object, - camel_mime_part_get_content_type (mime_part)); - camel_medium_set_content_object ( CAMEL_MEDIUM (mime_part), content_object); - camel_data_wrapper_construct_from_stream (content_object, stream); - - /* - * the object is referenced in the set_content_object method, - * so unref it here - */ - gtk_object_unref (GTK_OBJECT (content_object)); - - - CAMEL_LOG_FULL_DEBUG ("CamelMimePartUtils::construct_from_stream " - "content parsed\n"); - - CAMEL_LOG_FULL_DEBUG ("CamelMimePartUtils:: Leaving _construct_from_stream\n"); -} - - - -void -camel_mime_part_store_stream_in_buffer (CamelMimePart *mime_part, - CamelStream *stream) -{ - gint nb_bytes_read_total = 0; - gint nb_bytes_read_chunk; - GByteArray *buffer; -#define STREAM_READ_CHUNK_SZ 100 - - CAMEL_LOG_FULL_DEBUG ("CamelMimePartUtils::store_stream_in_buffer entering\n"); - - if (mime_part->temp_message_buffer == NULL) - mime_part->temp_message_buffer = g_byte_array_new (); - - buffer = mime_part->temp_message_buffer; - - g_byte_array_set_size (buffer, nb_bytes_read_total + STREAM_READ_CHUNK_SZ); - nb_bytes_read_chunk = camel_stream_read (stream, - buffer->data + nb_bytes_read_total, - STREAM_READ_CHUNK_SZ); - nb_bytes_read_total += nb_bytes_read_chunk; - - while (nb_bytes_read_chunk >0) { - g_byte_array_set_size (buffer, nb_bytes_read_total + STREAM_READ_CHUNK_SZ); - nb_bytes_read_chunk = camel_stream_read (stream, - buffer->data + nb_bytes_read_total, - STREAM_READ_CHUNK_SZ); - nb_bytes_read_total += nb_bytes_read_chunk; - } - - g_byte_array_set_size (buffer, nb_bytes_read_total); - CAMEL_LOG_FULL_DEBUG ("CamelMimePartUtils::store_stream_in_buffer entering\n"); - -} diff --git a/camel/camel-mime-part-utils.h b/camel/camel-mime-part-utils.h deleted file mode 100644 index 7edbf5d603..0000000000 --- a/camel/camel-mime-part-utils.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mime-part-utils : Utility for mime parsing and so on */ - - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_MIME_PART_UTILS_H -#define CAMEL_MIME_PART_UTILS_H 1 - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include "camel-mime-part.h" - - -void camel_mime_part_construct_headers_from_stream (CamelMimePart *mime_part, - CamelStream *stream); - -void camel_mime_part_construct_content_from_stream (CamelMimePart *mime_part, - CamelStream *stream); - -void camel_mime_part_store_stream_in_buffer (CamelMimePart *mime_part, - CamelStream *stream); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MIME_PART_UTILS_H */ - diff --git a/camel/camel-mime-part.c b/camel/camel-mime-part.c deleted file mode 100644 index 874400deb8..0000000000 --- a/camel/camel-mime-part.c +++ /dev/null @@ -1,865 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camelMimePart.c : Abstract class for a mime_part */ - - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel-mime-part.h" -#include <stdio.h> -#include "gmime-content-field.h" -#include "string-utils.h" -#include "camel-log.h" -#include "gmime-utils.h" -#include "camel-simple-data-wrapper.h" -#include "hash-table-utils.h" -#include "camel-stream-mem.h" - -typedef enum { - HEADER_UNKNOWN, - HEADER_DESCRIPTION, - HEADER_DISPOSITION, - HEADER_CONTENT_ID, - HEADER_ENCODING, - HEADER_CONTENT_MD5, - HEADER_CONTENT_LANGUAGES, - HEADER_CONTENT_TYPE -} CamelHeaderType; - - -static GHashTable *header_name_table; - - -static CamelMediumClass *parent_class=NULL; - -/* Returns the class for a CamelMimePart */ -#define CMP_CLASS(so) CAMEL_MIME_PART_CLASS (GTK_OBJECT(so)->klass) - -/* from GtkObject */ -static void _finalize (GtkObject *object); - -/* from CamelDataWrapper */ -static void _write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream); -static void _construct_from_stream (CamelDataWrapper *data_wrapper, CamelStream *stream); - -/* from CamelMedia */ -static void _add_header (CamelMedium *medium, gchar *header_name, gchar *header_value); - -static void _set_content_object (CamelMedium *medium, CamelDataWrapper *content); -static CamelDataWrapper *_get_content_object (CamelMedium *medium); - -/* CamelMimePart methods */ -static void _set_description (CamelMimePart *mime_part, const gchar *description); -static const gchar *_get_description (CamelMimePart *mime_part); -static void _set_disposition (CamelMimePart *mime_part, const gchar *disposition); -static const gchar *_get_disposition (CamelMimePart *mime_part); -static void _set_filename (CamelMimePart *mime_part, gchar *filename); -static const gchar *_get_filename (CamelMimePart *mime_part); -static void _set_content_id (CamelMimePart *mime_part, gchar *content_id); -static const gchar *_get_content_id (CamelMimePart *mime_part); -static void _set_content_MD5 (CamelMimePart *mime_part, gchar *content_MD5); -static const gchar *_get_content_MD5 (CamelMimePart *mime_part); -static void _set_encoding (CamelMimePart *mime_part, CamelMimePartEncodingType encoding); -static CamelMimePartEncodingType _get_encoding (CamelMimePart *mime_part); -static void _set_content_languages (CamelMimePart *mime_part, GList *content_languages); -static const GList *_get_content_languages (CamelMimePart *mime_part); -static void _set_header_lines (CamelMimePart *mime_part, GList *header_lines); -static const GList *_get_header_lines (CamelMimePart *mime_part); -static void _set_content_type (CamelMimePart *mime_part, const gchar *content_type); -static GMimeContentField *_get_content_type (CamelMimePart *mime_part); - -static gboolean _parse_header_pair (CamelMimePart *mime_part, gchar *header_name, gchar *header_value); - - - -/* loads in a hash table the set of header names we */ -/* recognize and associate them with a unique enum */ -/* identifier (see CamelHeaderType above) */ -static void -_init_header_name_table() -{ - header_name_table = g_hash_table_new (g_strcase_hash, g_strcase_equal); - g_hash_table_insert (header_name_table, "Content-Description", (gpointer)HEADER_DESCRIPTION); - g_hash_table_insert (header_name_table, "Content-Disposition", (gpointer)HEADER_DISPOSITION); - g_hash_table_insert (header_name_table, "Content-id", (gpointer)HEADER_CONTENT_ID); - g_hash_table_insert (header_name_table, "Content-Transfer-Encoding", (gpointer)HEADER_ENCODING); - g_hash_table_insert (header_name_table, "Content-MD5", (gpointer)HEADER_CONTENT_MD5); - g_hash_table_insert (header_name_table, "Content-Type", (gpointer)HEADER_CONTENT_TYPE); - -} - -static void -camel_mime_part_class_init (CamelMimePartClass *camel_mime_part_class) -{ - CamelMediumClass *camel_medium_class = CAMEL_MEDIUM_CLASS (camel_mime_part_class); - CamelDataWrapperClass *camel_data_wrapper_class = CAMEL_DATA_WRAPPER_CLASS (camel_mime_part_class); - GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_data_wrapper_class); - - parent_class = gtk_type_class (camel_medium_get_type ()); - _init_header_name_table(); - - /* virtual method definition */ - camel_mime_part_class->set_description = _set_description; - camel_mime_part_class->get_description = _get_description; - camel_mime_part_class->set_disposition = _set_disposition; - camel_mime_part_class->get_disposition = _get_disposition; - camel_mime_part_class->set_filename = _set_filename; - camel_mime_part_class->get_filename = _get_filename; - camel_mime_part_class->set_content_id = _set_content_id; - camel_mime_part_class->get_content_id = _get_content_id; - camel_mime_part_class->set_content_MD5 =_set_content_MD5; - camel_mime_part_class->get_content_MD5 = _get_content_MD5; - camel_mime_part_class->set_encoding = _set_encoding; - camel_mime_part_class->get_encoding = _get_encoding; - camel_mime_part_class->set_content_languages = _set_content_languages; - camel_mime_part_class->get_content_languages = _get_content_languages; - camel_mime_part_class->set_header_lines =_set_header_lines; - camel_mime_part_class->get_header_lines =_get_header_lines; - camel_mime_part_class->set_content_type = _set_content_type; - camel_mime_part_class->get_content_type = _get_content_type; - - camel_mime_part_class->parse_header_pair = _parse_header_pair; - - /* virtual method overload */ - camel_medium_class->add_header = _add_header; - camel_medium_class->set_content_object = _set_content_object; - camel_medium_class->get_content_object = _get_content_object; - - camel_data_wrapper_class->write_to_stream = _write_to_stream; - camel_data_wrapper_class->construct_from_stream = _construct_from_stream; - - gtk_object_class->finalize = _finalize; -} - -static void -camel_mime_part_init (gpointer object, gpointer klass) -{ - CamelMimePart *camel_mime_part = CAMEL_MIME_PART (object); - - camel_mime_part->content_type = gmime_content_field_new (NULL, NULL); - camel_mime_part->description = NULL; - camel_mime_part->disposition = NULL; - camel_mime_part->content_id = NULL; - camel_mime_part->content_MD5 = NULL; - camel_mime_part->content_languages = NULL; - camel_mime_part->encoding = CAMEL_MIME_PART_ENCODING_DEFAULT; - camel_mime_part->filename = NULL; - camel_mime_part->header_lines = NULL; - - camel_mime_part->temp_message_buffer = NULL; - -} - - - - -GtkType -camel_mime_part_get_type (void) -{ - static GtkType camel_mime_part_type = 0; - - if (!camel_mime_part_type) { - GtkTypeInfo camel_mime_part_info = - { - "CamelMimePart", - sizeof (CamelMimePart), - sizeof (CamelMimePartClass), - (GtkClassInitFunc) camel_mime_part_class_init, - (GtkObjectInitFunc) camel_mime_part_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_mime_part_type = gtk_type_unique (camel_medium_get_type (), &camel_mime_part_info); - } - - return camel_mime_part_type; -} - - -static void -_finalize (GtkObject *object) -{ - CamelMimePart *mime_part = CAMEL_MIME_PART (object); - -#warning do something for (mime_part->disposition) which should not be a GMimeContentField - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMimePart::finalize\n"); - - - - g_free (mime_part->description); - gmime_content_field_unref (mime_part->disposition); - g_free (mime_part->content_id); - g_free (mime_part->content_MD5); - string_list_free (mime_part->content_languages); - g_free (mime_part->filename); - if (mime_part->header_lines) string_list_free (mime_part->header_lines); - - if (mime_part->content_type) gmime_content_field_unref (mime_part->content_type); - if (mime_part->temp_message_buffer) g_byte_array_free (mime_part->temp_message_buffer, TRUE); - - GTK_OBJECT_CLASS (parent_class)->finalize (object); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMimePart::finalize\n"); -} - - -/* **** */ - -static void -_add_header (CamelMedium *medium, gchar *header_name, gchar *header_value) -{ - CamelMimePart *mime_part = CAMEL_MIME_PART (medium); - gboolean header_exists; - gchar *old_header_name; - gchar *old_header_value; - - /* Try to parse the header pair. If it corresponds to something */ - /* known, the job is done in the parsing routine. If not, */ - /* we simply add the header in a raw fashion */ - if (! CMP_CLASS(mime_part)->parse_header_pair (mime_part, header_name, header_value) ) - parent_class->add_header (medium, header_name, header_value); -} - - - - - - -static void -_set_description (CamelMimePart *mime_part, const gchar *description) -{ - g_free (mime_part->description); - mime_part->description = g_strdup (description); -} - -void -camel_mime_part_set_description (CamelMimePart *mime_part, const gchar *description) -{ - CMP_CLASS(mime_part)->set_description (mime_part, description); -} - - - -/* **** */ - - - -static const gchar * -_get_description (CamelMimePart *mime_part) -{ - return mime_part->description; -} - -const gchar * -camel_mime_part_get_description (CamelMimePart *mime_part) -{ - return CMP_CLASS(mime_part)->get_description (mime_part); -} - - - -/* **** */ - - -static void -_set_disposition (CamelMimePart *mime_part, const gchar *disposition) -{ -#warning Do not use MimeContentfield here !!! - - if (mime_part->disposition) g_free ((mime_part->disposition)->type); - g_free (mime_part->disposition); - - mime_part->disposition = g_new0 (GMimeContentField,1); - (mime_part->disposition)->type = g_strdup (disposition); -} - - -void -camel_mime_part_set_disposition (CamelMimePart *mime_part, const gchar *disposition) -{ - CMP_CLASS(mime_part)->set_disposition (mime_part, disposition); -} - - -/* **** */ - - - -static const gchar * -_get_disposition (CamelMimePart *mime_part) -{ - if (!mime_part->disposition) return NULL; - return (mime_part->disposition)->type; -} - - -const gchar * -camel_mime_part_get_disposition (CamelMimePart *mime_part) -{ - return CMP_CLASS(mime_part)->get_disposition (mime_part); -} - - - -static void -_set_filename (CamelMimePart *mime_part, gchar *filename) -{ - g_free(mime_part->filename); - mime_part->filename = filename; -} - - -void -camel_mime_part_set_filename (CamelMimePart *mime_part, gchar *filename) -{ - CMP_CLASS(mime_part)->set_filename (mime_part, filename); -} - - - -/* **** */ - - -static const gchar * -_get_filename (CamelMimePart *mime_part) -{ - return mime_part->filename; -} - - -const gchar * -camel_mime_part_get_filename (CamelMimePart *mime_part) -{ - return CMP_CLASS(mime_part)->get_filename (mime_part); -} - - -/* **** */ - - -/* this routine must not be public */ -static void -_set_content_id (CamelMimePart *mime_part, gchar *content_id) -{ - g_free(mime_part->content_id); - mime_part->content_id = content_id; -} - - -static const gchar * -_get_content_id (CamelMimePart *mime_part) -{ - return mime_part->content_id; -} - - -/* **** */ - - -const gchar * -camel_mime_part_get_content_id (CamelMimePart *mime_part) -{ - return CMP_CLASS(mime_part)->get_content_id (mime_part); -} - - -/* this routine must not be public */ -static void -_set_content_MD5 (CamelMimePart *mime_part, gchar *content_MD5) -{ - g_free(mime_part->content_MD5); - mime_part->content_MD5 = content_MD5; -} - - -/* **** */ - - -static const gchar * -_get_content_MD5 (CamelMimePart *mime_part) -{ - return mime_part->content_MD5; -} - -const gchar * -camel_mime_part_get_content_MD5 (CamelMimePart *mime_part) -{ - return CMP_CLASS(mime_part)->get_content_MD5 (mime_part); -} - - -/* **** */ - - - -static void -_set_encoding (CamelMimePart *mime_part, CamelMimePartEncodingType encoding) -{ - mime_part->encoding = encoding; -} - -void -camel_mime_part_set_encoding (CamelMimePart *mime_part, - CamelMimePartEncodingType encoding) -{ - CMP_CLASS(mime_part)->set_encoding (mime_part, encoding); -} - - -/* **** */ - - - -static CamelMimePartEncodingType -_get_encoding (CamelMimePart *mime_part) -{ - return mime_part->encoding; -} - -const CamelMimePartEncodingType -camel_mime_part_get_encoding (CamelMimePart *mime_part) -{ - return CMP_CLASS(mime_part)->get_encoding (mime_part); -} - - - -/* **** */ - - - -static void -_set_content_languages (CamelMimePart *mime_part, GList *content_languages) -{ - if (mime_part->content_languages) string_list_free (mime_part->content_languages); - mime_part->content_languages = content_languages; -} - -void -camel_mime_part_set_content_languages (CamelMimePart *mime_part, GList *content_languages) -{ - CMP_CLASS(mime_part)->set_content_languages (mime_part, content_languages); -} - - -/* **** */ - - - -static const GList * -_get_content_languages (CamelMimePart *mime_part) -{ - return mime_part->content_languages; -} - - -const GList * -camel_mime_part_get_content_languages (CamelMimePart *mime_part) -{ - return CMP_CLASS(mime_part)->get_content_languages (mime_part); -} - - -/* **** */ - - - -static void -_set_header_lines (CamelMimePart *mime_part, GList *header_lines) -{ - if (mime_part->header_lines) string_list_free (mime_part->header_lines); - mime_part->header_lines = header_lines; -} - -void -camel_mime_part_set_header_lines (CamelMimePart *mime_part, GList *header_lines) -{ - CMP_CLASS(mime_part)->set_header_lines (mime_part, header_lines); -} - - -/* **** */ - - - -static const GList * -_get_header_lines (CamelMimePart *mime_part) -{ - return mime_part->header_lines; -} - - - -const GList * -camel_mime_part_get_header_lines (CamelMimePart *mime_part) -{ - return CMP_CLASS(mime_part)->get_header_lines (mime_part); -} - - -/* **** */ - - - -static void -_set_content_type (CamelMimePart *mime_part, const gchar *content_type) -{ - g_assert (content_type); - gmime_content_field_construct_from_string (mime_part->content_type, content_type); -} - -void -camel_mime_part_set_content_type (CamelMimePart *mime_part, gchar *content_type) -{ - CMP_CLASS(mime_part)->set_content_type (mime_part, content_type); -} - -/* **** */ - - -static GMimeContentField * -_get_content_type (CamelMimePart *mime_part) -{ - return mime_part->content_type; -} - -GMimeContentField * -camel_mime_part_get_content_type (CamelMimePart *mime_part) -{ - return CMP_CLASS(mime_part)->get_content_type (mime_part); -} - -/*********/ - - - -static void -_set_content_object (CamelMedium *medium, CamelDataWrapper *content) -{ - CamelMimePart *mime_part = CAMEL_MIME_PART (medium); - GMimeContentField *object_content_field; - - parent_class->set_content_object (medium, content); - - object_content_field = camel_data_wrapper_get_mime_type_field (content); - if (mime_part->content_type && (mime_part->content_type != object_content_field)) - gmime_content_field_unref (mime_part->content_type); - mime_part->content_type = object_content_field; - gmime_content_field_ref (object_content_field); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMimePart::set_content_object\n"); - -} - -static CamelDataWrapper * -_get_content_object (CamelMedium *medium) -{ - CamelMimePart *mime_part = CAMEL_MIME_PART (medium); - CamelStream *stream; - - CAMEL_LOG_FULL_DEBUG ("CamelMimePart::get_content_object entering\n"); - /* - * test if there is not pending content stored in the - * temporary buffer - */ - if ((!medium->content ) && (mime_part->temp_message_buffer)) { - stream = camel_stream_mem_new_with_buffer (mime_part->temp_message_buffer, - CAMEL_STREAM_MEM_READ); - camel_mime_part_construct_content_from_stream (mime_part, stream); - /* - * Beware : this will destroy the temp buffer as well - */ - gtk_object_unref (GTK_OBJECT (stream)); - } else { - CAMEL_LOG_FULL_DEBUG ("CamelMimePart::get_content_object part has a pointer " - "to a content object as well as a temp buffer\n"); - } - - CAMEL_LOG_FULL_DEBUG ("CamelMimePart::get_content_object leaving\n"); - - return parent_class->get_content_object (medium); - -} - - -/* **** */ - - - - -/**********************************************************************/ -#ifdef WHPT -#warning : WHPT is already defined !!!!!! -#endif -#define WHPT gmime_write_header_pair_to_stream - - -static void -_write_content_to_stream (CamelMimePart *mime_part, CamelStream *stream) -{ - CamelMedium *medium = CAMEL_MEDIUM (mime_part); - CamelStream *wrapper_stream; - guint buffer_size; - gchar *buffer; - gchar *encoded_buffer; - - CamelDataWrapper *content = medium->content; - CAMEL_LOG_FULL_DEBUG ( "Entering CamelMimePart::_write_content_to_stream\n"); - CAMEL_LOG_FULL_DEBUG ( "CamelMimePart::_write_content_to_stream, content=%p\n", content); - if (!content) return; - - switch (mime_part->encoding) { - case CAMEL_MIME_PART_ENCODING_DEFAULT: - case CAMEL_MIME_PART_ENCODING_7BIT: - case CAMEL_MIME_PART_ENCODING_8BIT: - camel_data_wrapper_write_to_stream (content, stream); - break; - case CAMEL_MIME_PART_ENCODING_BASE64: - wrapper_stream = camel_data_wrapper_get_stream (content); - if (wrapper_stream == NULL) { - /* FIXME in this case, we should probably copy stuff - in-memory and make sure things work anyway. */ - g_warning ("Class `%s' does not implement `get_stream'", - gtk_type_name (GTK_OBJECT (content)->klass->type)); - } - gmime_encode_base64 (wrapper_stream, stream); - break; - default: - g_warning ("Encoding type `%s' not supported.", - camel_mime_part_encoding_to_string - (mime_part->encoding)); - } - - CAMEL_LOG_FULL_DEBUG ( "Leaving CamelMimePart::_write_content_to_stream\n"); -} - - - - - -static void -_write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream) -{ - CamelMimePart *mp = CAMEL_MIME_PART (data_wrapper); - CamelMedium *medium = CAMEL_MEDIUM (data_wrapper); - - CAMEL_LOG_FULL_DEBUG ( "Entering CamelMimePart::write_to_stream\n"); - - CAMEL_LOG_FULL_DEBUG ( "CamelMimePart::write_to_stream writing content-disposition\n"); - gmime_content_field_write_to_stream(mp->disposition, stream); - CAMEL_LOG_FULL_DEBUG ( "CamelMimePart::write_to_stream writing content-transfer-encoding\n"); - WHPT (stream, "Content-Transfer-Encoding", - camel_mime_part_encoding_to_string (mp->encoding)); - CAMEL_LOG_FULL_DEBUG ( "CamelMimePart::write_to_stream writing content-description\n"); - WHPT (stream, "Content-Description", mp->description); - CAMEL_LOG_FULL_DEBUG ( "CamelMimePart::write_to_stream writing content-MD5\n"); - WHPT (stream, "Content-MD5", mp->content_MD5); - CAMEL_LOG_FULL_DEBUG ( "CamelMimePart::write_to_stream writing content-id\n"); - WHPT (stream, "Content-id", mp->content_id); - CAMEL_LOG_FULL_DEBUG ( "CamelMimePart::write_to_stream writing content-languages\n"); - gmime_write_header_with_glist_to_stream (stream, "Content-Language", mp->content_languages,", "); - - CAMEL_LOG_FULL_DEBUG ( "CamelMimePart::write_to_stream writing other headers\n"); - gmime_write_header_table_to_stream (stream, medium->headers); - - CAMEL_LOG_FULL_DEBUG ( "CamelMimePart::write_to_stream writing content-type\n"); - gmime_content_field_write_to_stream (mp->content_type, stream); - - camel_stream_write_string(stream,"\n"); - _write_content_to_stream (mp, stream); - -} - - - -/*******************************/ -/* mime part parsing */ - -static gboolean -_parse_header_pair (CamelMimePart *mime_part, gchar *header_name, gchar *header_value) -{ - CamelHeaderType header_type; - gboolean header_handled = FALSE; - - - header_type = (CamelHeaderType) g_hash_table_lookup (header_name_table, header_name); - switch (header_type) { - - case HEADER_DESCRIPTION: - CAMEL_LOG_FULL_DEBUG ( - "CamelMimePart::parse_header_pair found HEADER_DESCRIPTION: %s\n", - header_value ); - - camel_mime_part_set_description (mime_part, header_value); - header_handled = TRUE; - break; - - case HEADER_DISPOSITION: - CAMEL_LOG_FULL_DEBUG ( - "CamelMimePart::parse_header_pair found HEADER_DISPOSITION: %s\n", - header_value); - - camel_mime_part_set_disposition (mime_part, header_value); - header_handled = TRUE; - break; - - case HEADER_CONTENT_ID: - CAMEL_LOG_FULL_DEBUG ( - "CamelMimePart::parse_header_pair found HEADER_CONTENT_ID: %s\n", - header_value); - - CMP_CLASS(mime_part)->set_content_id (mime_part, header_value); - header_handled = TRUE; - break; - - case HEADER_ENCODING: - CAMEL_LOG_FULL_DEBUG ( - "CamelMimePart::parse_header_pair found HEADER_ENCODING: %s\n", - header_value); - - camel_mime_part_set_encoding - (mime_part, - camel_mime_part_encoding_from_string (header_value)); - header_handled = TRUE; - break; - - case HEADER_CONTENT_MD5: - CAMEL_LOG_FULL_DEBUG ( - "CamelMimePart::parse_header_pair found HEADER_CONTENT_MD5: %s\n", - header_value ); - - CMP_CLASS(mime_part)->set_content_MD5 (mime_part, header_value); - header_handled = TRUE; - break; - - case HEADER_CONTENT_TYPE: - CAMEL_LOG_FULL_DEBUG ( - "CamelMimePart::parse_header_pair found HEADER_CONTENT_TYPE: %s\n", - header_value ); - - gmime_content_field_construct_from_string (mime_part->content_type, header_value); - header_handled = TRUE; - break; - - - } - - - if (header_handled) { - g_free (header_name); - return TRUE; - } else return FALSE; - -} - - -static void -_construct_from_stream (CamelDataWrapper *data_wrapper, CamelStream *stream) -{ - - CamelMimePart *mime_part = CAMEL_MIME_PART (data_wrapper); - - CAMEL_LOG_FULL_DEBUG ("CamelMimePart::construct_from_stream entering\n"); - camel_mime_part_construct_headers_from_stream (mime_part, stream); - - camel_mime_part_store_stream_in_buffer (mime_part, stream); - CAMEL_LOG_FULL_DEBUG ("CamelMimePart::construct_from_stream leaving\n"); - -} - - -const gchar * -camel_mime_part_encoding_to_string (CamelMimePartEncodingType encoding) -{ - switch (encoding) { - case CAMEL_MIME_PART_ENCODING_DEFAULT: - case CAMEL_MIME_PART_ENCODING_7BIT: - return "7bit"; - case CAMEL_MIME_PART_ENCODING_8BIT: - return "8bit"; - case CAMEL_MIME_PART_ENCODING_BASE64: - return "base64"; - case CAMEL_MIME_PART_ENCODING_QUOTEDPRINTABLE: - return "quoted-printable"; - } -} - - -/* FIXME I am not sure this is the correct way to do this. */ -CamelMimePartEncodingType -camel_mime_part_encoding_from_string (const gchar *string) -{ - if (strncmp (string, "7bit") == 0) - return CAMEL_MIME_PART_ENCODING_7BIT; - else if (strncmp (string, "8bit") == 0) - return CAMEL_MIME_PART_ENCODING_8BIT; - else if (strncmp (string, "base64") == 0) - return CAMEL_MIME_PART_ENCODING_BASE64; - else if (strncmp (string, "quoted-printable") == 0) - return CAMEL_MIME_PART_ENCODING_QUOTEDPRINTABLE; - else - /* FIXME? Spit a warning? */ - return CAMEL_MIME_PART_ENCODING_DEFAULT; -} - - -/******************************/ -/** Misc utility functions **/ - - -/** - * camel_mime_part_set_text: set the content to be some text - * @camel_mime_part: Mime part - * @text: the text - * - * Utility function used to set the content of a mime part object to - * be a text string. When @text is NULL, this routine can be used as - * a way to remove old text content. - * - **/ -void -camel_mime_part_set_text (CamelMimePart *camel_mime_part, const gchar *text) -{ - CamelSimpleDataWrapper *simple_data_wrapper; - CamelMedium *medium = CAMEL_MEDIUM (camel_mime_part); - - CAMEL_LOG_FULL_DEBUG ("CamelMimePart:: Entering set_text\n"); - CAMEL_LOG_TRACE ("CamelMimePart::set_text, setting text as a mime part content\n"); - if (medium->content) { - CAMEL_LOG_FULL_DEBUG ("CamelMimePart::set_text unreferencing old content object\n"); - gtk_object_unref (GTK_OBJECT (medium->content)); - } - if (text) { - simple_data_wrapper = camel_simple_data_wrapper_new (); - CAMEL_LOG_FULL_DEBUG ("CamelMimePart::set_text calling CamelSimpleDataWrapper:set_text with %d chars\n", strlen (text)); - camel_data_wrapper_set_mime_type (CAMEL_DATA_WRAPPER (simple_data_wrapper), "text/plain"); - camel_simple_data_wrapper_set_text ( simple_data_wrapper, text); - camel_medium_set_content_object ( CAMEL_MEDIUM (camel_mime_part), CAMEL_DATA_WRAPPER (simple_data_wrapper)); - gtk_object_unref (GTK_OBJECT (simple_data_wrapper)); - } else medium->content = NULL; - - CAMEL_LOG_FULL_DEBUG ("CamelMimePart:: Leaving camel_mime_part_set_text\n"); -} - - diff --git a/camel/camel-mime-part.h b/camel/camel-mime-part.h deleted file mode 100644 index 573cf69576..0000000000 --- a/camel/camel-mime-part.h +++ /dev/null @@ -1,153 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mime-part.h : class for a mime part */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_MIME_PART_H -#define CAMEL_MIME_PART_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include "camel-medium.h" -#include "camel-stream.h" - - -#define CAMEL_MIME_PART_TYPE (camel_mime_part_get_type ()) -#define CAMEL_MIME_PART(obj) (GTK_CHECK_CAST((obj), CAMEL_MIME_PART_TYPE, CamelMimePart)) -#define CAMEL_MIME_PART_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_MIME_PART_TYPE, CamelMimePartClass)) -#define CAMEL_IS_MIME_PART(o) (GTK_CHECK_TYPE((o), CAMEL_MIME_PART_TYPE)) - - -enum _CamelMimePartEncodingType { - CAMEL_MIME_PART_ENCODING_DEFAULT, - CAMEL_MIME_PART_ENCODING_7BIT, - CAMEL_MIME_PART_ENCODING_8BIT, - CAMEL_MIME_PART_ENCODING_BASE64, - CAMEL_MIME_PART_ENCODING_QUOTEDPRINTABLE, - CAMEL_MIME_PART_NUM_ENCODINGS -}; -typedef enum _CamelMimePartEncodingType CamelMimePartEncodingType; - - -/* Do not change these values directly, you - would regret it one day */ -typedef struct -{ - CamelMedium parent_object; - - /* All fields here are -** PRIVATE **- */ - gchar *description; - GMimeContentField *disposition; - gchar *content_id; - gchar *content_MD5; - GList *content_languages; - CamelMimePartEncodingType encoding; - gchar *filename; - GList *header_lines; - - GByteArray *temp_message_buffer; - GMimeContentField *content_type; - -} CamelMimePart; - - - -typedef struct { - CamelMediumClass parent_class; - - /* Virtual methods */ - void (*set_description) (CamelMimePart *mime_part, const gchar *description); - const gchar * (*get_description) (CamelMimePart *mime_part); - void (*set_disposition) (CamelMimePart *mime_part, const gchar *disposition); - const gchar * (*get_disposition) (CamelMimePart *mime_part); - void (*set_filename) (CamelMimePart *mime_part, gchar *filename); - const gchar * (*get_filename) (CamelMimePart *mime_part); - void (*set_content_id) (CamelMimePart *mime_part, gchar *content_id); - const gchar * (*get_content_id) (CamelMimePart *mime_part); - void (*set_content_MD5) (CamelMimePart *mime_part, gchar *content_MD5); - const gchar * (*get_content_MD5) (CamelMimePart *mime_part); - void (*set_encoding) (CamelMimePart *mime_part, CamelMimePartEncodingType type); - const CamelMimePartEncodingType (*get_encoding) (CamelMimePart *mime_part); - void (*set_content_languages) (CamelMimePart *mime_part, GList *content_languages); - const GList * (*get_content_languages) (CamelMimePart *mime_part); - void (*set_header_lines) (CamelMimePart *mime_part, GList *header_lines); - const GList * (*get_header_lines) (CamelMimePart *mime_part); - - void (*set_content_type) (CamelMimePart *mime_part, const gchar *content_type); - GMimeContentField * (*get_content_type) (CamelMimePart *mime_part); - - gboolean (*parse_header_pair) (CamelMimePart *mime_part, gchar *header_name, gchar *header_value); - - -} CamelMimePartClass; - - - -/* Standard Gtk function */ -GtkType camel_mime_part_get_type (void); - - -/* public methods */ -void camel_mime_part_set_description (CamelMimePart *mime_part, - const gchar *description); -const gchar *camel_mime_part_get_description (CamelMimePart *mime_part); -void camel_mime_part_set_disposition (CamelMimePart *mime_part, - const gchar *disposition); -const gchar *camel_mime_part_get_disposition (CamelMimePart *mime_part); -void camel_mime_part_set_filename (CamelMimePart *mime_part, - gchar *filename); -const gchar *camel_mime_part_get_filename (CamelMimePart *mime_part); -const gchar *camel_mime_part_get_content_id (CamelMimePart *mime_part); -const gchar *camel_mime_part_get_content_MD5 (CamelMimePart *mime_part); -void camel_mime_part_set_encoding (CamelMimePart *mime_part, - CamelMimePartEncodingType type); -CamelMimePartEncodingType camel_mime_part_get_encoding (CamelMimePart *mime_part); -void camel_mime_part_set_content_languages (CamelMimePart *mime_part, - GList *content_languages); -const GList *camel_mime_part_get_content_languages (CamelMimePart *mime_part); -void camel_mime_part_set_header_lines (CamelMimePart *mime_part, - GList *header_lines); -const GList *camel_mime_part_get_header_lines (CamelMimePart *mime_part); - -GMimeContentField *camel_mime_part_get_content_type (CamelMimePart *mime_part); - -const gchar *camel_mime_part_encoding_to_string (CamelMimePartEncodingType encoding); -CamelMimePartEncodingType camel_mime_part_encoding_from_string (const gchar *string); - -/* utility functions */ -void camel_mime_part_set_text (CamelMimePart *camel_mime_part, const gchar *text); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MIME_PART_H */ - diff --git a/camel/camel-multipart.c b/camel/camel-multipart.c deleted file mode 100644 index 9b6734f011..0000000000 --- a/camel/camel-multipart.c +++ /dev/null @@ -1,505 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-multipart.c : Abstract class for a multipart */ - - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel-multipart.h" -#include "camel-log.h" -#include "gmime-content-field.h" -#include "gmime-utils.h" -#include "camel-stream-mem.h" - - -static void _add_part (CamelMultipart *multipart, CamelMimeBodyPart *part); -static void _add_part_at (CamelMultipart *multipart, CamelMimeBodyPart *part, guint index); -static void _remove_part (CamelMultipart *multipart, CamelMimeBodyPart *part); -static CamelMimeBodyPart *_remove_part_at (CamelMultipart *multipart, guint index); -static CamelMimeBodyPart *_get_part (CamelMultipart *multipart, guint index); -static guint _get_number (CamelMultipart *multipart); -static void _set_parent (CamelMultipart *multipart, CamelMimePart *parent); -static CamelMimePart *_get_parent (CamelMultipart *multipart); -static void _set_boundary (CamelMultipart *multipart, gchar *boundary); -static const gchar *_get_boundary (CamelMultipart *multipart); -static void _write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream); -static void _construct_from_stream (CamelDataWrapper *data_wrapper, CamelStream *stream); - -static void _finalize (GtkObject *object); - -static CamelDataWrapperClass *parent_class=NULL; - -/* Returns the class for a CamelMultipart */ -#define CMP_CLASS(so) CAMEL_MULTIPART_CLASS (GTK_OBJECT(so)->klass) - -/* Returns the class for a CamelDataWrapper */ -#define CDW_CLASS(so) CAMEL_DATA_WRAPPER_CLASS (GTK_OBJECT(so)->klass) - - -static void -camel_multipart_class_init (CamelMultipartClass *camel_multipart_class) -{ - CamelDataWrapperClass *camel_data_wrapper_class = CAMEL_DATA_WRAPPER_CLASS (camel_multipart_class); - GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_multipart_class); - - parent_class = gtk_type_class (camel_data_wrapper_get_type ()); - - /* virtual method definition */ - camel_multipart_class->add_part = _add_part; - camel_multipart_class->add_part_at = _add_part_at; - camel_multipart_class->remove_part = _remove_part; - camel_multipart_class->remove_part_at = _remove_part_at; - camel_multipart_class->get_part = _get_part; - camel_multipart_class->get_number = _get_number; - camel_multipart_class->set_parent = _set_parent; - camel_multipart_class->get_parent = _get_parent; - camel_multipart_class->set_boundary = _set_boundary; - camel_multipart_class->get_boundary = _get_boundary; - - /* virtual method overload */ - camel_data_wrapper_class->write_to_stream = _write_to_stream; - camel_data_wrapper_class->construct_from_stream = _construct_from_stream; - - gtk_object_class->finalize = _finalize; -} - -static void -camel_multipart_init (gpointer object, gpointer klass) -{ - CamelMultipart *multipart = CAMEL_MULTIPART (object); - camel_data_wrapper_set_mime_type ( CAMEL_DATA_WRAPPER (multipart), "multipart"); - camel_multipart_set_boundary (multipart, "__camel_boundary__"); - multipart->preface = NULL; - multipart->postface = NULL; - -} - - - - -GtkType -camel_multipart_get_type (void) -{ - static GtkType camel_multipart_type = 0; - - if (!camel_multipart_type) { - GtkTypeInfo camel_multipart_info = - { - "CamelMultipart", - sizeof (CamelMultipart), - sizeof (CamelMultipartClass), - (GtkClassInitFunc) camel_multipart_class_init, - (GtkObjectInitFunc) camel_multipart_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_multipart_type = gtk_type_unique (camel_data_wrapper_get_type (), &camel_multipart_info); - } - - return camel_multipart_type; -} - -static void -_unref_part (gpointer data, gpointer user_data) -{ - GtkObject *body_part = GTK_OBJECT (data); - - gtk_object_unref (body_part); -} - -static void -_finalize (GtkObject *object) -{ - CamelMultipart *multipart = CAMEL_MULTIPART (object); - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMultipart::finalize\n"); - - if (multipart->parent) gtk_object_unref (GTK_OBJECT (multipart->parent)); - - g_list_foreach (multipart->parts, _unref_part, NULL); - - if (multipart->boundary) g_free (multipart->boundary); - if (multipart->preface) g_free (multipart->preface); - if (multipart->postface) g_free (multipart->postface); - - GTK_OBJECT_CLASS (parent_class)->finalize (object); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMultipart::finalize\n"); -} - - -CamelMultipart * -camel_multipart_new () -{ - CamelMultipart *multipart; - CAMEL_LOG_FULL_DEBUG ("CamelMultipart:: Entering new()\n"); - - multipart = (CamelMultipart *)gtk_type_new (CAMEL_MULTIPART_TYPE); - multipart->preface = NULL; - multipart->postface = NULL; - - - CAMEL_LOG_FULL_DEBUG ("CamelMultipart:: Leaving new()\n"); - return multipart; -} - - -static void -_add_part (CamelMultipart *multipart, CamelMimeBodyPart *part) -{ - multipart->parts = g_list_append (multipart->parts, part); - if (part) gtk_object_ref (GTK_OBJECT (part)); -} - -void -camel_multipart_add_part (CamelMultipart *multipart, CamelMimeBodyPart *part) -{ - CMP_CLASS (multipart)->add_part (multipart, part); -} - - -static void -_add_part_at (CamelMultipart *multipart, CamelMimeBodyPart *part, guint index) -{ - multipart->parts = g_list_insert (multipart->parts, part, index); - if (part) gtk_object_ref (GTK_OBJECT (part)); -} - -void -camel_multipart_add_part_at (CamelMultipart *multipart, CamelMimeBodyPart *part, guint index) -{ - CMP_CLASS (multipart)->add_part_at (multipart, part, index); -} - -static void -_remove_part (CamelMultipart *multipart, CamelMimeBodyPart *part) -{ - if (!multipart->parts) { - CAMEL_LOG_FULL_DEBUG ("CamelMultipart::remove_part part list id void\n"); - return; - } - multipart->parts = g_list_remove (multipart->parts, part); - if (part) gtk_object_unref (GTK_OBJECT (part)); -} - -void -camel_multipart_remove_part (CamelMultipart *multipart, CamelMimeBodyPart *part) -{ - CMP_CLASS (multipart)->remove_part (multipart, part); -} - - -static CamelMimeBodyPart * -_remove_part_at (CamelMultipart *multipart, guint index) -{ - GList *parts_list; - GList *part_to_remove; - CamelMimeBodyPart *removed_body_part; - - CAMEL_LOG_FULL_DEBUG ("CamelMultipart:: Entering remove_part_at\n"); - CAMEL_LOG_TRACE ("CamelMultipart::remove_part_at : Removing part number %d\n", index); - - if (!(multipart->parts)) { - CAMEL_LOG_FULL_DEBUG ("CamelMultipart::remove_part_at part list is void \n"); - return NULL; - } - - parts_list = multipart->parts; - part_to_remove = g_list_nth (parts_list, index); - if (!part_to_remove) { - CAMEL_LOG_WARNING ("CamelMultipart::remove_part_at : part to remove is NULL\n"); - CAMEL_LOG_FULL_DEBUG ("CamelMultipart::remove_part_at : index = %d, number of parts=%d\n", - index, g_list_length (parts_list)); - return NULL; - } - removed_body_part = CAMEL_MIME_BODY_PART (part_to_remove->data); - - multipart->parts = g_list_remove_link (parts_list, part_to_remove); - if (part_to_remove->data) gtk_object_unref (GTK_OBJECT (part_to_remove->data)); - g_list_free_1 (part_to_remove); - - CAMEL_LOG_FULL_DEBUG ("CamelMultipart:: Leaving remove_part_at\n"); - return removed_body_part; - -} - -CamelMimeBodyPart * -camel_multipart_remove_part_at (CamelMultipart *multipart, guint index) -{ - return CMP_CLASS (multipart)->remove_part_at (multipart, index); -} - - -static CamelMimeBodyPart * -_get_part (CamelMultipart *multipart, guint index) -{ - GList *part; - if (!(multipart->parts)) { - CAMEL_LOG_FULL_DEBUG ("CamelMultipart::get_part part list is void \n"); - return NULL; - } - - part = g_list_nth (multipart->parts, index); - if (part) return CAMEL_MIME_BODY_PART (part->data); - else { - CAMEL_LOG_FULL_DEBUG ("CamelMultipart::get_part part number %d not found\n", index); - return NULL; - } -} - -CamelMimeBodyPart * -camel_multipart_get_part (CamelMultipart *multipart, guint index) -{ - return CMP_CLASS (multipart)->get_part (multipart, index); -} - - -static guint -_get_number (CamelMultipart *multipart) -{ - return g_list_length (multipart->parts); -} - -guint -camel_multipart_get_number (CamelMultipart *multipart) -{ - return CMP_CLASS (multipart)->get_number (multipart); -} - - -static void -_set_parent (CamelMultipart *multipart, CamelMimePart *parent) -{ - multipart->parent = parent; - if (parent) gtk_object_ref (GTK_OBJECT (parent)); -} - -void -camel_multipart_set_parent (CamelMultipart *multipart, CamelMimePart *parent) -{ - CMP_CLASS (multipart)->set_parent (multipart, parent); -} - - -static CamelMimePart * -_get_parent (CamelMultipart *multipart) -{ - return multipart->parent; -} - - -CamelMimePart * -camel_multipart_get_parent (CamelMultipart *multipart) -{ - return CMP_CLASS (multipart)->get_parent (multipart); -} - - - - - -static void -_set_boundary (CamelMultipart *multipart, gchar *boundary) -{ - gmime_content_field_set_parameter (CAMEL_DATA_WRAPPER (multipart)->mime_type, "boundary", boundary); -} - -void -camel_multipart_set_boundary (CamelMultipart *multipart, gchar *boundary) -{ - CMP_CLASS (multipart)->set_boundary (multipart, boundary); -} - - -static const gchar * -_get_boundary (CamelMultipart *multipart) -{ - const gchar *boundary; - CAMEL_LOG_FULL_DEBUG ("Entering CamelMultipart::_get_boundary\n"); - if (!CAMEL_DATA_WRAPPER (multipart)->mime_type) { - CAMEL_LOG_WARNING ("CamelMultipart::_get_boundary CAMEL_DATA_WRAPPER (multipart)->mime_type is NULL\n"); - return NULL; - } - boundary = gmime_content_field_get_parameter (CAMEL_DATA_WRAPPER (multipart)->mime_type, "boundary"); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMultipart::_get_boundary\n"); - return boundary; -} - - -const gchar * -camel_multipart_get_boundary (CamelMultipart *multipart) -{ - return CMP_CLASS (multipart)->get_boundary (multipart); -} - - -struct _print_part_user_data { - CamelStream *stream; - const gchar *boundary; -}; - - - -static void -_print_part (gpointer data, gpointer user_data) -{ - CamelMimeBodyPart *body_part = CAMEL_MIME_BODY_PART (data); - struct _print_part_user_data *ud = (struct _print_part_user_data *)user_data; - - if (ud->boundary) camel_stream_write_strings (ud->stream, "\n--", ud->boundary, "\n", NULL); - else camel_stream_write_strings (ud->stream, "\n--\n", NULL); - camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (body_part), ud->stream); - - -} - - - -static void -_write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream) -{ - CamelMultipart *multipart = CAMEL_MULTIPART (data_wrapper); - struct _print_part_user_data ud; - const gchar *boundary; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMultipart::_write_to_stream entering\n"); - boundary = camel_multipart_get_boundary (multipart); - CAMEL_LOG_FULL_DEBUG ("Entering CamelMultipart::_write_to_stream, boundary = %s\n", boundary); - g_return_if_fail (boundary); - ud.boundary = boundary; - ud.stream = stream; - if (multipart->preface) camel_stream_write_strings (stream, multipart->preface, NULL); - g_list_foreach (multipart->parts, _print_part, (gpointer)&ud); - camel_stream_write_strings (stream, "\n--", boundary, "--\n", NULL); - if (multipart->postface) camel_stream_write_strings (stream, multipart->postface, NULL); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMultipart::_write_to_stream leaving \n"); -} - - - - -/** - * _read_part: read one part in a multipart environement. - * @new_part_stream: stream to add the part to - * @stream: the stream to read the lines from. - * @normal_boundary: end of part bundary. - * @end_boundary: end of multipart boundary. - * - * This routine is a bit special: RFC 2046 says that, in a multipart - * environment, the last crlf before a boundary belongs to the boundary. - * Thus, if there is no blank line before the boundary, the last crlf - * of the last line of the part is removed. - * - * Return value: true if the last boundary element has been found or if no more data was available from the stream, flase otherwise - **/ - -static gboolean -_read_part (CamelStream *new_part_stream, CamelStream *stream, gchar *normal_boundary, gchar *end_boundary) -{ - gchar *new_line = NULL; - gboolean end_of_part = FALSE; - gboolean last_part = FALSE; - gboolean first_line = TRUE; - - /* Note for future enhancements */ - /* RFC 2046 precises that when parsing the content of a multipart - * element, the program should not think it will find the last boundary, - * and in particular, the message could have been damaged during - * transport, the parsing should still be OK */ - CAMEL_LOG_FULL_DEBUG ("CamelMultipart:: Entering _read_part\n"); - - new_line = gmime_read_line_from_stream (stream); - while (new_line && !end_of_part && !last_part) { - end_of_part = (strcmp (new_line, normal_boundary) == 0); - last_part = (strcmp (new_line, end_boundary) == 0); - if (!end_of_part && !last_part) { - if (first_line) { - first_line = FALSE; - camel_stream_write_string (new_part_stream, new_line); - } else camel_stream_write_strings (new_part_stream, "\n", new_line, NULL); - g_free (new_line); - new_line = gmime_read_line_from_stream (stream); - } - } - if (new_line) g_free (new_line); - - CAMEL_LOG_FULL_DEBUG ("CamelMultipart:: Leaving _read_part\n"); - return (last_part || (new_line == NULL)); -} - -static void -_construct_from_stream (CamelDataWrapper *data_wrapper, CamelStream *stream) -{ - CamelMultipart *multipart = CAMEL_MULTIPART (data_wrapper); - const gchar *boundary; - gchar *real_boundary_line; - gchar *end_boundary_line; - CamelStream *new_part_stream; - gboolean end_of_multipart; - CamelMimeBodyPart *body_part; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMultipart::_construct_from_stream\n"); - boundary = camel_multipart_get_boundary (multipart); - g_return_if_fail (boundary); - - real_boundary_line = g_strdup_printf ("--%s", boundary); - end_boundary_line = g_strdup_printf ("--%s--", boundary); - - - /* read the prefix if any */ - new_part_stream = camel_stream_mem_new (CAMEL_STREAM_MEM_RW); - end_of_multipart = _read_part (new_part_stream, stream, real_boundary_line, end_boundary_line); - CAMEL_LOG_FULL_DEBUG ("CamelMultipart::construct_from_stream freeing new_part_stream:%p\n", new_part_stream); - gtk_object_unref (GTK_OBJECT (new_part_stream)); - if (multipart->preface) g_free (multipart->preface); - - /* if ( (new_part->str)[0] != '\0') multipart->preface = g_strdup (new_part->str); */ - - /* read all the real parts */ - while (!end_of_multipart) { - CAMEL_LOG_FULL_DEBUG ("CamelMultipart::construct_from_stream, detected a new part\n"); - new_part_stream = camel_stream_mem_new (CAMEL_STREAM_MEM_RW); - body_part = camel_mime_body_part_new (); - - end_of_multipart = _read_part ( new_part_stream, stream, real_boundary_line, end_boundary_line); - camel_stream_seek (new_part_stream, 0, CAMEL_STREAM_SET); - camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (body_part), new_part_stream); - camel_multipart_add_part (multipart, body_part); - gtk_object_destroy (GTK_OBJECT (new_part_stream)); - - } - - /* g_string_assign (new_part, ""); */ - /* _read_part (new_part, stream, real_boundary_line, end_boundary_line); */ - - if (multipart->postface) g_free (multipart->postface); - /* if ( (new_part->str)[0] != '\0') multipart->postface = g_strdup (new_part->str); */ - - /* g_string_free (new_part, TRUE); */ - - g_free (real_boundary_line); - g_free (end_boundary_line); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMultipart::_construct_from_stream\n"); -} diff --git a/camel/camel-multipart.h b/camel/camel-multipart.h deleted file mode 100644 index 905bc82927..0000000000 --- a/camel/camel-multipart.h +++ /dev/null @@ -1,108 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-multipart.h : class for a multipart */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_MULTIPART_H -#define CAMEL_MULTIPART_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -typedef struct _CamelMultipart CamelMultipart; - -#include <gtk/gtk.h> -#include "camel-mime-part.h" -#include "camel-mime-body-part.h" - - -#define CAMEL_MULTIPART_TYPE (camel_multipart_get_type ()) -#define CAMEL_MULTIPART(obj) (GTK_CHECK_CAST((obj), CAMEL_MULTIPART_TYPE, CamelMultipart)) -#define CAMEL_MULTIPART_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_MULTIPART_TYPE, CamelMultipartClass)) -#define CAMEL_IS_MULTIPART(o) (GTK_CHECK_TYPE((o), CAMEL_MULTIPART_TYPE)) - - -struct _CamelMultipart -{ - CamelDataWrapper parent_object; - - CamelMimePart *parent; - GList *parts; - gchar *boundary; - gchar *preface; - gchar *postface; - -}; - - - -typedef struct { - CamelDataWrapperClass parent_class; - - /* Virtual methods */ - void (*add_part) (CamelMultipart *multipart, CamelMimeBodyPart *part); - void (*add_part_at) (CamelMultipart *multipart, CamelMimeBodyPart *part, guint index); - void (*remove_part) (CamelMultipart *multipart, CamelMimeBodyPart *part); - CamelMimeBodyPart * (*remove_part_at) (CamelMultipart *multipart, guint index); - CamelMimeBodyPart * (*get_part) (CamelMultipart *multipart, guint index); - guint (*get_number) (CamelMultipart *multipart); - void (*set_parent) (CamelMultipart *multipart, CamelMimePart *parent); - CamelMimePart * (*get_parent) (CamelMultipart *multipart); - void (*set_boundary) (CamelMultipart *multipart, gchar *boundary); - const gchar * (*get_boundary) (CamelMultipart *multipart); - -} CamelMultipartClass; - - -/* Standard Gtk function */ -GtkType camel_multipart_get_type (void); - - -/* public methods */ -CamelMultipart *camel_multipart_new (); -void camel_multipart_add_part (CamelMultipart *multipart, CamelMimeBodyPart *part); -void camel_multipart_add_part_at (CamelMultipart *multipart, CamelMimeBodyPart *part, guint index); -void camel_multipart_remove_part (CamelMultipart *multipart, CamelMimeBodyPart *part); -CamelMimeBodyPart *camel_multipart_remove_part_at (CamelMultipart *multipart, guint index); -CamelMimeBodyPart *camel_multipart_get_part (CamelMultipart *multipart, guint index); -guint camel_multipart_get_number (CamelMultipart *multipart); -void camel_multipart_set_parent (CamelMultipart *multipart, CamelMimePart *parent); -CamelMimePart *camel_multipart_get_parent (CamelMultipart *multipart); -void camel_multipart_set_boundary (CamelMultipart *multipart, gchar *boundary); -const gchar *camel_multipart_get_boundary (CamelMultipart *multipart); - - - - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MULTIPART_H */ - diff --git a/camel/camel-op-queue.c b/camel/camel-op-queue.c deleted file mode 100644 index dc9996ef38..0000000000 --- a/camel/camel-op-queue.c +++ /dev/null @@ -1,187 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 - */ - - -/* MT safe */ - - -#include <config.h> -#include "camel-log.h" -#include "camel-op-queue.h" - -static GStaticMutex op_queue_mutex = G_STATIC_MUTEX_INIT; - - - -/** - * camel_op_queue_new: create a new operation queue - * - * Create a new operation queue. - * - * Return value: the newly allcated object - **/ -CamelOpQueue * -camel_op_queue_new () -{ - CamelOpQueue *op_queue; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelOpQueue::new\n"); - - op_queue = g_new (CamelOpQueue, 1); - op_queue->ops_tail = NULL; - op_queue->ops_head = NULL; - op_queue->service_available = TRUE; - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelOpQueue::new\n"); - return op_queue; -} - - -void -camel_op_queue_free (CamelOpQueue *op_queue) -{ - CAMEL_LOG_FULL_DEBUG ("Entering CamelOpQueue::free\n"); - g_list_free (op_queue->ops_head); - g_free (op_queue); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelOpQueue::free\n"); -} - -/** - * camel_op_queue_push_op: Add an operation to the queue - * @queue: queue object - * @op: operation to add - * - * Add an operation to an operation queue. - * The queue is a FIFO queue. - **/ -void -camel_op_queue_push_op (CamelOpQueue *queue, CamelOp *op) -{ - GList *new_op; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelOpQueue::push_op\n"); - g_assert (queue); - g_static_mutex_lock (&op_queue_mutex); - if (!queue->ops_tail) { - CAMEL_LOG_FULL_DEBUG ("CamelOpQueue::push_op queue does not exists yet. " - "Creating it\n"); - queue->ops_head = g_list_prepend (NULL, op); - queue->ops_tail = queue->ops_head; - } else - queue->ops_head = g_list_prepend (queue->ops_head, op); - g_static_mutex_unlock (&op_queue_mutex); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelOpQueue::push_op\n"); -} - - -/** - * camel_op_queue_pop_op: Pop the next operation pending in the queue - * @queue: queue object - * - * Pop the next operation pending in the queue. - * - * Return value: - **/ -CamelOp * -camel_op_queue_pop_op (CamelOpQueue *queue) -{ - GList *op_list; - CamelOp *op; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelOpQueue::pop_op\n"); - g_assert (queue); - - g_static_mutex_lock (&op_queue_mutex); - op_list = queue->ops_tail; - if (!op_list) return NULL; - - queue->ops_tail = queue->ops_tail->prev; - op = (CamelOp *)op_list->data; - g_static_mutex_unlock (&op_queue_mutex); - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelOpQueue::pop_op\n"); - return op; -} - - -/** - * camel_op_queue_run_next_op: run the next pending operation - * @queue: queue object - * - * Run the next pending operation in the queue. - * - * Return value: TRUE if an operation was launched FALSE if there was no operation pending in the queue. - **/ -gboolean -camel_op_queue_run_next_op (CamelOpQueue *queue) -{ - CamelOp *op; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelOpQueue::run_next_op\n"); - op = camel_op_queue_pop_op (queue); - if (!op) return FALSE; - - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelOpQueue::run_next_op\n"); - return FALSE; -} - -/** - * camel_op_queue_set_service_availability: set the service availability for an operation queue - * @queue: queue object - * @available: availability flag - * - * set the service availability - **/ -void -camel_op_queue_set_service_availability (CamelOpQueue *queue, gboolean available) -{ - CAMEL_LOG_FULL_DEBUG ("Entering CamelOpQueue::set_service_availability\n"); - g_static_mutex_lock (&op_queue_mutex); - queue->service_available = available; - g_static_mutex_unlock (&op_queue_mutex); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelOpQueue::set_service_availability\n"); -} - -/** - * camel_op_queue_get_service_availability: determine if an operation queue service is available - * @queue: queue object - * - * Determine if the service associated to an operation queue is available. - * - * Return value: service availability. - **/ -gboolean -camel_op_queue_get_service_availability (CamelOpQueue *queue) -{ - gboolean available; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelOpQueue::get_service_availability\n"); - g_static_mutex_lock (&op_queue_mutex); - available = queue->service_available; - g_static_mutex_unlock (&op_queue_mutex); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelOpQueue::get_service_availability\n"); - return available; -} - diff --git a/camel/camel-op-queue.h b/camel/camel-op-queue.h deleted file mode 100644 index 2bceceb4c8..0000000000 --- a/camel/camel-op-queue.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_OP_QUEUE_H -#define CAMEL_OP_QUEUE_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <glib.h> -#include "camel-marshal-utils.h" - - - -typedef struct -{ - GList *ops_head; - GList *ops_tail; - gboolean service_available; - -} CamelOpQueue; - - -/* public methods */ -CamelOpQueue *camel_op_queue_new (); -void camel_op_queue_free (CamelOpQueue *op_queue); -void camel_op_queue_push_op (CamelOpQueue *queue, CamelOp *op); -CamelOp *camel_op_queue_pop_op (CamelOpQueue *queue); -gboolean camel_op_queue_run_next_op (CamelOpQueue *queue); -gboolean camel_op_queue_get_service_availability (CamelOpQueue *queue); -void camel_op_queue_set_service_availability (CamelOpQueue *queue, gboolean available); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_OP_QUEUE_H */ - diff --git a/camel/camel-provider.c b/camel/camel-provider.c deleted file mode 100644 index 7328f4ca64..0000000000 --- a/camel/camel-provider.c +++ /dev/null @@ -1,186 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-provider.c : provider framework */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 - */ - - -/* - A provider can be added "by hand" or by loading a module. - - - Adding providers with modules. - ------------------------------ - - The modules are shared libraries which must contain the - function - - CamelProvider *camel_provider_module_init (); - - returning the provider object defined in the module - - -*/ - -/* FIXME: Shouldn't we add a version number to providers ? */ - -#include "config.h" -#include "camel-provider.h" -#include "camel-log.h" - - -static GList *_provider_list = NULL; -static gchar *_last_error; - -static gint -_provider_name_cmp (gconstpointer a, gconstpointer b) -{ - CamelProvider *provider_a = CAMEL_PROVIDER (a); - CamelProvider *provider_b = CAMEL_PROVIDER (b); - - return strcmp ( provider_a->name, provider_b->name); -} - -void -camel_provider_register (CamelProvider *provider) -{ - GList *old_provider_node = NULL; - - g_assert (provider); - - if (_provider_list) - old_provider_node = g_list_find_custom (_provider_list, provider, _provider_name_cmp); - - if (old_provider_node != NULL) { - /* camel_provider_unref (CAMEL_PROVIDER (old_provider_node->data)); */ - old_provider_node->data = provider; - } else { - /* be careful, we use prepend here, so that last registered - providers come first */ - _provider_list = g_list_prepend (_provider_list, provider); - } - /* camel_provider_ref (provider); */ -} - - -const CamelProvider * -camel_provider_register_as_module (const gchar *module_path) -{ - - CamelProvider *new_provider = NULL; - GModule *new_module = NULL; - CamelProvider * (*camel_provider_module_init) (); - gboolean has_module_init; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelProvider::register_as_module\n"); - - g_return_val_if_fail (module_path, NULL); - - if (!g_module_supported ()) { - CAMEL_LOG_WARNING ("CamelProvider::register_as_module module loading not supported on this system\n"); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelProvider::register_as_module\n"); - return NULL; - } - - - new_module = g_module_open (module_path, 0); - if (!new_module) { - CAMEL_LOG_WARNING ("CamelProvider::register_as_module Unable to load module %s\n", module_path); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelProvider::register_as_module\n"); - return NULL; - } - - has_module_init = g_module_symbol (new_module, "camel_provider_module_init", (gpointer *)&camel_provider_module_init); - if (!has_module_init){ - CAMEL_LOG_WARNING ("CamelProvider::register_as_module loading of module %s failed,\n" - "\t Symbol camel_provider_module_init not defined in it\n", module_path); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelProvider::register_as_module\n"); - return NULL; - } - - new_provider = camel_provider_module_init(); - new_provider->gmodule = new_module; - camel_provider_register (new_provider); - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelProvider::register_as_module\n"); - return new_provider; - - -} - - - - -/* - be careful to this function, @a is expected to be - a provider, @b a protocol name (const gchar *) -*/ -static gint -_provider_protocol_find (gconstpointer a, gconstpointer b) -{ - CamelProvider *provider_a = CAMEL_PROVIDER (a); - const gchar *name_b = (const gchar *)b; - - return g_strcasecmp ( provider_a->name, name_b); -} - -/** - * camel_provider_get_for_protocol: get a registered provider for a protocol - * @protocol: protocol name (case insensitive) - * @type: provider type (transport, store, ...) - * - * Look into the list of registered provider if - * one correspond both to the protocol name - * and to the protocol type. When several providers - * exist for a same protocol, the last registered - * is returned. - * - * Return value: Matching provider or NULL if none exists. - **/ -const CamelProvider * -camel_provider_get_for_protocol (const gchar *protocol, ProviderType type) -{ - CamelProvider *current_provider = NULL; - GList *current_provider_node; - gboolean protocol_is_found; - gboolean provider_is_found; - - g_assert (protocol); - g_return_val_if_fail (_provider_list, NULL); - - current_provider_node = _provider_list; - provider_is_found = FALSE; - - while ((!provider_is_found) && current_provider_node) { - current_provider = (CamelProvider *)current_provider_node->data; - - protocol_is_found = (g_strcasecmp (protocol, current_provider->protocol) == 0); - if (protocol_is_found) - provider_is_found = (current_provider->provider_type == type); - - current_provider_node = current_provider_node->next; - } - - if (provider_is_found) return current_provider; - else return NULL; -} diff --git a/camel/camel-provider.h b/camel/camel-provider.h deleted file mode 100644 index 95df289c3b..0000000000 --- a/camel/camel-provider.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-provider.h : provider definition */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_PROVIDER_H -#define CAMEL_PROVIDER_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include <gmodule.h> - -#define CAMEL_PROVIDER(obj) (CamelProvider *)(obj) - -typedef enum { - PROVIDER_STORE, - PROVIDER_TRANSPORT -} ProviderType; - - -typedef struct { - GtkType object_type; /* used to create instance of the provider */ - ProviderType provider_type; /* is a store or a transport */ - gchar *protocol; /* name of the protocol ("imap"/"smtp"/"mh" ...) */ - gchar *name; /* name of the provider ("Raymond the imap provider") */ - gchar *description; /* Useful when multiple providers are available for a same protocol */ - - GModule *gmodule; -} CamelProvider; - -void camel_provider_register (CamelProvider *provider); -const CamelProvider *camel_provider_register_as_module (const gchar *module_path); -const CamelProvider *camel_provider_get_for_protocol (const gchar *protocol, ProviderType type); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_PROVIDER_H */ diff --git a/camel/camel-recipient.c b/camel/camel-recipient.c deleted file mode 100644 index 3a301f201e..0000000000 --- a/camel/camel-recipient.c +++ /dev/null @@ -1,281 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-recipient.h : handle recipients (addresses) and recipiemt lists */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 "glib.h" -#include "hash-table-utils.h" -#include "camel-recipient.h" - - -/** - * camel_recipient_table_new: Create a new recipient table object - * - * - * creates a new recipient table object. A recipient table - * objects merely associates a recipient list (GList) to - * recipient types (as for example "To", "Cc" for mime - * maile messages - * - * Return value: the newly created recipient table object - **/ -CamelRecipientTable * -camel_recipient_table_new () -{ - CamelRecipientTable *recipient_table; - - recipient_table = g_new0 (CamelRecipientTable, 1); - recipient_table->recipient_hash_table = g_hash_table_new (g_strcase_hash, g_strcase_equal); - recipient_table->ref_count = 1; - return recipient_table; -} - - -/** - * camel_recipient_table_ref: add a reference to a recipient table object - * @recipient_table: the recipient table object - * - * Add a reference to a recipient table object. - **/ -void -camel_recipient_table_ref (CamelRecipientTable *recipient_table) -{ - g_return_if_fail (recipient_table); - recipient_table->ref_count += 1; -} - - - -static void -_free_recipient_list (gpointer key, gpointer value, gpointer user_data) -{ - GList *recipient_list = (GList *)value; - gchar *recipient_name = (gchar *)key; - - while (recipient_list) { - g_free (recipient_list->data); - recipient_list = recipient_list->next; - } - - g_free (recipient_name); - -} - -/** - * camel_recipient_table_free: Free a recipient table object - * @recipient_table: the recipient table object to free - * - * Free a recipient table object. All recipients and recipient - * are freed. - **/ -void -camel_recipient_table_free (CamelRecipientTable *recipient_table) -{ - if (!recipient_table) return; - - /* free each recipient list */ - g_hash_table_foreach (recipient_table->recipient_hash_table, _free_recipient_list, NULL); - g_hash_table_destroy (recipient_table->recipient_hash_table); -} - - - - -/** - * camel_recipient_table_unref: Removes a reference to a recipient table object - * @recipient_table: the recipient table object - * - * Removes a reference to the reference count of a recipient - * table object. If the reference count falls to zero, the - * recipient table object is freed. - * - **/ -void -camel_recipient_table_unref (CamelRecipientTable *recipient_table) -{ - if (!recipient_table) return; - - recipient_table->ref_count -= 1; - if (recipient_table->ref_count <1) - camel_recipient_table_free (recipient_table); - -} - - - - -/** - * camel_recipient_table_add: Add a recipient to a recipient table object. - * @recipient_table: The recipient table object - * @recipient_type: Recipient type string - * @recipient: The recipient to add - * - * Add a recipient to a recipient table object. - * The recipient is appended to the list of recipients - * of type @recipient_type. @recipient and @recipient_type - * are duplicated if necessary and freed when - * camel_recipient_table_free is called. - **/ -void -camel_recipient_table_add (CamelRecipientTable *recipient_table, - const gchar *recipient_type, - const gchar *recipient) -{ - GList *recipients_list; - GList *existent_list; - - /* see if there is already a list for this recipient type */ - existent_list = (GList *)g_hash_table_lookup (recipient_table->recipient_hash_table, recipient_type); - - - /* append the new recipient to the recipient list - if the existent_list is NULL, then a new GList is - automagically created */ - recipients_list = g_list_append (existent_list, (gpointer)g_strdup (recipient)); - - if (!existent_list) /* if there was no recipient of this type create the section */ - g_hash_table_insert (recipient_table->recipient_hash_table, g_strdup (recipient_type), recipients_list); - - -} - - -/** - * camel_recipient_table_add_list: Add a full list of recipients to a recipient table. - * @recipient_table: The recipient table object - * @recipient_type: Recipient type string. - * @recipient_list: Recipient list to add. - * - * Add a full list of recipients to a recipient table. - * The new recipients are appended at the end of the - * existing recipient list corresponding to @recipient_type. - * Be careful, the list is used as is, and its element - * will be freed by camel_recipient_table_unref - **/ -void -camel_recipient_table_add_list (CamelRecipientTable *recipient_table, - const gchar *recipient_type, - GList *recipient_list) -{ - GList *recipients_list; - GList *existent_list; - - /* see if there is already a list for this recipient type */ - existent_list = (GList *)g_hash_table_lookup (recipient_table->recipient_hash_table, recipient_type); - - - if (existent_list) - g_list_concat (existent_list, recipient_list); - else - g_hash_table_insert (recipient_table->recipient_hash_table, g_strdup (recipient_type), recipients_list); -} - - - - -/** - * camel_recipient_table_remove: Remove a recipient from a recipient table. - * @recipient_table: The recipient table object - * @recipient_type: Recipient type string. - * @recipient: Recipient to remove from the table - * - * Remove a recipient from a recipient table. The recipient is - * only removed from the recipient list corresponding to - * @recipient_type. The removed recipient is freed. - * - **/ -void -camel_recipient_table_remove (CamelRecipientTable *recipient_table, - const gchar *recipient_type, - const gchar *recipient) -{ - GList *recipients_list; - GList *new_recipients_list; - GList *old_element; - gchar *old_recipient_type; - - /* if the recipient type section does not exist, do nothing */ - if (! g_hash_table_lookup_extended (recipient_table->recipient_hash_table, - recipient_type, - (gpointer)&(old_recipient_type), - (gpointer)&(recipients_list)) - ) return; - - /* look for the recipient to remove */ - /* g_list_find_custom , use gpointer instead of gconstpointer */ - old_element = g_list_find_custom (recipients_list, (gpointer)recipient, g_strcase_equal); - if (old_element) { - /* if recipient exists, remove it */ - new_recipients_list = g_list_remove_link (recipients_list, old_element); - - /* if glist head has changed, fix up hash table */ - if (new_recipients_list != recipients_list) - g_hash_table_insert (recipient_table->recipient_hash_table, old_recipient_type, new_recipients_list); - - g_free( (gchar *)(old_element->data)); - g_list_free_1 (old_element); - } -} - - - -/** - * camel_recipient_table_get: Get the recipients corresponding to a recipient type. - * @recipient_table: The recipient table object - * @recipient_type: Recipient type string. - * - * Return the list of recipients corresponding to - * @recipient_type. The returned list is not a copy - * of the internal list used by the recipient table object - * but the list itself. It thus must not be freed. - * The recipients it contains can be modified. - * - * Return value: The list of recipients. - **/ -const GList * -camel_recipient_table_get (CamelRecipientTable *recipient_table, - const gchar *recipient_type) -{ - return (const GList *)g_hash_table_lookup (recipient_table->recipient_hash_table, recipient_type); -} - - - - -/** - * camel_recipient_foreach_recipient_type: Runs a function over over all recipients type lists. - * @recipient_table: The recipient table object. - * @func: The function to run. - * @user_data: User data to pass to the function. - * - * Runs a function over over all recipients type lists. - **/ -void -camel_recipient_foreach_recipient_type (CamelRecipientTable *recipient_table, - CRLFunc func, - gpointer user_data) -{ - g_hash_table_foreach (recipient_table->recipient_hash_table, (GHFunc)func, user_data); -} diff --git a/camel/camel-recipient.h b/camel/camel-recipient.h deleted file mode 100644 index e59171add8..0000000000 --- a/camel/camel-recipient.h +++ /dev/null @@ -1,87 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-recipient.h : handle recipients (addresses) and recipiemt lists */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_RECIPIENT_H -#define CAMEL_RECIPIENT_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <glib.h> - - - -typedef struct { - GHashTable *recipient_hash_table; - gint ref_count; - -} CamelRecipientTable; - - -typedef void (*CRLFunc) (gchar *recipient_type, - GList *recipient_list, - gpointer user_data); - - - - -CamelRecipientTable *camel_recipient_table_new (); - -void camel_recipient_table_ref (CamelRecipientTable *recipient_table); - -void camel_recipient_table_unref (CamelRecipientTable *recipient_table); - -void camel_recipient_table_add (CamelRecipientTable *recipient_table, - const gchar *recipient_type, - const gchar *recipient); - -void camel_recipient_table_add_list (CamelRecipientTable *recipient_table, - const gchar *recipient_type, - GList *recipient_list); - -void camel_recipient_table_remove (CamelRecipientTable *recipient_table, - const gchar *recipient_type, - const gchar *recipient); - -const GList *camel_recipient_table_get (CamelRecipientTable *recipient_table, - const gchar *recipient_type); - -void camel_recipient_foreach_recipient_type (CamelRecipientTable *recipient_table, - CRLFunc func, - gpointer user_data); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_RECIPIENT_H */ - diff --git a/camel/camel-service.c b/camel/camel-service.c deleted file mode 100644 index bf7af23ed2..0000000000 --- a/camel/camel-service.c +++ /dev/null @@ -1,297 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camelService.c : Abstract class for an email service */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel-service.h" -#include "camel-log.h" - -static GtkObjectClass *parent_class=NULL; - -/* Returns the class for a CamelService */ -#define CSERV_CLASS(so) CAMEL_SERVICE_CLASS (GTK_OBJECT(so)->klass) - -static void _connect(CamelService *service); -static void _connect_to_with_login_passwd (CamelService *service, gchar *host, gchar *login, gchar *passwd); -static void _connect_to_with_login_passwd_port (CamelService *service, gchar *host, gchar *login, gchar *passwd, guint port); -static gboolean _is_connected (CamelService *service); -static void _set_connected (CamelService *service, gboolean state); -static const gchar *_get_url (CamelService *service); -static void _finalize (GtkObject *object); - -static void -camel_service_class_init (CamelServiceClass *camel_service_class) -{ - GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_service_class); - - parent_class = gtk_type_class (gtk_object_get_type ()); - - /* virtual method definition */ - camel_service_class->connect = _connect; - camel_service_class->connect_to_with_login_passwd = _connect_to_with_login_passwd; - camel_service_class->connect_to_with_login_passwd_port = _connect_to_with_login_passwd_port; - camel_service_class->is_connected = _is_connected; - camel_service_class->set_connected = _set_connected; - camel_service_class->get_url = _get_url; - - /* virtual method overload */ - gtk_object_class->finalize = _finalize; -} - - - - - - - -GtkType -camel_service_get_type (void) -{ - static GtkType camel_service_type = 0; - - if (!camel_service_type) { - GtkTypeInfo camel_service_info = - { - "CamelService", - sizeof (CamelService), - sizeof (CamelServiceClass), - (GtkClassInitFunc) camel_service_class_init, - (GtkObjectInitFunc) NULL, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_service_type = gtk_type_unique (gtk_object_get_type (), &camel_service_info); - } - - return camel_service_type; -} - - -static void -_finalize (GtkObject *object) -{ - CamelService *camel_service = CAMEL_SERVICE (object); - - CAMEL_LOG_FULL_DEBUG ("Entering CamelService::finalize\n"); - - g_free (camel_service->url); - - GTK_OBJECT_CLASS (parent_class)->finalize (object); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelService::finalize\n"); -} - - - -/** - * _connect : connect to a service - * - * connect to the service using the parameters - * stored in the session it is initialized with - * WARNING: session not implemented for the moment - * - * @service: object to connect - **/ -static void -_connect (CamelService *service) -{ - CSERV_CLASS(service)->set_connected(service, TRUE); -} - - - -/** - * camel_service_connect:connect to a service - * @service: CamelService object - * - * connect to the service using the parameters - * stored in the session it is initialized with - * WARNING: session not implemented for the moment - * - **/ -void -camel_service_connect (CamelService *service) -{ - CSERV_CLASS(service)->connect(service); -} - - - -/** - * _connect_to: connect to the specified address - * - * Connect to the service, but do not use the session - * default parameters to retrieve server's address - * - * @service: object to connect - * @host: host to connect to - * @login: user name used to log in - * @passwd: password used to log in - **/ -static void -_connect_to_with_login_passwd (CamelService *service, gchar *host, gchar *login, gchar *passwd) -{ - CSERV_CLASS(service)->set_connected(service, TRUE); -} - -/** - * camel_service_connect_to_with_login_passwd: connect a service - * @service: the service to connect - * @host: host to connect to - * @login: login to connect with - * @passwd: password to connect with - * - * Connect to a service, but do not use the session - * default parameters to retrieve server's address - * - **/ -void -camel_service_connect_to_with_login_passwd (CamelService *service, gchar *host, gchar *login, gchar *passwd) -{ - CSERV_CLASS(service)->connect_to_with_login_passwd (service, host, login, passwd); -} - - - - -/** - * _connect_to_with_login_passwd_port: connect to the specified address - * @service: service to connect - * @host: host to connect to - * @login: user name used to log in - * @passwd: password used to log in - * @port: port to connect to - * - * - **/ -static void -_connect_to_with_login_passwd_port (CamelService *service, gchar *host, gchar *login, gchar *passwd, guint port) -{ - CSERV_CLASS(service)->set_connected(service, TRUE); -} - - -/** - * camel_service_connect_to_with_login_passwd_port: connect a service - * @service: service to connect - * @host: host to connect to - * @login: user name used to log in - * @passwd: password used to log in - * @port: port to connect to - * - * Connect to a service, but do not use the session - * default parameters to retrieve server's address - * - **/ -void -camel_service_connect_to_with_login_passwd_port (CamelService *service, gchar *host, gchar *login, gchar *passwd, guint port) -{ - CSERV_CLASS(service)->connect_to_with_login_passwd_port (service, host, login, passwd, port); -} - - - - -/** - * _is_connected: test if the service object is connected - * @service: object to test - * - * - * - * Return value: - **/ -static gboolean -_is_connected (CamelService *service) -{ - return service->connected; -} - - -/** - * camel_service_is_connected: test if the service object is connected - * @service: object to test - * - * - * - * Return value: - **/ -gboolean -camel_service_is_connected (CamelService *service) -{ - return CSERV_CLASS(service)->is_connected(service); -} - - - -/** - * _set_connected:set the connected state - * @service: object to set the state of - * @state: connected/disconnected - * - * This routine has to be called by providers to set the - * connection state, mainly when the service is disconnected - * wheras the close() method has not been called. - * - **/ -static void -_set_connected (CamelService *service, gboolean state) -{ - service->connected = state; -} - - - -/** - * _get_url: get url representing a service - * @service: the service - * - * This method merely returns the "url" field. Subclasses - * may provide more active implementations. - * - * - * Return value: - **/ -static const gchar * -_get_url (CamelService *service) -{ - return service->url; -} - -/** - * camel_service_get_url: get the url representing a service - * @service: the service - * - * returns the URL representing a service. For security reasons - * This routine may not always return the password. - * - * Return value: the url name - **/ -const gchar * -camel_service_get_url (CamelService *service) -{ - return CSERV_CLASS(service)->get_url(service); -} - - diff --git a/camel/camel-service.h b/camel/camel-service.h deleted file mode 100644 index ae960e22b8..0000000000 --- a/camel/camel-service.h +++ /dev/null @@ -1,85 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-service.h : Abstract class for an email service */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_SERVICE_H -#define CAMEL_SERVICE_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> - -#define CAMEL_SERVICE_TYPE (camel_service_get_type ()) -#define CAMEL_SERVICE(obj) (GTK_CHECK_CAST((obj), CAMEL_SERVICE_TYPE, CamelService)) -#define CAMEL_SERVICE_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_SERVICE_TYPE, CamelServiceClass)) -#define CAMEL_IS_SERVICE(o) (GTK_CHECK_TYPE((o), CAMEL_SERVICE_TYPE)) - - - -typedef struct { - GtkObject parent_object; - - gboolean connected; - gchar *url; /* This may be a full object ? */ - -} CamelService; - - - -typedef struct { - GtkObjectClass parent_class; - - void (*connect) (CamelService *service); - void (*connect_to_with_login_passwd) (CamelService *service, gchar *host, gchar *login, gchar *passwd); - void (*connect_to_with_login_passwd_port) (CamelService *service, gchar *host, gchar *login, gchar *passwd, guint port); - gboolean (*is_connected) (CamelService *service); - void (*set_connected) (CamelService *service, gboolean state); - const gchar * (*get_url) (CamelService *service); - -} CamelServiceClass; - - - - -/* public methods */ -void camel_service_connect (CamelService *service); -gboolean camel_service_is_connected (CamelService *service); -void camel_service_connect_to_with_login_passwd (CamelService *service, gchar *host, gchar *login, gchar *passwd); -void camel_service_connect_to_with_login_passwd_port (CamelService *service, gchar *host, gchar *login, gchar *passwd, guint port); -const gchar *camel_service_get_url (CamelService *service); -/* Standard Gtk function */ -GtkType camel_service_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_SERVICE_H */ - diff --git a/camel/camel-session.c b/camel/camel-session.c deleted file mode 100644 index ff065b8c74..0000000000 --- a/camel/camel-session.c +++ /dev/null @@ -1,217 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-session.c : Abstract class for an email session */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel-session.h" -#include "string-utils.h" -#include "url-util.h" -#include "camel-provider.h" -#include "hash-table-utils.h" - -static GtkObjectClass *parent_class=NULL; - -/* Returns the class for a CamelSession */ -#define CSS_CLASS(so) CAMEL_SESSION_CLASS (GTK_OBJECT(so)->klass) - - -static void -camel_session_class_init (CamelSessionClass *camel_session_class) -{ - parent_class = gtk_type_class (gtk_object_get_type ()); - - /* virtual method definition */ - /* virtual method overload */ -} - - - - - -static void -camel_session_init (CamelSession *session) -{ - session->store_provider_list = g_hash_table_new (g_strcase_hash, g_strcase_equal); - session->transport_provider_list = g_hash_table_new (g_strcase_hash, g_strcase_equal); -} - - - -GtkType -camel_session_get_type (void) -{ - static GtkType camel_session_type = 0; - - if (!camel_session_type) { - GtkTypeInfo camel_session_info = - { - "CamelSession", - sizeof (CamelSession), - sizeof (CamelSessionClass), - (GtkClassInitFunc) camel_session_class_init, - (GtkObjectInitFunc) camel_session_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_session_type = gtk_type_unique (gtk_object_get_type (), &camel_session_info); - } - - return camel_session_type; -} - - -CamelSession * -camel_session_new () -{ - return gtk_type_new (CAMEL_SESSION_TYPE); -} - -/** - * camel_session_set_provider: set the default provider for a protocol - * @session: session object for wich the provider will the default - * @provider: provider object - * - * Set the default implementation for a protocol. The protocol - * is determined by provider->protocol field (See CamelProtocol). - * It overrides the default provider for this protocol. - * - **/ -void -camel_session_set_provider (CamelSession *session, CamelProvider *provider) -{ - GHashTable *table; - - g_assert(session); - g_assert(provider); - - if (provider->provider_type == PROVIDER_STORE) - table = session->store_provider_list; - else - table = session->transport_provider_list; - - g_hash_table_insert (table, (gpointer)(provider->protocol), (gpointer)(provider)); - -} - - - - - -/** - * camel_session_get_store_from_provider: create a folder instance for a given provider - * @session: session object the folder will be initialized with - * @provider: provider folder to instantiate - * - * - * - * Return value: the newly instantiated store - **/ -CamelStore * -camel_session_get_store_from_provider (CamelSession *session, CamelProvider *provider) -{ - CamelStore *store; - - g_assert(session); - g_assert(provider); - - store = CAMEL_STORE (gtk_object_new (provider->object_type, NULL)); -#warning set the url to a useful value. - camel_store_init(store, session, NULL); - return store; -} - - - - -/** - * camel_session_get_store_for_protocol: get the store associated to a protocol - * @session: CamelSession object - * @protocol: protocol name - * - * Return a CamelStore object associated to a given - * store protocol. If a provider has been set for this - * protocol in the session @session using - * camel_session_set_provider (), then a store - * obtained from this provider is return. - * Otherwise, if one or more provider corresponding - * to this protocol has been registered (See - * camel_provider_register_as_module), the last registered - * one is used. - * - * Return value: store associated to this protocol or NULL if no provider was found. - **/ -CamelStore * -camel_session_get_store_for_protocol (CamelSession *session, const gchar *protocol) -{ - const CamelProvider *provider = NULL; - CamelStore *new_store; - - /* look if there is a provider assiciated to this - protocol in this session */ - provider = CAMEL_PROVIDER (g_hash_table_lookup (session->store_provider_list, protocol)); - if (!provider) - /* no provider was found in this session, look - if there is a registered provider for this - protocol */ - provider = camel_provider_get_for_protocol (protocol, PROVIDER_STORE); - - if (!provider) return NULL; - - new_store = (CamelStore *)gtk_type_new (provider->object_type); - return new_store; -} - - - - -/** - * camel_session_get_store: get a store object for an URL - * @session: session object - * @url_string: url - * - * return a store corresponding to an URL. - * - * Return value: the store, or NULL if no provider correponds to the protocol - **/ -CamelStore * -camel_session_get_store (CamelSession *session, const gchar *url_string) -{ - Gurl *url = NULL; - CamelStore *new_store = NULL; - - url = g_url_new (url_string); - g_return_val_if_fail (url, NULL); - - if (url->protocol) { - new_store = camel_session_get_store_for_protocol (session, url->protocol); - if (new_store) - camel_store_init (new_store, session, url_string); - } - g_url_free (url); - - return new_store; - -} diff --git a/camel/camel-session.h b/camel/camel-session.h deleted file mode 100644 index bd7af5dc38..0000000000 --- a/camel/camel-session.h +++ /dev/null @@ -1,87 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-session.h : Abstract class for an email session */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_SESSION_H -#define CAMEL_SESSION_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> - -typedef struct _CamelSession CamelSession; - -#include "camel-provider.h" -#include "camel-store.h" - -#define CAMEL_SESSION_TYPE (camel_session_get_type ()) -#define CAMEL_SESSION(obj) (GTK_CHECK_CAST((obj), CAMEL_SESSION_TYPE, CamelSession)) -#define CAMEL_SESSION_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_SESSION_TYPE, CamelSessionClass)) -#define CAMEL_IS_SESSION(o) (GTK_CHECK_TYPE((o), CAMEL_SESSION_TYPE)) - - - - -struct _CamelSession -{ - GtkObject parent_object; - GHashTable *store_provider_list; /* providers are identified by their protocol */ - GHashTable *transport_provider_list; - - -}; - - - -typedef struct { - GtkObjectClass parent_class; - - /* Virtual methods */ - -} CamelSessionClass; - - -/* public methods */ - -/* Standard Gtk function */ -GtkType camel_session_get_type (void); - - -CamelSession *camel_session_new (); -void camel_session_set_provider (CamelSession *session, CamelProvider *provider); -CamelStore *camel_session_get_store_for_protocol (CamelSession *session, const gchar *protocol); -CamelStore *camel_session_get_store (CamelSession *session, const gchar *url_string); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_SESSION_H */ diff --git a/camel/camel-simple-data-wrapper-stream.c b/camel/camel-simple-data-wrapper-stream.c deleted file mode 100644 index 2b5704b31e..0000000000 --- a/camel/camel-simple-data-wrapper-stream.c +++ /dev/null @@ -1,276 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* camel-simple-data-wrapper-stream.c - * - * 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. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "camel-simple-data-wrapper-stream.h" - - -static CamelStreamClass *parent_class = NULL; - - -/* CamelStream methods. */ - -static gint -read (CamelStream *stream, - gchar *buffer, - gint n) -{ - CamelSimpleDataWrapperStream *wrapper_stream; - CamelSimpleDataWrapper *wrapper; - GByteArray *array; - gint len; - - wrapper_stream = CAMEL_SIMPLE_DATA_WRAPPER_STREAM (stream); - wrapper = wrapper_stream->wrapper; - g_return_val_if_fail (wrapper != NULL, -1); - array = wrapper->byte_array; - - len = MIN (n, array->len - wrapper_stream->current_position); - if (len > 0) { - memcpy (buffer, array->data, len); - wrapper_stream->current_position += len; - return len; - } else { - return 0; - } -} - -static gint -write (CamelStream *stream, - const gchar *buffer, - gint n) -{ - CamelSimpleDataWrapperStream *wrapper_stream; - CamelSimpleDataWrapper *wrapper; - GByteArray *array; - gint len; - const gchar *buffer_next; - gint left; - - wrapper_stream = CAMEL_SIMPLE_DATA_WRAPPER_STREAM (stream); - wrapper = wrapper_stream->wrapper; - g_return_val_if_fail (wrapper != NULL, -1); - array = wrapper->byte_array; - - len = MIN (n, array->len - wrapper_stream->current_position); - if (len > 0) { - memcpy (array->data, buffer, len); - buffer_next = buffer + len; - left = n - len; - } else { - /* If we are past the end of the array, fill with zeros. */ - if (wrapper_stream->current_position > array->len) { - gint saved_length; - - saved_length = array->len; - g_byte_array_set_size - (array, wrapper_stream->current_position); - memset (array->data + saved_length, - 0, - (wrapper_stream->current_position - - saved_length)); - } - - buffer_next = buffer; - left = n; - } - - if (n > 0) - g_byte_array_append (array, buffer_next, left); - - wrapper_stream->current_position += n; - return n; -} - -static void -flush (CamelStream *stream) -{ - /* No op, as we don't do any buffering. */ -} - -static gint -available (CamelStream *stream) -{ - CamelSimpleDataWrapperStream *wrapper_stream; - CamelSimpleDataWrapper *wrapper; - GByteArray *array; - gint available; - - wrapper_stream = CAMEL_SIMPLE_DATA_WRAPPER_STREAM (stream); - wrapper = wrapper_stream->wrapper; - g_return_val_if_fail (wrapper != NULL, -1); - array = wrapper->byte_array; - - available = array->len - wrapper_stream->current_position; - return MAX (available, 0); -} - -static gboolean -eos (CamelStream *stream) -{ - if (available (stream) > 0) - return TRUE; - else - return FALSE; -} - -static void -close (CamelStream *stream) -{ - /* Nothing to do, we have no associated file descriptor. */ -} - -static gint -seek (CamelStream *stream, - gint offset, - CamelStreamSeekPolicy policy) -{ - CamelSimpleDataWrapperStream *wrapper_stream; - gint new_position; - - wrapper_stream = CAMEL_SIMPLE_DATA_WRAPPER_STREAM (stream); - - switch (policy) { - case CAMEL_STREAM_SET: - new_position = offset; - break; - case CAMEL_STREAM_CUR: - new_position = wrapper_stream->current_position + offset; - break; - case CAMEL_STREAM_END: - new_position = wrapper_stream->wrapper->byte_array->len; - break; - default: - g_warning ("Unknown CamelStreamSeekPolicy %d.", policy); - return -1; - } - - wrapper_stream->current_position = new_position; - return new_position; -} - - -/* This handles destruction of the associated CamelDataWrapper. */ -/* Hm, this should never happen though, because we gtk_object_ref() the - wrapper. */ -static void -wrapper_destroy_cb (GtkObject *object, - gpointer data) -{ - CamelSimpleDataWrapperStream *stream; - - g_warning ("CamelSimpleDataWrapperStream: associated CamelSimpleDataWrapper was destroyed."); - stream = CAMEL_SIMPLE_DATA_WRAPPER_STREAM (object); - stream->wrapper = NULL; -} - - -/* GtkObject methods. */ - -static void -destroy (GtkObject *object) -{ - CamelSimpleDataWrapperStream *stream; - - stream = CAMEL_SIMPLE_DATA_WRAPPER_STREAM (object); - - gtk_object_unref (GTK_OBJECT (stream->wrapper)); - - if (GTK_OBJECT_CLASS (parent_class)->destroy != NULL) - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -static void -class_init (CamelSimpleDataWrapperStreamClass *klass) -{ - GtkObjectClass *object_class; - - object_class = (GtkObjectClass*) klass; - - parent_class = gtk_type_class (camel_stream_get_type ()); -} - -static void -init (CamelSimpleDataWrapperStream *simple_data_wrapper_stream) -{ - simple_data_wrapper_stream->current_position = 0; -} - - -GtkType -camel_simple_data_wrapper_stream_get_type (void) -{ - static GtkType type = 0; - - if (type == 0) { - static const GtkTypeInfo info = { - "CamelSimpleDataWrapperStream", - sizeof (CamelSimpleDataWrapperStream), - sizeof (CamelSimpleDataWrapperStreamClass), - (GtkClassInitFunc) class_init, - (GtkObjectInitFunc) init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - type = gtk_type_unique (camel_stream_get_type (), &info); - } - - return type; -} - -void -camel_simple_data_wrapper_stream_construct (CamelSimpleDataWrapperStream *stream, - CamelSimpleDataWrapper *wrapper) -{ - g_return_if_fail (stream != NULL); - g_return_if_fail (CAMEL_IS_SIMPLE_DATA_WRAPPER_STREAM (stream)); - g_return_if_fail (wrapper != NULL); - g_return_if_fail (CAMEL_IS_SIMPLE_DATA_WRAPPER (wrapper)); - - gtk_object_ref (GTK_OBJECT (wrapper)); - stream->wrapper = wrapper; - gtk_signal_connect (GTK_OBJECT (wrapper), "destroy", - wrapper_destroy_cb, stream); -} - -CamelStream * -camel_simple_data_wrapper_stream_new (CamelSimpleDataWrapper *wrapper) -{ - CamelStream *stream; - - g_return_val_if_fail (wrapper != NULL, NULL); - g_return_val_if_fail (CAMEL_IS_SIMPLE_DATA_WRAPPER (wrapper), NULL); - - stream = gtk_type_new (camel_simple_data_wrapper_stream_get_type ()); - - camel_simple_data_wrapper_stream_construct - (CAMEL_SIMPLE_DATA_WRAPPER_STREAM (stream), wrapper); - - return stream; -} diff --git a/camel/camel-simple-data-wrapper-stream.h b/camel/camel-simple-data-wrapper-stream.h deleted file mode 100644 index 094f15faf7..0000000000 --- a/camel/camel-simple-data-wrapper-stream.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* camel-simple-data-wrapper-stream.h - * - * 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. - * - * Author: Ettore Perazzoli - */ - -#ifndef __CAMEL_SIMPLE_DATA_WRAPPER_STREAM_H__ -#define __CAMEL_SIMPLE_DATA_WRAPPER_STREAM_H__ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gtk/gtk.h> - -#include "camel-simple-data-wrapper.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define CAMEL_TYPE_SIMPLE_DATA_WRAPPER_STREAM \ - (camel_simple_data_wrapper_stream_get_type ()) -#define CAMEL_SIMPLE_DATA_WRAPPER_STREAM(obj) \ - (GTK_CHECK_CAST ((obj), CAMEL_TYPE_SIMPLE_DATA_WRAPPER_STREAM, CamelSimpleDataWrapperStream)) -#define CAMEL_SIMPLE_DATA_WRAPPER_STREAM_CLASS(klass) \ - (GTK_CHECK_CLASS_CAST ((klass), CAMEL_TYPE_SIMPLE_DATA_WRAPPER_STREAM, CamelSimpleDataWrapperStreamClass)) -#define CAMEL_IS_SIMPLE_DATA_WRAPPER_STREAM(obj) \ - (GTK_CHECK_TYPE ((obj), CAMEL_TYPE_SIMPLE_DATA_WRAPPER_STREAM)) -#define CAMEL_IS_SIMPLE_DATA_WRAPPER_STREAM_CLASS(klass) \ - (GTK_CHECK_CLASS_TYPE ((obj), CAMEL_TYPE_SIMPLE_DATA_WRAPPER_STREAM)) - - -typedef struct _CamelSimpleDataWrapperStream CamelSimpleDataWrapperStream; -typedef struct _CamelSimpleDataWrapperStreamClass CamelSimpleDataWrapperStreamClass; - -struct _CamelSimpleDataWrapperStream { - CamelStream parent; - - CamelSimpleDataWrapper *wrapper; - gint current_position; -}; - -struct _CamelSimpleDataWrapperStreamClass { - CamelStreamClass parent_class; -}; - - -GtkType camel_simple_data_wrapper_stream_get_type (void); -CamelStream *camel_simple_data_wrapper_stream_new (CamelSimpleDataWrapper *wrapper); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __CAMEL_SIMPLE_DATA_WRAPPER_STREAM_H__ */ diff --git a/camel/camel-simple-data-wrapper.c b/camel/camel-simple-data-wrapper.c deleted file mode 100644 index 943d8e902d..0000000000 --- a/camel/camel-simple-data-wrapper.c +++ /dev/null @@ -1,230 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-simple-data-wrapper.c : simple implementation of a data wrapper */ -/* store the data in a glib byte array */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> - -#include "camel-simple-data-wrapper.h" -#include "camel-simple-data-wrapper-stream.h" -#include "camel-log.h" - -static CamelDataWrapperClass *parent_class=NULL; - -/* Returns the class for a CamelDataWrapper */ -#define CSDW_CLASS(so) CAMEL_SIMPLE_DATA_WRAPPER_CLASS (GTK_OBJECT(so)->klass) - -static void _construct_from_stream (CamelDataWrapper *data_wrapper, CamelStream *stream); -static void _write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream); -static void _finalize (GtkObject *object); -static CamelStream *_get_stream (CamelDataWrapper *data_wrapper); - -static void -camel_simple_data_wrapper_class_init (CamelSimpleDataWrapperClass *camel_simple_data_wrapper_class) -{ - CamelDataWrapperClass *camel_data_wrapper_class = CAMEL_DATA_WRAPPER_CLASS (camel_simple_data_wrapper_class); - GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_data_wrapper_class); - - parent_class = gtk_type_class (camel_data_wrapper_get_type ()); - /* virtual method definition */ - - /* virtual method overload */ - camel_data_wrapper_class->write_to_stream = _write_to_stream; - camel_data_wrapper_class->construct_from_stream = _construct_from_stream; - - camel_data_wrapper_class->get_stream = _get_stream; - - gtk_object_class->finalize = _finalize; -} - - -static void -camel_simple_data_wrapper_init (CamelSimpleDataWrapper *wrapper) -{ - wrapper->stream = NULL; -} - -GtkType -camel_simple_data_wrapper_get_type (void) -{ - static GtkType camel_simple_data_wrapper_type = 0; - - if (!camel_simple_data_wrapper_type) { - GtkTypeInfo camel_simple_data_wrapper_info = - { - "CamelSimpleDataWrapper", - sizeof (CamelSimpleDataWrapper), - sizeof (CamelSimpleDataWrapperClass), - (GtkClassInitFunc) camel_simple_data_wrapper_class_init, - (GtkObjectInitFunc) camel_simple_data_wrapper_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_simple_data_wrapper_type = gtk_type_unique (camel_data_wrapper_get_type (), &camel_simple_data_wrapper_info); - } - - return camel_simple_data_wrapper_type; -} - - -static void -_finalize (GtkObject *object) -{ - CamelSimpleDataWrapper *simple_data_wrapper = CAMEL_SIMPLE_DATA_WRAPPER (object); - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMimePart::finalize\n"); - if (simple_data_wrapper->byte_array) g_byte_array_free (simple_data_wrapper->byte_array, TRUE); - - GTK_OBJECT_CLASS (parent_class)->finalize (object); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMimePart::finalize\n"); -} - - -/** - * camel_simple_data_wrapper_new: create a new CamelSimpleDataWrapper object - * - * - * - * Return value: - **/ -CamelSimpleDataWrapper * -camel_simple_data_wrapper_new () -{ - CamelSimpleDataWrapper *simple_data_wrapper; - CAMEL_LOG_FULL_DEBUG ("CamelSimpleDataWrapper:: Entering new()\n"); - - simple_data_wrapper = (CamelSimpleDataWrapper *)gtk_type_new (CAMEL_SIMPLE_DATA_WRAPPER_TYPE); - CAMEL_LOG_FULL_DEBUG ("CamelSimpleDataWrapper:: Leaving new()\n"); - return simple_data_wrapper; -} - - - -static void -_write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream) -{ - CamelSimpleDataWrapper *simple_data_wrapper = CAMEL_SIMPLE_DATA_WRAPPER (data_wrapper); - GByteArray *array; - CAMEL_LOG_FULL_DEBUG ("CamelSimpleDataWrapper:: Entering _write_to_stream\n"); - - g_assert (data_wrapper); - g_assert (stream); - g_assert (simple_data_wrapper->byte_array); - array = simple_data_wrapper->byte_array; - if (array->len) - camel_stream_write (stream, (gchar *)array->data, array->len); - - CAMEL_LOG_FULL_DEBUG ("CamelSimpleDataWrapper:: Leaving _write_to_stream\n"); -} - - -#define _CMSDW_TMP_BUF_SIZE 100 -static void -_construct_from_stream (CamelDataWrapper *data_wrapper, CamelStream *stream) -{ - CamelSimpleDataWrapper *simple_data_wrapper = CAMEL_SIMPLE_DATA_WRAPPER (data_wrapper); - gint nb_bytes_read; - static gchar *tmp_buf; - GByteArray *array; - - CAMEL_LOG_FULL_DEBUG ("CamelSimpleDataWrapper:: Entering _construct_from_stream\n"); - - g_assert (data_wrapper); - g_assert (stream); - - if (!tmp_buf) { - CAMEL_LOG_FULL_DEBUG ("CamelSimpleDataWrapper::construct_from_stream allocating new temp buffer " - "with %d bytes\n", _CMSDW_TMP_BUF_SIZE); - tmp_buf = g_new (gchar, _CMSDW_TMP_BUF_SIZE); - } - - array = simple_data_wrapper->byte_array; - if (array) { - CAMEL_LOG_FULL_DEBUG ("CamelSimpleDataWrapper::construct_from_stream freeing old byte array\n"); - g_byte_array_free (array, FALSE); - } - - array = g_byte_array_new (); - CAMEL_LOG_FULL_DEBUG ("CamelSimpleDataWrapper::construct_from_stream new byte array address:%p\n", array); - simple_data_wrapper->byte_array = array; - nb_bytes_read = camel_stream_read (stream, tmp_buf, _CMSDW_TMP_BUF_SIZE); - while (nb_bytes_read>0) { - CAMEL_LOG_FULL_DEBUG ("CamelSimpleDataWrapper::construct_from_stream read %d bytes from stream\n", nb_bytes_read); - if (nb_bytes_read>0) g_byte_array_append (array, tmp_buf, nb_bytes_read); - nb_bytes_read = camel_stream_read (stream, tmp_buf, _CMSDW_TMP_BUF_SIZE); - }; - - CAMEL_LOG_FULL_DEBUG ("CamelSimpleDataWrapper:: Leaving _construct_from_stream\n"); -} - - - - -/** - * camel_simple_data_wrapper_set_text: set some text as data wrapper content - * @simple_data_wrapper: SimpleDataWrapper object - * @text: the text to use - * - * Utility routine used to set up the content of a SimpleDataWrapper object - * to be a character string. - **/ -void -camel_simple_data_wrapper_set_text (CamelSimpleDataWrapper *simple_data_wrapper, const gchar *text) -{ - GByteArray *array; - CAMEL_LOG_FULL_DEBUG ("CamelSimpleDataWrapper:: Entering set_text\n"); - - array = simple_data_wrapper->byte_array; - if (array) { - CAMEL_LOG_FULL_DEBUG ("CamelSimpleDataWrapper::set_text freeing old byte array\n"); - g_byte_array_free (array, FALSE); - } - - array = g_byte_array_new (); - simple_data_wrapper->byte_array = array; - - g_byte_array_append (array, text, strlen (text)); - - CAMEL_LOG_FULL_DEBUG ("CamelSimpleDataWrapper:: Entering set_text\n"); -} - - - -static CamelStream * -_get_stream (CamelDataWrapper *data_wrapper) -{ - CamelSimpleDataWrapper *simple_data_wrapper; - - simple_data_wrapper = CAMEL_SIMPLE_DATA_WRAPPER (data_wrapper); - if (simple_data_wrapper->stream == NULL) { - CamelStream *s; - - s = camel_simple_data_wrapper_stream_new (simple_data_wrapper); - simple_data_wrapper->stream = s; - } - - return simple_data_wrapper->stream; -} diff --git a/camel/camel-simple-data-wrapper.h b/camel/camel-simple-data-wrapper.h deleted file mode 100644 index 1a511b96c4..0000000000 --- a/camel/camel-simple-data-wrapper.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-simple-data-wrapper.c : simple implementation of a data wrapper */ -/* store the data in a glib byte array */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_SIMPLE_DATA_WRAPPER_H -#define CAMEL_SIMPLE_DATA_WRAPPER_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include <stdio.h> -#include "camel-stream.h" -#include "camel-data-wrapper.h" - - - -#define CAMEL_SIMPLE_DATA_WRAPPER_TYPE (camel_simple_data_wrapper_get_type ()) -#define CAMEL_SIMPLE_DATA_WRAPPER(obj) (GTK_CHECK_CAST((obj), CAMEL_SIMPLE_DATA_WRAPPER_TYPE, CamelSimpleDataWrapper)) -#define CAMEL_SIMPLE_DATA_WRAPPER_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_SIMPLE_DATA_WRAPPER_TYPE, CamelSimpleDataWrapperClass)) -#define CAMEL_IS_SIMPLE_DATA_WRAPPER(o) (GTK_CHECK_TYPE((o), CAMEL_SIMPLE_DATA_WRAPPER_TYPE)) - - -typedef struct -{ - CamelDataWrapper parent_object; - - GByteArray *byte_array; - CamelStream *stream; -} CamelSimpleDataWrapper; - - - -typedef struct { - CamelDataWrapperClass parent_class; - - -} CamelSimpleDataWrapperClass; - - - -/* Standard Gtk function */ -GtkType camel_simple_data_wrapper_get_type (void); - - -/* public methods */ - -CamelSimpleDataWrapper *camel_simple_data_wrapper_new (); -void camel_simple_data_wrapper_set_text (CamelSimpleDataWrapper *simple_data_wrapper, const gchar *text); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_SIMPLE_DATA_WRAPPER_H */ diff --git a/camel/camel-store.c b/camel/camel-store.c deleted file mode 100644 index 5b69490521..0000000000 --- a/camel/camel-store.c +++ /dev/null @@ -1,263 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camelStore.c : Abstract class for an email store */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel-store.h" -#include "camel-log.h" - -static CamelServiceClass *parent_class = NULL; - -/* Returns the class for a CamelStore */ -#define CS_CLASS(so) CAMEL_STORE_CLASS (GTK_OBJECT(so)->klass) - -static void _set_separator(CamelStore *store, gchar sep); -static CamelFolder *_get_root_folder(CamelStore *store); -static CamelFolder *_get_default_folder(CamelStore *store); -static void _init(CamelStore *store, CamelSession *session, const gchar *url_name); -static CamelFolder *_get_folder (CamelStore *store, const gchar *folder_name); -static gchar _get_separator (CamelStore *store); - -static void _finalize (GtkObject *object); - -static void -camel_store_class_init (CamelStoreClass *camel_store_class) -{ - GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_store_class); - - parent_class = gtk_type_class (camel_service_get_type ()); - - /* virtual method definition */ - camel_store_class->init = _init; - camel_store_class->set_separator = _set_separator; - camel_store_class->get_separator = _get_separator; - camel_store_class->get_folder = _get_folder; - camel_store_class->get_root_folder = _get_root_folder; - camel_store_class->get_default_folder = _get_default_folder; - - /* virtual method overload */ - gtk_object_class->finalize = _finalize; -} - - - - - - - -GtkType -camel_store_get_type (void) -{ - static GtkType camel_store_type = 0; - - if (!camel_store_type) { - GtkTypeInfo camel_store_info = - { - "CamelStore", - sizeof (CamelStore), - sizeof (CamelStoreClass), - (GtkClassInitFunc) camel_store_class_init, - (GtkObjectInitFunc) NULL, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_store_type = gtk_type_unique (CAMEL_SERVICE_TYPE, &camel_store_info); - } - - return camel_store_type; -} - - - - - -/** - * camel_store_init: call store's init method - * @store: the store to initialize - * @session: session which instantiates the store - * @url_name: URL defining the store - * - * This routine is called by the session object from which this - * store is created. It must not be called directly. - * - **/ -void -camel_store_init (CamelStore *store, CamelSession *session, const gchar *url_name) -{ - g_assert(store); - CS_CLASS(store)->init (store, session, url_name); -} - - -/** - * init: method called by a session object to initialize a store object - * @store: the store to initialize - * @session: session which instantiates the store - * @url_name: URL defining the store - * - * This routine is called by the session object from which this - * store is created. Be careful, @url_name is used as a private field - * of the store object. - * - **/ -static void -_init (CamelStore *store, CamelSession *session, const gchar *url_name) -{ - -#warning re-enable assertion here. - g_assert(session); - g_assert(url_name); - - store->session = session; - gtk_object_ref (GTK_OBJECT (session)); - /*store->url_name = url_name;*/ -} - - -static void -_finalize (GtkObject *object) -{ - CamelStore *camel_store = CAMEL_STORE (object); - CAMEL_LOG_FULL_DEBUG ("Entering CamelStore::finalize\n"); - - /* if (camel_store->url_name) g_free (camel_store->url_name); */ - if (camel_store->session) gtk_object_unref (GTK_OBJECT (camel_store->session)); - - GTK_OBJECT_CLASS (parent_class)->finalize (object); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelStore::finalize\n"); -} - - - -/** - * camel_store_set_separator: set the character which separates this folder path from the folders names in a lower level of hierarchy. - * - * @store: - * @sep: - * - **/ -static void -_set_separator (CamelStore *store, gchar sep) -{ - store->separator = sep; -} - - - - - -static gchar -_get_separator (CamelStore *store) -{ - g_assert(store); - return store->separator; -} - - - -/** - * camel_store_get_separator: return the character which separates this folder path from the folders names in a lower level of hierarchy. - * @store: store - * - * - * - * Return value: the separator - **/ -gchar -camel_store_get_separator (CamelStore *store) -{ - return CS_CLASS(store)->get_separator (store); -} - - - - - - - -static CamelFolder * -_get_folder (CamelStore *store, const gchar *folder_name) -{ - return NULL; -} - - -/** - * camel_store_get_folder: return the folder corresponding to a path. - * @store: store - * @folder_name: name of the folder to get - * - * Returns the folder corresponding to the path "name". - * If the path begins with the separator caracter, it - * is relative to the root folder. Otherwise, it is - * relative to the default folder. - * The folder does not necessarily exist on the store. - * To make sure it already exists, use its "exists" method. - * If it does not exist, you can create it with its - * "create" method. - * - * - * Return value: the folder - **/ -CamelFolder * -camel_store_get_folder (CamelStore *store, const gchar *folder_name) -{ - return CS_CLASS(store)->get_folder (store, folder_name); -} - - -/** - * camel_store_get_root_folder : return the toplevel folder - * - * Returns the folder which is at the top of the folder - * hierarchy. This folder is generally different from - * the default folder. - * - * @Return value: the tolevel folder. - **/ -static CamelFolder * -_get_root_folder (CamelStore *store) -{ - return NULL; -} - -/** - * camel_store_get_default_folder : return the store default folder - * - * The default folder is the folder which is presented - * to the user in the default configuration. The default - * is often the root folder. - * - * @Return value: the default folder. - **/ -static CamelFolder * -_get_default_folder (CamelStore *store) -{ - return NULL; -} - - - diff --git a/camel/camel-store.h b/camel/camel-store.h deleted file mode 100644 index 71f368e2e2..0000000000 --- a/camel/camel-store.h +++ /dev/null @@ -1,88 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-store.h : Abstract class for an email store */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_STORE_H -#define CAMEL_STORE_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> - -typedef struct _CamelStore CamelStore; - -#include "camel-folder.h" -#include "camel-service.h" -#include "camel-session.h" - -#define CAMEL_STORE_TYPE (camel_store_get_type ()) -#define CAMEL_STORE(obj) (GTK_CHECK_CAST((obj), CAMEL_STORE_TYPE, CamelStore)) -#define CAMEL_STORE_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_STORE_TYPE, CamelStoreClass)) -#define CAMEL_IS_STORE(o) (GTK_CHECK_TYPE((o), CAMEL_STORE_TYPE)) - - -struct _CamelStore -{ - CamelService parent_object; - - CamelSession *session; - /* gchar *url_name; */ - gchar separator; -}; - - - -typedef struct { - CamelServiceClass parent_class; - - void (*init) (CamelStore *store, CamelSession *session, const gchar *url_name); - void (*set_separator) (CamelStore *store, gchar sep); - gchar (*get_separator) (CamelStore *store); - CamelFolder * (*get_folder) (CamelStore *store, const gchar *folder_name); - CamelFolder * (*get_root_folder) (CamelStore *store); - CamelFolder * (*get_default_folder) (CamelStore *store); - -} CamelStoreClass; - - -/* public methods */ - -/* Standard Gtk function */ -GtkType camel_store_get_type (void); - -void camel_store_init (CamelStore *store, CamelSession *session, const gchar *url_name); -CamelFolder *camel_store_get_folder (CamelStore *store, const gchar *folder_name); -gchar camel_store_get_separator (CamelStore *store); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_STORE_H */ diff --git a/camel/camel-stream-buffered-fs.c b/camel/camel-stream-buffered-fs.c deleted file mode 100644 index c42f47aa96..0000000000 --- a/camel/camel-stream-buffered-fs.c +++ /dev/null @@ -1,265 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-stream-buffered-fs.c : file system based stream with buffer*/ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel-stream-buffered-fs.h" -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <errno.h> -#include "camel-log.h" - -static CamelStreamFsClass *parent_class=NULL; - - -/* Returns the class for a CamelStreamBufferedFs */ -#define CSBFS_CLASS(so) CAMEL_STREAM_BUFFERED_FS_CLASS (GTK_OBJECT(so)->klass) -#define CSFS_CLASS(so) CAMEL_STREAM_FS_CLASS (GTK_OBJECT(so)->klass) -#define CS_CLASS(so) CAMEL_STREAM_CLASS (GTK_OBJECT(so)->klass) - -static gint _read (CamelStream *stream, gchar *buffer, gint n); -static gint _write (CamelStream *stream, const gchar *buffer, gint n); -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 void _finalize (GtkObject *object); -static void _destroy (GtkObject *object); - -static void -camel_stream_buffered_fs_class_init (CamelStreamBufferedFsClass *camel_stream_buffered_fs_class) -{ - CamelStreamClass *camel_stream_class = CAMEL_STREAM_CLASS (camel_stream_buffered_fs_class); - GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_stream_buffered_fs_class); - - parent_class = gtk_type_class (camel_stream_fs_get_type ()); - - /* virtual method definition */ - - /* virtual method overload */ - camel_stream_class->read = _read; - - gtk_object_class->finalize = _finalize; - gtk_object_class->destroy = _destroy; - -} - -static void -camel_stream_buffered_fs_init (gpointer object, gpointer klass) -{ - CamelStreamBufferedFs *stream = CAMEL_STREAM_BUFFERED_FS (object); - - stream->buffer_size = 200; - stream->read_buffer = g_new (gchar, stream->buffer_size); - stream->write_buffer = g_new (gchar, stream->buffer_size); - stream->read_pos = 0; - stream->read_pos_max = 0; - stream->write_pos = 0; - stream->write_pos_max = stream->buffer_size; -} - -GtkType -camel_stream_buffered_fs_get_type (void) -{ - static GtkType camel_stream_buffered_fs_type = 0; - - gdk_threads_enter (); - if (!camel_stream_buffered_fs_type) { - GtkTypeInfo camel_stream_buffered_fs_info = - { - "CamelStreamBufferedFs", - sizeof (CamelStreamBufferedFs), - sizeof (CamelStreamBufferedFsClass), - (GtkClassInitFunc) camel_stream_buffered_fs_class_init, - (GtkObjectInitFunc) camel_stream_buffered_fs_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_stream_buffered_fs_type = gtk_type_unique (camel_stream_fs_get_type (), &camel_stream_buffered_fs_info); - } - gdk_threads_leave (); - return camel_stream_buffered_fs_type; -} - - -static void -_destroy (GtkObject *object) -{ - CamelStreamBufferedFs *stream_buffered_fs = CAMEL_STREAM_BUFFERED_FS (object); - - CAMEL_LOG_FULL_DEBUG ("Entering CamelStreamBufferedFs::destroy\n"); - - - GTK_OBJECT_CLASS (parent_class)->destroy (object); - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelStreamBufferedFs::destroy\n"); -} - - -static void -_finalize (GtkObject *object) -{ - CamelStreamBufferedFs *stream_buffered_fs = CAMEL_STREAM_BUFFERED_FS (object); - - - CAMEL_LOG_FULL_DEBUG ("Entering CamelStreamBufferedFs::finalize\n"); - - g_free (stream_buffered_fs->read_buffer); - g_free (stream_buffered_fs->write_buffer); - - GTK_OBJECT_CLASS (parent_class)->finalize (object); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelStreamBufferedFs::finalize\n"); -} - - - -CamelStream * -camel_stream_buffered_fs_new_with_name (const gchar *name, CamelStreamFsMode mode) -{ - CamelStreamFs *stream_buffered_fs; - stream_buffered_fs = gtk_type_new (camel_stream_buffered_fs_get_type ()); - CSFS_CLASS (stream_buffered_fs)->init_with_name (stream_buffered_fs, name, mode); - - return CAMEL_STREAM (stream_buffered_fs); - -} - -CamelStream * -camel_stream_buffered_fs_new_with_fd (int fd) -{ - CamelStreamFs *stream_buffered_fs; - - CAMEL_LOG_FULL_DEBUG ( "Entering CamelStream::new_with_fd fd=%d\n",fd); - stream_buffered_fs = gtk_type_new (camel_stream_buffered_fs_get_type ()); - CSFS_CLASS (stream_buffered_fs)->init_with_fd (stream_buffered_fs, fd); - - - return CAMEL_STREAM (stream_buffered_fs); -} - -/** - * _read: read bytes from a stream - * @stream: stream - * @buffer: buffer where bytes are stored - * @n: max number of bytes to read - * - * - * - * Return value: number of bytes actually read. - **/ -static gint -_read (CamelStream *stream, gchar *buffer, gint n) -{ - CamelStreamBufferedFs *sbf = CAMEL_STREAM_BUFFERED_FS (stream); - gint v; - gint nb_bytes_buffered; - gint nb_bytes_to_read = n; - gint nb_bytes_read = 0; - gint bytes_chunk; - gboolean eof = FALSE; - - g_return_val_if_fail (n>0, n); - - nb_bytes_buffered = sbf->read_pos_max - sbf->read_pos; - while ( (!eof) && (nb_bytes_to_read>0)) { - if (nb_bytes_buffered <= 0) { - /* have to read some data on disk */ - v = CAMEL_STREAM_CLASS (parent_class)->read (stream, sbf->read_buffer, sbf->buffer_size); - nb_bytes_buffered = v; - sbf->read_pos_max = v; - sbf->read_pos = 0; - } - - /* nb of bytes to put inside buffer */ - bytes_chunk = MIN (nb_bytes_buffered, nb_bytes_to_read); - - if (bytes_chunk > 0) { - /* copy some bytes from the cache */ - memcpy (buffer, sbf->read_buffer + sbf->read_pos, bytes_chunk); - nb_bytes_buffered -= bytes_chunk; - nb_bytes_to_read -= bytes_chunk; - nb_bytes_read += bytes_chunk; - sbf->read_pos += bytes_chunk; - - } else /* nb_bytes_to_read is >0 so if bytes_chunk is <0 - * there was no data available */ - eof = TRUE; - } - - - - return nb_bytes_read; -} - - -static gint -_write (CamelStream *stream, const gchar *buffer, gint n) -{ - return 0; -} - - - -static void -_flush (CamelStream *stream) -{ - -} - - - -static gint -_available (CamelStream *stream) -{ - return 0; -} - - -static gboolean -_eos (CamelStream *stream) -{ - return FALSE; -} - - - -static void -_close (CamelStream *stream) -{ - -} - - -static gint -_seek (CamelStream *stream, gint offset, CamelStreamSeekPolicy policy) -{ - return 0; -} diff --git a/camel/camel-stream-buffered-fs.h b/camel/camel-stream-buffered-fs.h deleted file mode 100644 index 778c7e88df..0000000000 --- a/camel/camel-stream-buffered-fs.h +++ /dev/null @@ -1,91 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-stream-bufered-fs.h :stream based on unix filesystem */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_STREAM_BUFFERED_FS_H -#define CAMEL_STREAM_BUFFERED_FS_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include <stdio.h> -#include "camel-stream-fs.h" - -#define CAMEL_STREAM_BUFFERED_FS_TYPE (camel_stream_buffered_fs_get_type ()) -#define CAMEL_STREAM_BUFFERED_FS(obj) (GTK_CHECK_CAST((obj), CAMEL_STREAM_BUFFERED_FS_TYPE, CamelStreamBufferedFs)) -#define CAMEL_STREAM_BUFFERED_FS_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_STREAM_BUFFERED_FS_TYPE, CamelStreamBufferedFsClass)) -#define CAMEL_IS_STREAM_BUFFERED_FS(o) (GTK_CHECK_TYPE((o), CAMEL_STREAM_BUFFERED_FS_TYPE)) - -typedef enum -{ - CAMEL_STREAM_BUFFERED_FS_READ = 1, - CAMEL_STREAM_BUFFERED_FS_WRITE = 2 -} CamelStreamBufferedFsMode; - - -typedef struct -{ - CamelStreamFs parent_object; - - gint buffer_size; - gchar *read_buffer; - gint read_pos; - gint read_pos_max; - - gchar *write_buffer; - gint write_pos; - gint write_pos_max; - -} CamelStreamBufferedFs; - - - -typedef struct { - CamelStreamFsClass parent_class; - - /* Virtual methods */ - -} CamelStreamBufferedFsClass; - - - -/* Standard Gtk function */ -GtkType camel_stream_buffered_fs_get_type (void); - - -/* public methods */ -CamelStream *camel_stream_buffered_fs_new_with_name (const gchar *name, CamelStreamBufferedFsMode mode); -CamelStream *camel_stream_buffered_fs_new_with_fd (int fd); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_STREAM_BUFFERED_FS_H */ diff --git a/camel/camel-stream-data-wrapper.c b/camel/camel-stream-data-wrapper.c deleted file mode 100644 index f4dfbb29e9..0000000000 --- a/camel/camel-stream-data-wrapper.c +++ /dev/null @@ -1,209 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* camel-stream-data-wrapper.c - * - * 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. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gtk/gtk.h> - -#include "camel-stream-data-wrapper.h" - - -static CamelDataWrapperClass *parent_class = NULL; - - -/* CamelDataWrapper methods. */ - -static void -write_to_stream (CamelDataWrapper *data_wrapper, - CamelStream *output_stream) -{ -#define BUFFER_SIZE 4096 - gchar buffer[BUFFER_SIZE]; - CamelStreamDataWrapper *stream_data_wrapper; - CamelStream *input_stream; - - stream_data_wrapper = CAMEL_STREAM_DATA_WRAPPER (data_wrapper); - input_stream = stream_data_wrapper->stream; - - while (TRUE) { - gchar *p; - gint read, written; - - read = camel_stream_read (input_stream, buffer, BUFFER_SIZE); - if (read == 0) - break; - - p = buffer; - while (read > 0) { - written = camel_stream_write (output_stream, p, read); - - /* FIXME no way to report an error?! */ - if (written == -1) - break; - - p += written; - read -= written; - } - } -#undef BUFFER_SIZE -} - -static CamelStream * -get_stream (CamelDataWrapper *data_wrapper) -{ - CamelStreamDataWrapper *stream_data_wrapper; - - stream_data_wrapper = CAMEL_STREAM_DATA_WRAPPER (data_wrapper); - return stream_data_wrapper->stream; -} - - -/* GtkObject methods. */ - -static void -destroy (GtkObject *object) -{ - CamelStreamDataWrapper *stream_data_wrapper; - GtkObject *stream_object; - - stream_data_wrapper = CAMEL_STREAM_DATA_WRAPPER (object); - - stream_object = GTK_OBJECT (object); - stream_data_wrapper->stream = NULL; - - gtk_object_unref (stream_object); -} - - -/* This handles destruction of the associated CamelDataWrapper outside - CamelStreamDataWrapper, for debuggin purposes (this should never happen). */ -static void -stream_destroy_cb (GtkObject *object, - gpointer data) -{ - CamelStreamDataWrapper *wrapper; - - wrapper = CAMEL_STREAM_DATA_WRAPPER (data); - - /* Hack: when we destroy the stream ourselves, we set the `stream' - member to NULL first, so that we can recognize when this is done out - of our control. */ - if (wrapper->stream != NULL) { - g_warning ("CamelSimpleDataWrapperStream: associated CamelSimpleDataWrapper was destroyed."); - wrapper->stream = NULL; - } -} - - -static void -class_init (CamelStreamDataWrapperClass *class) -{ - GtkObjectClass *object_class; - CamelDataWrapperClass *data_wrapper_class; - - object_class = GTK_OBJECT_CLASS (class); - object_class->destroy = destroy; - - data_wrapper_class = CAMEL_DATA_WRAPPER_CLASS (class); - data_wrapper_class->write_to_stream = write_to_stream; - data_wrapper_class->get_stream = get_stream; - - parent_class = gtk_type_class (camel_data_wrapper_get_type ()); -} - -static void -init (CamelStreamDataWrapper *wrapper) -{ - wrapper->stream = NULL; -} - - -GtkType -camel_stream_data_wrapper_get_type (void) -{ - static GtkType type = 0; - - if (type == 0) { - static const GtkTypeInfo info = { - "CamelStreamDataWrapper", - sizeof (CamelStreamDataWrapper), - sizeof (CamelStreamDataWrapperClass), - (GtkClassInitFunc) class_init, - (GtkObjectInitFunc) init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - type = gtk_type_unique (camel_data_wrapper_get_type (), &info); - } - - return type; -} - -/** - * camel_stream_data_wrapper_construct: - * @wrapper: A CamelStreamDataWrapper object - * @stream: A Camel stream object - * - * Construct @wrapper associating @stream to it. Notice that, after this call, - * @stream is conceptually owned by @wrapper and will be destroyed when - * @wrapper is destroyed. - **/ -void -camel_stream_data_wrapper_construct (CamelStreamDataWrapper *wrapper, - CamelStream *stream) -{ - g_return_if_fail (wrapper != NULL); - g_return_if_fail (CAMEL_IS_STREAM_DATA_WRAPPER (wrapper)); - g_return_if_fail (stream != NULL); - g_return_if_fail (CAMEL_IS_STREAM (stream)); - - wrapper->stream = stream; - gtk_signal_connect (GTK_OBJECT (stream), "destroy", - GTK_SIGNAL_FUNC (stream_destroy_cb), wrapper); -} - -/** - * camel_stream_data_wrapper_new: - * @stream: A Camel stream object - * - * Create a new stream data wrapper object for @stream. Notice that, after - * this call, @stream is conceptually owned by the new wrapper and will be - * destroyed when the wrapper is destroyed. - * - * Return value: A pointer to the new CamelStreamDataWrapper object. - **/ -CamelDataWrapper * -camel_stream_data_wrapper_new (CamelStream *stream) -{ - CamelDataWrapper *wrapper; - - wrapper = gtk_type_new (camel_stream_data_wrapper_get_type ()); - camel_stream_data_wrapper_construct - (CAMEL_STREAM_DATA_WRAPPER (wrapper), stream); - - return wrapper; -} diff --git a/camel/camel-stream-data-wrapper.h b/camel/camel-stream-data-wrapper.h deleted file mode 100644 index d0b95e63a6..0000000000 --- a/camel/camel-stream-data-wrapper.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* camel-stream-data-wrapper.h - * - * 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. - * - * Author: Ettore Perazzoli - */ - -#ifndef __CAMEL_STREAM_DATA_WRAPPER_H__ -#define __CAMEL_STREAM_DATA_WRAPPER_H__ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gtk/gtk.h> -#include "camel-data-wrapper.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - - -#define CAMEL_TYPE_STREAM_DATA_WRAPPER \ - (camel_stream_data_wrapper_get_type ()) -#define CAMEL_STREAM_DATA_WRAPPER(obj) \ - (GTK_CHECK_CAST ((obj), CAMEL_TYPE_STREAM_DATA_WRAPPER, CamelStreamDataWrapper)) -#define CAMEL_STREAM_DATA_WRAPPER_CLASS(klass) \ - (GTK_CHECK_CLASS_CAST ((klass), CAMEL_TYPE_STREAM_DATA_WRAPPER, CamelStreamDataWrapperClass)) -#define CAMEL_IS_STREAM_DATA_WRAPPER(obj) \ - (GTK_CHECK_TYPE ((obj), CAMEL_TYPE_STREAM_DATA_WRAPPER)) -#define CAMEL_IS_STREAM_DATA_WRAPPER_CLASS(klass) \ - (GTK_CHECK_CLASS_TYPE ((obj), CAMEL_TYPE_STREAM_DATA_WRAPPER)) - - -typedef struct _CamelStreamDataWrapper CamelStreamDataWrapper; -typedef struct _CamelStreamDataWrapperClass CamelStreamDataWrapperClass; - -struct _CamelStreamDataWrapper { - CamelDataWrapper parent; - - CamelStream *stream; -}; - -struct _CamelStreamDataWrapperClass { - CamelDataWrapperClass parent_class; -}; - - -GtkType camel_stream_data_wrapper_get_type (void); -CamelDataWrapper *camel_stream_data_wrapper_new (CamelStream *stream); -void camel_stream_data_wrapper_construct (CamelStreamDataWrapper *wrapper, - CamelStream *stream); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __CAMEL_STREAM_DATA_WRAPPER_H__ */ diff --git a/camel/camel-stream-fs.c b/camel/camel-stream-fs.c deleted file mode 100644 index c4d6e9be8c..0000000000 --- a/camel/camel-stream-fs.c +++ /dev/null @@ -1,355 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-stream-fs.c : file system based stream */ - -/* inspired by gnome-stream-fs.c in bonobo by Miguel de Icaza */ -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel-stream-fs.h" -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <errno.h> -#include <string.h> -#include "camel-log.h" - -static CamelStreamClass *parent_class=NULL; - - -/* Returns the class for a CamelStreamFS */ -#define CSFS_CLASS(so) CAMEL_STREAM_FS_CLASS (GTK_OBJECT(so)->klass) - -static gint _read (CamelStream *stream, gchar *buffer, gint n); -static gint _write (CamelStream *stream, const gchar *buffer, gint n); -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 void _finalize (GtkObject *object); -static void _destroy (GtkObject *object); - -static void _init_with_fd (CamelStreamFs *stream_fs, int fd); -static void _init_with_name (CamelStreamFs *stream_fs, const gchar *name, CamelStreamFsMode mode); - -static void -camel_stream_fs_class_init (CamelStreamFsClass *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); - - parent_class = gtk_type_class (camel_stream_get_type ()); - - /* virtual method definition */ - camel_stream_fs_class->init_with_fd = _init_with_fd; - camel_stream_fs_class->init_with_name = _init_with_name; - - /* virtual method overload */ - camel_stream_class->read = _read; - camel_stream_class->write = _write; - camel_stream_class->flush = _flush; - camel_stream_class->available = _available; - camel_stream_class->eos = _eos; - camel_stream_class->close = _close; - camel_stream_class->seek = _seek; - - gtk_object_class->finalize = _finalize; - gtk_object_class->destroy = _destroy; - -} - -static void -camel_stream_fs_init (gpointer object, gpointer klass) -{ - CamelStreamFs *stream = CAMEL_STREAM_FS (object); - - stream->name = NULL; -} - - -GtkType -camel_stream_fs_get_type (void) -{ - static GtkType camel_stream_fs_type = 0; - - if (!camel_stream_fs_type) { - GtkTypeInfo camel_stream_fs_info = - { - "CamelStreamFs", - sizeof (CamelStreamFs), - sizeof (CamelStreamFsClass), - (GtkClassInitFunc) camel_stream_fs_class_init, - (GtkObjectInitFunc) camel_stream_fs_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_stream_fs_type = gtk_type_unique (camel_stream_get_type (), &camel_stream_fs_info); - } - - return camel_stream_fs_type; -} - - -static void -_destroy (GtkObject *object) -{ - CamelStreamFs *stream_fs = CAMEL_STREAM_FS (object); - gint close_error; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelStreamFs::destroy\n"); - - close_error = close (stream_fs->fd); - if (close_error) { - CAMEL_LOG_FULL_DEBUG ("CamelStreamFs::destroy Error while closing file descriptor\n"); - CAMEL_LOG_FULL_DEBUG ( " Full error text is : %s\n", strerror(errno)); - } - GTK_OBJECT_CLASS (parent_class)->destroy (object); - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelStreamFs::destroy\n"); -} - - -static void -_finalize (GtkObject *object) -{ - CamelStreamFs *stream_fs = CAMEL_STREAM_FS (object); - - - CAMEL_LOG_FULL_DEBUG ("Entering CamelStreamFs::finalize\n"); - - g_free (stream_fs->name); - - GTK_OBJECT_CLASS (parent_class)->finalize (object); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelStreamFs::finalize\n"); -} - -static void -_init_with_fd (CamelStreamFs *stream_fs, int fd) -{ - stream_fs->fd = fd; -} - -static void -_init_with_name (CamelStreamFs *stream_fs, const gchar *name, CamelStreamFsMode mode) -{ - struct stat s; - int v, fd; - int flags; - - g_assert (name); - CAMEL_LOG_FULL_DEBUG ( "Entering CamelStream::new_with_name, name=\"%s\", mode=%d\n", name, mode); - v = stat (name, &s); - - if (mode & CAMEL_STREAM_FS_READ){ - if (mode & CAMEL_STREAM_FS_WRITE) - flags = O_RDWR | O_CREAT; - else - flags = O_RDONLY; - } else { - if (mode & CAMEL_STREAM_FS_WRITE) - flags = O_WRONLY | O_CREAT; - else - return; - } - if ( (mode & CAMEL_STREAM_FS_READ) && !(mode & CAMEL_STREAM_FS_WRITE) ) - if (v == -1) return; - - fd = open (name, flags, 0600); - if (fd==-1) { - CAMEL_LOG_WARNING ( "CamelStreamFs::new_with_name can not obtain fd for file \"%s\"\n", name); - CAMEL_LOG_FULL_DEBUG ( " Full error text is : %s\n", strerror(errno)); - return; - } - - stream_fs->name = g_strdup (name); - CSFS_CLASS (stream_fs)->init_with_fd (stream_fs, fd); - - - -} - - -CamelStream * -camel_stream_fs_new_with_name (const gchar *name, CamelStreamFsMode mode) -{ - CamelStreamFs *stream_fs; - stream_fs = gtk_type_new (camel_stream_fs_get_type ()); - CSFS_CLASS (stream_fs)->init_with_name (stream_fs, name, mode); - - return CAMEL_STREAM (stream_fs); - -} - -CamelStream * -camel_stream_fs_new_with_fd (int fd) -{ - CamelStreamFs *stream_fs; - - CAMEL_LOG_FULL_DEBUG ( "Entering CamelStream::new_with_fd fd=%d\n",fd); - stream_fs = gtk_type_new (camel_stream_fs_get_type ()); - CSFS_CLASS (stream_fs)->init_with_fd (stream_fs, fd); - - - return CAMEL_STREAM (stream_fs); -} - -/** - * _read: read bytes from a stream - * @stream: stream - * @buffer: buffer where bytes are stored - * @n: max number of bytes to read - * - * - * - * Return value: number of bytes actually read. - **/ -static gint -_read (CamelStream *stream, gchar *buffer, gint n) -{ - gint v; - do { - v = read ( (CAMEL_STREAM_FS (stream))->fd, buffer, n); - } while (v == -1 && errno == EINTR); - if (v<0) - CAMEL_LOG_FULL_DEBUG ("CamelStreamFs::read v=%d\n", v); - return v; -} - - -/** - * _write: read bytes to a stream - * @stream: the stream - * @buffer: byte buffer - * @n: number of bytes to write - * - * - * - * Return value: the number of bytes actually written - * in the stream. - **/ -static gint -_write (CamelStream *stream, const gchar *buffer, gint n) -{ - int v; - g_assert (stream); - g_assert ((CAMEL_STREAM_FS (stream))->fd); - CAMEL_LOG_FULL_DEBUG ( "CamelStreamFs:: entering write. n=%d\n", n); - do { - v = write ( (CAMEL_STREAM_FS (stream))->fd, buffer, n); - } while (v == -1 && errno == EINTR); - -#if HARD_LOG_LEVEL >= FULL_DEBUG - if (v==-1) { - perror(""); - CAMEL_LOG_FULL_DEBUG ( "CamelStreamFs::write could not write bytes in stream\n"); - } -#endif - return v; - -} - - - -/** - * _flush: flush pending changes - * @stream: the stream - * - * - **/ -static void -_flush (CamelStream *stream) -{ - fsync ((CAMEL_STREAM_FS (stream))->fd); -} - - - -/** - * _available: return the number of bytes available for reading - * @stream: the stream - * - * Return the number of bytes available without blocking. - * - * Return value: the number of bytes available - **/ -static gint -_available (CamelStream *stream) -{ - g_warning ("Not implemented yet"); - return -1; -} - - -/** - * _eos: test if there are bytes left to read - * @stream: the stream - * - * - * - * Return value: true if all stream has been read - **/ -static gboolean -_eos (CamelStream *stream) -{ - g_warning ("Not implemented yet"); - return FALSE; -} - - -/** - * _close: close a stream - * @stream: the stream - * - * - **/ -static void -_close (CamelStream *stream) -{ - close ((CAMEL_STREAM_FS (stream))->fd); -} - - -static gint -_seek (CamelStream *stream, gint offset, CamelStreamSeekPolicy policy) -{ - int whence; - switch (policy) { - case CAMEL_STREAM_SET: - whence = SEEK_SET; - break; - case CAMEL_STREAM_CUR: - whence = SEEK_CUR; - break; - case CAMEL_STREAM_END: - whence = SEEK_END; - break; - default: - return -1; - } - - - return lseek ((CAMEL_STREAM_FS (stream))->fd, offset, whence); -} diff --git a/camel/camel-stream-fs.h b/camel/camel-stream-fs.h deleted file mode 100644 index 85df8f3a2c..0000000000 --- a/camel/camel-stream-fs.h +++ /dev/null @@ -1,85 +0,0 @@ -/* -*- 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 <bertrand@helixcode.com> - * - * 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_STREAM_FS_H -#define CAMEL_STREAM_FS_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include <stdio.h> -#include "camel-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)) -#define CAMEL_STREAM_FS_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_STREAM_FS_TYPE, CamelStreamFsClass)) -#define CAMEL_IS_STREAM_FS(o) (GTK_CHECK_TYPE((o), CAMEL_STREAM_FS_TYPE)) - -typedef enum -{ - CAMEL_STREAM_FS_READ = 1, - CAMEL_STREAM_FS_WRITE = 2 -} CamelStreamFsMode; - - -typedef struct -{ - CamelStream parent_object; - gchar *name; - int fd; -} CamelStreamFs; - - - -typedef struct { - CamelStreamClass parent_class; - - /* Virtual methods */ - void (*init_with_fd) (CamelStreamFs *stream_fs, int fd); - void (*init_with_name) (CamelStreamFs *stream_fs, const gchar *name, CamelStreamFsMode mode); - -} CamelStreamFsClass; - - - -/* Standard Gtk function */ -GtkType camel_stream_fs_get_type (void); - - -/* public methods */ -CamelStream *camel_stream_fs_new_with_name (const gchar *name, CamelStreamFsMode mode); -CamelStream *camel_stream_fs_new_with_fd (int fd); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_STREAM_FS_H */ diff --git a/camel/camel-stream-mem.c b/camel/camel-stream-mem.c deleted file mode 100644 index df69fc0448..0000000000 --- a/camel/camel-stream-mem.c +++ /dev/null @@ -1,286 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-stream-mem.c : memory buffer based stream */ - -/* inspired by gnome-stream-mem.c in bonobo by Miguel de Icaza */ -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel-stream-mem.h" -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <errno.h> -#include "camel-log.h" - -static CamelStreamClass *parent_class=NULL; - - -/* Returns the class for a CamelStreamMEM */ -#define CS_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); -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 void _finalize (GtkObject *object); - -static void -camel_stream_mem_class_init (CamelStreamMemClass *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); - - parent_class = gtk_type_class (gtk_object_get_type ()); - - /* virtual method definition */ - - /* virtual method overload */ - camel_stream_class->read = _read; - camel_stream_class->write = _write; - camel_stream_class->flush = _flush; - camel_stream_class->available = _available; - camel_stream_class->eos = _eos; - camel_stream_class->close = _close; - camel_stream_class->seek = _seek; - - gtk_object_class->finalize = _finalize; - -} - -static void -camel_stream_mem_init (gpointer object, gpointer klass) -{ - CamelStreamMem *camel_stream_mem = CAMEL_STREAM_MEM (object); - camel_stream_mem->position = 0; -} - -GtkType -camel_stream_mem_get_type (void) -{ - static GtkType camel_stream_mem_type = 0; - - if (!camel_stream_mem_type) { - GtkTypeInfo camel_stream_mem_info = - { - "CamelStreamMem", - sizeof (CamelStreamMem), - sizeof (CamelStreamMemClass), - (GtkClassInitFunc) camel_stream_mem_class_init, - (GtkObjectInitFunc) camel_stream_mem_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_stream_mem_type = gtk_type_unique (camel_stream_get_type (), &camel_stream_mem_info); - } - - return camel_stream_mem_type; -} - - -CamelStream * -camel_stream_mem_new (CamelStreamMemMode mode) -{ - CamelStreamMem *stream_mem; - GByteArray *buffer; - - buffer = g_byte_array_new (); - stream_mem = (CamelStreamMem *)camel_stream_mem_new_with_buffer (buffer, mode); - return CAMEL_STREAM (stream_mem); -} - - -CamelStream * -camel_stream_mem_new_with_buffer (GByteArray *buffer, CamelStreamMemMode mode) -{ - CamelStreamMem *stream_mem; - - stream_mem = gtk_type_new (camel_stream_mem_get_type ()); - stream_mem->mode = mode; - stream_mem->buffer = buffer; - - return CAMEL_STREAM (stream_mem); -} - - - -static void -_finalize (GtkObject *object) -{ - CamelStreamMem *stream_mem = CAMEL_STREAM_MEM (object); - - - CAMEL_LOG_FULL_DEBUG ("Entering CamelStreamMem::finalize\n"); - g_byte_array_free (stream_mem->buffer, TRUE); - - GTK_OBJECT_CLASS (parent_class)->finalize (object); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelStreamMem::finalize\n"); -} - - - -/** - * _read: read bytes from a stream - * @stream: stream - * @buffer: buffer where bytes are stored - * @n: max number of bytes to read - * - * - * - * Return value: number of bytes actually read. - **/ -static gint -_read (CamelStream *stream, gchar *buffer, gint n) -{ - CamelStreamMem *camel_stream_mem = CAMEL_STREAM_MEM (stream); - gint nb_bytes_to_read; - - g_assert (stream); - nb_bytes_to_read = MIN (n, (camel_stream_mem->buffer)->len - camel_stream_mem->position); - if (nb_bytes_to_read>0) { - memcpy (buffer, (camel_stream_mem->buffer)->data + camel_stream_mem->position, nb_bytes_to_read); - camel_stream_mem->position += nb_bytes_to_read; - } else nb_bytes_to_read = -1; - - return nb_bytes_to_read; -} - - -/** - * _write: read bytes to a stream - * @stream: the stream - * @buffer: byte buffer - * @n: number of bytes to write - * - * - * - * Return value: the number of bytes actually written - * in the stream. - **/ -static gint -_write (CamelStream *stream, const gchar *buffer, gint n) -{ - CamelStreamMem *camel_stream_mem = CAMEL_STREAM_MEM (stream); - - g_assert (stream); - g_return_val_if_fail (camel_stream_mem->position>=0, -1); - camel_stream_mem->buffer = g_byte_array_append (camel_stream_mem->buffer, (const guint8 *)buffer, n); - camel_stream_mem->position += n; - - return n; -} - - - -/** - * _flush: flush pending changes - * @stream: the stream - * - * - **/ -static void -_flush (CamelStream *stream) -{ - g_warning ("Not implemented yet"); -} - - - -/** - * _available: return the number of bytes available for reading - * @stream: the stream - * - * Return the number of bytes available without blocking. - * - * Return value: the number of bytes available - **/ -static gint -_available (CamelStream *stream) -{ - g_warning ("Not implemented yet"); - return -1; -} - - -/** - * _eos: test if there are bytes left to read - * @stream: the stream - * - * - * - * Return value: true if all stream has been read - **/ -static gboolean -_eos (CamelStream *stream) -{ - g_warning ("Not implemented yet"); - return FALSE; -} - - -/** - * _close: close a stream - * @stream: the stream - * - * - **/ -static void -_close (CamelStream *stream) -{ - g_warning ("Not implemented yet"); -} - - - -static gint -_seek (CamelStream *stream, gint offset, CamelStreamSeekPolicy policy) -{ - gint position; - CamelStreamMem *camel_stream_mem = CAMEL_STREAM_MEM (stream); - - switch (policy) { - case CAMEL_STREAM_SET: - position = offset; - break; - case CAMEL_STREAM_CUR: - position = camel_stream_mem->position + offset; - break; - case CAMEL_STREAM_END: - position = (camel_stream_mem->buffer)->len + offset; - break; - default: - return -1; - } - - position = MIN (position, (camel_stream_mem->buffer)->len); - position = MAX (position, 0); - - camel_stream_mem->position = position; - - return position; -} diff --git a/camel/camel-stream-mem.h b/camel/camel-stream-mem.h deleted file mode 100644 index 0ebcfead24..0000000000 --- a/camel/camel-stream-mem.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-stream-mem.h :stream based on memory buffer */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_STREAM_MEM_H -#define CAMEL_STREAM_MEM_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include <stdio.h> -#include "camel-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)) -#define CAMEL_STREAM_MEM_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_STREAM_MEM_TYPE, CamelStreamMemClass)) -#define CAMEL_IS_STREAM_MEM(o) (GTK_CHECK_TYPE((o), CAMEL_STREAM_MEM_TYPE)) - -typedef enum -{ - CAMEL_STREAM_MEM_READ = 1, - CAMEL_STREAM_MEM_WRITE = 2, - CAMEL_STREAM_MEM_RW = 3 -} CamelStreamMemMode; - - -typedef struct -{ - CamelStream parent_object; - - GByteArray *buffer; - gint position; - CamelStreamMemMode mode; -} CamelStreamMem; - - - -typedef struct { - CamelStreamClass parent_class; - - /* Virtual methods */ - -} CamelStreamMemClass; - - - -/* Standard Gtk function */ -GtkType camel_stream_mem_get_type (void); - - -/* public methods */ -CamelStream *camel_stream_mem_new (CamelStreamMemMode mode); -CamelStream * camel_stream_mem_new_with_buffer (GByteArray *buffer, - CamelStreamMemMode mode); - - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_STREAM_MEM_H */ diff --git a/camel/camel-stream.c b/camel/camel-stream.c deleted file mode 100644 index 26c346e1e5..0000000000 --- a/camel/camel-stream.c +++ /dev/null @@ -1,227 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-stream.c : abstract class for a stream */ - - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel-stream.h" - -static GtkObjectClass *parent_class = NULL; - - -/* Returns the class for a CamelMimeMessage */ -#define CS_CLASS(so) CAMEL_STREAM_CLASS (GTK_OBJECT(so)->klass) - -static void -default_camel_flush (CamelStream *stream) -{ - /* nothing */ -} - -static void -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) -{ - - parent_class = gtk_type_class (gtk_object_get_type ()); - - /* virtual method definition */ - camel_stream_class->read = NULL; - camel_stream_class->write = NULL; - camel_stream_class->flush = default_camel_flush; - 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 */ -} - -GtkType -camel_stream_get_type (void) -{ - static GtkType camel_stream_type = 0; - - if (!camel_stream_type) { - GtkTypeInfo camel_stream_info = - { - "CamelStream", - sizeof (CamelStream), - sizeof (CamelStreamClass), - (GtkClassInitFunc) camel_stream_class_init, - (GtkObjectInitFunc) NULL, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_stream_type = gtk_type_unique (gtk_object_get_type (), &camel_stream_info); - } - - return camel_stream_type; -} - -/** - * camel_stream_read: - * @stream: a CamelStream. - * @buffer: buffer where bytes pulled from the stream are stored. - * @n: max number of bytes to read. - * - * Read at most @n bytes from the @stream object and stores them - * in the buffer pointed at by @buffer. - * - * Return value: number of bytes actually read. - **/ -gint -camel_stream_read (CamelStream *stream, gchar *buffer, gint n) -{ - return CS_CLASS (stream)->read (stream, buffer, n); -} - -/** - * camel_stream_write: - * @stream: a CamelStream object. - * @buffer: buffer to write. - * @n: number of bytes to write - * - * Write @n bytes from the buffer pointed at by @buffer into @stream. - * - * Return value: the number of bytes actually written - * in the stream. - **/ -gint -camel_stream_write (CamelStream *stream, const gchar *buffer, gint n) -{ - return CS_CLASS (stream)->write (stream, buffer, n); -} - -/** - * camel_stream_flush: - * @stream: a CamelStream object - * - * Flushes the contents of the stream to its backing store. - **/ -void -camel_stream_flush (CamelStream *stream) -{ - CS_CLASS (stream)->flush (stream); -} - -/** - * camel_stream_available: - * @stream: a CamelStream object - * - * Return value: the number of bytes available. - **/ -gint -camel_stream_available (CamelStream *stream) -{ - return CS_CLASS (stream)->available (stream); -} - -/** - * camel_stream_eos: - * @stream: a CamelStream object - * - * Test if there are bytes left to read on the @stream object. - * - * Return value: %TRUE if all the contents on the stream has been read, or - * %FALSE if information is still available. - **/ -gboolean -camel_stream_eos (CamelStream *stream) -{ - return CS_CLASS (stream)->eos (stream); -} - - -/** - * camel_stram_close: - * @stream: a CamelStream object. - * - * Close the @stream object. - **/ -void -camel_stream_close (CamelStream *stream) -{ - CS_CLASS (stream)->close (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 ********************/ - -/** - * came_stream_write_strings: - * @stream: a CamelStream object. - * @...: A %NULL terminated list of strings. - * - * This is a utility function that writes the list of - * strings into the @stream object. - */ -void -camel_stream_write_strings (CamelStream *stream, ... ) -{ - va_list args; - const char *string; - - va_start(args, stream); - string = va_arg (args, const char *); - - while (string) { - camel_stream_write_string (stream, string); - string = va_arg (args, char *); - } - va_end (args); -} diff --git a/camel/camel-stream.h b/camel/camel-stream.h deleted file mode 100644 index b866dd5974..0000000000 --- a/camel/camel-stream.h +++ /dev/null @@ -1,96 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-stream.h : class for an abstract stream */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_STREAM_H -#define CAMEL_STREAM_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> - -#define CAMEL_STREAM_TYPE (camel_stream_get_type ()) -#define CAMEL_STREAM(obj) (GTK_CHECK_CAST((obj), CAMEL_STREAM_TYPE, CamelStream)) -#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 -{ - GtkObject parent_object; - -} CamelStream; - - - -typedef struct { - GtkObjectClass parent_class; - - /* Virtual methods */ - gint (*read) (CamelStream *stream, gchar *buffer, gint n); - gint (*write) (CamelStream *stream, const gchar *buffer, gint n); - void (*flush) (CamelStream *stream); - gint (*available) (CamelStream *stream); - gboolean (*eos) (CamelStream *stream); - void (*close) (CamelStream *stream); - gint (*seek) (CamelStream *stream, gint offset, CamelStreamSeekPolicy policy); -} CamelStreamClass; - - - -/* Standard Gtk function */ -GtkType camel_stream_get_type (void); - - -/* public methods */ -gint camel_stream_read (CamelStream *stream, gchar *buffer, gint n); -gint camel_stream_write (CamelStream *stream, const gchar *buffer, gint n); -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)) - -void camel_stream_write_strings (CamelStream *stream, ... ); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_STREAM_H */ diff --git a/camel/camel-thread-proxy.c b/camel/camel-thread-proxy.c deleted file mode 100644 index 5ff176a7fb..0000000000 --- a/camel/camel-thread-proxy.c +++ /dev/null @@ -1,569 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-folder-pt-proxy.c : proxy folder using posix threads */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel-log.h" -#include "camel-marshal-utils.h" -#include "camel-thread-proxy.h" -#include <pthread.h> -#include <unistd.h> -#include <string.h> -#include <errno.h> - - - -/* vocabulary: - * operation: commanded by the main thread, executed by the child thread - * callback: commanded by the child thread, generally when an operation is - * completed. Executed in the main thread, - */ - -/* needed for proper casts of async funcs when - * calling pthreads_create - */ -typedef void * (*thread_call_func) (void *); - -/* forward declarations */ -static gboolean -_thread_notification_catch (GIOChannel *source, - GIOCondition condition, - gpointer data); - -static void -_notify_availability (CamelThreadProxy *proxy, gchar op_name); - -static int -_init_notify_system (CamelThreadProxy *proxy); - - - -/** - * camel_thread_proxy_new: create a new proxy object - * - * Create a new proxy object. This proxy object can be used - * to run async operations and this operations can trigger - * callbacks. It can also be used to proxy signals. - * - * Return value: The newly created proxy object - **/ -CamelThreadProxy * -camel_thread_proxy_new () -{ - CamelThreadProxy *proxy; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelThreadProxy::new\n"); - - proxy = g_new (CamelThreadProxy, 1); - if (!proxy) - return NULL; - - proxy->server_op_queue = camel_op_queue_new (); - proxy->client_op_queue = camel_op_queue_new (); - proxy->signal_data_cond = g_cond_new(); - proxy->signal_data_mutex = g_mutex_new(); - if (_init_notify_system (proxy) < 0) { - g_free (proxy); - return NULL; - } - CAMEL_LOG_FULL_DEBUG ("Leaving CamelThreadProxy::new\n"); - return proxy; -} - - -/** - * camel_thread_proxy_free: free a proxy object - * @proxy: proxy object to free - * - * free a proxy object - **/ -void -camel_thread_proxy_free (CamelThreadProxy *proxy) -{ - CAMEL_LOG_FULL_DEBUG ("Entering CamelThreadProxy::free\n"); - - g_cond_free (proxy->signal_data_cond); - g_mutex_free (proxy->signal_data_mutex); - camel_op_queue_free (proxy->server_op_queue); - camel_op_queue_free (proxy->client_op_queue); - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelThreadProxy::free\n"); -} - - - - - -/* Operations handling */ - - -/** - * _op_run_free_notify: - * @folder: folder to notify when the operation is completed. - * @op: operation to run. - * - * run an operation, free the operation field - * and then notify the main thread of the op - * completion. - * - * this routine is intended to be called - * in a new thread (in _run_next_op_in_thread) - * - **/ -void -_op_run_free_and_notify (CamelOp *op) -{ - gboolean error; - CamelThreadProxy *th_proxy; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelThreadProxy::_op_run_free_and_notify\n"); - - camel_op_run (op); - camel_op_free (op); - th_proxy = camel_op_get_user_data (op); - _notify_availability (th_proxy, 'a'); - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelThreadProxy::_op_run_free_and_notify\n"); -} - - -/** - * _run_next_op_in_thread: - * @proxy_object: - * - * run the next operation pending in the proxy - * operation queue - **/ -static void -_run_next_op_in_thread (CamelThreadProxy *proxy) -{ - CamelOp *op; - CamelOpQueue *server_op_queue; - CamelThreadProxy *th_proxy; - pthread_t thread; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelThreadProxy::_run_next_op_in_thread\n"); - - server_op_queue = proxy->server_op_queue; - /* get the next pending operation */ - op = camel_op_queue_pop_op (server_op_queue); - if (!op) { - camel_op_queue_set_service_availability (server_op_queue, TRUE); - return; - } - - /* run the operation in a child thread */ - pthread_create (&thread, NULL, (thread_call_func) _op_run_free_and_notify, op); - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelThreadProxy::_run_next_op_in_thread\n"); -} - - - -/** - * camel_thread_proxy_push_op: push an operation in the proxy operation queue - * @proxy: proxy object - * @op: operation to push in the execution queue - * - * if no thread is currently running, executes the - * operation directly, otherwise push the operation - * in the proxy operation queue. - **/ -void -camel_thread_proxy_push_op (CamelThreadProxy *proxy, CamelOp *op) -{ - CamelOpQueue *server_op_queue; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelThreadProxy::camel_thread_proxy_push_op\n"); - - g_assert (proxy); - server_op_queue = proxy->server_op_queue; - - /* put the proxy object in the user data - so that it can be notified when the - operation is completed */ - camel_op_set_user_data (op, (gpointer)proxy); - - /* get next operation */ - camel_op_queue_push_op (server_op_queue, op); - - if (camel_op_queue_get_service_availability (server_op_queue)) { - /* no thread is currently running, run - * the next operation. */ - camel_op_queue_set_service_availability (server_op_queue, FALSE); - /* when the operation is completed in the - child thread the main thread gets - notified and executes next operation - (see _thread_notification_catch, case 'a') - so there is no need to set the service - availability to FALSE except here - */ - _run_next_op_in_thread (proxy); - } - CAMEL_LOG_FULL_DEBUG ("Leaving CamelThreadProxy::camel_thread_proxy_push_op\n"); -} -/** - * _op_run_and_free: Run an operation and free it - * @op: Operation object - * - * Run an operation object in the current thread - * and free it. - **/ -static void -_op_run_and_free (CamelOp *op) -{ - CAMEL_LOG_FULL_DEBUG ("Entering CamelThreadProxy::_op_run_and_free\n"); - camel_op_run (op); - camel_op_free (op); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelThreadProxy::_op_run_and_free\n"); -} - - - - - - -/* Callbacks handling */ - -/** - * _run_next_cb: Run next callback pending in a proxy object - * @proxy: Proxy object - * - * Run next callback in the callback queue of a proxy object - **/ -static void -_run_next_cb (CamelThreadProxy *proxy) -{ - CamelOp *op; - CamelOpQueue *client_op_queue; - CamelThreadProxy *th_proxy; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelThreadProxy::_run_next_cb\n"); - client_op_queue = proxy->client_op_queue; - - /* get the next pending operation */ - op = camel_op_queue_pop_op (client_op_queue); - if (!op) return; - - /* run the operation in the main thread */ - _op_run_and_free (op); - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelThreadProxy::_run_next_cb\n"); -} - - -/** - * camel_thread_proxy_push_cb: push a callback in the client queue - * @proxy: proxy object concerned by the callback - * @cb: callback to push - * - * Push an operation in the client queue, ie the queue - * containing the operations (callbacks) intended to be - * executed in the main thread. - **/ -void -camel_thread_proxy_push_cb (CamelThreadProxy *proxy, CamelOp *cb) -{ - CamelOpQueue *client_op_queue; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelThreadProxy::camel_thread_proxy_push_cb\n"); - client_op_queue = proxy->client_op_queue; - - /* put the proxy object in the user data - so that it can be notified when the - operation is completed */ - camel_op_set_user_data (cb, (gpointer)proxy); - - /* push the callback in the client queue */ - camel_op_queue_push_op (client_op_queue, cb); - - /* tell the main thread a new callback is there */ - _notify_availability (proxy, 'c'); - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelThreadProxy::camel_thread_proxy_push_cb\n"); -} - - - -/** - * _init_notify_system: set the notify channel up - * @proxy: proxy object - * - * called once to set the notification channel up - **/ -static int -_init_notify_system (CamelThreadProxy *proxy) -{ - int filedes[2]; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelThreadProxy::_init_notify_system\n"); - - /* set up the notification channel */ - if (pipe (filedes) < 0) { - CAMEL_LOG_WARNING ("could not create pipe in CamelThreadProxy::_init_notify_system\n"); - CAMEL_LOG_FULL_DEBUG ("Full error message : %s\n", strerror(errno)); - return -1; - } - - - proxy->pipe_client_fd = filedes [0]; - proxy->pipe_server_fd = filedes [1]; - proxy->notify_source = g_io_channel_unix_new (filedes [0]); - proxy->notify_channel = g_io_channel_unix_new (filedes [1]); - - /* the _thread_notification_catch function - * will be called in the main thread when the - * child thread writes some data in the channel */ - g_io_add_watch (proxy->notify_source, G_IO_IN, - _thread_notification_catch, - proxy); - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelThreadProxy::_init_notify_system\n"); - return 1; -} - -/** - * _notify_availability: notify the main thread from an event - * @proxy: proxy object - * @op_name: operation name - * - * called by child thread to notify the main - * thread something is available for him. - * What this thing is depends on @op_name: - * - * 'a' : thread available. That means the thread is ready - * to process an operation. - * 's' : a signal is available. Used by the signal proxy. - * - */ -static void -_notify_availability (CamelThreadProxy *proxy, gchar op_name) -{ - GIOChannel *notification_channel; - guint bytes_written; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelThreadProxy::_notify_availability\n"); - - notification_channel = proxy->notify_channel; - - do { - /* the write operation will trigger the - * watch on the main thread side */ - g_io_channel_write (notification_channel, - &op_name, - 1, - &bytes_written); - } while (bytes_written < 1); - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelThreadProxy::_notify_availability\n"); -} - - - -/* signal proxying */ - - - -/** - * _signal_marshaller_server_side: called in the child thread to proxy a signal - * @object: - * @data: - * @n_args: - * @args: - * - * - **/ -static void -_signal_marshaller_server_side (GtkObject *object, - gpointer data, - guint n_args, - GtkArg *args) -{ - CamelThreadProxy *proxy; - guint signal_id; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelThreadProxy::_signal_marshaller_server_side\n"); - proxy = CAMEL_THREAD_PROXY (gtk_object_get_data (object, "__proxy__")); - signal_id = (guint)data; - g_assert (proxy); - - g_mutex_lock (proxy->signal_data_mutex); - - /* we are going to wait for the main client thread - * to have emitted the last signal we asked him - * to proxy. - */ - while (proxy->signal_data.args) - g_cond_wait (proxy->signal_data_cond, - proxy->signal_data_mutex); - - proxy->signal_data.signal_id = signal_id; - proxy->signal_data.args = args; - - - g_mutex_unlock (proxy->signal_data_mutex); - - /* tell the main thread there is a signal pending */ - _notify_availability (proxy, 's'); - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelThreadProxy::_signal_marshaller_server_side\n"); -} - - -static void -_signal_marshaller_client_side (CamelThreadProxy *proxy) -{ - g_mutex_lock (proxy->signal_data_mutex); - g_assert (proxy->signal_data.args); - - CAMEL_LOG_FULL_DEBUG ("Entering CamelThreadProxy::_signal_marshaller_client_side\n"); - /* emit the pending signal */ - gtk_signal_emitv (GTK_OBJECT (proxy), - proxy->signal_data.signal_id, - proxy->signal_data.args); - - proxy->signal_data.args = NULL; - - /* if waiting for the signal to be treated, - * awake the client thread up - */ - g_cond_signal (proxy->signal_data_cond); - g_mutex_unlock (proxy->signal_data_mutex); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelThreadProxy::_signal_marshaller_client_side\n"); -} - - -/** - * camel_thread_proxy_add_signals: init the signal proxy - * @proxy: proxy - * @proxy_object: Proxy Gtk Object - * @real_object: Real Gtk Object - * @signal_to_proxy: NULL terminated array of signal name - * - * Add some signals to the list of signals to be - * proxied by the proxy object. - * The signals emitted by the real object in the child - * thread are reemited by the proxy object in the - * main thread. - **/ -void -camel_thread_proxy_add_signals (CamelThreadProxy *proxy, - GtkObject *proxy_object, - GtkObject *real_object, - char *signal_to_proxy[]) -{ - GtkType camel_folder_type; - guint i; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelThreadProxy::camel_thread_proxy_init_signals\n"); - - for (i=0; signal_to_proxy[i]; i++) { - /* connect the signal to the signal marshaller - * user_data is the signal id */ - gtk_signal_connect_full (GTK_OBJECT (real_object), - signal_to_proxy[i], - NULL, - _signal_marshaller_server_side, - (gpointer)gtk_signal_lookup (signal_to_proxy[i], - GTK_OBJECT_CLASS (real_object)->type), - NULL, - TRUE, - FALSE); - } - - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelThreadProxy::camel_thread_proxy_init_signals\n"); - - -} - -/**** catch notification from child thread ****/ -/** - * _thread_notification_catch: call by glib loop when data is available on the thread io channel - * @source: - * @condition: - * @data: - * - * called by watch set on the IO channel - * - * Return value: TRUE because we don't want the watch to be removed - **/ -static gboolean -_thread_notification_catch (GIOChannel *source, - GIOCondition condition, - gpointer data) -{ - CamelThreadProxy *proxy = CAMEL_THREAD_PROXY (data); - gchar op_name; - guint bytes_read; - GIOError error; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelThreadProxy::_thread_notification_catch\n"); - - - error = g_io_channel_read (source, - &op_name, - 1, - &bytes_read); - - while ((!error) && (bytes_read == 1)) { - - switch (op_name) { - case 'a': /* the thread is OK for a new operation */ - _run_next_op_in_thread (proxy); - break; - case 's': /* there is a pending signal to proxy */ - _signal_marshaller_client_side (proxy); - break; - case 'c': /* there is a cb pending in the main thread */ - _run_next_cb (proxy); - break; - } - - error = g_io_channel_read (source, - &op_name, - 1, - &bytes_read); - - } - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelThreadProxy::_thread_notification_catch\n"); - - /* do not remove the io watch */ - return TRUE; -} - - - - - - - - - - - diff --git a/camel/camel-thread-proxy.h b/camel/camel-thread-proxy.h deleted file mode 100644 index 9ce7f0e11b..0000000000 --- a/camel/camel-thread-proxy.h +++ /dev/null @@ -1,90 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-folder-pt-proxy.h : proxy folder using posix threads */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_THREAD_PROXY_H -#define CAMEL_THREAD_PROXY_H 1 - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include "camel-op-queue.h" - -#define CAMEL_THREAD_PROXY(o) (CamelThreadProxy *)(o) - - -typedef struct { - guint signal_id; - GtkArg *args; -} CamelThreadProxySignalData; - - -typedef struct { - - GtkObject *real_object; - GtkObject *proxy_object; - - CamelOpQueue *server_op_queue; - CamelOpQueue *client_op_queue; - - - gint pipe_client_fd; - gint pipe_server_fd; - GIOChannel *notify_source; - GIOChannel *notify_channel; - - /* signal proxy */ - GMutex *signal_data_mutex; - GCond *signal_data_cond; - CamelThreadProxySignalData signal_data; - -} CamelThreadProxy; - - -CamelThreadProxy *camel_thread_proxy_new (); -void camel_thread_proxy_free (CamelThreadProxy *proxy); - -void camel_thread_proxy_push_op (CamelThreadProxy *proxy, CamelOp *op); -void camel_thread_proxy_push_cb (CamelThreadProxy *proxy, CamelOp *cb); - -void camel_thread_proxy_add_signals (CamelThreadProxy *proxy, - GtkObject *proxy_object, - GtkObject *real_object, - char *signal_to_proxy[]); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_THREAD_PROXY_H */ - - diff --git a/camel/camel.c b/camel/camel.c deleted file mode 100644 index b6b1012a66..0000000000 --- a/camel/camel.c +++ /dev/null @@ -1,39 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "camel.h" - -gint -camel_init() -{ -#ifdef G_THREADS_ENABLED - g_thread_init (NULL); -#else /* G_THREADS_ENABLED */ - printf ("Threads are not supported by glib\n"); -#endif /* G_THREADS_ENABLED */ - - /* return data_wrapper_repository_init (); */ -} diff --git a/camel/camel.h b/camel/camel.h deleted file mode 100644 index 0e41d32742..0000000000 --- a/camel/camel.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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_H -#define CAMEL_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include <camel/data-wrapper-repository.h> -#include <camel/data-wrapper-repository.h> -#include <camel/camel-log.h> -#include <camel/camel-data-wrapper.h> -#include <camel-simple-data-wrapper.h> -#include <camel-folder.h> -#include <camel-folder-pt-proxy.h> -#include <camel-marshal-utils.h> -#include <camel-mime-body-part.h> -#include <camel-mime-message.h> -#include <camel-mime-part.h> -#include <camel-multipart.h> -#include <camel-op-queue.h> -#include <camel-provider.h> -#include <camel-service.h> -#include <camel-session.h> -#include <camel-store.h> -#include <camel-stream.h> -#include <camel-stream-fs.h> -#include <camel-stream-mem.h> -#include <camel-thread-proxy.h> -#include <data-wrapper-repository.h> -#include <gmime-content-field.h> -#include <gmime-utils.h> -#include <gstring-util.h> -#include <string-utils.h> -#include <url-util.h> - -gint camel_init (); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_H */ diff --git a/camel/data-wrapper-repository.c b/camel/data-wrapper-repository.c deleted file mode 100644 index 7d1b1dc05f..0000000000 --- a/camel/data-wrapper-repository.c +++ /dev/null @@ -1,127 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 "data-wrapper-repository.h" -#include "camel-multipart.h" - - - -static DataWrapperRepository _repository; -static _initialized = -1; -GMimeContentField *_content_field; - - - -/** - * data_wrapper_repository_init: initialize data wrapper repository - * - * initialize the data wrapper repository. When the repository has - * already been initialized, returns -1. - * - * Return value: 1 if correctly initialized returns -1. - **/ -gint -data_wrapper_repository_init () -{ - if (_initialized != -1) return -1; - _repository.mime_links = g_hash_table_new (g_str_hash, g_str_equal); - data_wrapper_repository_set_data_wrapper_type ("multipart", camel_multipart_get_type()); - _content_field = gmime_content_field_new (NULL, NULL); - _initialized = 1; - return 1; -} - -/** - * data_wrapper_repository_set_data_wrapper_type: associate a data wrapper object type to a mime type - * @mime_type: mime type - * @object_type: object type - * - * Associate an object type to a mime type. - **/ -void -data_wrapper_repository_set_data_wrapper_type (const gchar *mime_type, GtkType object_type) -{ - gboolean already_exists; - gchar *old_mime_type; - GtkType old_gtk_type; - - already_exists = g_hash_table_lookup_extended (_repository.mime_links, (gpointer)mime_type, - (gpointer)&old_mime_type, (gpointer)&old_gtk_type); - if (already_exists) - g_hash_table_insert (_repository.mime_links, (gpointer)old_mime_type, (gpointer)object_type); - else - g_hash_table_insert (_repository.mime_links, (gpointer)g_strdup (mime_type), (gpointer)object_type); -} - - - -/** - * data_wrapper_repository_get_data_wrapper_type: get the gtk type object associated to a mime type - * @mime_type: mime type - * - * returns the GtkType of the data wrapper object associated to - * a particular mime type. The mime type must be a character string - * of the form "type/subtype" or simply "type". When the complete - * mime type ("type/subtype") is not associated to any particular - * data wrapper object, this routine looks for a default data wrapper - * for the main mime type ("type"). When no particular association is - * found for this mime type, the type of the SimpleDataWrapper is - * returned. - * - * - * Return value: the associated data wrapper object type. - **/ -GtkType -data_wrapper_repository_get_data_wrapper_type (const gchar *mime_type) -{ - gboolean exists; - gchar *old_mime_type; - GtkType gtk_type; - - /* find if the complete mime type exists */ - exists = g_hash_table_lookup_extended (_repository.mime_links, (gpointer)mime_type, - (gpointer)&old_mime_type, (gpointer)>k_type); - if (exists) /* the complete mime type exists, return it */ - return gtk_type; - else { - /* the complete mime type association does not exists */ - /* is there an association for the main mime type ? */ - gmime_content_field_construct_from_string (_content_field, mime_type); - exists = g_hash_table_lookup_extended (_repository.mime_links, (gpointer)(_content_field->type), - (gpointer)&old_mime_type, (gpointer)>k_type); - - if (exists) /* the main mime type association exists */ - return gtk_type; - else return camel_simple_data_wrapper_get_type(); - } - - - - -} - diff --git a/camel/data-wrapper-repository.h b/camel/data-wrapper-repository.h deleted file mode 100644 index ec73025764..0000000000 --- a/camel/data-wrapper-repository.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 DATA_WRAPPER_REPOSITORY_H -#define DATA_WRAPPER_REPOSITORY_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <glib.h> -#include "camel-data-wrapper.h" - - - -typedef struct { - GHashTable *mime_links; -} DataWrapperRepository; - - -gint data_wrapper_repository_init (); -void data_wrapper_repository_set_data_wrapper_type (const gchar *mime_type, GtkType object_type); -GtkType data_wrapper_repository_get_data_wrapper_type (const gchar *mime_type); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* DATA_WRAPPER_REPOSITORY_H */ diff --git a/camel/gmime-base64.c b/camel/gmime-base64.c deleted file mode 100644 index db784f7143..0000000000 --- a/camel/gmime-base64.c +++ /dev/null @@ -1,97 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Base64 handlers - * - * Author: - * Miguel de Icaza (miguel@kernel.org) - */ -#include <config.h> -#include "gmime-base64.h" - -#define BSIZE 512 - -/* - * 64-based alphabet used by the the Base64 enconding - */ -static char *base64_alphabet = -"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -/** - * gmime_encode_base64: - * @input: The data source to be encoded in base64 format - * @output: Where to put the encoded information in. - * - * This routine encodes the information pulled from @input using - * base64 encoding and stores it on the @output CamelStream object - */ -void -gmime_encode_base64 (CamelStream *input, CamelStream *output) -{ - char buffer [BSIZE]; - char obuf [80]; /* Output is limited to 76 characters, rfc2045 */ - int n, i, j, state; - int keep = 0; - - state = 0; - j = 0; - while ((n = camel_stream_read (input, buffer, sizeof (buffer))) > 0){ - for (i = 0; i < n; i++, state++){ - char c = buffer [i]; - - switch (state % 3){ - case 0: - obuf [j++] = base64_alphabet [c >> 2]; - keep = (c & 3) << 4; - break; - case 1: - obuf [j++] = base64_alphabet [keep | (c >> 4)]; - keep = (c & 0xf) << 2; - break; - case 2: - obuf [j++] = base64_alphabet [keep | (c >> 6)]; - obuf [j++] = base64_alphabet [c & 0x3f]; - break; - } - - if (j == 72){ - obuf [j++] = '\r'; - obuf [j++] = '\n'; - camel_stream_write (output, obuf, j); - j = 0; - } - } - } - - switch (state % 3){ - case 0: - /* full ouput, nothing left to do */ - break; - - case 1: - obuf [j++] = base64_alphabet [keep]; - obuf [j++] = '='; - obuf [j++] = '='; - break; - - case 2: - obuf [j++] = base64_alphabet [keep]; - obuf [j++] = '='; - break; - } - camel_stream_write (output, obuf, j); - camel_stream_flush (output); -} - - -/** - * gmime_decode_base64: - * @input: A buffer in base64 format. - * @output: Destination where the decoded information is stored. - * - * This routine decodes the base64 information pulled from @input - * and stores it on the @output CamelStream object. - */ -void -gmime_decode_base64 (CamelStream *input, CamelStream *output) -{ -} diff --git a/camel/gmime-base64.h b/camel/gmime-base64.h deleted file mode 100644 index 58ddd58722..0000000000 --- a/camel/gmime-base64.h +++ /dev/null @@ -1,16 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Base64 handlers - * - * Author: - * Miguel de Icaza (miguel@kernel.org) - */ - -#ifndef _GMIME_BASE64_H -#define _GMIME_BASE64_H - -#include "camel-stream.h" - -void gmime_encode_base64 (CamelStream *input, CamelStream *output); - -#endif diff --git a/camel/gmime-content-field.c b/camel/gmime-content-field.c deleted file mode 100644 index 0a72246a0d..0000000000 --- a/camel/gmime-content-field.c +++ /dev/null @@ -1,370 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* mime-content_field.c : mime content type field utilities */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "gmime-content-field.h" -#include "string-utils.h" -#include "camel-log.h" -#include <string.h> - - -/** - * gmime_content_field_new: Creates a new GMimeContentField object - * @type: mime type - * @subtype: mime subtype - * - * Creates a GMimeContentField object and initialize it with - * a mime type and a mime subtype. For example, - * gmime_content_field_new ("application", "postcript"); - * will create a content field with complete mime type - * "application/postscript" - * - * Return value: The newly created GMimeContentField object - **/ -GMimeContentField * -gmime_content_field_new (const gchar *type, const gchar *subtype) -{ - GMimeContentField *ctf; - - ctf = g_new (GMimeContentField, 1); - ctf->type = g_strdup (type); - ctf->subtype = g_strdup (subtype); - ctf->parameters = g_hash_table_new (g_str_hash, g_str_equal); - ctf->ref = 1; - - return ctf; -} - - -static void -_free_parameter (gpointer name, gpointer value, gpointer user_data) -{ - g_free (name); - g_free (value); -} - -/** - * gmime_content_field_free: free a GMimeContentField object - * @content_field: GMimeContentField object - * - * This method destroys the object and should be used very carefully. - * Use gmime_content_field_unref instead. - * - **/ -void -gmime_content_field_free (GMimeContentField *content_field) -{ - if (!content_field) return; - - g_hash_table_foreach (content_field->parameters, _free_parameter, NULL); - g_free (content_field->type); - g_free (content_field->subtype); - g_hash_table_destroy (content_field->parameters); - g_free (content_field); -} - -/** - * gmime_content_field_ref: add a reference to a GMimeContentField object - * @content_field: GMimeContentField object - * - * Tell a GMimeContentField object that something holds a reference - * on him. This, coupled with the corresponding - * gmime_content_field_unref() method allow several - * objects to use the same GMimeContentField object. - **/ -void -gmime_content_field_ref (GMimeContentField *content_field) -{ - content_field->ref += 1; -} - -/** - * gmime_content_field_unref: remove a reference to a GMimeContentField object - * @content_field: GMimeContentField object - * - * Tell a GMimeContentField object that something which - * was holding a reference to him does not need it anymore. - * When no more reference exist, the GMimeContentField object - * is freed using gmime_content_field_free(). - * - **/ -void -gmime_content_field_unref (GMimeContentField *content_field) -{ - if (!content_field) return; - - content_field->ref -= 1; - if (content_field->ref <= 0) - gmime_content_field_free (content_field); -} - - - -/** - * gmime_content_field_set_parameter: set a parameter for a GMimeContentField object - * @content_field: content field - * @attribute: parameter name - * @value: paramteter value - * - * set a parameter (called attribute in RFC 2045) of a content field. Meaningfull - * or valid parameters name depend on the content type object. For example, - * gmime_content_field_set_parameter (cf, "charset", "us-ascii"); - * will make sense for a "text/plain" content field but not for a - * "image/gif". This routine does not check parameter validity. - **/ -void -gmime_content_field_set_parameter (GMimeContentField *content_field, const gchar *attribute, const gchar *value) -{ - gboolean attribute_exists; - gchar *old_attribute; - gchar *old_value; - CAMEL_LOG_FULL_DEBUG ("GMimeContentField:: Entering set_parameter\n"); - CAMEL_LOG_FULL_DEBUG ("GMimeContentField:: set_parameter content_field=%p name=%s, value=%s\n", content_field, attribute, value); - attribute_exists = g_hash_table_lookup_extended (content_field->parameters, - attribute, - (gpointer *) &old_attribute, - (gpointer *) &old_value); - /** CHECK THAT : is normal to free pointers before insertion ? **/ - if (attribute_exists) { - g_free (old_value); - g_free (old_attribute); - } - - g_hash_table_insert (content_field->parameters, g_strdup (attribute), g_strdup (value)); - CAMEL_LOG_FULL_DEBUG ("GMimeContentField:: Leaving set_parameter\n"); -} - - -/** - * _print_parameter: print a parameter/value pair to a stream as described in RFC 2045 - * @name: name of the parameter - * @value: value of the parameter - * @user_data: CamelStream object to write the text to. - * - * - **/ -static void -_print_parameter (gpointer name, gpointer value, gpointer user_data) -{ - CamelStream *stream = (CamelStream *)user_data; - - camel_stream_write_strings (stream, - "; \n ", - (gchar *)name, - "=", - (gchar *)value, - NULL); - -} - -/** - * gmime_content_field_write_to_stream: write a mime content type to a stream - * @content_field: content type object - * @stream: the stream - * - * - **/ -void -gmime_content_field_write_to_stream (GMimeContentField *content_field, CamelStream *stream) -{ - if (!content_field) return; - - g_assert (stream); - if (content_field->type) { - camel_stream_write_strings (stream, "Content-Type: ", content_field->type, NULL); - if (content_field->subtype) { - camel_stream_write_strings (stream, "/", content_field->subtype, NULL); - } - /* print all parameters */ - g_hash_table_foreach (content_field->parameters, _print_parameter, stream); - camel_stream_write_string (stream, "\n"); - } else CAMEL_LOG_FULL_DEBUG ("GMimeContentField::write_to_stream no mime type found\n"); -} - -/** - * gmime_content_field_get_mime_type: return the mime type of the content field object - * @content_field: content field object - * - * A RFC 2045 content type field contains the mime type in the - * form "type/subtype" (example : "application/postscript") and some - * parameters (attribute/value pairs). This routine returns the mime type - * in a gchar object. - * - * Return value: the mime type in the form "type/subtype" or NULL if not defined. - **/ -gchar * -gmime_content_field_get_mime_type (GMimeContentField *content_field) -{ - gchar *mime_type; - - if (!content_field->type) return NULL; - - if (content_field->subtype) - mime_type = g_strdup_printf ("%s/%s", content_field->type, content_field->subtype); - else - mime_type = g_strdup (content_field->type); - return mime_type; -} - -static void -___debug_print_parameter (gpointer name, gpointer value, gpointer user_data) -{ - - printf ("****** parameter \"%s\"=\"%s\"\n", (gchar *)name, (gchar *)value); - -} - -/** - * gmime_content_field_get_parameter: return the value of a mime type parameter - * @content_field: content field object - * @name: name of the parameter - * - * Returns the value of a parameter contained in the content field - * object. The content type is formed of a mime type, a mime subtype, - * and a parameter list. Each parameter is a name/value pair. This - * routine returns the value assiciated to a given name. - * When the parameter does not exist, NULL is returned. - * - * Return value: parameter value, or NULL if not found. - **/ -const gchar * -gmime_content_field_get_parameter (GMimeContentField *content_field, const gchar *name) -{ - const gchar *parameter; - const gchar *old_name; - gboolean parameter_exists; - - CAMEL_LOG_FULL_DEBUG ("Entering GMimeContentField::get_parameter content_field =%p\n", content_field); - g_assert (content_field->parameters); - g_assert (name); - CAMEL_LOG_FULL_DEBUG ("GMimeContentField::get_parameter looking for parameter \"%s\"\n", name); - /* parameter = (const gchar *)g_hash_table_lookup (content_field->parameters, name); */ - parameter_exists = g_hash_table_lookup_extended (content_field->parameters, - name, - (gpointer *) &old_name, - (gpointer *) ¶meter); - if (!parameter_exists) { - CAMEL_LOG_FULL_DEBUG ("GMimeContentField::get_parameter, parameter not found\n"); - g_hash_table_foreach (content_field->parameters, ___debug_print_parameter, NULL); - return NULL; - } - CAMEL_LOG_FULL_DEBUG ("Leaving GMimeContentField::get_parameter\n"); - return parameter; -} - - - - -/** - * gmime_content_field_construct_from_string: construct a ContentType object by parsing a string. - * - * @content_field: content type object to construct - * @string: string containing the content type field - * - * Parse a string containing a content type field as defined in - * RFC 2045, and construct the corresponding ContentType object. - * The string is not modified and not used in the ContentType - * object. It can and must be freed by the calling part. - **/ -void -gmime_content_field_construct_from_string (GMimeContentField *content_field, const gchar *string) -{ - gint first, len; - gchar *str; - gint i=0; - gchar *type, *subtype; - gchar *param_name, *param_value; - gboolean param_end; - - CAMEL_LOG_TRACE ( "GMimeContentField::construct_from_string, entering\n"); - g_assert (string); - g_assert (content_field); - - g_free (content_field->type); - g_free (content_field->subtype); - - - first = 0; - len = strlen (string); - if (!len) return; - CAMEL_LOG_FULL_DEBUG ("GMimeContentField::construct_from_string, All checks done\n"); - - /* find the type */ - while ( (i<len) && (!strchr ("/;", string[i])) ) i++; - - if (i == 0) return; - - type = g_strndup (string, i); - string_trim (type, " \t", STRING_TRIM_STRIP_TRAILING | STRING_TRIM_STRIP_LEADING); - content_field->type = type; - CAMEL_LOG_TRACE ( "GMimeContentField::construct_from_string, Found mime type : \"%s\"\n", type); - if (i >= len-1) { - content_field->subtype = NULL; - return; - } - - first = i+1; - /* find the subtype, if any */ - if (string[i++] == '/') { - while ( (i<len) && (string[i] != ';') ) i++; - if (i != first) { - subtype = g_strndup (string+first, i-first); - string_trim (subtype, " \t", STRING_TRIM_STRIP_TRAILING | STRING_TRIM_STRIP_LEADING); - content_field->subtype = subtype; - CAMEL_LOG_TRACE ( "GMimeContentField::construct_from_string, Found mime subtype: \"%s\"\n", subtype); - if (i >= len-1) return; - } - } - first = i+1; - - /* parse parameters list */ - param_end = FALSE; - do { - while ( (i<len) && (string[i] != '=') ) i++; - if ((i == len) || (i==first)) param_end = TRUE; - else { - /* we have found parameter name */ - param_name = g_strndup (string+first, i-first); - string_trim (param_name, " ", STRING_TRIM_STRIP_TRAILING | STRING_TRIM_STRIP_LEADING); - i++; - first = i; - /* Let's find parameter value */ - while ( (i<len) && (string[i] != ';') ) i++; - if (i != first) param_value = g_strndup (string+first, i-first); - else param_value = g_strdup (""); - CAMEL_LOG_TRACE ( "GMimeContentField::construct_from_string, Found mime parameter \"%s\"=\"%s\"\n", param_name, param_value); - string_trim (param_value, " \t", STRING_TRIM_STRIP_TRAILING | STRING_TRIM_STRIP_LEADING); - gmime_content_field_set_parameter (content_field, param_name, param_value); - g_free (param_name); - g_free (param_value); - i++; - first = i; - } - } while ((!param_end) && (first < len)); - - -} - diff --git a/camel/gmime-content-field.h b/camel/gmime-content-field.h deleted file mode 100644 index 7558e4b735..0000000000 --- a/camel/gmime-content-field.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* mime-content_field.h : mime content type field utilities */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 GMIME_CONTENT_FIELD_H -#define GMIME_CONTENT_FIELD_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <glib.h> -#include <stdio.h> -#include "camel-stream.h" - -typedef struct { - - gchar *type; - gchar *subtype; - GHashTable *parameters; - - gint ref; - -} GMimeContentField; - -GMimeContentField *gmime_content_field_new (const gchar *type, const gchar *subtype); -void gmime_content_field_ref (GMimeContentField *content_field); -void gmime_content_field_unref (GMimeContentField *content_field); - -void gmime_content_field_set_parameter (GMimeContentField *content_field, const gchar *attribute, const gchar *value); -void gmime_content_field_write_to_stream (GMimeContentField *content_field, CamelStream *stream); -void gmime_content_field_construct_from_string (GMimeContentField *content_field, const gchar *string); -void gmime_content_field_free (GMimeContentField *content_field); -gchar * gmime_content_field_get_mime_type (GMimeContentField *content_field); -const gchar *gmime_content_field_get_parameter (GMimeContentField *content_field, const gchar *name); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* GMIME_CONTENT_FIELD_H */ diff --git a/camel/gmime-rfc2047.c b/camel/gmime-rfc2047.c deleted file mode 100644 index 8dad887849..0000000000 --- a/camel/gmime-rfc2047.c +++ /dev/null @@ -1,491 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* gmime-rfc2047.c: implemention of RFC2047 */ - -/* - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 - * - */ - -/* - * Authors: Robert Brady <rwb197@ecs.soton.ac.uk> - */ - -#include <stdio.h> -#include <ctype.h> -#include <unicode.h> -#include <string.h> - -#include "gmime-rfc2047.h" - -#define NOT_RANKED -1 - -/* This should be changed ASAP to use the base64 code Miguel comitted */ - -const char *base64_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -static unsigned char base64_rank[256]; -static int base64_rank_table_built; -static void build_base64_rank_table (void); - -static int -hexval (gchar c) { - if (isdigit (c)) return c-'0'; - c = tolower (c); - return c - 'a' + 10; -} - -static gchar * -decode_quoted (const gchar *text, const gchar *end) -{ - gchar *to = malloc(end - text + 1), *to_2 = to; - - if (!to) return NULL; - while (*text && text < end) { - if (*text == '=') { - gchar a = hexval (text[1]); - gchar b = hexval (text[2]); - int c = (a << 4) + b; - *to = c; - to++; - text+=3; - } else if (*text == '_') { - *to = ' '; - to++; - text++; - } else { - *to = *text; - to++; - text++; - } - } - return to_2; -} - -static gchar * -decode_base64 (const gchar *data, const gchar *end) -{ - unsigned short pattern = 0; - int bits = 0; - int delimiter = '='; - gchar x; - gchar *buffer = g_malloc((end - data) * 3); - gchar *t = buffer; - int Q = 0; - - if (!buffer) return NULL; - - while (*data != delimiter) { - x = base64_rank[(unsigned char)(*data++)]; - if (x == NOT_RANKED) - continue; - pattern <<= 6; - pattern |= x; - bits += 6; - if (bits >= 8) { - x = (pattern >> (bits - 8)) & 0xff; - *t++ = x; - Q++; - bits -= 8; - } - } - *t = 0; - return buffer; -} - -static void -build_base64_rank_table (void) -{ - int i; - - if (!base64_rank_table_built) { - for (i = 0; i < 256; i++) - base64_rank[i] = NOT_RANKED; - for (i = 0; i < 64; i++) - base64_rank[(int) base64_alphabet[i]] = i; - base64_rank_table_built = 1; - } -} - - -static gchar * -rfc2047_decode_word (const gchar *data, const gchar *into_what) -{ - const char *charset = strstr (data, "=?"), *encoding, *text, *end; - - char *buffer, *b, *cooked_data; - - buffer = g_malloc (strlen(data) * 2); - b = buffer; - - if (!charset) return strdup (data); - charset+=2; - - encoding = strchr (charset, '?'); - if (!encoding) return strdup (data); - encoding++; - - text = strchr(encoding, '?'); - if (!text) return strdup (data); - text++; - - end = strstr(text, "?="); - if (!end) return strdup (data); - - b[0] = 0; - - if (toupper(*encoding)=='Q') - cooked_data = decode_quoted (text, end); - else if (toupper (*encoding)=='B') - cooked_data = decode_base64 (text, end); - else - return g_strdup(data); - - { - char *c = strchr (charset, '?'); - char *q = g_malloc (c - charset + 1); - char *cook_2 = cooked_data; - int cook_len = strlen (cook_2); - int b_len = 4096; - unicode_iconv_t i; - strncpy (q, charset, c - charset); - q[c - charset] = 0; - i = unicode_iconv_open (into_what, q); - if (!i) { - g_free (q); - return g_strdup (buffer); - } - if (unicode_iconv (i, &cook_2, &cook_len, &b, &b_len)==-1) - /* FIXME : use approximation code if we can't convert it properly. */ - ; - unicode_iconv_close (i); - *b = 0; - } - - return g_strdup (buffer); -} - -static const gchar * -find_end_of_encoded_word (const gchar *data) -{ - /* We can't just search for ?=, - because of the case : - "=?charset?q?=ff?=" :( */ - if (!data) return NULL; - data = strstr (data, "=?"); - if (!data) return NULL; - data = strchr(data+2, '?'); - if (!data) return NULL; - data = strchr (data+1, '?'); - if (!data) return NULL; - data = strstr (data+1, "?="); - if (!data) return NULL; - return data + 2; -} - -gchar * -gmime_rfc2047_decode (const gchar *data, const gchar *into_what) -{ - char *buffer = malloc (strlen(data) * 4), *b = buffer; - - int was_encoded_word = 0; - - build_base64_rank_table (); - - while (data && *data) { - char *word_start = strstr (data, "=?"), *decoded; - if (!word_start) { - strcpy (b, data); - b[strlen (data)] = 0; - return buffer; - } - if (word_start != data) { - - if (strspn (data, " \t\n\r") != (word_start - data)) { - strncpy (b, data, word_start - data); - b += word_start - data; - *b = 0; - } - } - decoded = rfc2047_decode_word (word_start, into_what); - strcpy (b, decoded); - b += strlen (decoded); - *b = 0; - g_free (decoded); - - data = find_end_of_encoded_word (data); - } - - *b = 0; - return buffer; -} - -#define isnt_ascii(a) ((a) <= 0x1f || (a) >= 0x7f) - -static int -rfc2047_clean (const gchar *string, const gchar *max) -{ - /* if (strstr (string, "?=")) return 1; */ - while (string < max) { - if (isnt_ascii ((unsigned char)*string)) - return 0; - string++; - } - return 1; -} - -static gchar * -encode_word (const gchar *string, int length, const gchar *said_charset) -{ - const gchar *max = string + length; - if (rfc2047_clean(string, max)) { - /* don't bother encoding it if it has no odd characters in it */ - return g_strndup (string, length); - } - { - char *temp = malloc (length * 4 + 1), *t = temp; - t += sprintf (t, "=?%s?q?", said_charset); - while (string < max) { - if (*string == ' ') - *(t++) = '_'; - else if ((*string <= 0x1f) || (*string >= 0x7f) || (*string == '=') || (*string == '?')) - t += sprintf (t, "=%2x", (unsigned char)*string); - else - *(t++) = *string; - - string++; - } - t += sprintf (t, "?="); - *t = 0; - return temp; - } -} - -static int -words_in(char *a) -{ - int words = 1; - while (*a) { - if (*(a++)==' ') - words++; - } - return words; -} - -struct word_data { - const char *word; - int word_length; - const char *to_encode_in; - char *encoded; - enum { - wt_None, - wt_Address, - } type; -}; - -static int string_can_fit_in(const char *a, int length, const char *charset) -{ - while (length--) { - if (*a < 0x1f || *a >= 0x7f) return 0; - a++; - } - return 1; -} - -static void -show_entry(struct word_data *a) -{ - a->type = wt_None; - - if (string_can_fit_in(a->word, a->word_length, "US-ASCII")) - a->to_encode_in = "US-ASCII"; - - if (a->word[0]=='<' && a->word[a->word_length-1]=='>') { - a->type = wt_Address; - } -} - -static void -break_into_words(const char *string, struct word_data *a, int words) -{ - int i; - for (i=0;i<words;i++) { - - char *next_space = strchr(string, ' '); - - if (!next_space) { - a[i].word = string; - a[i].word_length = strlen(string); - a[i].to_encode_in = NULL; /* i.e. the default */ - - show_entry(a+i); - - return; - } - - a[i].word = string; - a[i].word_length = next_space - string; - a[i].to_encode_in = NULL; - - show_entry(a+i); - - string = next_space + 1; - - } -} - -static void -join_words(struct word_data *a, int words) -{ - int i; - for (i=(words-1);i>0;i--) { - if (a[i].to_encode_in == a[i-1].to_encode_in) { - a[i-1].word_length += 1 + a[i].word_length; - a[i].word = 0; - a[i].word_length = 0; - } - - } -} - -static void show_words(struct word_data *words, int count) -{ - int i; - for (i=0;i<count;i++) - if (words[i].word) - show_entry(words+i); -} - -gchar * -gmime_rfc2047_encode (const gchar *string, const gchar *charset) -{ - int temp_len = strlen (string)*4 + 1, word_count; - char *temp = g_malloc (temp_len), *temp_2 = temp; - int string_length = strlen (string); - char *encoded = NULL, *p; - struct word_data *words; - - /* first, let us convert to UTF-8 */ - unicode_iconv_t i = unicode_iconv_open ("UTF-8", charset); - unicode_iconv (i, &string, &string_length, &temp_2, &temp_len); - unicode_iconv_close (i); - - /* null terminate it */ - *temp_2 = 0; - - /* now encode it as if it were a single word */ - - word_count = words_in ( temp ); - - words = g_malloc(sizeof (struct word_data) * word_count); - break_into_words(temp, words, word_count); - - join_words(words, word_count); - - show_words(words, word_count); - - { - size_t len = 0; - int c = 0; - for (c = 0;c<word_count;c++) { - if (words[c].word) - { - words[c].encoded = encode_word(words[c].word, words[c].word_length, - words[c].to_encode_in ? words[c].to_encode_in : - "UTF-8"); - len += strlen(words[c].encoded) + 1; - } - } - - { - encoded = g_malloc(len+1); - p = encoded; - for (c = 0; c < word_count;c++) if (words[c].word) { - strcpy(p, words[c].encoded); - p += strlen(p); - strcpy(p, " "); - p++; - } - *p = 0; - } - } - - - /* - - real algorithm : - - we need to - - split it into words - - identify portions that have NOT to be encoded (i.e. <> and the comment starter/ender ) - - identify the best character set for each word - - merge words which share a character set, allow jumping and merging with words which - would be ok to encode in non-US-ASCII. - - if we have to use 2 character sets, try and collapse them into one. - - (e.g. if one word contains letters in latin-1, and another letters in latin-2, use - latin-2 for the first word as well if possible). - - finally : - - if utf-8 will still be used, use it for everything. - - and then, at last, generate the encoded text, using base64/quoted-printable for - each word depending upon which is more efficient. - - TODO : - create a priority list of encodings - - i.e. - - US-ASCII, ISO-8859-1, ISO-8859-2, ISO-8859-3, KOI8, - - Should survey for most popular charsets : - what do people usually use for the following scripts? - - * Chinese/Japanese/Korean - * Greek - * Cyrillic - - (any other scripts commonly used in mail/news?) - - This algorithm is probably far from optimal, but should be - reasonably efficient for simple cases. (and almost free if - the text is just in US-ASCII : like 99% of the text that will - pass through it) - - - - current status : - - Algorithm now partially implemented. - - */ - - g_free(words); - g_free(temp); - - return encoded; -} diff --git a/camel/gmime-rfc2047.h b/camel/gmime-rfc2047.h deleted file mode 100644 index 6efd8cc243..0000000000 --- a/camel/gmime-rfc2047.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* gmime-rfc2047.c: implemention of RFC2047 */ - -/* - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 - * - */ - -/* - * Authors: Robert Brady <rwb197@ecs.soton.ac.uk> - */ - -#ifndef GMIME_RFC2047_H -#define GMIME_RFC2047_H 1 -#include <glib.h> - -gchar *gmime_rfc2047_decode (const gchar *text, const gchar* charset); -gchar *gmime_rfc2047_encode (const gchar *text, const gchar* charset); - -/* - * pass text and charset, (e.g. "UTF-8", or "ISO-8859-1"), and - * it will encode or decode text according to RFC2047 - * - * You will need to link with libunicode for these. - * - * TODO : Make it so that if charset==NULL, the charset specified (either - * implicitly or explicity) in the locale is used. - * - * TODO : Run torture tests and fix the buffer overruns in these functions. - * - * The caller will need to free the memory for the string. - */ - -#endif /* GMIME_RFC2047_H */ diff --git a/camel/gmime-utils.c b/camel/gmime-utils.c deleted file mode 100644 index e703e877e9..0000000000 --- a/camel/gmime-utils.c +++ /dev/null @@ -1,268 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* mime-utils.c : misc utilities for mime */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "gmime-utils.h" -#include "string-utils.h" -#include "camel-log.h" -#include "camel-stream.h" - -void -gmime_write_header_pair_to_stream (CamelStream *stream, const gchar* name, const gchar *value) -{ - - gchar *strtmp; - - CAMEL_LOG_FULL_DEBUG ( "gmime_write_header_pair_to_stream:: Entering\n"); - g_assert(name); - - if (!value) return; - strtmp = g_strdup_printf ("%s: %s\n", name, value); - - camel_stream_write_string (stream, strtmp); - CAMEL_LOG_FULL_DEBUG ( "gmime_write_header_pair_to_stream:\n writing %s\n", strtmp); - - g_free (strtmp); - CAMEL_LOG_FULL_DEBUG ( "gmime_write_header_pair_to_stream:: Leaving\n"); - -} - - -static void -_write_one_header_to_stream (gpointer key, gpointer value, gpointer user_data) -{ - gchar *header_name = (gchar *)key; - gchar *header_value = (gchar *)value; - CamelStream *stream = (CamelStream *)user_data; - - CAMEL_LOG_FULL_DEBUG ( "_write_one_header_to_stream:: Entering\n"); - if ((header_name) && (header_value)) - gmime_write_header_pair_to_stream (stream, header_name, header_value); - CAMEL_LOG_FULL_DEBUG ( "_write_one_header_to_stream:: Leaving\n"); -} - -void -gmime_write_header_table_to_stream (CamelStream *stream, GHashTable *header_table) -{ - CAMEL_LOG_FULL_DEBUG ( "write_header_table_to_stream:: Entering\n"); - g_hash_table_foreach (header_table, - _write_one_header_to_stream, - (gpointer)stream); - CAMEL_LOG_FULL_DEBUG ( "write_header_table_to_stream:: Leaving\n"); -} - - -void -gmime_write_header_with_glist_to_stream (CamelStream *stream, - const gchar *header_name, - GList *header_values, - const gchar *separator) -{ - - gchar *current; - - CAMEL_LOG_FULL_DEBUG ( "write_header_with_glist_to_stream:: entering\n"); - if ( (header_name) && (header_values) ) - { - gboolean first; - - camel_stream_write (stream, header_name, strlen (header_name) ); - camel_stream_write (stream, ": ", 2); - first = TRUE; - while (header_values) { - current = (gchar *)header_values->data; - if (current) { - if (!first) camel_stream_write_string (stream, separator); - else first = FALSE; - camel_stream_write (stream, current, strlen (current)); - } - header_values = g_list_next (header_values); - } - camel_stream_write (stream, "\n", 1); - } - CAMEL_LOG_FULL_DEBUG ("write_header_with_glist_to_stream:: leaving\n"); - -} - - - - - -/* * * * * * * * * * * */ -/* scanning functions */ - -static void -_store_header_pair_from_string (GArray *header_array, gchar *header_line) -{ - gchar dich_result; - gchar *header_name, *header_value; - Rfc822Header header; - - CAMEL_LOG_FULL_DEBUG ( "_store_header_pair_from_string:: Entering\n"); - - g_assert (header_array); - g_return_if_fail (header_line); - - - if (header_line) { - dich_result = string_dichotomy ( header_line, ':', - &header_name, &header_value, - STRING_DICHOTOMY_NONE); - if (dich_result != 'o') { - CAMEL_LOG_WARNING ( - "** WARNING **\n" - "store_header_pair_from_string : dichotomy result is '%c'\n" - "header line is :\n--\n%s\n--\n" - "** \n", dich_result, header_line); - if (header_name) - g_free (header_name); - if (header_value) - g_free (header_value); - - } else { - string_trim (header_value, " \t", - STRING_TRIM_STRIP_LEADING | STRING_TRIM_STRIP_TRAILING); - - header.name = header_name; - header.value = header_value; - g_array_append_val (header_array, header); - } - } - - CAMEL_LOG_FULL_DEBUG ( "_store_header_pair_from_string:: Leaving\n"); - -} - - - - -GArray * -get_header_array_from_stream (CamelStream *stream) -{ -#warning Correct Lazy Implementation - /* should not use GString. */ - /* should read the header line by line */ - /* and not char by char */ - gchar next_char; - gint nb_char_read; - - gboolean crlf = FALSE; - gboolean end_of_header_line = FALSE; - gboolean end_of_headers = FALSE; - gboolean end_of_file = FALSE; - - GString *header_line=NULL; - gchar *str_header_line; - - GArray *header_array; - - - CAMEL_LOG_FULL_DEBUG ( "gmime-utils:: Entering get_header_table_from_stream\n"); - header_array = g_array_new (FALSE, FALSE, sizeof (Rfc822Header)); - - nb_char_read = camel_stream_read (stream, &next_char, 1); - do { - header_line = g_string_new (""); - end_of_header_line = FALSE; - crlf = FALSE; - - /* read a whole header line */ - do { - if (nb_char_read>0) { - switch (next_char) { - - case '\n': /* a blank line means end of headers */ - if (crlf) { - end_of_headers=TRUE; - end_of_header_line = TRUE; - } - else crlf = TRUE; - break; - case ' ': - case '\t': - if (crlf) { - crlf = FALSE; - next_char = ' '; - } - - default: - if (!crlf) header_line = g_string_append_c (header_line, next_char); - else end_of_header_line = TRUE; - } - } else { - end_of_file=TRUE; - end_of_header_line = TRUE; - } - /* if we have read a whole header line, we have also read - the first character of the next line to be sure the - crlf was not followed by a space or a tab char */ - if (!end_of_header_line) nb_char_read = camel_stream_read (stream, &next_char, 1); - - } while ( !end_of_header_line ); - if ( strlen(header_line->str) ) { - /* str_header_line = g_strdup (header_line->str); */ - _store_header_pair_from_string (header_array, header_line->str); - } - g_string_free (header_line, FALSE); - - } while ( (!end_of_headers) && (!end_of_file) ); - - CAMEL_LOG_FULL_DEBUG ( "gmime-utils:: Leaving get_header_table_from_stream\n"); - return header_array; -} - - -gchar * -gmime_read_line_from_stream (CamelStream *stream) -{ - GString *new_line; - gchar *result; - gchar next_char; - gboolean end_of_line = FALSE; - gboolean end_of_stream = FALSE; - gint nb_char_read; - - new_line = g_string_new (""); - do { - nb_char_read = camel_stream_read (stream, &next_char, 1); - if (nb_char_read>0) { - switch (next_char) { - case '\n': - end_of_line = TRUE; - /* g_string_append_c (new_line, next_char); */ - break; - default: - g_string_append_c (new_line, next_char); - } - } else end_of_stream = TRUE; - } while (!end_of_line && !end_of_stream); - - if (!end_of_stream) - result = g_strdup (new_line->str); - else result=NULL; - g_string_free (new_line, TRUE); - return result; -} diff --git a/camel/gmime-utils.h b/camel/gmime-utils.h deleted file mode 100644 index 2e0682fcf9..0000000000 --- a/camel/gmime-utils.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* mime-utils.h : misc utilities for mime */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 GMIME_UTILS_H -#define GMIME_UTILS_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <glib.h> -#include <stdio.h> -#include <camel-stream.h> - -typedef struct -{ - gchar *name; - gchar *value; - -} Rfc822Header; - - -void gmime_write_header_pair_to_stream (CamelStream *stream, - const gchar* name, - const gchar *value); - -void gmime_write_header_table_to_stream (CamelStream *stream, - GHashTable *header_table); - -void gmime_write_header_with_glist_to_stream (CamelStream *stream, - const gchar *header_name, - GList *header_values, - const gchar *separator); - -GArray *get_header_array_from_stream (CamelStream *stream); -gchar *gmime_read_line_from_stream (CamelStream *stream); - - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* GMIME_UTILS_H */ diff --git a/camel/gstring-util.c b/camel/gstring-util.c deleted file mode 100644 index 9794696c95..0000000000 --- a/camel/gstring-util.c +++ /dev/null @@ -1,343 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* gstring-util : utilities for gstring object */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "gstring-util.h" -#include "camel-log.h" -#include <string.h> - -/** - * g_string_equals : test if two string are equal - * - * @string1 : first string - * @string2 : second string - * - * @Return Value : true if the strings equal, false otherwise - **/ -gboolean -g_string_equals (GString *string1, GString *string2) -{ - g_assert (string1); - g_assert (string2); - return !strcmp (string1->str, string2->str); -} - - - - -/** - * g_string_clone : clone a GString - * - * @string : the string to clone - * - * @Return Value : the clone ... - **/ -GString * -g_string_clone (GString *string) -{ - return g_string_new (g_strdup (string->str) ); -} - - - - -/** - * g_string_dichotomy: - * @sep : separator - * @prefix: pointer to be field by the prefix object - * the prefix is not returned when the given pointer is NULL - * @suffix: pointer to be field by the suffix object - * the suffix is not returned when the given pointer is NULL - * - * Return the strings before and/or after - * the last occurence of the specified separator - * - * This routine returns the string before and/or after - * a character given as an argument. - * if the separator is the last character, prefix and/or - * suffix is set to NULL and result is set to 'l' - * if the separator is not in the list, prefix and/or - * suffix is set to NULL and result is set to 'n' - * When the operation succedeed, the return value is 'o' - * - * @Return Value : result of the operation ('o', 'l' or 'n') - * - **/ -gchar -g_string_dichotomy (GString *string, gchar sep, GString **prefix, GString **suffix, - GStringDichotomyOption options) -{ - gchar *str, *tmp; - gint pos, len, first; - - CAMEL_LOG_FULL_DEBUG (\ - "Entering string_dichotomy: \n\tseparator=%c \n\tprefix=%p \n\tsuffix=%p \n\toptions=%ld\n",\ - sep, prefix, suffix, options); - g_assert (tmp=string->str); - len = strlen (tmp); - if (!len) { - if (prefix) - *prefix=NULL; - if (suffix) - *suffix=NULL; - CAMEL_LOG_FULL_DEBUG ("string_dichotomy: string is empty\n"); - return 'n'; - } - first = 0; - - if ((options & GSTRING_DICHOTOMY_STRIP_LEADING ) && (tmp[first] == sep) ) - do {first++;} while ( (first<len) && (tmp[first] == sep) ); - - if (options & GSTRING_DICHOTOMY_STRIP_TRAILING ) - while (tmp[len-1] == sep) - len--; - - if (first==len) { - if (prefix) *prefix=NULL; - if (suffix) *suffix=NULL; - CAMEL_LOG_FULL_DEBUG ("string_dichotomy: after stripping, string is empty\n"); - return 'n'; - } - - if (options & GSTRING_DICHOTOMY_RIGHT_DIR) { - pos = len; - - do { - pos--; - } while ((pos>=first) && (tmp[pos]!=sep)); - } else { - pos = first; - do { - pos++; - } while ((pos<len) && (tmp[pos]!=sep)); - - } - - if ( (pos<first) || (pos>=len) ) - { - if (suffix) *suffix=NULL; - if (prefix) *prefix=NULL; - CAMEL_LOG_FULL_DEBUG ("string_dichotomy: separator not found\n"); - return 'n'; - } - - /* if we have stripped trailing separators, we should */ - /* never enter here */ - if (pos==len-1) - { - if (suffix) *suffix=NULL; - if (prefix) *prefix=NULL; - CAMEL_LOG_FULL_DEBUG ("string_dichotomy: separator is last character\n"); - return 'l'; - } - /* if we have stripped leading separators, we should */ - /* never enter here */ - if (pos==first) - { - if (suffix) *suffix=NULL; - if (prefix) *prefix=NULL; - CAMEL_LOG_FULL_DEBUG ("string_dichotomy: separator is first character\n"); - return 'l'; - } - - if (prefix) /* return the prefix */ - { - str = g_strndup(tmp,pos); - *prefix = g_string_new(str); - g_free(str); - } - if (suffix) /* return the suffix */ - { - str = g_strdup(tmp+pos+1); - *suffix = g_string_new(str); - g_free(str); - } - - return 'o'; -} - - -/** - * g_string_append_g_string : append a GString to another GString - * - * @dest_string : string which will be appended - * @other_string : string to append - * - **/ -void -g_string_append_g_string(GString *dest_string, GString *other_string) -{ - g_assert(other_string); - g_assert(dest_string); - g_assert(other_string->str); - - g_string_append(dest_string, other_string->str); -} - - - -/** - * g_string_equal_for_hash: test equality of two GStrings for hash tables - * @v: string 1 - * @v2: string 2 - * - * - * - * Return value: - **/ -g_string_equal_for_hash (gconstpointer v, gconstpointer v2) -{ - return strcmp ( ((const GString*)v)->str, ((const GString*)v2)->str) == 0; -} - -g_string_equal_for_glist (gconstpointer v, gconstpointer v2) -{ - return !strcmp ( ((const GString*)v)->str, ((const GString*)v2)->str) == 0; -} - - -/** - * g_string_hash: computes a hash value for a Gstring - * @v: Gstring object - * - * - * - * Return value: - **/ -guint -g_string_hash (gconstpointer v) -{ - return g_str_hash(((const GString*)v)->str); -} - - - - -/* utility func : frees a GString element in a GList */ -static void -__g_string_list_free_string (gpointer data, gpointer user_data) -{ - GString *string = (GString *)data; - g_string_free(string, TRUE); -} - - -void -g_string_list_free (GList *string_list) -{ - g_list_foreach(string_list, __g_string_list_free_string, NULL); - g_list_free(string_list); -} - - - - - - -GList * -g_string_split (GString *string, char sep, gchar *trim_chars, GStringTrimOption trim_options) -{ - GList *result = NULL; - gint first, last, pos; - gchar *str; - gchar *new_str; - GString *new_gstring; - - g_assert (string); - str = string->str; - if (!str) return NULL; - - first = 0; - last = strlen(str) - 1; - - /* strip leading and trailing separators */ - while ( (first<=last) && (str[first]==sep) ) - first++; - while ( (first<=last) && (str[last]==sep) ) - last--; - - - CAMEL_LOG_FULL_DEBUG ("g_string_split:: trim options: %d\n", trim_options); - - while (first<=last) { - pos = first; - /* find next separator */ - while ((pos<=last) && (str[pos]!=sep)) pos++; - if (first != pos) { - new_str = g_strndup (str+first, pos-first); - new_gstring = g_string_new (new_str); - g_free (new_str); - /* could do trimming in line to speed up this code */ - if (trim_chars) g_string_trim (new_gstring, trim_chars, trim_options); - result = g_list_append (result, new_gstring); - } - first = pos + 1; - } - - return result; -} - - -void -g_string_trim (GString *string, gchar *chars, GStringTrimOption options) -{ - gint first_ok; - gint last_ok; - guint length; - gchar *str; - - CAMEL_LOG_FULL_DEBUG ("**\nentering g_string_trim::\n"); - - if ((!string) || (!string->str)) - return; - str = string->str; - length = strlen (str); - if (!length) - return; - - first_ok = 0; - last_ok = length - 1; - - CAMEL_LOG_FULL_DEBUG ("g_string_trim:: trim_options:%d\n", options); - if (options & GSTRING_TRIM_STRIP_LEADING) - while ( (first_ok <= last_ok) && (strchr (chars, str[first_ok])) ) - first_ok++; - - if (options & GSTRING_TRIM_STRIP_TRAILING) - while ( (first_ok <= last_ok) && (strchr (chars, str[last_ok])) ) - last_ok++; - CAMEL_LOG_FULL_DEBUG ("g_string_trim::\n\t\"%s\":first ok:%d last_ok:%d\n", - string->str, first_ok, last_ok); - - if (first_ok > 0) - g_string_erase (string, 0, first_ok); - - if (last_ok < length-1) - g_string_truncate (string, last_ok - first_ok +1); - -} diff --git a/camel/gstring-util.h b/camel/gstring-util.h deleted file mode 100644 index 10bbac3a56..0000000000 --- a/camel/gstring-util.h +++ /dev/null @@ -1,77 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* gstring-util : utilities for gstring object */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 GSTRING_UTIL_H -#define GSTRING_UTIL_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <glib.h> - -typedef enum { - GSTRING_DICHOTOMY_NONE = 0, - GSTRING_DICHOTOMY_RIGHT_DIR = 1, - GSTRING_DICHOTOMY_STRIP_TRAILING = 2, - GSTRING_DICHOTOMY_STRIP_LEADING = 4 - -} GStringDichotomyOption; - -typedef enum { - GSTRING_TRIM_NONE = 0, - GSTRING_TRIM_STRIP_TRAILING = 1, - GSTRING_TRIM_STRIP_LEADING = 2 -} GStringTrimOption; - - -gboolean g_string_equals (GString *string1, GString *string2); -GString *g_string_clone (GString *string); -gchar g_string_dichotomy (GString *string, gchar sep, - GString **prefix, GString **suffix, - GStringDichotomyOption options); -void g_string_append_g_string (GString *dest_string, - GString *other_string); - -gboolean g_string_equal_for_hash (gconstpointer v, gconstpointer v2); -gboolean g_string_equal_for_glist (gconstpointer v, gconstpointer v2); -guint g_string_hash (gconstpointer v); -void g_string_list_free (GList *string_list); - -GList *g_string_split (GString *string, char sep, - gchar *trim_chars, GStringTrimOption trim_options); -void g_string_trim (GString *string, gchar *chars, - GStringTrimOption options); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* GSTRING_UTIL_H */ diff --git a/camel/hash-table-utils.c b/camel/hash-table-utils.c deleted file mode 100644 index fa326020cb..0000000000 --- a/camel/hash-table-utils.c +++ /dev/null @@ -1,82 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* generic utilities for hash tables */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 "glib.h" -#include "hash-table-utils.h" - - -/* - * free a (key/value) hash table pair. - * to be called in a g_hash_table_foreach() - * before g_hash_table_destroy(). - */ -void -g_hash_table_generic_free (gpointer key, gpointer value, gpointer user_data) -{ - g_free (key); - g_free (value); -} - - - -/***/ -/* use these two funcs for case insensitive hash table */ - -gint -g_strcase_equal (gconstpointer a, gconstpointer b) -{ - return (g_strcasecmp ((gchar *)a, (gchar *)b) == 0); -} - - -/* modified g_str_hash from glib/gstring.c - because it would have been too slow to - us g_strdown() on the string */ -/* a char* hash function from ASU */ -guint -g_strcase_hash (gconstpointer v) -{ - const char *s = (char*)v; - const char *p; - char c; - guint h=0, g; - - for(p = s; *p != '\0'; p += 1) { - c = isupper ((guchar)*p) ? tolower ((guchar)*p) : *p; - h = ( h << 4 ) + c; - if ( ( g = h & 0xf0000000 ) ) { - h = h ^ (g >> 24); - h = h ^ g; - } - } - - return h /* % M */; -} - - - -/***/ diff --git a/camel/hash-table-utils.h b/camel/hash-table-utils.h deleted file mode 100644 index 99d33f59a0..0000000000 --- a/camel/hash-table-utils.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* generic utilities for hash tables */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 HASH_TABLE_UTILS_H -#define HASH_TABLE_UTILS_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -void g_hash_table_generic_free (gpointer key, gpointer value, gpointer user_data); - -gint g_strcase_equal (gconstpointer a, gconstpointer b); -guint g_strcase_hash (gconstpointer v); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* HASH_TABLE_UTILS_H */ diff --git a/camel/md5-utils.c b/camel/md5-utils.c deleted file mode 100644 index 53f3373bb5..0000000000 --- a/camel/md5-utils.c +++ /dev/null @@ -1,388 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * This code implements the MD5 message-digest algorithm. - * The algorithm is due to Ron Rivest. This code was - * written by Colin Plumb in 1993, no copyright is claimed. - * This code is in the public domain; do with it what you wish. - * - * Equivalent code is available from RSA Data Security, Inc. - * This code has been tested against that, and is equivalent, - * except that you don't need to include two pages of legalese - * with every copy. - * - * To compute the message digest of a chunk of bytes, declare an - * MD5Context structure, pass it to md5_init, call md5_update as - * needed on buffers full of bytes, and then call md5_Final, which - * will fill a supplied 16-byte array with the digest. - */ - -/* parts of this file are : - * Written March 1993 by Branko Lankester - * Modified June 1993 by Colin Plumb for altered md5.c. - * Modified October 1995 by Erik Troan for RPM - */ - - -#include "md5-utils.h" -#include <stdio.h> - -static void md5_transform (guint32 buf[4], const guint32 in[16]); - -static gint _ie = 0x44332211; -static union _endian { gint i; gchar b[4]; } *_endian = (union _endian *)&_ie; -#define IS_BIG_ENDIAN() (_endian->b[0] == '\x44') -#define IS_LITTLE_ENDIAN() (_endian->b[0] == '\x11') - - -/* - * Note: this code is harmless on little-endian machines. - */ -static void -_byte_reverse (guchar *buf, guint32 longs) -{ - guint32 t; - do { - t = (guint32) ((guint32) buf[3] << 8 | buf[2]) << 16 | - ((guint32) buf[1] << 8 | buf[0]); - *(guint32 *) buf = t; - buf += 4; - } while (--longs); -} - -/** - * md5_init: Initialise an md5 context object - * @ctx: md5 context - * - * Initialise an md5 buffer. - * - **/ -void -md5_init (MD5Context *ctx) -{ - ctx->buf[0] = 0x67452301; - ctx->buf[1] = 0xefcdab89; - ctx->buf[2] = 0x98badcfe; - ctx->buf[3] = 0x10325476; - - ctx->bits[0] = 0; - ctx->bits[1] = 0; - - if (IS_BIG_ENDIAN()) - ctx->doByteReverse = 1; - else - ctx->doByteReverse = 0; -} - - - -/** - * md5_update: add a buffer to md5 hash computation - * @ctx: conetxt object used for md5 computaion - * @buf: buffer to add - * @len: buffer length - * - * Update context to reflect the concatenation of another buffer full - * of bytes. Use this to progressively construct an md5 hash. - **/ -void -md5_update (MD5Context *ctx, const guchar *buf, guint32 len) -{ - guint32 t; - - /* Update bitcount */ - - t = ctx->bits[0]; - if ((ctx->bits[0] = t + ((guint32) len << 3)) < t) - ctx->bits[1]++; /* Carry from low to high */ - ctx->bits[1] += len >> 29; - - t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ - - /* Handle any leading odd-sized chunks */ - - if (t) { - guchar *p = (guchar *) ctx->in + t; - - t = 64 - t; - if (len < t) { - memcpy (p, buf, len); - return; - } - memcpy (p, buf, t); - if (ctx->doByteReverse) - _byte_reverse (ctx->in, 16); - md5_transform (ctx->buf, (guint32 *) ctx->in); - buf += t; - len -= t; - } - /* Process data in 64-byte chunks */ - - while (len >= 64) { - memcpy (ctx->in, buf, 64); - if (ctx->doByteReverse) - _byte_reverse (ctx->in, 16); - md5_transform (ctx->buf, (guint32 *) ctx->in); - buf += 64; - len -= 64; - } - - /* Handle any remaining bytes of data. */ - - memcpy (ctx->in, buf, len); -} - - - - - -/* - * Final wrapup - pad to 64-byte boundary with the bit pattern - * 1 0* (64-bit count of bits processed, MSB-first) - */ -/** - * md5_final: copy the final md5 hash to a bufer - * @digest: 16 bytes buffer - * @ctx: context containing the calculated md5 - * - * copy the final md5 hash to a bufer - **/ -void -md5_final (guchar digest[16], MD5Context *ctx) -{ - guint32 count; - guchar *p; - - /* Compute number of bytes mod 64 */ - count = (ctx->bits[0] >> 3) & 0x3F; - - /* Set the first char of padding to 0x80. This is safe since there is - always at least one byte free */ - p = ctx->in + count; - *p++ = 0x80; - - /* Bytes of padding needed to make 64 bytes */ - count = 64 - 1 - count; - - /* Pad out to 56 mod 64 */ - if (count < 8) { - /* Two lots of padding: Pad the first block to 64 bytes */ - memset (p, 0, count); - if (ctx->doByteReverse) - _byte_reverse (ctx->in, 16); - md5_transform (ctx->buf, (guint32 *) ctx->in); - - /* Now fill the next block with 56 bytes */ - memset (ctx->in, 0, 56); - } else { - /* Pad block to 56 bytes */ - memset (p, 0, count - 8); - } - if (ctx->doByteReverse) - _byte_reverse (ctx->in, 14); - - /* Append length in bits and transform */ - ((guint32 *) ctx->in)[14] = ctx->bits[0]; - ((guint32 *) ctx->in)[15] = ctx->bits[1]; - - md5_transform (ctx->buf, (guint32 *) ctx->in); - if (ctx->doByteReverse) - _byte_reverse ((guchar *) ctx->buf, 4); - memcpy (digest, ctx->buf, 16); - memset (ctx, 0, sizeof(ctx)); /* In case it's sensitive */ -} - - - - -/* The four core functions - F1 is optimized somewhat */ - -/* #define F1(x, y, z) (x & y | ~x & z) */ -#define F1(x, y, z) (z ^ (x & (y ^ z))) -#define F2(x, y, z) F1(z, x, y) -#define F3(x, y, z) (x ^ y ^ z) -#define F4(x, y, z) (y ^ (x | ~z)) - -/* This is the central step in the MD5 algorithm. */ -#define MD5STEP(f, w, x, y, z, data, s) \ - ( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x ) - -/* - * The core of the MD5 algorithm, this alters an existing MD5 hash to - * reflect the addition of 16 longwords of new data. md5_Update blocks - * the data and converts bytes into longwords for this routine. - */ -static void -md5_transform (guint32 buf[4], const guint32 in[16]) -{ - register guint32 a, b, c, d; - - a = buf[0]; - b = buf[1]; - c = buf[2]; - d = buf[3]; - - MD5STEP (F1, a, b, c, d, in[0] + 0xd76aa478, 7); - MD5STEP (F1, d, a, b, c, in[1] + 0xe8c7b756, 12); - MD5STEP (F1, c, d, a, b, in[2] + 0x242070db, 17); - MD5STEP (F1, b, c, d, a, in[3] + 0xc1bdceee, 22); - MD5STEP (F1, a, b, c, d, in[4] + 0xf57c0faf, 7); - MD5STEP (F1, d, a, b, c, in[5] + 0x4787c62a, 12); - MD5STEP (F1, c, d, a, b, in[6] + 0xa8304613, 17); - MD5STEP (F1, b, c, d, a, in[7] + 0xfd469501, 22); - MD5STEP (F1, a, b, c, d, in[8] + 0x698098d8, 7); - MD5STEP (F1, d, a, b, c, in[9] + 0x8b44f7af, 12); - MD5STEP (F1, c, d, a, b, in[10] + 0xffff5bb1, 17); - MD5STEP (F1, b, c, d, a, in[11] + 0x895cd7be, 22); - MD5STEP (F1, a, b, c, d, in[12] + 0x6b901122, 7); - MD5STEP (F1, d, a, b, c, in[13] + 0xfd987193, 12); - MD5STEP (F1, c, d, a, b, in[14] + 0xa679438e, 17); - MD5STEP (F1, b, c, d, a, in[15] + 0x49b40821, 22); - - MD5STEP (F2, a, b, c, d, in[1] + 0xf61e2562, 5); - MD5STEP (F2, d, a, b, c, in[6] + 0xc040b340, 9); - MD5STEP (F2, c, d, a, b, in[11] + 0x265e5a51, 14); - MD5STEP (F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); - MD5STEP (F2, a, b, c, d, in[5] + 0xd62f105d, 5); - MD5STEP (F2, d, a, b, c, in[10] + 0x02441453, 9); - MD5STEP (F2, c, d, a, b, in[15] + 0xd8a1e681, 14); - MD5STEP (F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); - MD5STEP (F2, a, b, c, d, in[9] + 0x21e1cde6, 5); - MD5STEP (F2, d, a, b, c, in[14] + 0xc33707d6, 9); - MD5STEP (F2, c, d, a, b, in[3] + 0xf4d50d87, 14); - MD5STEP (F2, b, c, d, a, in[8] + 0x455a14ed, 20); - MD5STEP (F2, a, b, c, d, in[13] + 0xa9e3e905, 5); - MD5STEP (F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); - MD5STEP (F2, c, d, a, b, in[7] + 0x676f02d9, 14); - MD5STEP (F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); - - MD5STEP (F3, a, b, c, d, in[5] + 0xfffa3942, 4); - MD5STEP (F3, d, a, b, c, in[8] + 0x8771f681, 11); - MD5STEP (F3, c, d, a, b, in[11] + 0x6d9d6122, 16); - MD5STEP (F3, b, c, d, a, in[14] + 0xfde5380c, 23); - MD5STEP (F3, a, b, c, d, in[1] + 0xa4beea44, 4); - MD5STEP (F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); - MD5STEP (F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); - MD5STEP (F3, b, c, d, a, in[10] + 0xbebfbc70, 23); - MD5STEP (F3, a, b, c, d, in[13] + 0x289b7ec6, 4); - MD5STEP (F3, d, a, b, c, in[0] + 0xeaa127fa, 11); - MD5STEP (F3, c, d, a, b, in[3] + 0xd4ef3085, 16); - MD5STEP (F3, b, c, d, a, in[6] + 0x04881d05, 23); - MD5STEP (F3, a, b, c, d, in[9] + 0xd9d4d039, 4); - MD5STEP (F3, d, a, b, c, in[12] + 0xe6db99e5, 11); - MD5STEP (F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); - MD5STEP (F3, b, c, d, a, in[2] + 0xc4ac5665, 23); - - MD5STEP (F4, a, b, c, d, in[0] + 0xf4292244, 6); - MD5STEP (F4, d, a, b, c, in[7] + 0x432aff97, 10); - MD5STEP (F4, c, d, a, b, in[14] + 0xab9423a7, 15); - MD5STEP (F4, b, c, d, a, in[5] + 0xfc93a039, 21); - MD5STEP (F4, a, b, c, d, in[12] + 0x655b59c3, 6); - MD5STEP (F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); - MD5STEP (F4, c, d, a, b, in[10] + 0xffeff47d, 15); - MD5STEP (F4, b, c, d, a, in[1] + 0x85845dd1, 21); - MD5STEP (F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); - MD5STEP (F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); - MD5STEP (F4, c, d, a, b, in[6] + 0xa3014314, 15); - MD5STEP (F4, b, c, d, a, in[13] + 0x4e0811a1, 21); - MD5STEP (F4, a, b, c, d, in[4] + 0xf7537e82, 6); - MD5STEP (F4, d, a, b, c, in[11] + 0xbd3af235, 10); - MD5STEP (F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); - MD5STEP (F4, b, c, d, a, in[9] + 0xeb86d391, 21); - - buf[0] += a; - buf[1] += b; - buf[2] += c; - buf[3] += d; -} - - - - -/** - * md5_get_digest: get the md5 hash of a buffer - * @buffer: byte buffer - * @buffer_size: buffer size (in bytes) - * @digest: 16 bytes buffer receiving the hash code. - * - * Get the md5 hash of a buffer. The result is put in - * the 16 bytes buffer @digest . - **/ -void -md5_get_digest (const gchar *buffer, gint buffer_size, guchar digest[16]) -{ - MD5Context ctx; - - md5_init (&ctx); - md5_update (&ctx, buffer, buffer_size); - md5_final (digest, &ctx); - -} - - -/** - * md5_get_digest_from_stream: get the md5 hash of a stream - * @stream: stream - * @digest: 16 bytes buffer receiving the hash code. - * - * Get the md5 hash of a stream. The result is put in - * the 16 bytes buffer @digest . - **/ -void -md5_get_digest_from_stream (CamelStream *stream, guchar digest[16]) -{ - MD5Context ctx; - guchar tmp_buf[1024]; - gint nb_bytes_read; - - md5_init (&ctx); - - nb_bytes_read = camel_stream_read (stream, tmp_buf, 1024); - while (nb_bytes_read) { - md5_update (&ctx, tmp_buf, nb_bytes_read); - nb_bytes_read = camel_stream_read (stream, tmp_buf, 1024); - } - - md5_final (digest, &ctx); - -} - - - - -/** - * md5_get_digest_from_file: get the md5 hash of a file - * @filename: file name - * @digest: 16 bytes buffer receiving the hash code. - * - * Get the md5 hash of a file. The result is put in - * the 16 bytes buffer @digest . - **/ -void -md5_get_digest_from_file (const gchar *filename, guchar digest[16]) -{ - MD5Context ctx; - guchar tmp_buf[1024]; - gint nb_bytes_read; - FILE *fp; - - md5_init (&ctx); - fp = fopen(filename, "r"); - if (!fp) { - return; - } - - while ((nb_bytes_read = fread (tmp_buf, sizeof (guchar), 1024, fp)) > 0) - md5_update (&ctx, tmp_buf, nb_bytes_read); - - if (ferror(fp)) { - fclose(fp); - return; - } - - md5_final (digest, &ctx); - -} - - - - diff --git a/camel/md5-utils.h b/camel/md5-utils.h deleted file mode 100644 index a2552d21b2..0000000000 --- a/camel/md5-utils.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * This code implements the MD5 message-digest algorithm. - * The algorithm is due to Ron Rivest. This code was - * written by Colin Plumb in 1993, no copyright is claimed. - * This code is in the public domain; do with it what you wish. - * - * Equivalent code is available from RSA Data Security, Inc. - * This code has been tested against that, and is equivalent, - * except that you don't need to include two pages of legalese - * with every copy. - * - * To compute the message digest of a chunk of bytes, declare an - * MD5Context structure, pass it to rpmMD5Init, call rpmMD5Update as - * needed on buffers full of bytes, and then call rpmMD5Final, which - * will fill a supplied 16-byte array with the digest. - */ - -/* parts of this file are : - * Written March 1993 by Branko Lankester - * Modified June 1993 by Colin Plumb for altered md5.c. - * Modified October 1995 by Erik Troan for RPM - */ - - -#ifndef MD5_UTILS_H -#define MD5_UTILS_H - -#include <glib.h> -#include "camel-stream.h" - -typedef struct { - guint32 buf[4]; - guint32 bits[2]; - guchar in[64]; - gint doByteReverse; - -} MD5Context ; - - -void md5_get_digest (const gchar *buffer, gint buffer_size, guchar digest[16]); -void md5_get_digest_from_stream (CamelStream *stream, guchar digest[16]); - -/* use this one when speed is needed */ -/* for use in provider code only */ -void md5_get_digest_from_file (const gchar *filename, guchar digest[16]); - -/* raw routines */ -void md5_init (MD5Context *ctx); -void md5_update (MD5Context *ctx, const guchar *buf, guint32 len); -void md5_final (guchar digest[16], MD5Context *ctx); - - -#endif /* MD5_UTILS_H */ diff --git a/camel/providers/.cvsignore b/camel/providers/.cvsignore deleted file mode 100644 index b840c21800..0000000000 --- a/camel/providers/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in -Makefile
\ No newline at end of file diff --git a/camel/providers/MH/.cvsignore b/camel/providers/MH/.cvsignore deleted file mode 100644 index 2e7b174532..0000000000 --- a/camel/providers/MH/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -Makefile.in -Makefile -.deps -*.lo -*.la -.libs diff --git a/camel/providers/MH/Makefile.am b/camel/providers/MH/Makefile.am deleted file mode 100644 index dab6bec199..0000000000 --- a/camel/providers/MH/Makefile.am +++ /dev/null @@ -1,33 +0,0 @@ -## Process this file with automake to produce Makefile.in - -SUBDIRS = - -libcamelmhincludedir = $(includedir)/camel - - -lib_LTLIBRARIES = libcamelmh.la - -INCLUDES = -I.. -I$(srcdir)/.. -I$(includedir) \ - -I$(top_srcdir)/intl \ - $(GTK_INCLUDEDIR) -I$(top_srcdir)/camel - -libcamelmh_la_SOURCES = \ - camel-mh-folder.c \ - camel-mh-provider.c \ - camel-mh-store.c \ - mh-summary.c \ - mh-uid.c \ - mh-utils.c - -libcamelmhinclude_HEADERS = \ - camel-mh-folder.h \ - camel-mh-store.h \ - mh-summary.c \ - mh-uid.h \ - mh-utils.h - - -libcamelmh_la_LDFLAGS = -version-info 0:0:0 -rpath $(libdir) - - -EXTRA_DIST = diff --git a/camel/providers/MH/camel-mh-folder.c b/camel/providers/MH/camel-mh-folder.c deleted file mode 100644 index 86bbab46ba..0000000000 --- a/camel/providers/MH/camel-mh-folder.c +++ /dev/null @@ -1,1022 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mh-folder.c : Abstract class for an email folder */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@aful.org> . - * - * 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 <config.h> -#include <sys/stat.h> -#include <sys/param.h> -#include <unistd.h> -#include <sys/types.h> -#include <fcntl.h> -#include <dirent.h> -#include <stdio.h> -#include <string.h> -#include <errno.h> -#include "camel-mh-folder.h" -#include "camel-mh-store.h" -#include "gstring-util.h" -#include "camel-log.h" -#include "camel-stream-fs.h" -#include "camel-stream-buffered-fs.h" -#include "camel-folder-summary.h" -#include "gmime-utils.h" -#include "mh-utils.h" -#include "mh-uid.h" -#include "mh-summary.h" - - -static CamelFolderClass *parent_class=NULL; - -/* Returns the class for a CamelMhFolder */ -#define CMHF_CLASS(so) CAMEL_MH_FOLDER_CLASS (GTK_OBJECT(so)->klass) -#define CF_CLASS(so) CAMEL_FOLDER_CLASS (GTK_OBJECT(so)->klass) -#define CMHS_CLASS(so) CAMEL_STORE_CLASS (GTK_OBJECT(so)->klass) - - -static void _set_name(CamelFolder *folder, const gchar *name, CamelException *ex); -static void _init_with_store (CamelFolder *folder, CamelStore *parent_store, CamelException *ex); -static gboolean _exists (CamelFolder *folder, CamelException *ex); -static gboolean _create(CamelFolder *folder, CamelException *ex); -static gboolean _delete (CamelFolder *folder, gboolean recurse, CamelException *ex); -static gboolean _delete_messages (CamelFolder *folder, CamelException *ex); -static GList *_list_subfolders (CamelFolder *folder, CamelException *ex); -static CamelMimeMessage *_get_message (CamelFolder *folder, gint number, CamelException *ex); -static gint _get_message_count (CamelFolder *folder, CamelException *ex); -static gint _append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex); -static void _expunge (CamelFolder *folder, CamelException *ex); -static void _copy_message_to (CamelFolder *folder, CamelMimeMessage *message, CamelFolder *dest_folder, CamelException *ex); -static void _open (CamelFolder *folder, CamelFolderOpenMode mode, CamelException *ex); -static void _close (CamelFolder *folder, gboolean expunge, CamelException *ex); - -static const gchar *_get_message_uid (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex); -static CamelMimeMessage *_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex); -static GList *_get_uid_list (CamelFolder *folder, CamelException *ex); - -/* some utility functions */ -static int copy_reg (const char *src_path, const char *dst_path, CamelException *ex); - -static void -camel_mh_folder_class_init (CamelMhFolderClass *camel_mh_folder_class) -{ - CamelFolderClass *camel_folder_class = CAMEL_FOLDER_CLASS (camel_mh_folder_class); - - parent_class = gtk_type_class (camel_folder_get_type ()); - - /* virtual method definition */ - /* virtual method overload */ - camel_folder_class->init_with_store = _init_with_store; - camel_folder_class->set_name = _set_name; - camel_folder_class->exists = _exists; - camel_folder_class->delete = _delete; - camel_folder_class->delete_messages = _delete_messages; - camel_folder_class->list_subfolders = _list_subfolders; - camel_folder_class->get_message = _get_message; - camel_folder_class->get_message_count = _get_message_count; - camel_folder_class->append_message = _append_message; - camel_folder_class->expunge = _expunge; - camel_folder_class->copy_message_to = _copy_message_to; - camel_folder_class->open = _open; - camel_folder_class->close = _close; - camel_folder_class->get_message_uid = _get_message_uid; - camel_folder_class->get_message_by_uid = _get_message_by_uid; - camel_folder_class->get_uid_list = _get_uid_list; - -} - - - - - - - -GtkType -camel_mh_folder_get_type (void) -{ - static GtkType camel_mh_folder_type = 0; - - if (!camel_mh_folder_type) { - GtkTypeInfo camel_mh_folder_info = - { - "CamelMhFolder", - sizeof (CamelMhFolder), - sizeof (CamelMhFolderClass), - (GtkClassInitFunc) camel_mh_folder_class_init, - (GtkObjectInitFunc) NULL, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_mh_folder_type = gtk_type_unique (CAMEL_FOLDER_TYPE, &camel_mh_folder_info); - } - - return camel_mh_folder_type; -} - - - -static gint -_message_name_compare (gconstpointer a, gconstpointer b) -{ - gchar *m1 = (gchar *)a; - gchar *m2 = (gchar *)b; - gint len_diff; - - return (atoi (m1) - atoi (m2)); -} - - -static void -_init_with_store (CamelFolder *folder, CamelStore *parent_store, CamelException *ex) -{ - /* call parent method */ - parent_class->init_with_store (folder, parent_store, ex); - - folder->can_hold_messages = TRUE; - folder->can_hold_folders = TRUE; - folder->has_summary_capability = TRUE; - folder->has_uid_capability = TRUE; - - folder->summary = NULL; - -} - - - -static void -_open (CamelFolder *folder, CamelFolderOpenMode mode, CamelException *ex) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER (folder); - struct dirent *dir_entry; - DIR *dir_handle; - - - if (folder->open_state == FOLDER_OPEN) return; - - - /* create message list */ - /* read the whole folder and sort message names */ - dir_handle = opendir (mh_folder->directory_path); - /* read first entry in the directory */ - dir_entry = readdir (dir_handle); - while (dir_entry != NULL) { - /* tests if the entry correspond to a message file */ - if (mh_is_a_message_file (dir_entry->d_name, mh_folder->directory_path)) - /* add the file name to the list */ - mh_folder->file_name_list = g_list_insert_sorted (mh_folder->file_name_list, - g_strdup (dir_entry->d_name), - _message_name_compare); - /* read next entry */ - dir_entry = readdir (dir_handle); - } - - closedir (dir_handle); - - /* get (or create) uid list */ - if (!(mh_load_uid_list (mh_folder) > 0)) - mh_generate_uid_list (mh_folder); - - /* get or create summary */ - /* it is important that it comes after uid list reading/generation */ - if (!(mh_load_summary (mh_folder) > 0)) - mh_generate_summary (folder); - printf ("**** summary = %p\n", folder->summary); - -} - - - -static void -_close (CamelFolder *folder, gboolean expunge, CamelException *ex) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER (folder); - - /* save uid list, if any */ - if (mh_folder->uid_array) - mh_save_uid_list (mh_folder); - - /* save summary, if any */ - if (folder->summary) - mh_save_summary (mh_folder); - - /* call parent implementation */ - parent_class->close (folder, expunge, ex); -} - - - - - -/** - * camel_mh_folder_set_name: set the name of an MH folder - * @folder: the folder to set the name - * @name: a string representing the (short) name - * - * - * - **/ -static void -_set_name (CamelFolder *folder, const gchar *name, CamelException *ex) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER (folder); - const gchar *root_dir_path; - gchar *full_name; - const gchar *parent_full_name; - gchar separator; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMhFolder::set_name\n"); - g_assert (folder); - g_assert (name); - g_assert (folder->parent_store); - - /* call default implementation */ - parent_class->set_name (folder, name, ex); - - if (mh_folder->directory_path) g_free (mh_folder->directory_path); - - separator = camel_store_get_separator (folder->parent_store); - root_dir_path = camel_mh_store_get_toplevel_dir (CAMEL_MH_STORE(folder->parent_store)); - - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::set_name full_name is %s\n", folder->full_name); - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::set_name root_dir_path is %s\n", root_dir_path); - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::separator is %c\n", separator); - - mh_folder->directory_path = g_strdup_printf ("%s%c%s", root_dir_path, separator, folder->full_name); - - if (!camel_folder_exists (folder, ex)) return; - - - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::set_name mh_folder->directory_path is %s\n", - mh_folder->directory_path); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMhFolder::set_name\n"); -} - - - -static gboolean -_exists (CamelFolder *folder, CamelException *ex) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); - struct stat stat_buf; - gint stat_error; - gboolean exists; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMhFolder::exists\n"); - g_assert (folder); - - if (!mh_folder->directory_path) return FALSE; - - stat_error = stat (mh_folder->directory_path, &stat_buf); - if (stat_error == -1) { - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::exists when executing stat on %s, stat_error = %d\n", - mh_folder->directory_path, stat_error); - CAMEL_LOG_FULL_DEBUG (" Full error text is : %s\n", strerror(errno)); - return FALSE; - } - exists = S_ISDIR (stat_buf.st_mode); - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMhFolder::exists\n"); - return exists; -} - - -static gboolean -_create (CamelFolder *folder, CamelException *ex) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); - const gchar *directory_path; - mode_t dir_mode = S_IRWXU; - gint mkdir_error; - - g_assert(folder); - - /* call default implementation */ - parent_class->create (folder, ex); - - directory_path = mh_folder->directory_path; - if (!directory_path) return FALSE; - - if (camel_folder_exists (folder, ex)) return TRUE; - - mkdir_error = mkdir (directory_path, dir_mode); - return (mkdir_error == -1); -} - - - -static gboolean -_delete (CamelFolder *folder, gboolean recurse, CamelException *ex) -{ - - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); - const gchar *directory_path; - gint rmdir_error = 0; - - g_assert(folder); - - /* call default implementation */ - parent_class->delete (folder, recurse, ex); - /* the default implementation will care about deleting - messages first and recursing the operation if - necessary */ - - directory_path = mh_folder->directory_path; - if (!directory_path) return FALSE; - - if (!camel_folder_exists (folder, ex)) return TRUE; - - /* physically delete the directory */ - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::delete removing directory %s\n", directory_path); - rmdir_error = rmdir (directory_path); - if (rmdir_error == -1) { - CAMEL_LOG_WARNING ("CamelMhFolder::delete Error when removing directory %s\n", directory_path); - CAMEL_LOG_FULL_DEBUG ( " Full error text is : %s\n", strerror(errno)); - } - - return (rmdir_error != -1); -} - - -static gboolean -_delete_messages (CamelFolder *folder, CamelException *ex) -{ - - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); - const gchar *directory_path; - struct stat stat_buf; - gint stat_error = 0; - gchar *entry_name; - struct dirent *dir_entry; - gint unlink_error = 0; - DIR *dir_handle; - - g_assert(folder); - - /* call default implementation */ - parent_class->delete_messages (folder, ex); - - directory_path = mh_folder->directory_path; - if (!directory_path) return FALSE; - - if (!camel_folder_exists (folder, ex)) return TRUE; - - dir_handle = opendir (directory_path); - - /* read first entry in the directory */ - dir_entry = readdir (dir_handle); - while ((stat_error != -1) && (unlink_error != -1) && (dir_entry != NULL)) { - - /* get the name of the next entry in the dir */ - entry_name = dir_entry->d_name; - stat_error = stat (mh_folder->directory_path, &stat_buf); - - /* is it a regular file ? */ - if ((stat_error != -1) && S_ISREG(stat_buf.st_mode)) { - /* yes, delete it */ - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::delete_messages removing file %s\n", entry_name); - unlink_error = unlink(entry_name); - - if (unlink_error == -1) { - CAMEL_LOG_WARNING ("CamelMhFolder::delete_messages Error when deleting file %s\n", - entry_name); - CAMEL_LOG_FULL_DEBUG ( " Full error text is : %s\n", strerror(errno)); - } - } - /* read next entry */ - dir_entry = readdir (dir_handle); - } - - closedir (dir_handle); - - return ((stat_error != -1) && (unlink_error != -1)); - -} - - - -static GList * -_list_subfolders (CamelFolder *folder, CamelException *ex) -{ - GList *subfolder_name_list = NULL; - - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); - const gchar *directory_path; - struct stat stat_buf; - gint stat_error = 0; - GList *file_list; - gchar *entry_name; - gchar *full_entry_name; - struct dirent *dir_entry; - DIR *dir_handle; - - g_assert(folder); - - /* call default implementation */ - parent_class->delete_messages (folder, ex); - - directory_path = mh_folder->directory_path; - if (!directory_path) return NULL; - - if (!camel_folder_exists (folder, ex)) return NULL; - - dir_handle = opendir (directory_path); - - /* read first entry in the directory */ - dir_entry = readdir (dir_handle); - while ((stat_error != -1) && (dir_entry != NULL)) { - - /* get the name of the next entry in the dir */ - entry_name = dir_entry->d_name; - full_entry_name = g_strdup_printf ("%s/%s", mh_folder->directory_path, entry_name); - stat_error = stat (full_entry_name, &stat_buf); - g_free (full_entry_name); - - /* is it a directory ? */ - if ((stat_error != -1) && S_ISDIR (stat_buf.st_mode)) { - /* yes, add it to the list */ - if (entry_name[0] != '.') { - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::list_subfolders adding %s\n", entry_name); - subfolder_name_list = g_list_append (subfolder_name_list, g_strdup (entry_name)); - } - } - /* read next entry */ - dir_entry = readdir (dir_handle); - } - - closedir (dir_handle); - - return subfolder_name_list; -} - - - - - -static void -_filename_free (gpointer data) -{ - g_free ((gchar *)data); -} - - -/* slow routine, may be optimixed, or we should use - caches if users complain */ -static CamelMimeMessage * -_get_message (CamelFolder *folder, gint number, CamelException *ex) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); - const gchar *directory_path; - gchar *message_name; - gchar *message_file_name; - CamelStream *input_stream = NULL; - CamelMimeMessage *message = NULL; - GList *message_list = NULL; - - g_assert(folder); - - - directory_path = mh_folder->directory_path; - if (!directory_path) return NULL; - - - - message_name = g_list_nth_data (mh_folder->file_name_list, number); - - if (message_name != NULL) { - CAMEL_LOG_FULL_DEBUG ("CanelMhFolder::get_message message number = %d, name = %s\n", - number, message_name); - message_file_name = g_strdup_printf ("%s/%s", directory_path, message_name); - input_stream = camel_stream_buffered_fs_new_with_name (message_file_name, CAMEL_STREAM_BUFFERED_FS_READ); - - if (input_stream != NULL) { -#warning use session field here - message = camel_mime_message_new_with_session ( (CamelSession *)NULL); - camel_data_wrapper_construct_from_stream ( CAMEL_DATA_WRAPPER (message), input_stream); - gtk_object_unref (GTK_OBJECT (input_stream)); - message->message_number = number; - gtk_object_set_data_full (GTK_OBJECT (message), "filename", - g_strdup (message_name), _filename_free); - -#warning Set flags and all this stuff here - } - g_free (message_file_name); - } else - CAMEL_LOG_FULL_DEBUG ("CanelMhFolder::get_message message number = %d, not found\n", number); - - - return message; -} - - - -static gint -_get_message_count (CamelFolder *folder, CamelException *ex) -{ - - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); - const gchar *directory_path; - struct dirent *dir_entry; - DIR *dir_handle; - guint message_count = 0; - - g_assert(folder); - - directory_path = mh_folder->directory_path; - if (!directory_path) return -1; - - if (!camel_folder_exists (folder, ex)) return 0; - - dir_handle = opendir (directory_path); - - /* read first entry in the directory */ - dir_entry = readdir (dir_handle); - while (dir_entry != NULL) { - /* tests if the entry correspond to a message file */ - if (mh_is_a_message_file (dir_entry->d_name, directory_path)) - message_count++; - /* read next entry */ - dir_entry = readdir (dir_handle); - } - - closedir (dir_handle); - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::get_message_count found %d messages\n", message_count); - return message_count; -} - - - -static gboolean -_find_next_free_message_file (CamelFolder *folder, gint *new_msg_number, gchar **new_msg_filename, CamelException *ex) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); - const gchar *directory_path; - struct dirent *dir_entry; - DIR *dir_handle; - gint last_max_message_number = 0; - gint current_message_number; - - g_assert(folder); - - directory_path = mh_folder->directory_path; - if (!directory_path) return FALSE; - - if (!camel_folder_exists (folder, ex)) return FALSE; - - dir_handle = opendir (directory_path); - - /* read first entry in the directory */ - dir_entry = readdir (dir_handle); - while (dir_entry != NULL) { - /* tests if the entry correspond to a message file */ - if (mh_is_a_message_file (dir_entry->d_name, directory_path)) { - /* see if the message number is the biggest found */ - current_message_number = atoi (dir_entry->d_name); - if (current_message_number > last_max_message_number) - last_max_message_number = current_message_number; - } - /* read next entry */ - dir_entry = readdir (dir_handle); - } - closedir (dir_handle); - - *new_msg_number = last_max_message_number + 1; - *new_msg_filename = g_strdup_printf ("%s/%d", directory_path, *new_msg_number); - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::find_next_free_message_file new message path is %s\n", - *new_msg_filename); - return TRUE; - - -} -static gint -_append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex) -{ - guint new_msg_number; - gchar *new_msg_filename; - CamelStream *output_stream; - gboolean error; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMhFolder::append_message\n"); - if (!_find_next_free_message_file (folder, &new_msg_number, &new_msg_filename, ex)) - return -1; - - output_stream = camel_stream_fs_new_with_name (new_msg_filename, CAMEL_STREAM_FS_WRITE); - if (output_stream != NULL) { - camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (message), output_stream); - camel_stream_close (output_stream); - } else { - CAMEL_LOG_WARNING ("CamelMhFolder::append_message could not open %s for writing\n", - new_msg_filename); - CAMEL_LOG_FULL_DEBUG (" Full error text is : %s\n", strerror(errno)); - error = TRUE; - } - - g_free (new_msg_filename); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMhFolder::append_message\n"); - if (error) return -1; - else return new_msg_number; -} - - - - - -static void -_expunge (CamelFolder *folder, CamelException *ex) -{ - /* For the moment, we look in the folder active message - * list. I did not make my mind for the moment, should - * the gtk_object->destroy signal be used to expunge - * freed messages objects marked DELETED ? - */ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); - CamelMimeMessage *message; - GList *message_node; - gchar *fullpath; - gchar *filename; - gint unlink_error; - const gchar *directory_path; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelFolder::expunge\n"); - - message_node = folder->message_list; - - directory_path = mh_folder->directory_path; - if (!directory_path) return; - - /* look in folder message list which messages - * need to be expunged */ - while ( message_node) { - message = CAMEL_MIME_MESSAGE (message_node->data); - - if (message && camel_mime_message_get_flag (message, "DELETED")) { - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::expunge, expunging message %d\n", message->message_number); - /* expunge the message */ - filename = gtk_object_get_data (GTK_OBJECT (message), "filename"); - fullpath = g_strdup_printf ("%s/%s", directory_path, filename); - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::expunge, message fullpath is %s\n", - fullpath); - unlink_error = unlink(fullpath); - if (unlink_error != -1) { - message->expunged = TRUE; - } else { - CAMEL_LOG_WARNING ("CamelMhFolder:: could not unlink %s (message %d)\n", - fullpath, message->message_number); - CAMEL_LOG_FULL_DEBUG (" Full error text is : %s\n", strerror(errno)); - } - } - message_node = message_node->next; - CAMEL_LOG_FULL_DEBUG ("CamelFolder::expunge, examined message node %p\n", message_node); - } - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelFolder::expunge\n"); -} - - -static void -_copy_message_to (CamelFolder *folder, CamelMimeMessage *message, CamelFolder *dest_folder, CamelException *ex) -{ - gchar *src_msg_filename; - guint dest_msg_number; - gchar *dest_msg_filename; - - if (IS_CAMEL_MH_FOLDER (dest_folder)) { - /*g_return_if_fail (message->parent_folder == folder);*/ - - if (!_find_next_free_message_file (dest_folder, &dest_msg_number, &dest_msg_filename, ex)) - return; - src_msg_filename = gtk_object_get_data (GTK_OBJECT (message), "fullpath"); - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::copy_to copy file %s to %s\n", src_msg_filename, dest_msg_filename); - copy_reg (src_msg_filename, dest_msg_filename, ex); - - } else - parent_class->copy_message_to (folder, message, dest_folder, ex); -} - - - -/** UID **/ - -static const gchar * -_get_message_uid (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER (folder); - GArray *uid_array; - gboolean found = FALSE; - MhUidCouple *uid_couple; - gchar *filename; - guint file_number; - gint i; - - /* if the message already has its uid stored, - return it */ - if (message->message_uid) - return (message->message_uid); - - /* else, it has a filename associated to it */ - filename = gtk_object_get_data (GTK_OBJECT (message), "filename"); - file_number = atoi (file_number); - - uid_array = mh_folder->uid_array; - uid_couple = (MhUidCouple *)uid_array->data; - - /* look in the uid array for the file number */ - found = (uid_couple->file_number == file_number); - for (i=0; (i<uid_array->len) && (!found); i++) { - uid_couple++; - found = (uid_couple->file_number == file_number); - } - - if (found) return uid_couple->uid; - else return NULL; - -} - - -static CamelMimeMessage * -_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER (folder); - GArray *uid_array; - gboolean found = FALSE; - MhUidCouple *uid_couple; - gint file_number; - gchar *filename; - CamelMimeMessage *message = NULL; - CamelStream *input_stream; - int i; - - /* - * because they are constructed with md5 - * signatures, all MH uids are 16 bytes long - */ - if (strlen (uid) != 16) return NULL; - - uid_array = mh_folder->uid_array; - uid_couple = (MhUidCouple *)uid_array->data; - - found = !strncmp (uid, uid_couple->uid, 16 * sizeof (guchar)); - for (i=0; (i<uid_array->len) && (!found); i++) { - uid_couple++; - found = !strncmp (uid, uid_couple->uid, 16 * sizeof (guchar)); - } - if (found) { - /* physically retrieve the message */ - file_number = uid_couple->file_number; - filename = g_strdup_printf ("%d", file_number); - input_stream = camel_stream_buffered_fs_new_with_name (filename, CAMEL_STREAM_BUFFERED_FS_READ); - - if (input_stream != NULL) { -#warning use session field here - message = camel_mime_message_new_with_session ( (CamelSession *)NULL); - camel_data_wrapper_construct_from_stream ( CAMEL_DATA_WRAPPER (message), input_stream); - gtk_object_unref (GTK_OBJECT (input_stream)); - - /* set message UID in CamelMimeMessage */ - message->message_uid = g_strdup (uid); - - } - g_free (filename); - } - - return message; - -} - -static GList * -_get_uid_list (CamelFolder *folder, CamelException *ex) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER (folder); - GList *uid_list; - GArray *uid_array; - MhUidCouple *uid_couple; - int i; - - uid_array = mh_folder->uid_array; - uid_couple = (MhUidCouple *)uid_array->data; - - for (i=0; i<uid_array->len; i++) { - uid_list = g_list_prepend (uid_list, uid_couple->uid); - uid_couple++; - } - - return uid_list; -} - - - - - - - - -/************************************************************************/ - -/*** Took directly from GNU fileutils-4.0 ***/ -/* Copyright (C) 89, 90, 91, 95, 96, 97, 1998 Free Software Foundation. */ -/* This may be rwritten soon. -Bertrand */ - - -/* Write LEN bytes at PTR to descriptor DESC, retrying if interrupted. - Return LEN upon success, write's (negative) error code otherwise. */ -int -full_write (int desc, const char *ptr, size_t len) -{ - int total_written; - - total_written = 0; - while (len > 0) - { - int written = write (desc, ptr, len); - if (written < 0) - { - if (errno == EINTR) - continue; - return written; - } - total_written += written; - ptr += written; - len -= written; - } - return total_written; -} - - - - -static int -copy_reg (const char *src_path, const char *dst_path, CamelException *ex) -{ - char *buf; - int buf_size; - int dest_desc; - int source_desc; - int n_read; - struct stat sb; - char *cp; - int *ip; - int return_val = 0; - off_t n_read_total = 0; - int last_write_made_hole = 0; - int make_holes = TRUE; - - source_desc = open (src_path, O_RDONLY); - if (source_desc < 0) - { - /* If SRC_PATH doesn't exist, then chances are good that the - user did something like this `cp --backup foo foo': and foo - existed to start with, but copy_internal renamed DST_PATH - with the backup suffix, thus also renaming SRC_PATH. */ - if (errno == ENOENT) - error (0, 0, "`%s' and `%s' are the same file", - src_path, dst_path); - else - error (0, errno, "%s", src_path); - - return -1; - } - - /* Create the new regular file with small permissions initially, - to not create a security hole. */ - - dest_desc = open (dst_path, O_WRONLY | O_CREAT | O_TRUNC, 0600); - if (dest_desc < 0) - { - error (0, errno, "cannot create regular file `%s'", dst_path); - return_val = -1; - goto ret2; - } - - /* Find out the optimal buffer size. */ - - if (fstat (dest_desc, &sb)) - { - error (0, errno, "%s", dst_path); - return_val = -1; - goto ret; - } - - buf_size = 8192; - - - - /* Make a buffer with space for a sentinel at the end. */ - - buf = (char *) alloca (buf_size + sizeof (int)); - - for (;;) - { - n_read = read (source_desc, buf, buf_size); - if (n_read < 0) - { - if (errno == EINTR) - continue; - error (0, errno, "%s", src_path); - return_val = -1; - goto ret; - } - if (n_read == 0) - break; - - n_read_total += n_read; - - ip = 0; - if (make_holes) - { - buf[n_read] = 1; /* Sentinel to stop loop. */ - - /* Find first nonzero *word*, or the word with the sentinel. */ - - ip = (int *) buf; - while (*ip++ == 0) - ; - - /* Find the first nonzero *byte*, or the sentinel. */ - - cp = (char *) (ip - 1); - while (*cp++ == 0) - ; - - /* If we found the sentinel, the whole input block was zero, - and we can make a hole. */ - - if (cp > buf + n_read) - { - /* Make a hole. */ - if (lseek (dest_desc, (off_t) n_read, SEEK_CUR) < 0L) - { - error (0, errno, "%s", dst_path); - return_val = -1; - goto ret; - } - last_write_made_hole = 1; - } - else - /* Clear to indicate that a normal write is needed. */ - ip = 0; - } - if (ip == 0) - { - if (full_write (dest_desc, buf, n_read) < 0) - { - error (0, errno, "%s", dst_path); - return_val = -1; - goto ret; - } - last_write_made_hole = 0; - } - } - - /* If the file ends with a `hole', something needs to be written at - the end. Otherwise the kernel would truncate the file at the end - of the last write operation. */ - - if (last_write_made_hole) - { -#if HAVE_FTRUNCATE - /* Write a null character and truncate it again. */ - if (full_write (dest_desc, "", 1) < 0 - || ftruncate (dest_desc, n_read_total) < 0) -#else - /* Seek backwards one character and write a null. */ - if (lseek (dest_desc, (off_t) -1, SEEK_CUR) < 0L - || full_write (dest_desc, "", 1) < 0) -#endif - { - error (0, errno, "%s", dst_path); - return_val = -1; - } - } - -ret: - if (close (dest_desc) < 0) - { - error (0, errno, "%s", dst_path); - return_val = -1; - } -ret2: - if (close (source_desc) < 0) - { - error (0, errno, "%s", src_path); - return_val = -1; - } - - return return_val; -} diff --git a/camel/providers/MH/camel-mh-folder.h b/camel/providers/MH/camel-mh-folder.h deleted file mode 100644 index 40800375eb..0000000000 --- a/camel/providers/MH/camel-mh-folder.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mh-folder.h : Abstract class for an email folder */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@aful.org> . - * - * 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_MH_FOLDER_H -#define CAMEL_MH_FOLDER_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include "camel-folder.h" -/* #include "camel-store.h" */ - -#define CAMEL_MH_FOLDER_TYPE (camel_mh_folder_get_type ()) -#define CAMEL_MH_FOLDER(obj) (GTK_CHECK_CAST((obj), CAMEL_MH_FOLDER_TYPE, CamelMhFolder)) -#define CAMEL_MH_FOLDER_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_MH_FOLDER_TYPE, CamelMhFolderClass)) -#define IS_CAMEL_MH_FOLDER(o) (GTK_CHECK_TYPE((o), CAMEL_MH_FOLDER_TYPE)) - - -typedef struct { - CamelFolder parent_object; - - gchar *directory_path; - GList *file_name_list; - GArray *uid_array; - -} CamelMhFolder; - - - -typedef struct { - CamelFolderClass parent_class; - - /* Virtual methods */ - -} CamelMhFolderClass; - - -/* public methods */ - -/* Standard Gtk function */ -GtkType camel_mh_folder_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MH_FOLDER_H */ diff --git a/camel/providers/MH/camel-mh-provider.c b/camel/providers/MH/camel-mh-provider.c deleted file mode 100644 index 316b8a0797..0000000000 --- a/camel/providers/MH/camel-mh-provider.c +++ /dev/null @@ -1,46 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mh-provider.c: mh provider registration code */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@aful.org> . - * - * 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 "config.h" -#include "camel-mh-store.h" -#include "camel-provider.h" -#include "camel-log.h" - - -static CamelProvider _mh_provider = { - (GtkType) 0, - PROVIDER_STORE, - "mh", - "Camel default mh provider", - "This is a very simple provider, mh is a bad protocol anyway", - (GModule *) NULL -}; - - - -CamelProvider * -camel_provider_module_init () -{ - _mh_provider.object_type = camel_mh_store_get_type(); - return &_mh_provider; -} diff --git a/camel/providers/MH/camel-mh-store.c b/camel/providers/MH/camel-mh-store.c deleted file mode 100644 index 60ba07f47b..0000000000 --- a/camel/providers/MH/camel-mh-store.c +++ /dev/null @@ -1,153 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mh-store.c : class for an mh store */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@aful.org> . - * - * 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 "camel-mh-store.h" -#include "camel-mh-folder.h" -#include "url-util.h" - -static CamelStoreClass *parent_class=NULL; - -/* Returns the class for a CamelMhStore */ -#define CMHS_CLASS(so) CAMEL_MH_STORE_CLASS (GTK_OBJECT(so)->klass) -#define CF_CLASS(so) CAMEL_FOLDER_CLASS (GTK_OBJECT(so)->klass) -#define CMHF_CLASS(so) CAMEL_MH_FOLDER_CLASS (GTK_OBJECT(so)->klass) - -static void _init (CamelStore *store, CamelSession *session, const gchar *url_name); -static CamelFolder *_get_folder (CamelStore *store, const gchar *folder_name); - - -static void -camel_mh_store_class_init (CamelMhStoreClass *camel_mh_store_class) -{ - CamelStoreClass *camel_store_class = CAMEL_STORE_CLASS (camel_mh_store_class); - - parent_class = gtk_type_class (camel_store_get_type ()); - - /* virtual method definition */ - /* virtual method overload */ - camel_store_class->init = _init; - camel_store_class->get_folder = _get_folder; -} - - - -static void -camel_mh_store_init (gpointer object, gpointer klass) -{ - CamelMhStore *mh_store = CAMEL_MH_STORE (object); - CamelStore *store = CAMEL_STORE (object); - - store->separator = '/'; -} - - - - -GtkType -camel_mh_store_get_type (void) -{ - static GtkType camel_mh_store_type = 0; - - if (!camel_mh_store_type) { - GtkTypeInfo camel_mh_store_info = - { - "CamelMhStore", - sizeof (CamelMhStore), - sizeof (CamelMhStoreClass), - (GtkClassInitFunc) camel_mh_store_class_init, - (GtkObjectInitFunc) camel_mh_store_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_mh_store_type = gtk_type_unique (CAMEL_STORE_TYPE, &camel_mh_store_info); - } - - return camel_mh_store_type; -} - - - - -/* These evil public functions are here for test only */ -void -camel_mh_store_set_toplevel_dir (CamelMhStore *store, const gchar *toplevel) -{ - store->toplevel_dir = g_strdup (toplevel); - CAMEL_STORE(store)->separator = '/'; -} - - -const gchar * -camel_mh_store_get_toplevel_dir (CamelMhStore *store) -{ - return store->toplevel_dir; -} - - - -static void -_init (CamelStore *store, CamelSession *session, const gchar *url_name) -{ - CamelMhStore *mh_store = CAMEL_MH_STORE (store); - Gurl *store_url; - - g_assert (url_name); - /* call parent implementation */ - parent_class->init (store, session, url_name); - - - /* find the path in the URL*/ - store_url = g_url_new (url_name); - - g_return_if_fail (store_url); - g_return_if_fail (store_url->path); - - mh_store->toplevel_dir = g_strdup (store_url->path); - g_url_free (store_url); - - - -} - - -static CamelFolder * -_get_folder (CamelStore *store, const gchar *folder_name) -{ - CamelMhFolder *new_mh_folder; - CamelFolder *new_folder; - - /* check if folder has already been created */ - /* call the standard routine for that when */ - /* it is done ... */ - - new_mh_folder = gtk_type_new (CAMEL_MH_FOLDER_TYPE); - new_folder = CAMEL_FOLDER (new_mh_folder); - - CF_CLASS (new_folder)->init_with_store (new_folder, store, NULL); - CF_CLASS (new_folder)->set_name (new_folder, folder_name, NULL); - - - return new_folder; -} diff --git a/camel/providers/MH/camel-mh-store.h b/camel/providers/MH/camel-mh-store.h deleted file mode 100644 index 924a5a6fc5..0000000000 --- a/camel/providers/MH/camel-mh-store.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mhstore.h : class for an mh store */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@aful.org> . - * - * 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_MH_STORE_H -#define CAMEL_MH_STORE_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include "camel-store.h" - -#define CAMEL_MH_STORE_TYPE (camel_mh_store_get_type ()) -#define CAMEL_MH_STORE(obj) (GTK_CHECK_CAST((obj), CAMEL_MH_STORE_TYPE, CamelMhStore)) -#define CAMEL_MH_STORE_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_MH_STORE_TYPE, CamelMhStoreClass)) -#define IS_CAMEL_MH_STORE(o) (GTK_CHECK_TYPE((o), CAMEL_MH_STORE_TYPE)) - - -typedef struct { - CamelStore parent_object; - - gchar *toplevel_dir; -} CamelMhStore; - - - -typedef struct { - CamelStoreClass parent_class; - - -} CamelMhStoreClass; - - -/* public methods */ - -/* Standard Gtk function */ -GtkType camel_mh_store_get_type (void); - -void camel_mh_store_set_toplevel_dir (CamelMhStore *store, const gchar *toplevel); -const gchar *camel_mh_store_get_toplevel_dir (CamelMhStore *store); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MH_STORE_H */ - - diff --git a/camel/providers/MH/mh-summary.c b/camel/providers/MH/mh-summary.c deleted file mode 100644 index 5a964696e0..0000000000 --- a/camel/providers/MH/mh-summary.c +++ /dev/null @@ -1,290 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@aful.org> . - * - * 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 <config.h> - -#include "mh-uid.h" -#include "camel-log.h" -#include "camel-stream.h" -#include "camel-stream-fs.h" -#include "camel-stream-buffered-fs.h" -#include "gmime-utils.h" -#include "mh-utils.h" - -#include <sys/stat.h> -#include <unistd.h> -#include <sys/types.h> -#include <fcntl.h> -#include <dirent.h> -#include <stdio.h> -#include <string.h> -#include <errno.h> - -void -mh_generate_summary (CamelFolder *folder) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER (folder); - CamelFolderSummary *summary; - CamelMessageInfo *message_info; - CamelFolderInfo *subfolder_info; - CamelStream *message_stream; - guint file_number; - gchar *message_fullpath; - gchar *directory_path; - GArray *header_array; - MhUidCouple *uid_couple; - Rfc822Header *cur_header; - int i; - int n_file; - GArray *uid_array; - - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::generate_summary entering \n"); - - g_assert (folder); - - directory_path = mh_folder->directory_path; - if (!directory_path) { - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::generate_summary folder has no directory path\n"); - return; - } - - summary = camel_folder_summary_new (); - folder->summary = summary; - - uid_array = mh_folder->uid_array; - - if (!uid_array) { - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::generate_summary " - "no uid list, that probably means there is " - "no message in this folder, exiting \n"); - return; - } - uid_couple = (MhUidCouple *)uid_array->data; - - for (n_file=0; n_file<uid_array->len; n_file++) { - - file_number = uid_couple->file_number; - - message_info = g_new0 (CamelMessageInfo, 1); - message_info->uid = g_new0 (guchar, 17); - strncpy (message_info->uid, uid_couple->uid, 16); - - - message_fullpath = g_strdup_printf ("%s/%d", directory_path, file_number); - message_stream = camel_stream_buffered_fs_new_with_name (message_fullpath, - CAMEL_STREAM_BUFFERED_FS_READ); - if (!message_stream) { - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::generate_summary " - "could not open %d for reading\n", message_fullpath); - g_free (message_fullpath); - return; - } - g_free (message_fullpath); - - header_array = get_header_array_from_stream (message_stream); - gtk_object_unref (GTK_OBJECT (message_stream)); - - for (i=0; i<header_array->len; i++) { - cur_header = (Rfc822Header *)header_array->data + i; - if (!g_strcasecmp (cur_header->name, "subject")) { - message_info->subject = cur_header->value; - g_free (cur_header->name); - } else if (!g_strcasecmp (cur_header->name, "sender")) { - message_info->date = cur_header->value; - g_free (cur_header->name); - } else if (!g_strcasecmp (cur_header->name, "date")) { - message_info->date = cur_header->value; - g_free (cur_header->name); - } else { - g_free (cur_header->name); - g_free (cur_header->value); - } - } - g_array_free (header_array, TRUE); - - summary->message_info_list = g_list_append (summary->message_info_list, message_info); - - /* next message in the uid list */ - uid_couple++; - } - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::generate_summary leaving \n"); - -} - - -void -mh_save_summary (CamelMhFolder *mh_folder) -{ - GArray *uid_array; - MhUidCouple *first_uid_couple; - CamelFolderSummary *summary; - GList *msg_info_list; - CamelMessageInfo *msg_info; - gchar *directory_path = mh_folder->directory_path; - gchar *summary_file_path; - gint fd; - gint i; - gint field_lgth; - - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::save_summary entering \n"); - - summary = CAMEL_FOLDER (mh_folder)->summary; - if (!summary) return; - - summary_file_path = g_strdup_printf ("%s/%s", directory_path, ".camel-summary"); - CAMEL_LOG_FULL_DEBUG ("In the process of writing %s\n", summary_file_path); - fd = open (summary_file_path, O_WRONLY | O_CREAT ); - - if (!fd) { - CAMEL_LOG_FULL_DEBUG ("could not open file %s for writing. Exiting.\n", summary_file_path); - g_free (summary_file_path); - return; - } - g_free (summary_file_path); - - msg_info_list = summary->message_info_list; - while (msg_info_list) { - msg_info = msg_info_list->data; - /* write subject */ - field_lgth = msg_info->subject ? strlen (msg_info->subject) : 0; - write (fd, &field_lgth, sizeof (gint)); - if (field_lgth) - write (fd, msg_info->subject, field_lgth); - - /* write uid */ - field_lgth = msg_info->uid ? strlen (msg_info->uid) : 0; - write (fd, &field_lgth, sizeof (gint)); - if (field_lgth) - write (fd, msg_info->uid, field_lgth); - - /* write date */ - field_lgth = msg_info->date ? strlen (msg_info->date) : 0; - write (fd, &field_lgth, sizeof (gint)); - if (field_lgth) - write (fd, msg_info->date, field_lgth); - - /* write sender */ - field_lgth = msg_info->sender ? strlen (msg_info->sender) : 0; - write (fd, &field_lgth, sizeof (gint)); - if (field_lgth) - write (fd, msg_info->sender, field_lgth); - - msg_info_list = msg_info_list->next; - - } - - close (fd); - - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::save_summary leaving \n"); - -} - - - - - -gint -mh_load_summary (CamelMhFolder *mh_folder) -{ - GArray *uid_array; - MhUidCouple *first_uid_couple; - CamelFolderSummary *summary; - CamelMessageInfo *msg_info; - gchar *directory_path = mh_folder->directory_path; - gchar *summary_file_path; - gint fd; - gint i; - gint field_lgth; - gboolean file_eof; - gint stat_error; - struct stat stat_buf; - - summary = CAMEL_FOLDER (mh_folder)->summary; - if (summary) return 1; /* should we regenerate it ? */ - - summary_file_path = g_strdup_printf ("%s/%s", directory_path, ".camel-summary"); - CAMEL_LOG_FULL_DEBUG ("In the process of reading %s\n", summary_file_path); - fd = open (summary_file_path, O_RDONLY); - /* tests if file exists */ - stat_error = stat (summary_file_path, &stat_buf); - - if (!((stat_error != -1) && S_ISREG (stat_buf.st_mode))) { - CAMEL_LOG_FULL_DEBUG ("could not open file %s for reading. Exiting.\n", summary_file_path); - g_free (summary_file_path); - return -1; - } - g_free (summary_file_path); - - for (;;) { - /* read subject */ - file_eof = (read (fd, &field_lgth, sizeof (gint)) <= 0); - if (file_eof) break; - - - /* allcate a summary if needed */ - if (!summary) - summary = camel_folder_summary_new (); - /* allocate a message info struct */ - msg_info = g_new0 (CamelMessageInfo, 1); - - if (!file_eof && (field_lgth > 0)) { - msg_info->subject = g_new0 (gchar, field_lgth + 1); - read (fd, msg_info->subject, field_lgth); - } else - msg_info->subject = NULL; - - /* read uid */ - if (!file_eof) file_eof = (read (fd, &field_lgth, sizeof (gint)) <= 0); - if (!file_eof && (field_lgth > 0)) { - msg_info->uid = g_new0 (gchar, field_lgth + 1); - read (fd, msg_info->uid, field_lgth); - } else - msg_info->uid = NULL; - - /* read date */ - if (!file_eof) file_eof = (read (fd, &field_lgth, sizeof (gint)) <= 0); - if (!file_eof && (field_lgth > 0)) { - msg_info->date = g_new0 (gchar, field_lgth + 1); - read (fd, msg_info->date, field_lgth); - } else - msg_info->date = NULL; - - /* read sender */ - if (!file_eof) file_eof = (read (fd, &field_lgth, sizeof (gint)) <= 0); - if (!file_eof && (field_lgth > 0)) { - msg_info->sender = g_new0 (gchar, field_lgth + 1); - read (fd, msg_info->sender, field_lgth); - } else - msg_info->sender = NULL; - - summary->message_info_list = g_list_prepend (summary->message_info_list, - msg_info); - } - - CAMEL_FOLDER (mh_folder)->summary = summary; - - close (fd); - return 1; -} - - diff --git a/camel/providers/MH/mh-summary.h b/camel/providers/MH/mh-summary.h deleted file mode 100644 index 27c9a21f60..0000000000 --- a/camel/providers/MH/mh-summary.h +++ /dev/null @@ -1,33 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@aful.org> . - * - * 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 MH_SUMMARY_H -#define MH_SUMMARY_H 1 - -#include <glib.h> -#include "camel-mh-folder.h" - -void mh_generate_summary (CamelFolder *folder); -void mh_save_summary (CamelMhFolder *mh_folder); -gint mh_load_summary (CamelMhFolder *mh_folder); - -#endif /* MH_SUMMARY_H */ diff --git a/camel/providers/MH/mh-uid.c b/camel/providers/MH/mh-uid.c deleted file mode 100644 index 7dbde4de00..0000000000 --- a/camel/providers/MH/mh-uid.c +++ /dev/null @@ -1,220 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@aful.org> . - * - * 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 <config.h> - -#include "mh-uid.h" -#include "camel-log.h" -#include "camel-stream.h" -#include "camel-stream-fs.h" -#include "camel-stream-buffered-fs.h" -#include "gmime-utils.h" -#include "md5-utils.h" -#include "mh-utils.h" - -#include <sys/stat.h> -#include <unistd.h> -#include <sys/types.h> -#include <fcntl.h> -#include <dirent.h> -#include <stdio.h> -#include <string.h> -#include <errno.h> - -void -mh_uid_get_for_file (gchar *filename, guchar uid[16]) -{ - CamelStream *message_stream; - GArray *header_array; - Rfc822Header *cur_header; - int i; - MD5Context ctx; - - - message_stream = camel_stream_buffered_fs_new_with_name (filename, - CAMEL_STREAM_BUFFERED_FS_READ); - header_array = get_header_array_from_stream (message_stream); - gtk_object_unref (GTK_OBJECT (message_stream)); - - md5_init (&ctx); - for (i=0; i<header_array->len; i++) { - cur_header = (Rfc822Header *)header_array->data + i; - if (!g_strcasecmp (cur_header->name, "subject")) { - md5_update (&ctx, cur_header->value, strlen (cur_header->value)); - } else if (!g_strcasecmp (cur_header->name, "sender")) { - md5_update (&ctx, cur_header->value, strlen (cur_header->value)); - } else if (!g_strcasecmp (cur_header->name, "date")) { - md5_update (&ctx, cur_header->value, strlen (cur_header->value)); - } - - g_free (cur_header->name); - g_free (cur_header->value); - - } - - g_array_free (header_array, TRUE); - - md5_final (uid, &ctx); -} - - - - -void -mh_save_uid_list (CamelMhFolder *mh_folder) -{ - GArray *uid_array; - MhUidCouple *first_uid_couple; - gchar *directory_path = mh_folder->directory_path; - gchar *uidfile_path; - int fd; - int i; - - - uidfile_path = g_strdup_printf ("%s/%s", directory_path, ".camel-uid-list"); - CAMEL_LOG_FULL_DEBUG ("In the process of writing %s\n", uidfile_path); - fd = open (uidfile_path, O_WRONLY | O_CREAT ); - - if (!fd) { - CAMEL_LOG_FULL_DEBUG ("could not open file %s for writing. Exiting.\n", uidfile_path); - g_free (uidfile_path); - return; - } - g_free (uidfile_path); - - uid_array = mh_folder->uid_array; - first_uid_couple = (MhUidCouple *)uid_array->data; - - /* write the number of uid contained in the file */ - write (fd, &(uid_array->len), sizeof (guint)); - CAMEL_LOG_FULL_DEBUG ("%d entrie present in the list\n", uid_array->len); - /* now write the array of uid self */ - write (fd, first_uid_couple, sizeof (MhUidCouple) * uid_array->len); - - close (fd); -} - - -gint -mh_load_uid_list (CamelMhFolder *mh_folder) -{ - GArray *new_uid_array; - MhUidCouple *first_uid_couple; - gchar *directory_path = mh_folder->directory_path; - gchar *uidfile_path; - int fd; - guint uid_nb; - struct stat stat_buf; - gint stat_error = 0; - - uidfile_path = g_strdup_printf ("%s/%s", directory_path, ".camel-uid-list"); - - /* tests if file exists */ - stat_error = stat (uidfile_path, &stat_buf); - - - if (!((stat_error != -1) && S_ISREG (stat_buf.st_mode))) { - CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::load_uid_list " - "file %s does not exist. Exiting.\n", uidfile_path); - g_free (uidfile_path); - return -1; - } - - fd = open (uidfile_path, O_RDONLY); - g_free (uidfile_path); - if (!fd) return -1; - - if (mh_folder->uid_array) g_array_free (mh_folder->uid_array, FALSE); - - /* read the number of uids in the file */ - read (fd, &uid_nb, sizeof (guint)); - CAMEL_LOG_FULL_DEBUG ("reading %d uid_entries\n", uid_nb); - new_uid_array = g_array_new (FALSE, FALSE, sizeof (MhUidCouple)); - new_uid_array = g_array_set_size (new_uid_array, uid_nb); - first_uid_couple = (MhUidCouple *)new_uid_array->data; - - - read (fd, first_uid_couple, sizeof (MhUidCouple) * uid_nb); - - mh_folder->uid_array = new_uid_array; - - return 1; -} - - -gint -mh_generate_uid_list (CamelMhFolder *mh_folder) -{ - GArray *new_uid_array; - const gchar *directory_path; - struct dirent *dir_entry; - DIR *dir_handle; - gchar *msg_path; - guint msg_count; - MhUidCouple *uid_couple; - guint file_number; - - g_assert (mh_folder); - CAMEL_LOG_FULL_DEBUG ("in the process of creating uid list \n"); - directory_path = mh_folder->directory_path; - if (!directory_path) { - CAMEL_LOG_FULL_DEBUG ("folder has no directory path. Exiting\n"); - return -1; - } - - msg_count = camel_folder_get_message_count (CAMEL_FOLDER (mh_folder), NULL); - if (!msg_count) { - CAMEL_LOG_FULL_DEBUG ("no message in %s. Exiting\n", directory_path); - return -1; - } - - new_uid_array = g_array_new (FALSE, FALSE, sizeof (MhUidCouple)); - new_uid_array = g_array_set_size (new_uid_array, msg_count); - uid_couple = (MhUidCouple *)new_uid_array->data; - - dir_handle = opendir (directory_path); - - /* read first entry in the directory */ - dir_entry = readdir (dir_handle); - while (dir_entry != NULL) { - - /* tests if the entry correspond to a message file */ - if (mh_is_a_message_file (dir_entry->d_name, directory_path)) { - - /* get the uid for this message */ - msg_path = g_strdup_printf ("%s/%s", directory_path, dir_entry->d_name); - mh_uid_get_for_file (msg_path, uid_couple->uid); - g_free (msg_path); - - /* convert filename into file number */ - uid_couple->file_number = atoi (dir_entry->d_name); - uid_couple++; - } - - /* read next entry */ - dir_entry = readdir (dir_handle); - } - - closedir (dir_handle); - mh_folder->uid_array = new_uid_array; -} diff --git a/camel/providers/MH/mh-uid.h b/camel/providers/MH/mh-uid.h deleted file mode 100644 index 63dfe5b159..0000000000 --- a/camel/providers/MH/mh-uid.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@aful.org> . - * - * 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 MH_UID_H -#define MH_UID_H 1 - -#include <glib.h> -#include "camel-mh-folder.h" - - -typedef struct { - gchar uid[16]; - guint file_number; -} MhUidCouple; - -void mh_uid_get_for_file (gchar *filename, guchar uid[16]); -void mh_save_uid_list (CamelMhFolder *mh_folder); -gint mh_load_uid_list (CamelMhFolder *mh_folder); -gint mh_generate_uid_list (CamelMhFolder *mh_folder); - -#endif /* MH_UID_H */ diff --git a/camel/providers/MH/mh-utils.c b/camel/providers/MH/mh-utils.c deleted file mode 100644 index 51bb84bc65..0000000000 --- a/camel/providers/MH/mh-utils.c +++ /dev/null @@ -1,50 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@aful.org> . - * - * 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 <config.h> -#include "mh-utils.h" - -#include <sys/stat.h> - -gboolean -mh_is_a_message_file (const gchar *file_name, const gchar *file_path) -{ - struct stat stat_buf; - gint stat_error = 0; - gboolean ok; - gchar *full_file_name; - int i; - - /* test if the name is a number */ - i=0; - while ((file_name[i] != '\0') && (file_name[i] >= '0') && (file_name[i] <= '9')) - i++; - if ((i==0) || (file_name[i] != '\0')) return FALSE; - - /* is it a regular file ? */ - full_file_name = g_strdup_printf ("%s/%s", file_path, file_name); - stat_error = stat (full_file_name, &stat_buf); - g_free (full_file_name); - - return ((stat_error != -1) && S_ISREG (stat_buf.st_mode)); -} - diff --git a/camel/providers/MH/mh-utils.h b/camel/providers/MH/mh-utils.h deleted file mode 100644 index 968228b0a3..0000000000 --- a/camel/providers/MH/mh-utils.h +++ /dev/null @@ -1,30 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@aful.org> . - * - * 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 MH_UTILS_H -#define MH_UTILS_H 1 - -#include <glib.h> - -gboolean mh_is_a_message_file (const gchar *file_name, const gchar *file_path); - -#endif /* MH_UTILS_H */ diff --git a/camel/providers/Makefile.am b/camel/providers/Makefile.am deleted file mode 100644 index 2ed9c0cecc..0000000000 --- a/camel/providers/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -## Process this file with automake to produce Makefile.in - -SUBDIRS = mbox -# this ones are disabled for the moment. -# MH maildir diff --git a/camel/providers/maildir/.cvsignore b/camel/providers/maildir/.cvsignore deleted file mode 100644 index 2e7b174532..0000000000 --- a/camel/providers/maildir/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -Makefile.in -Makefile -.deps -*.lo -*.la -.libs diff --git a/camel/providers/maildir/Makefile.am b/camel/providers/maildir/Makefile.am deleted file mode 100644 index 51a0d7327b..0000000000 --- a/camel/providers/maildir/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ -## Process this file with automake to produce Makefile.in - -SUBDIRS = - -libcamelmaildirincludedir = $(includedir)/camel - -lib_LTLIBRARIES = libcamelmaildir.la - -INCLUDES = -I.. -I$(srcdir)/.. -I$(top_srcdir)/intl -I$(top_srcdir)/camel \ - $(GTK_INCLUDEDIR) -I$(includedir) - -libcamelmaildir_la_SOURCES = \ - camel-maildir-folder.c \ - camel-maildir-provider.c \ - camel-maildir-store.c - -libcamelmaildirinclude_HEADERS = \ - camel-maildir-folder.h \ - camel-maildir-store.h - -libcamelmaildir_la_LDFLAGS = -version-info 0:0:0 -rpath $(libdir) - -EXTRA_DIST = diff --git a/camel/providers/maildir/camel-maildir-folder.c b/camel/providers/maildir/camel-maildir-folder.c deleted file mode 100644 index 4ad5409658..0000000000 --- a/camel/providers/maildir/camel-maildir-folder.c +++ /dev/null @@ -1,803 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-maildir-folder.c : camel-folder subclass for maildir folders */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@inria.fr> . - * - * 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 - */ - -/* - * AUTHORS : Jukka Zitting - * - */ - - -#include <config.h> -#include <sys/stat.h> -#include <sys/param.h> -#include <unistd.h> -#include <sys/types.h> -#include <fcntl.h> -#include <dirent.h> -#include <stdio.h> -#include <errno.h> -#include <time.h> -#include <string.h> -#include "camel-maildir-folder.h" -#include "camel-maildir-store.h" -#include "camel-stream-fs.h" -#include "camel-log.h" - -static CamelFolderClass *parent_class=NULL; - -/* Returns the class for a CamelMaildirFolder */ -#define CMAILDIRF_CLASS(so) CAMEL_MAILDIR_FOLDER_CLASS (GTK_OBJECT(so)->klass) -#define CF_CLASS(so) CAMEL_FOLDER_CLASS (GTK_OBJECT(so)->klass) -#define CMAILDIRS_CLASS(so) CAMEL_STORE_CLASS (GTK_OBJECT(so)->klass) - -static void _init_with_store (CamelFolder *folder, CamelStore *parent_store, CamelException *ex); -static void _set_name (CamelFolder *folder, const gchar *name, CamelException *ex); -static gboolean _exists (CamelFolder *folder, CamelException *ex); -static gboolean _create (CamelFolder *folder, CamelException *ex); -static gboolean _delete (CamelFolder *folder, gboolean recurse, CamelException *ex); -static gboolean _delete_messages (CamelFolder *folder, CamelException *ex); -static CamelMimeMessage *_get_message (CamelFolder *folder, gint number, CamelException *ex); -static gint _get_message_count (CamelFolder *folder, CamelException *ex); -static void _expunge (CamelFolder *folder, CamelException *ex); -static GList *_list_subfolders (CamelFolder *folder, CamelException *ex); - -/* fs utility functions */ -static DIR * _xopendir (const gchar *path); -static gboolean _xstat (const gchar *path, struct stat *buf); -static gboolean _xmkdir (const gchar *path); -static gboolean _xrename (const gchar *from, const gchar *to); -static gboolean _xunlink (const gchar *path); -static gboolean _xrmdir (const gchar *path); -/* ** */ - -static void -camel_maildir_folder_class_init (CamelMaildirFolderClass *camel_maildir_folder_class) -{ - CamelFolderClass *camel_folder_class = - CAMEL_FOLDER_CLASS (camel_maildir_folder_class); - - parent_class = gtk_type_class (camel_folder_get_type ()); - - /* virtual method definition */ - /* virtual method overload */ - camel_folder_class->init_with_store = _init_with_store; - camel_folder_class->set_name = _set_name; - camel_folder_class->exists = _exists; - camel_folder_class->create = _create; - camel_folder_class->delete = _delete; - camel_folder_class->delete_messages = _delete_messages; - camel_folder_class->expunge = _expunge; - camel_folder_class->get_message = _get_message; - camel_folder_class->get_message_count = _get_message_count; - camel_folder_class->list_subfolders = _list_subfolders; -} - -GtkType -camel_maildir_folder_get_type (void) -{ - static GtkType camel_maildir_folder_type = 0; - - if (!camel_maildir_folder_type) { - GtkTypeInfo camel_maildir_folder_info = - { - "CamelMaildirFolder", - sizeof (CamelMaildirFolder), - sizeof (CamelMaildirFolderClass), - (GtkClassInitFunc) camel_maildir_folder_class_init, - (GtkObjectInitFunc) NULL, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_maildir_folder_type = - gtk_type_unique (CAMEL_FOLDER_TYPE, &camel_maildir_folder_info); - } - - return camel_maildir_folder_type; -} - - - - - - -/** - * CamelMaildirFolder::init_with_store: initializes the folder object - * @folder: folder object to initialize - * @parent_store: parent store object of the folder - * - * Simply tells that the folder can contain messages but not subfolders. - * Perhaps we'll later implement subfolders too... - */ -static void -_init_with_store (CamelFolder *folder, CamelStore *parent_store, CamelException *ex) -{ - CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::init_with_store\n"); - g_assert (folder); - g_assert (parent_store); - - /* call parent method */ - parent_class->init_with_store (folder, parent_store, ex); - - folder->can_hold_messages = TRUE; - folder->can_hold_folders = TRUE; - folder->has_summary_capability = FALSE; - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::init_with_store\n"); -} - -/** - * CamelMaildirFolder::set_name: sets the name of the folder - * @folder: folder object - * @name: name of the folder - * - * Sets the name of the folder object. The existence of a folder with - * the given name is not checked in this function. - */ -static void -_set_name (CamelFolder *folder, const gchar *name, CamelException *ex) -{ - CamelMaildirFolder *maildir_folder; - CamelMaildirStore *maildir_store; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::set_name\n"); - g_assert (folder); - g_assert (name); - g_assert (folder->parent_store); - - maildir_folder = CAMEL_MAILDIR_FOLDER (folder); - maildir_store = CAMEL_MAILDIR_STORE (folder->parent_store); - - /* call default implementation */ - parent_class->set_name (folder, name, ex); - - if (maildir_folder->directory_path) - g_free (maildir_folder->directory_path); - - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::set_name full_name is %s\n", folder->full_name); - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::set_name toplevel_dir is %s\n", maildir_store->toplevel_dir); - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::set_name separator is %c\n", camel_store_get_separator (folder->parent_store)); - - if (folder->full_name && folder->full_name[0]) - maildir_folder->directory_path = - g_strconcat (maildir_store->toplevel_dir, G_DIR_SEPARATOR_S, - folder->full_name, NULL); - else - maildir_folder->directory_path = g_strdup (maildir_store->toplevel_dir); - - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::set_name: name set to %s\n", name); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::set_name\n"); -} - -/** - * CamelMaildirFolder::exists: tests whether the named maildir exists - * @folder: folder object - * - * A created maildir folder object doesn't necessarily exist yet in the - * filesystem. This function checks whether the maildir exists. - * The structure of the maildir is stated in the maildir.5 manpage. - * - * maildir.5: - * A directory in maildir format has three subdirectories, - * all on the same filesystem: tmp, new, and cur. - * - * Return value: TRUE if the maildir exists, FALSE otherwise - */ -static gboolean -_exists (CamelFolder *folder, CamelException *ex) -{ - CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER (folder); - static const gchar *dir[3] = { "new", "cur", "tmp" }; - gint i; - struct stat statbuf; - const gchar *maildir; - gchar *path; - gboolean rv = TRUE; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::exists\n"); - g_assert (folder); - g_return_val_if_fail (maildir_folder->directory_path, FALSE); - - maildir = maildir_folder->directory_path; - - CAMEL_LOG_FULL_DEBUG ("CamelMailFolder::exists: checking maildir %s\n", - maildir); - - /* check whether the toplevel directory exists */ - rv = _xstat (maildir, &statbuf) && S_ISDIR (statbuf.st_mode); - - /* check whether the maildir subdirectories exist */ - for (i = 0; rv && i < 3; i++) { - path = g_strconcat (maildir, G_DIR_SEPARATOR_S, dir[i], NULL); - - rv = _xstat (path, &statbuf) && S_ISDIR (statbuf.st_mode); - - g_free (path); - } - - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::exists: %s\n", - (rv) ? "maildir found" : "maildir not found"); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::exists\n"); - return rv; -} - -/** - * CamelMaildirFolder::create: creates the named maildir - * @folder: folder object - * - * A created maildir folder object doesn't necessarily exist yet in the - * filesystem. This function creates the maildir if it doesn't yet exist. - * The structure of the maildir is stated in the maildir.5 manpage. - * - * maildir.5: - * A directory in maildir format has three subdirectories, - * all on the same filesystem: tmp, new, and cur. - * - * Return value: TRUE if the maildir existed already or was created, - * FALSE otherwise - */ -static gboolean -_create (CamelFolder *folder, CamelException *ex) -{ - CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER (folder); - static const gchar *dir[3] = { "new", "cur", "tmp" }; - gint i; - const gchar *maildir; - gchar *path; - gboolean rv = TRUE; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::create\n"); - g_assert (folder); - - /* check whether the maildir already exists */ - if (camel_folder_exists (folder, ex)) return TRUE; - - maildir = maildir_folder->directory_path; - - CAMEL_LOG_FULL_DEBUG ("CamelMailFolder::create: creating maildir %s\n", - maildir); - - /* create the toplevel directory */ - rv = _xmkdir (maildir); - - /* create the maildir subdirectories */ - for (i = 0; rv && i < 3; i++) { - path = g_strconcat (maildir, G_DIR_SEPARATOR_S, dir[i], NULL); - - rv = _xmkdir (path); - - g_free (path); - } - - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::create: %s\n", - rv ? "maildir created" : "an error occurred"); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::create\n"); - return rv; -} - -/** - * CamelMaildirFolder::delete: delete the maildir folder - * @folder: the folder object - * @recurse: - * - * This function empties and deletes the maildir folder. The subdirectories - * "tmp", "cur", and "new" are removed first and then the toplevel maildir - * directory is deleted. All files from the directories are deleted as well, - * so you should be careful when using this function. If a subdirectory cannot - * be deleted, then the operation it is stopped. Thus if an error occurs, the - * maildir directory won't be removed, but it might no longer be a valid maildir. - */ -static gboolean -_delete (CamelFolder *folder, gboolean recurse, CamelException *ex) -{ - CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER (folder); - static const gchar *dir[3] = { "new", "cur", "tmp" }; - gint i; - const gchar *maildir; - gchar *path; - gboolean rv = TRUE; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::create\n"); - g_assert (folder); - - /* check whether the maildir already exists */ - if (!camel_folder_exists (folder, ex)) return TRUE; - - maildir = maildir_folder->directory_path; - - CAMEL_LOG_FULL_DEBUG ("CamelMailFolder::delete: deleting maildir %s\n", - maildir); - - /* delete the maildir subdirectories */ - for (i = 0; rv && i < 3; i++) { - path = g_strconcat (maildir, G_DIR_SEPARATOR_S, dir[i], NULL); - - rv = _xrmdir (path); - - g_free (path); - } - - /* create the toplevel directory */ - if (rv) - rv = _xrmdir (maildir); - - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::delete: %s\n", - rv ? "maildir deleted" : "an error occurred"); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::delete\n"); - return rv; -} - -/** - * CamelMaildirFolder::delete_messages: empty the maildir folder - * @folder: the folder object - * - * This function empties the maildir folder. All messages from the - * "cur" subdirectory are deleted. If a message cannot be deleted, then - * it is just skipped and the rest of the messages are still deleted. - * Files with names starting with a dot are skipped as described in the - * maildir.5 manpage. - * - * maildir.5: - * It is a good idea for readers to skip all filenames in new - * and cur starting with a dot. Other than this, readers - * should not attempt to parse filenames. - * - * Return value: FALSE on error and if some messages could not be deleted. - * TRUE otherwise. - */ -static gboolean -_delete_messages (CamelFolder *folder, CamelException *ex) -{ - CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER (folder); - const gchar *maildir; - gchar *curdir, *file; - DIR *dir_handle; - struct dirent *dir_entry; - gboolean rv = TRUE; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::delete_messages\n"); - g_assert (folder); - - /* call default implementation */ - parent_class->delete_messages (folder, ex); - - /* Check if the folder didn't exist */ - if (!camel_folder_exists (folder, ex)) return TRUE; - - maildir = maildir_folder->directory_path; - - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::delete_messages: " - "deleting messages from %s\n", maildir); - - /* delete messages from the maildir subdirectory "cur" */ - curdir = g_strconcat (maildir, G_DIR_SEPARATOR_S, "cur", NULL); - - dir_handle = _xopendir (curdir); - if (dir_handle) { - while ((dir_entry = readdir (dir_handle))) { - if (dir_entry->d_name[0] == '.') continue; - file = g_strconcat (curdir, G_DIR_SEPARATOR_S, - dir_entry->d_name, NULL); - - if (!_xunlink (file)) rv = FALSE; - - g_free (file); - } - closedir (dir_handle); - } else - rv = FALSE; - - g_free (curdir); - - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::delete_messages: %s\n", - rv ? "messages deleted" : "an error occurred"); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::delete_messages\n"); - return rv; -} - -/** - * CamelMaildirFolder::get_message: get a message from maildir - * @folder: the folder object - * @number: number of the message within the folder - * - * Return value: the message, NULL on error - */ -static CamelMimeMessage * -_get_message (CamelFolder *folder, gint number, CamelException *ex) -{ - CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER(folder); - DIR *dir_handle; - struct dirent *dir_entry; - CamelStream *stream; - CamelMimeMessage *message = NULL; - const gchar *maildir; - gchar *curdir, *file = NULL; - gint count = -1; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::get_message\n"); - g_assert(folder); - - /* Check if the folder exists */ - if (!camel_folder_exists (folder, ex)) return NULL; - - maildir = maildir_folder->directory_path; - - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::get_message: " - "getting message #%d from %s\n", number, maildir); - - /* Count until the desired message is reached */ - curdir = g_strconcat (maildir, G_DIR_SEPARATOR_S, "cur", NULL); - if ((dir_handle = _xopendir (curdir))) { - while ((count < number) && (dir_entry = readdir (dir_handle))) - if (dir_entry->d_name[0] != '.') count++; - - if (count == number) - file = g_strconcat (curdir, G_DIR_SEPARATOR_S, - dir_entry->d_name, NULL); - - closedir (dir_handle); - } - g_free (curdir); - if (!file) return NULL; - - /* Create the message object */ -#warning use session field here - message = camel_mime_message_new_with_session ((CamelSession *) NULL); - stream = camel_stream_fs_new_with_name (file, CAMEL_STREAM_FS_READ); - - if (!message || !stream) { - g_free (file); - if (stream) gtk_object_unref (GTK_OBJECT (stream)); - if (message) gtk_object_unref (GTK_OBJECT (message)); - return NULL; - } - - camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (message), - stream); - gtk_object_unref (GTK_OBJECT (stream)); - gtk_object_set_data_full (GTK_OBJECT (message), - "fullpath", file, g_free); - - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::get_message: " - "message %p created from %s\n", message, file); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::get_message\n"); - return message; -} - -/** - * CamelMaildirFolder::get_message_count: count messages in maildir - * @folder: the folder object - * - * Returns the number of messages in the maildir folder. New messages - * are included in this count. - * - * Return value: number of messages in the maildir, -1 on error - */ -static gint -_get_message_count (CamelFolder *folder, CamelException *ex) -{ - CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER(folder); - const gchar *maildir; - gchar *newdir, *curdir, *newfile, *curfile; - DIR *dir_handle; - struct dirent *dir_entry; - guint count = 0; - - CAMEL_LOG_FULL_DEBUG ("Entering " - "CamelMaildirFolder::get_message_count\n"); - g_assert(folder); - - /* check if the maildir exists */ - if (!camel_folder_exists (folder, ex)) return -1; - - maildir = maildir_folder->directory_path; - - newdir = g_strconcat (maildir, G_DIR_SEPARATOR_S, "new", NULL); - curdir = g_strconcat (maildir, G_DIR_SEPARATOR_S, "cur", NULL); - - /* Check new messages */ - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::get_message_count: " - "getting new messages from %s\n", newdir); - if ((dir_handle = _xopendir (newdir))) { - while ((dir_entry = readdir (dir_handle))) { - if (dir_entry->d_name[0] == '.') continue; - newfile = g_strconcat (newdir, G_DIR_SEPARATOR_S, - dir_entry->d_name, NULL); - curfile = g_strconcat (curdir, G_DIR_SEPARATOR_S, - dir_entry->d_name, ":2,", NULL); - - _xrename (newfile, curfile); - - g_free (curfile); - g_free (newfile); - } - closedir (dir_handle); - } - - /* Count messages */ - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::get_message_count: " - "counting messages in %s\n", curdir); - if ((dir_handle = _xopendir (curdir))) { - while ((dir_entry = readdir (dir_handle))) - if (dir_entry->d_name[0] != '.') count++; - closedir (dir_handle); - } - - g_free (curdir); - g_free (newdir); - - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::get_message_count: " - " found %d messages\n", count); - CAMEL_LOG_FULL_DEBUG ("Leaving " - "CamelMaildirFolder::get_message_count\n"); - return count; -} - - - - -/** - * CamelMaildirFolder::expunge: expunge messages marked as deleted - * @folder: the folder object - * - * Physically deletes the messages marked as deleted in the folder. - */ -static void -_expunge (CamelFolder *folder, CamelException *ex) -{ - CamelMimeMessage *message; - GList *node; - gchar *fullpath; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::expunge\n"); - g_assert(folder); - - /* expunge messages marked for deletion */ - for (node = folder->message_list; node; node = g_list_next(node)) { - message = CAMEL_MIME_MESSAGE (node->data); - if (!message) { - CAMEL_LOG_WARNING ("CamelMaildirFolder::expunge: " - "null message in node %p\n", node); - continue; - } - - if (camel_mime_message_get_flag (message, "DELETED")) { - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::expunge: " - "expunging message #%d\n", - message->message_number); - - /* expunge the message */ - fullpath = gtk_object_get_data (GTK_OBJECT (message), - "fullpath"); - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::expunge: " - "message fullpath is %s\n", - fullpath); - - if (_xunlink (fullpath)) - message->expunged = TRUE; - } else { - CAMEL_LOG_FULL_DEBUG ("CamelMaildirFolder::expunge: " - "skipping message #%d\n", - message->message_number); - } - } - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::expunge\n"); -} - - - - -/** - * CamelMaildirFolder::list_subfolders: return a list of subfolders - * @folder: the folder object - * - * Returns the names of the maildir subfolders in a list. - * - * Return value: list of subfolder names - */ -static GList * -_list_subfolders (CamelFolder *folder, CamelException *ex) -{ - CamelMaildirFolder *maildir_folder = CAMEL_MAILDIR_FOLDER (folder); - const gchar *maildir; - gchar *subdir; - struct stat statbuf; - struct dirent *dir_entry; - DIR *dir_handle; - GList *subfolders = NULL; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMaildirFolder::list_subfolders\n"); - g_assert (folder); - - /* check if the maildir exists */ - if (!camel_folder_exists (folder, ex)) return NULL; - - /* scan through the maildir toplevel directory */ - maildir = maildir_folder->directory_path; - if ((dir_handle = _xopendir (maildir))) { - while ((dir_entry = readdir (dir_handle))) { - if (dir_entry->d_name[0] == '.') continue; - if (strcmp (dir_entry->d_name, "new") == 0) continue; - if (strcmp (dir_entry->d_name, "cur") == 0) continue; - if (strcmp (dir_entry->d_name, "tmp") == 0) continue; - - subdir = g_strconcat (maildir, G_DIR_SEPARATOR_S, - dir_entry->d_name, NULL); - - if (_xstat (subdir, &statbuf) - && S_ISDIR (statbuf.st_mode)) - subfolders = - g_list_append ( - subfolders, - g_strdup (dir_entry->d_name)); - - g_free (subdir); - } - closedir (dir_handle); - } - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMaildirFolder::list_subfolders\n"); - return subfolders; -} - - - - - - - -/* - * fs utility function - * - */ - -static DIR * -_xopendir (const gchar *path) -{ - DIR *handle; - g_assert (path); - - handle = opendir (path); - if (!handle) { - CAMEL_LOG_WARNING ("ERROR: opendir (%s);\n", path); - CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n", - errno, strerror(errno)); - } - - return handle; -} - -static gboolean -_xstat (const gchar *path, struct stat *buf) -{ - gint stat_error; - g_assert (path); - g_assert (buf); - - stat_error = stat (path, buf); - if (stat_error == 0) { - return TRUE; - } else if (errno == ENOENT) { - buf->st_mode = 0; - return TRUE; - } else { - CAMEL_LOG_WARNING ("ERROR: stat (%s, %p);\n", path, buf); - CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n", - errno, strerror(errno)); - return FALSE; - } -} - -static gboolean -_xmkdir (const gchar *path) -{ - g_assert (path); - - if (mkdir (path, S_IRWXU) == -1) { - CAMEL_LOG_WARNING ("ERROR: mkdir (%s, S_IRWXU);\n", path); - CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n", - errno, strerror(errno)); - return FALSE; - } - - return TRUE; -} - -static gboolean -_xrename (const gchar *from, const gchar *to) -{ - g_assert (from); - g_assert (to); - - if (rename (from, to) == 0) { - return TRUE; - } else { - CAMEL_LOG_WARNING ("ERROR: rename (%s, %s);\n", from, to); - CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n", - errno, strerror(errno)); - return FALSE; - } -} - -static gboolean -_xunlink (const gchar *path) -{ - g_assert (path); - - if (unlink (path) == 0) { - return TRUE; - } else if (errno == ENOENT) { - return TRUE; - } else { - CAMEL_LOG_WARNING ("ERROR: unlink (%s);\n", path); - CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n", - errno, strerror(errno)); - return FALSE; - } -} - -static gboolean -_xrmdir (const gchar *path) -{ - DIR *dir_handle; - struct dirent *dir_entry; - gchar *file; - struct stat statbuf; - g_assert (path); - - dir_handle = opendir (path); - if (!dir_handle && errno == ENOENT) { - return TRUE; - } else if (!dir_handle) { - CAMEL_LOG_WARNING ("ERROR: opendir (%s);\n", path); - CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n", - errno, strerror(errno)); - return FALSE; - } - - while ((dir_entry = readdir (dir_handle))) { - file = g_strconcat (path, G_DIR_SEPARATOR_S, dir_entry->d_name, - NULL); - if (_xstat (file, &statbuf) && S_ISREG (statbuf.st_mode)) - _xunlink (file); - g_free (file); - } - - closedir (dir_handle); - - if (rmdir (path) == 0) { - return TRUE; - } else if (errno == ENOENT) { - return TRUE; - } else { - CAMEL_LOG_WARNING ("ERROR: rmdir (%s);\n", path); - CAMEL_LOG_FULL_DEBUG (" Full error text is: (%d) %s\n", - errno, strerror(errno)); - return FALSE; - } -} - -/** *** **/ - diff --git a/camel/providers/maildir/camel-maildir-folder.h b/camel/providers/maildir/camel-maildir-folder.h deleted file mode 100644 index 5997da2011..0000000000 --- a/camel/providers/maildir/camel-maildir-folder.h +++ /dev/null @@ -1,66 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-maildir-folder.h : Abstract class for an email folder */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@inria.fr> . - * - * 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_MAILDIR_FOLDER_H -#define CAMEL_MAILDIR_FOLDER_H 1 - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include "camel-folder.h" -/* #include "camel-store.h" */ - -#define CAMEL_MAILDIR_FOLDER_TYPE (camel_maildir_folder_get_type ()) -#define CAMEL_MAILDIR_FOLDER(obj) (GTK_CHECK_CAST((obj), CAMEL_MAILDIR_FOLDER_TYPE, CamelMaildirFolder)) -#define CAMEL_MAILDIR_FOLDER_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_MAILDIR_FOLDER_TYPE, CamelMaildirFolderClass)) -#define IS_CAMEL_MAILDIR_FOLDER(o) (GTK_CHECK_TYPE((o), CAMEL_MAILDIR_FOLDER_TYPE)) - - -typedef struct { - CamelFolder parent_object; - - gchar *directory_path; -} CamelMaildirFolder; - - - -typedef struct { - CamelFolderClass parent_class; - - /* Virtual methods */ - -} CamelMaildirFolderClass; - - -/* public methods */ - -/* Standard Gtk function */ -GtkType camel_maildir_folder_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MAILDIR_FOLDER_H */ diff --git a/camel/providers/maildir/camel-maildir-provider.c b/camel/providers/maildir/camel-maildir-provider.c deleted file mode 100644 index cd5521adc0..0000000000 --- a/camel/providers/maildir/camel-maildir-provider.c +++ /dev/null @@ -1,46 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-maildir-provider.c: maildir provider registration code */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@inria.fr> . - * - * 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 "config.h" -#include "camel-maildir-store.h" -#include "camel-provider.h" -#include "camel-log.h" - - -static CamelProvider _maildir_provider = { - (GtkType) 0, - PROVIDER_STORE, - "maildir", - "Maildir provider for Camel", - "This maildir provider is based on the default MH provider of Camel", - (GModule *) NULL -}; - - - -CamelProvider * -camel_provider_module_init () -{ - _maildir_provider.object_type = camel_maildir_store_get_type(); - return &_maildir_provider; -} diff --git a/camel/providers/maildir/camel-maildir-store.c b/camel/providers/maildir/camel-maildir-store.c deleted file mode 100644 index 8f37494003..0000000000 --- a/camel/providers/maildir/camel-maildir-store.c +++ /dev/null @@ -1,124 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-maildir-store.c : class for an maildir store */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@inria.fr> . - * - * 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 "camel-maildir-store.h" -#include "camel-maildir-folder.h" -#include "url-util.h" - -static CamelStoreClass *parent_class=NULL; - -/* Returns the class for a CamelMaildirStore */ -#define CMAILDIRS_CLASS(so) CAMEL_MAILDIR_STORE_CLASS (GTK_OBJECT(so)->klass) -#define CF_CLASS(so) CAMEL_FOLDER_CLASS (GTK_OBJECT(so)->klass) -#define CMAILDIRF_CLASS(so) CAMEL_MAILDIR_FOLDER_CLASS (GTK_OBJECT(so)->klass) - -static void _init (CamelStore *store, CamelSession *session, - const gchar *url_name); -static CamelFolder *_get_folder (CamelStore *store, const gchar *folder_name); - -static void -camel_maildir_store_class_init ( - CamelMaildirStoreClass *camel_maildir_store_class) -{ - CamelStoreClass *camel_store_class = - CAMEL_STORE_CLASS (camel_maildir_store_class); - - parent_class = gtk_type_class (camel_store_get_type ()); - - /* virtual method definition */ - /* virtual method overload */ - camel_store_class->init = _init; - camel_store_class->get_folder = _get_folder; -} - -static void -camel_maildir_store_init (gpointer object, gpointer klass) -{ - CamelMaildirStore *maildir_store = CAMEL_MAILDIR_STORE (object); - CamelStore *store = CAMEL_STORE (object); - - store->separator = G_DIR_SEPARATOR; -} - -GtkType -camel_maildir_store_get_type (void) -{ - static GtkType camel_maildir_store_type = 0; - - if (!camel_maildir_store_type) { - GtkTypeInfo camel_maildir_store_info = - { - "CamelMaildirStore", - sizeof (CamelMaildirStore), - sizeof (CamelMaildirStoreClass), - (GtkClassInitFunc) camel_maildir_store_class_init, - (GtkObjectInitFunc) camel_maildir_store_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_maildir_store_type = - gtk_type_unique (CAMEL_STORE_TYPE, - &camel_maildir_store_info); - } - - return camel_maildir_store_type; -} - -static void -_init (CamelStore *store, CamelSession *session, const gchar *url_name) -{ - CamelMaildirStore *maildir_store = CAMEL_MAILDIR_STORE (store); - Gurl *store_url; - g_assert (url_name); - - /* call parent implementation */ - parent_class->init (store, session, url_name); - - /* find the path in the URL*/ - store_url = g_url_new (url_name); - - g_return_if_fail (store_url); - g_return_if_fail (store_url->path); - - maildir_store->toplevel_dir = g_strdup (store_url->path); - - g_url_free (store_url); -} - -static CamelFolder * -_get_folder (CamelStore *store, const gchar *folder_name) -{ - CamelMaildirStore *maildir_store = CAMEL_MAILDIR_STORE (store); - CamelMaildirFolder *new_maildir_folder; - CamelFolder *new_folder; - - new_maildir_folder = gtk_type_new (CAMEL_MAILDIR_FOLDER_TYPE); - new_folder = CAMEL_FOLDER (new_maildir_folder); - - CF_CLASS (new_folder)->init_with_store (new_folder, store, NULL); - CF_CLASS (new_folder)->set_name (new_folder, folder_name, NULL); - - return new_folder; -} diff --git a/camel/providers/maildir/camel-maildir-store.h b/camel/providers/maildir/camel-maildir-store.h deleted file mode 100644 index 1a95ed1436..0000000000 --- a/camel/providers/maildir/camel-maildir-store.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-maildirstore.h : class for an maildir store */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@inria.fr> . - * - * 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_MAILDIR_STORE_H -#define CAMEL_MAILDIR_STORE_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include "camel-store.h" - -#define CAMEL_MAILDIR_STORE_TYPE (camel_maildir_store_get_type ()) -#define CAMEL_MAILDIR_STORE(obj) (GTK_CHECK_CAST((obj), CAMEL_MAILDIR_STORE_TYPE, CamelMaildirStore)) -#define CAMEL_MAILDIR_STORE_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_MAILDIR_STORE_TYPE, CamelMaildirStoreClass)) -#define IS_CAMEL_MAILDIR_STORE(o) (GTK_CHECK_TYPE((o), CAMEL_MAILDIR_STORE_TYPE)) - - -typedef struct { - CamelStore parent_object; - - gchar *toplevel_dir; -} CamelMaildirStore; - - - -typedef struct { - CamelStoreClass parent_class; - - -} CamelMaildirStoreClass; - - -/* public methods */ - -/* Standard Gtk function */ -GtkType camel_maildir_store_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MAILDIR_STORE_H */ - - diff --git a/camel/providers/mbox/.cvsignore b/camel/providers/mbox/.cvsignore deleted file mode 100644 index fd6b811c68..0000000000 --- a/camel/providers/mbox/.cvsignore +++ /dev/null @@ -1,7 +0,0 @@ -.deps -Makefile -Makefile.in -.libs -.deps -*.lo -*.la diff --git a/camel/providers/mbox/Makefile.am b/camel/providers/mbox/Makefile.am deleted file mode 100644 index b614a63036..0000000000 --- a/camel/providers/mbox/Makefile.am +++ /dev/null @@ -1,26 +0,0 @@ -## Process this file with automake to produce Makefile.in - -SUBDIRS = - -libcamelmboxincludedir = $(includedir)/camel - - -lib_LTLIBRARIES = libcamelmbox.la - -INCLUDES = -I.. -I$(srcdir)/.. -I$(includedir) \ - -I$(top_srcdir)/intl \ - $(GTK_INCLUDEDIR) -I$(top_srcdir)/camel - -libcamelmbox_la_SOURCES = \ - camel-mbox-folder.c \ - camel-mbox-store.c - -libcamelmboxinclude_HEADERS = \ - camel-mbox-folder.h \ - camel-mbox-store.h - - -libcamelmbox_la_LDFLAGS = -version-info 0:0:0 -rpath $(libdir) - - -EXTRA_DIST = diff --git a/camel/providers/mbox/camel-mbox-folder.c b/camel/providers/mbox/camel-mbox-folder.c deleted file mode 100644 index 966218fcc6..0000000000 --- a/camel/providers/mbox/camel-mbox-folder.c +++ /dev/null @@ -1,811 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mbox-folder.c : Abstract class for an email folder */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <bertrand@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 <config.h> - -#include <sys/types.h> -#include <dirent.h> -#include <sys/stat.h> -#include <unistd.h> -#include <errno.h> -#include <string.h> -#include <fcntl.h> - -#include "camel-mbox-folder.h" -#include "camel-mbox-store.h" -#include "string-utils.h" -#include "camel-log.h" -#include "camel-stream-buffered-fs.h" -#include "camel-folder-summary.h" -#include "gmime-utils.h" - -#include "camel-exception.h" - -#if 0 -#include "mbox-utils.h" -#include "mbox-uid.h" -#include "mbox-summary.h" -#endif - -static CamelFolderClass *parent_class=NULL; - -/* Returns the class for a CamelMboxFolder */ -#define CMBOXF_CLASS(so) CAMEL_MBOX_FOLDER_CLASS (GTK_OBJECT(so)->klass) -#define CF_CLASS(so) CAMEL_FOLDER_CLASS (GTK_OBJECT(so)->klass) -#define CMBOXS_CLASS(so) CAMEL_STORE_CLASS (GTK_OBJECT(so)->klass) - - -static void _init_with_store (CamelFolder *folder, CamelStore *parent_store, CamelException *ex); -static void _set_name(CamelFolder *folder, const gchar *name, CamelException *ex); - - -static void _open (CamelFolder *folder, CamelFolderOpenMode mode, CamelException *ex); -static void _close (CamelFolder *folder, gboolean expunge, CamelException *ex); -static gboolean _exists (CamelFolder *folder, CamelException *ex); -static gboolean _create(CamelFolder *folder, CamelException *ex); -static gboolean _delete (CamelFolder *folder, gboolean recurse, CamelException *ex); -static gboolean _delete_messages (CamelFolder *folder, CamelException *ex); -static GList *_list_subfolders (CamelFolder *folder, CamelException *ex); -#if 0 -static CamelMimeMessage *_get_message_by_number (CamelFolder *folder, gint number, CamelException *ex); -static gint _get_message_count (CamelFolder *folder, CamelException *ex); -static gint _append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex); -static void _expunge (CamelFolder *folder, CamelException *ex); -static void _copy_message_to (CamelFolder *folder, CamelMimeMessage *message, CamelFolder *dest_folder, CamelException *ex); -static const gchar *_get_message_uid (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex); -static CamelMimeMessage *_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex); -static GList *_get_uid_list (CamelFolder *folder, CamelException *ex); -#endif - -static void _finalize (GtkObject *object); - -static void -camel_mbox_folder_class_init (CamelMboxFolderClass *camel_mbox_folder_class) -{ - CamelFolderClass *camel_folder_class = CAMEL_FOLDER_CLASS (camel_mbox_folder_class); - GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_folder_class); - - parent_class = gtk_type_class (camel_folder_get_type ()); - - /* virtual method definition */ - /* virtual method overload */ - camel_folder_class->init_with_store = _init_with_store; - camel_folder_class->set_name = _set_name; - camel_folder_class->open = _open; - camel_folder_class->close = _close; - camel_folder_class->exists = _exists; - camel_folder_class->create = _create; - camel_folder_class->delete = _delete; - camel_folder_class->delete_messages = _delete_messages; - camel_folder_class->list_subfolders = _list_subfolders; -#if 0 - camel_folder_class->get_message_by_number = _get_message_by_number; - camel_folder_class->get_message_count = _get_message_count; - camel_folder_class->append_message = _append_message; - camel_folder_class->expunge = _expunge; - camel_folder_class->copy_message_to = _copy_message_to; - camel_folder_class->get_message_uid = _get_message_uid; - camel_folder_class->get_message_by_uid = _get_message_by_uid; - camel_folder_class->get_uid_list = _get_uid_list; -#endif - gtk_object_class->finalize = _finalize; - -} - - - -static void -_finalize (GtkObject *object) -{ - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER (object); - - CAMEL_LOG_FULL_DEBUG ("Entering CamelFolder::finalize\n"); - - - g_free (mbox_folder->folder_file_path); - g_free (mbox_folder->folder_dir_path); - - GTK_OBJECT_CLASS (parent_class)->finalize (object); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelFolder::finalize\n"); -} - - - - - -GtkType -camel_mbox_folder_get_type (void) -{ - static GtkType camel_mbox_folder_type = 0; - - if (!camel_mbox_folder_type) { - GtkTypeInfo camel_mbox_folder_info = - { - "CamelMboxFolder", - sizeof (CamelMboxFolder), - sizeof (CamelMboxFolderClass), - (GtkClassInitFunc) camel_mbox_folder_class_init, - (GtkObjectInitFunc) NULL, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_mbox_folder_type = gtk_type_unique (CAMEL_FOLDER_TYPE, &camel_mbox_folder_info); - } - - return camel_mbox_folder_type; -} - - - - - - -static void -_init_with_store (CamelFolder *folder, CamelStore *parent_store, CamelException *ex) -{ - CAMEL_LOG_FULL_DEBUG ("Entering CamelMhFolder::init_with_store\n"); - - /* call parent method */ - parent_class->init_with_store (folder, parent_store, ex); - if (camel_exception_get_id (ex)) return; - - /* we assume that the parent init_with_store - method checks for the existance of @folder */ - - folder->can_hold_messages = TRUE; - folder->can_hold_folders = TRUE; - folder->has_summary_capability = TRUE; - folder->has_uid_capability = TRUE; - - folder->summary = NULL; - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMhFolder::init_with_store\n"); -} - - - - - - -static void -_open (CamelFolder *folder, CamelFolderOpenMode mode, CamelException *ex) -{ - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER (folder); - struct dirent *dir_entry; - DIR *dir_handle; - - - if (folder->open_state == FOLDER_OPEN) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_INVALID_STATE, - "folder is already open"); - return; - } - - -#if 0 - Here, we need to check for the summary file - existence and create it if necessary. - /* get (or create) uid list */ - if (!(mbox_load_uid_list (mbox_folder) > 0)) - mbox_generate_uid_list (mbox_folder); - - /* get or create summary */ - /* it is important that it comes after uid list reading/generation */ - if (!(mbox_load_summary (mbox_folder) > 0)) - mbox_generate_summary (folder); - -#endif -} - - - - - - -static void -_close (CamelFolder *folder, gboolean expunge, CamelException *ex) -{ - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER (folder); - - - /* call parent implementation */ - parent_class->close (folder, expunge, ex); -} - - - - -static void -_set_name (CamelFolder *folder, const gchar *name, CamelException *ex) -{ - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER (folder); - const gchar *root_dir_path; - gchar *full_name; - const gchar *parent_full_name; - gchar separator; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMboxFolder::set_name\n"); - - /* call default implementation */ - parent_class->set_name (folder, name, ex); - if (camel_exception_get_id (ex)) return; - - g_free (mbox_folder->folder_file_path); - g_free (mbox_folder->folder_dir_path); - - separator = camel_store_get_separator (folder->parent_store); - root_dir_path = camel_mbox_store_get_toplevel_dir (CAMEL_MBOX_STORE(folder->parent_store)); - - CAMEL_LOG_FULL_DEBUG ("CamelMboxFolder::set_name full_name is %s\n", folder->full_name); - CAMEL_LOG_FULL_DEBUG ("CamelMboxFolder::set_name root_dir_path is %s\n", root_dir_path); - CAMEL_LOG_FULL_DEBUG ("CamelMboxFolder::separator is %c\n", separator); - - mbox_folder->folder_file_path = g_strdup_printf ("%s%c%s", root_dir_path, separator, folder->full_name); - mbox_folder->folder_dir_path = g_strdup_printf ("%s%c%s.sdb", root_dir_path, separator, folder->full_name); - - - CAMEL_LOG_FULL_DEBUG ("CamelMboxFolder::set_name mbox_folder->folder_file_path is %s\n", - mbox_folder->folder_file_path); - CAMEL_LOG_FULL_DEBUG ("CamelMboxFolder::set_name mbox_folder->folder_dir_path is %s\n", - mbox_folder->folder_dir_path); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMboxFolder::set_name\n"); -} - - - - - - -static gboolean -_exists (CamelFolder *folder, CamelException *ex) -{ - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder); - struct stat stat_buf; - gint stat_error; - gboolean exists; - - CAMEL_LOG_FULL_DEBUG ("Entering CamelMboxFolder::exists\n"); - - /* check if the folder object exists */ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FALSE; - } - - /* check if the mbox file path is determined */ - if (!mbox_folder->folder_file_path) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_INVALID, - "undetermined folder file path. Maybe use set_name ?"); - return FALSE; - } - - /* check if the mbox dir path is determined */ - if (!mbox_folder->folder_dir_path) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_INVALID, - "undetermined folder directory path. Maybe use set_name ?"); - return FALSE; - } - - /* check if the mbox directory exists */ - stat_error = stat (mbox_folder->folder_dir_path, &stat_buf); - if (stat_error == -1) { - CAMEL_LOG_FULL_DEBUG ("CamelMboxFolder::exists when executing stat on %s, stat_error = %d\n", - mbox_folder->folder_dir_path, stat_error); - CAMEL_LOG_FULL_DEBUG (" Full error text is : %s\n", strerror(errno)); - camel_exception_set (ex, - CAMEL_EXCEPTION_SYSTEM, - strerror(errno)); - return FALSE; - } - exists = S_ISDIR (stat_buf.st_mode); - if (!exists) return FALSE; - - /* check if the mbox file exists */ - stat_error = stat (mbox_folder->folder_file_path, &stat_buf); - if (stat_error == -1) { - CAMEL_LOG_FULL_DEBUG ("CamelMboxFolder::exists when executing stat on %s, stat_error = %d\n", - mbox_folder->folder_file_path, stat_error); - CAMEL_LOG_FULL_DEBUG (" Full error text is : %s\n", strerror(errno)); - camel_exception_set (ex, - CAMEL_EXCEPTION_SYSTEM, - strerror(errno)); - return FALSE; - } - - exists = S_REG (stat_buf.st_mode); - /* we should check the rights here */ - - CAMEL_LOG_FULL_DEBUG ("Leaving CamelMboxFolder::exists\n"); - return exists; -} - - - - - - - - -static gboolean -_create (CamelFolder *folder, CamelException *ex) -{ - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder); - const gchar *folder_file_path, *folder_dir_path; - mode_t dir_mode = S_IRWXU; - gint mkdir_error; - gboolean folder_already_exists; - int creat_fd; - mode_t old_umask; - - /* check if the folder object exists */ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FALSE; - } - - - /* call default implementation */ - parent_class->create (folder, ex); - - /* get the paths of what we need to create */ - folder_file_path = mbox_folder->folder_file_path; - folder_dir_path = mbox_folder->folder_file_path; - - if (!(folder_file_path || folder_dir_path)) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_INVALID, - "invalid folder path. Use set_name ?"); - return FALSE; - } - - - /* if the folder already exists, simply return */ - folder_already_exists = camel_folder_exists (folder,ex); - if (camel_exception_get_id (ex)) return FALSE; - - if (folder_already_exists) return TRUE; - - - /* create the directory for the subfolders */ - mkdir_error = mkdir (folder_dir_path, dir_mode); - if (mkdir_error == -1) goto io_error; - - - /* create the mbox file */ - /* it must be rw for the user and none for the others */ - old_umask = umask (0700); - creat_fd = open (folder_file_path, - O_WRONLY | O_CREAT | O_APPEND, - S_IRUSR | S_IWUSR); - umask (old_umask); - if (creat_fd == -1) goto io_error; - close (creat_fd); - - return TRUE; - - /* exception handling for io errors */ - io_error : - - CAMEL_LOG_WARNING ("CamelMboxFolder::create, error when creating %s and %s\n", - folder_dir_path, folder_file_path); - CAMEL_LOG_FULL_DEBUG ( " Full error text is : %s\n", strerror(errno)); - - if (errno == EACCES) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION, - "You don't have the permission to create the mbox file."); - return FALSE; - } else { - camel_exception_set (ex, - CAMEL_EXCEPTION_SYSTEM, - "Unable to create the mbox file."); - return FALSE; - } -} - - - - - - - - -static gboolean -_delete (CamelFolder *folder, gboolean recurse, CamelException *ex) -{ - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder); - const gchar *folder_file_path, *folder_dir_path; - gint rmdir_error = 0; - gint unlink_error = 0; - gboolean folder_already_exists; - - /* check if the folder object exists */ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FALSE; - } - - - /* in the case where the folder does not exist, - return immediatly */ - folder_already_exists = camel_folder_exists (folder, ex); - if (camel_exception_get_id (ex)) return FALSE; - - if (!folder_already_exists) return TRUE; - - - /* call default implementation. - It should delete the messages in the folder - and recurse the operation to subfolders */ - parent_class->delete (folder, recurse, ex); - - - /* get the paths of what we need to delete */ - folder_file_path = mbox_folder->folder_file_path; - folder_dir_path = mbox_folder->folder_file_path; - - if (!(folder_file_path || folder_dir_path)) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_INVALID, - "invalid folder path. Use set_name ?"); - return FALSE; - } - - - /* physically delete the directory */ - CAMEL_LOG_FULL_DEBUG ("CamelMboxFolder::delete removing directory %s\n", folder_dir_path); - rmdir_error = rmdir (folder_dir_path); - if (rmdir_error == -1) - switch errno { - case EACCES : - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION, - "Not enough permission to delete the mbox folder"); - return FALSE; - break; - - case ENOTEMPTY : - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NON_EMPTY, - "mbox folder not empty. Cannot delete it. Maybe use recurse flag ?"); - return FALSE; - break; - default : - camel_exception_set (ex, - CAMEL_EXCEPTION_SYSTEM, - "Unable to delete the mbox folder."); - return FALSE; - } - - /* physically delete the file */ - unlink_error = unlink (folder_dir_path); - if (unlink_error == -1) - switch errno { - case EACCES : - case EPERM : - case EROFS : - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION, - "Not enough permission to delete the mbox file"); - return FALSE; - break; - - case EFAULT : - case ENOENT : - case ENOTDIR : - case EISDIR : - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_INVALID_PATH, - "Invalid mbox file"); - return FALSE; - break; - - default : - camel_exception_set (ex, - CAMEL_EXCEPTION_SYSTEM, - "Unable to delete the mbox folder."); - return FALSE; - } - - - return TRUE; -} - - - - -gboolean -_delete_messages (CamelFolder *folder, CamelException *ex) -{ - - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder); - const gchar *folder_file_path; - gboolean folder_already_exists; - int creat_fd; - mode_t old_umask; - - - /* check if the folder object exists */ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FALSE; - } - - /* in the case where the folder does not exist, - return immediatly */ - folder_already_exists = camel_folder_exists (folder, ex); - if (camel_exception_get_id (ex)) return FALSE; - - if (!folder_already_exists) return TRUE; - - - - /* get the paths of the mbox file we need to delete */ - folder_file_path = mbox_folder->folder_file_path; - - if (!folder_file_path) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_INVALID, - "invalid folder path. Use set_name ?"); - return FALSE; - } - - - /* create the mbox file */ - /* it must be rw for the user and none for the others */ - old_umask = umask (0700); - creat_fd = open (folder_file_path, - O_WRONLY | O_TRUNC, - S_IRUSR | S_IWUSR); - umask (old_umask); - if (creat_fd == -1) goto io_error; - close (creat_fd); - - return TRUE; - - /* exception handling for io errors */ - io_error : - - CAMEL_LOG_WARNING ("CamelMboxFolder::create, error when deleting files %s\n", - folder_file_path); - CAMEL_LOG_FULL_DEBUG ( " Full error text is : %s\n", strerror(errno)); - - if (errno == EACCES) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION, - "You don't have the permission to write in the mbox file."); - return FALSE; - } else { - camel_exception_set (ex, - CAMEL_EXCEPTION_SYSTEM, - "Unable to write in the mbox file."); - return FALSE; - } - - -} - - - - - - - - - -static GList * -_list_subfolders (CamelFolder *folder, CamelException *ex) -{ - GList *subfolder_name_list = NULL; - - CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder); - const gchar *folder_dir_path; - gboolean folder_exists; - - struct stat stat_buf; - gint stat_error = 0; - GList *file_list; - gchar *entry_name; - gchar *full_entry_name; - gchar *real_folder_name; - struct dirent *dir_entry; - DIR *dir_handle; - gboolean folder_suffix_found; - - gchar *io_error_text; - - - - /* check if the folder object exists */ - if (!folder) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_NULL, - "folder object is NULL"); - return FALSE; - } - - - /* in the case the folder does not exist, - raise an exception */ - folder_exists = camel_folder_exists (folder, ex); - if (camel_exception_get_id (ex)) return FALSE; - - if (!folder_exists) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_INVALID, - "Inexistant folder."); - return FALSE; - } - - - /* get the mbox subfolders directories */ - folder_dir_path = mbox_folder->folder_file_path; - if (!folder_dir_path) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_INVALID, - "Invalid folder path. Use set_name ?"); - return FALSE; - } - - - dir_handle = opendir (folder_dir_path); - - /* read the first entry in the directory */ - dir_entry = readdir (dir_handle); - while ((stat_error != -1) && (dir_entry != NULL)) { - - /* get the name of the next entry in the dir */ - entry_name = dir_entry->d_name; - full_entry_name = g_strdup_printf ("%s/%s", folder_dir_path, entry_name); - stat_error = stat (full_entry_name, &stat_buf); - g_free (full_entry_name); - - /* is it a directory ? */ - if ((stat_error != -1) && S_ISDIR (stat_buf.st_mode)) { - /* yes, add it to the list */ - if (entry_name[0] != '.') { - CAMEL_LOG_FULL_DEBUG ("CamelMboxFolder::list_subfolders adding " - "%s\n", entry_name); - - /* if the folder is a netscape folder, remove the - ".sdb" from the name */ - real_folder_name = string_prefix (entry_name, ".sdb", &folder_suffix_found); - /* stick here the tests for other folder suffixes if any */ - - if (!folder_suffix_found) real_folder_name = g_strdup (entry_name); - - /* add the folder name to the list */ - subfolder_name_list = g_list_append (subfolder_name_list, - real_folder_name); - } - } - /* read next entry */ - dir_entry = readdir (dir_handle); - } - - closedir (dir_handle); - - return subfolder_name_list; - - - - /* io exception handling */ - io_error : - - switch errno { - case EACCES : - - camel_exception_setv (ex, - CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION, - "Unable to list the directory. Full Error text is : %s ", - strerror (errno)); - break; - - case ENOENT : - case ENOTDIR : - camel_exception_setv (ex, - CAMEL_EXCEPTION_FOLDER_INVALID_PATH, - "Invalid mbox folder path. Full Error text is : %s ", - strerror (errno)); - break; - - default : - camel_exception_set (ex, - CAMEL_EXCEPTION_SYSTEM, - "Unable to delete the mbox folder."); - - } - - g_list_free (subfolder_name_list); - return NULL; -} - - - - - - - - - - - -static CamelMimeMessage * -_get_message_by_number (CamelFolder *folder, gint number, CamelException *ex) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); - const gchar *directory_path; - gchar *message_name; - gchar *message_file_name; - CamelStream *input_stream = NULL; - CamelMimeMessage *message = NULL; - GList *message_list = NULL; - - g_assert(folder); - - - directory_path = mh_folder->directory_path; - if (!directory_path) return NULL; - - - - message_name = g_list_nth_data (mh_folder->file_name_list, number); - - if (message_name != NULL) { - CAMEL_LOG_FULL_DEBUG ("CanelMhFolder::get_message message number = %d, name = %s\n", - number, message_name); - message_file_name = g_strdup_printf ("%s/%s", directory_path, message_name); - input_stream = camel_stream_buffered_fs_new_with_name (message_file_name, CAMEL_STREAM_BUFFERED_FS_READ); - - if (input_stream != NULL) { -#warning use session field here - message = camel_mime_message_new_with_session ( (CamelSession *)NULL); - camel_data_wrapper_construct_from_stream ( CAMEL_DATA_WRAPPER (message), input_stream); - gtk_object_unref (GTK_OBJECT (input_stream)); - message->message_number = number; - gtk_object_set_data_full (GTK_OBJECT (message), "filename", - g_strdup (message_name), _filename_free); - -#warning Set flags and all this stuff here - } - g_free (message_file_name); - } else - CAMEL_LOG_FULL_DEBUG ("CanelMhFolder::get_message message number = %d, not found\n", number); - - - return message; -} diff --git a/camel/providers/mbox/camel-mbox-folder.h b/camel/providers/mbox/camel-mbox-folder.h deleted file mode 100644 index 6a0d8d66db..0000000000 --- a/camel/providers/mbox/camel-mbox-folder.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mbox-folder.h : Abstract class for an email folder */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <bertrand@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_MBOX_FOLDER_H -#define CAMEL_MBOX_FOLDER_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include "camel-folder.h" -/* #include "camel-store.h" */ - -#define CAMEL_MBOX_FOLDER_TYPE (camel_mbox_folder_get_type ()) -#define CAMEL_MBOX_FOLDER(obj) (GTK_CHECK_CAST((obj), CAMEL_MBOX_FOLDER_TYPE, CamelMboxFolder)) -#define CAMEL_MBOX_FOLDER_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_MBOX_FOLDER_TYPE, CamelMboxFolderClass)) -#define IS_CAMEL_MBOX_FOLDER(o) (GTK_CHECK_TYPE((o), CAMEL_MBOX_FOLDER_TYPE)) - - -typedef struct { - CamelFolder parent_object; - - gchar *folder_file_path; /* contains the messages */ - gchar *folder_dir_path; /* contains the subfolders */ - GArray *uid_array; - -} CamelMboxFolder; - - - -typedef struct { - CamelFolderClass parent_class; - - /* Virtual methods */ - -} CamelMboxFolderClass; - - -/* public methods */ - -/* Standard Gtk function */ -GtkType camel_mbox_folder_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MBOX_FOLDER_H */ diff --git a/camel/providers/mbox/camel-mbox-parser.c b/camel/providers/mbox/camel-mbox-parser.c deleted file mode 100644 index a13032a391..0000000000 --- a/camel/providers/mbox/camel-mbox-parser.c +++ /dev/null @@ -1,96 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mbox-parser.c : mbox folder parser */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <bertrand@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 <config.h> -#include "camel-mbox-parser.h" -#include "camel-log.h" -#include "camel-exception.h" - -#include <sys/types.h> -#include <unistd.h> - - - - -GList * -camel_mbox_find_message_positions (int fd, gint first_position, CamelException *ex) -{ -#define MBOX_PARSER_BUF_SIZE 1000 - - off_t seek_res; - GList *message_positions = NULL; - char buffer[MBOX_PARSER_BUF_SIZE]; - ssize_t buf_nb_read; - - - /* set the initial position */ - seek_res = lseek (fd, first_position, SEEK_SET); - if (seek_res == (off_t)-1) goto io_error; - - /* populate the buffer and initialize the search proc */ - buf_nb_read = read (fd, buffer, MBOX_PARSER_BUF_SIZE); - - while (buf_nb_read>0) { - current_pos = 0; - - - - - /* read the next chunk of data in the folder file */ - buf_nb_read = read (fd, buffer, MBOX_PARSER_BUF_SIZE); - } - - - - - - - /* io exception handling */ - io_error : - - switch errno { - case EACCES : - - camel_exception_setv (ex, - CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION, - "Unable to list the directory. Full Error text is : %s ", - strerror (errno)); - break; - - case ENOENT : - case ENOTDIR : - camel_exception_setv (ex, - CAMEL_EXCEPTION_FOLDER_INVALID_PATH, - "Invalid mbox folder path. Full Error text is : %s ", - strerror (errno)); - break; - - default : - camel_exception_set (ex, - CAMEL_EXCEPTION_SYSTEM, - "Unable to delete the mbox folder."); - - } - -} diff --git a/camel/providers/mbox/camel-mbox-parser.h b/camel/providers/mbox/camel-mbox-parser.h deleted file mode 100644 index 19b7a42dc8..0000000000 --- a/camel/providers/mbox/camel-mbox-parser.h +++ /dev/null @@ -1,25 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mbox-parser.c : mbox folder parser */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <bertrand@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 - */ - - - diff --git a/camel/providers/mbox/camel-mbox-store.c b/camel/providers/mbox/camel-mbox-store.c deleted file mode 100644 index d0b1d15cbc..0000000000 --- a/camel/providers/mbox/camel-mbox-store.c +++ /dev/null @@ -1,153 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mbox-store.c : class for an mbox store */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <bertrand@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 "camel-mbox-store.h" -#include "camel-mbox-folder.h" -#include "url-util.h" - -static CamelStoreClass *parent_class=NULL; - -/* Returns the class for a CamelMboxStore */ -#define CMBOXS_CLASS(so) CAMEL_MBOX_STORE_CLASS (GTK_OBJECT(so)->klass) -#define CF_CLASS(so) CAMEL_FOLDER_CLASS (GTK_OBJECT(so)->klass) -#define CMBOXF_CLASS(so) CAMEL_MBOX_FOLDER_CLASS (GTK_OBJECT(so)->klass) - -static void _init (CamelStore *store, CamelSession *session, const gchar *url_name); -static CamelFolder *_get_folder (CamelStore *store, const gchar *folder_name); - - -static void -camel_mbox_store_class_init (CamelMboxStoreClass *camel_mbox_store_class) -{ - CamelStoreClass *camel_store_class = CAMEL_STORE_CLASS (camel_mbox_store_class); - - parent_class = gtk_type_class (camel_store_get_type ()); - - /* virtual method definition */ - /* virtual method overload */ - camel_store_class->init = _init; - camel_store_class->get_folder = _get_folder; -} - - - -static void -camel_mbox_store_init (gpointer object, gpointer klass) -{ - CamelMboxStore *mbox_store = CAMEL_MBOX_STORE (object); - CamelStore *store = CAMEL_STORE (object); - - store->separator = '/'; -} - - - - -GtkType -camel_mbox_store_get_type (void) -{ - static GtkType camel_mbox_store_type = 0; - - if (!camel_mbox_store_type) { - GtkTypeInfo camel_mbox_store_info = - { - "CamelMboxStore", - sizeof (CamelMboxStore), - sizeof (CamelMboxStoreClass), - (GtkClassInitFunc) camel_mbox_store_class_init, - (GtkObjectInitFunc) camel_mbox_store_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_mbox_store_type = gtk_type_unique (CAMEL_STORE_TYPE, &camel_mbox_store_info); - } - - return camel_mbox_store_type; -} - - - - -/* These evil public functions are here for test only */ -void -camel_mbox_store_set_toplevel_dir (CamelMboxStore *store, const gchar *toplevel) -{ - store->toplevel_dir = g_strdup (toplevel); - CAMEL_STORE(store)->separator = '/'; -} - - -const gchar * -camel_mbox_store_get_toplevel_dir (CamelMboxStore *store) -{ - return store->toplevel_dir; -} - - - -static void -_init (CamelStore *store, CamelSession *session, const gchar *url_name) -{ - CamelMboxStore *mbox_store = CAMEL_MBOX_STORE (store); - Gurl *store_url; - - g_assert (url_name); - /* call parent implementation */ - parent_class->init (store, session, url_name); - - - /* find the path in the URL*/ - store_url = g_url_new (url_name); - - g_return_if_fail (store_url); - g_return_if_fail (store_url->path); - - mbox_store->toplevel_dir = g_strdup (store_url->path); - g_url_free (store_url); - - - -} - - -static CamelFolder * -_get_folder (CamelStore *store, const gchar *folder_name) -{ - CamelMboxFolder *new_mbox_folder; - CamelFolder *new_folder; - - /* check if folder has already been created */ - /* call the standard routine for that when */ - /* it is done ... */ - - new_mbox_folder = gtk_type_new (CAMEL_MBOX_FOLDER_TYPE); - new_folder = CAMEL_FOLDER (new_mbox_folder); - - CF_CLASS (new_folder)->init_with_store (new_folder, store, NULL); - CF_CLASS (new_folder)->set_name (new_folder, folder_name, NULL); - - - return new_folder; -} diff --git a/camel/providers/mbox/camel-mbox-store.h b/camel/providers/mbox/camel-mbox-store.h deleted file mode 100644 index 2f93c98c0e..0000000000 --- a/camel/providers/mbox/camel-mbox-store.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camel-mbox-store.h : class for an mbox store */ - -/* - * - * Copyright (C) 1999 Bertrand Guiheneuf <bertrand@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_MBOX_STORE_H -#define CAMEL_MBOX_STORE_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <gtk/gtk.h> -#include "camel-store.h" - -#define CAMEL_MBOX_STORE_TYPE (camel_mbox_store_get_type ()) -#define CAMEL_MBOX_STORE(obj) (GTK_CHECK_CAST((obj), CAMEL_MBOX_STORE_TYPE, CamelMboxStore)) -#define CAMEL_MBOX_STORE_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_MBOX_STORE_TYPE, CamelMboxStoreClass)) -#define IS_CAMEL_MBOX_STORE(o) (GTK_CHECK_TYPE((o), CAMEL_MBOX_STORE_TYPE)) - - -typedef struct { - CamelStore parent_object; - - gchar *toplevel_dir; -} CamelMboxStore; - - - -typedef struct { - CamelStoreClass parent_class; - - -} CamelMboxStoreClass; - - -/* public methods */ - -/* Standard Gtk function */ -GtkType camel_mbox_store_get_type (void); - -void camel_mbox_store_set_toplevel_dir (CamelMboxStore *store, const gchar *toplevel); -const gchar *camel_mbox_store_get_toplevel_dir (CamelMboxStore *store); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAMEL_MBOX_STORE_H */ - - diff --git a/camel/string-utils.c b/camel/string-utils.c deleted file mode 100644 index 3f9ce4805d..0000000000 --- a/camel/string-utils.c +++ /dev/null @@ -1,313 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* string-util : utilities for gchar* strings */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 <config.h> -#include "string-utils.h" -#include "camel-log.h" -#include "string.h" - - - -gboolean -string_equal_for_glist (gconstpointer v, gconstpointer v2) -{ - return (!strcmp ( ((const gchar *)v), ((const gchar*)v2))) == 0; -} - -/** - * string_dichotomy: - * @sep : separator - * @prefix: pointer to be field by the prefix object - * the prefix is not returned when the given pointer is NULL - * @suffix: pointer to be field by the suffix object - * the suffix is not returned when the given pointer is NULL - * - * Return the strings before and/or after - * the last occurence of the specified separator - * - * This routine returns the string before and/or after - * a character given as an argument. - * if the separator is the last character, prefix and/or - * suffix is set to NULL and result is set to 'l' - * if the separator is not in the list, prefix and/or - * suffix is set to NULL and result is set to 'n' - * When the operation succedeed, the return value is 'o' - * - * @Return Value : result of the operation ('o', 'l' or 'n') - * - **/ -gchar -string_dichotomy (const gchar *string, gchar sep, gchar **prefix, gchar **suffix, - StringDichotomyOption options) -{ - gchar *tmp_str; - gint sep_pos, first, last, len; - - g_assert (string); - CAMEL_LOG_FULL_DEBUG (\ - "string_dichotomy:: string=\"%s\"\n\tseparator=\"%c\" \n\tprefix=%p \n\tsuffix=%p \n\toptions=%ld\n",\ - string, sep, prefix, suffix, options); - len = strlen (string); - if (!len) { - if (prefix) - *prefix=NULL; - if (suffix) - *suffix=NULL; - CAMEL_LOG_FULL_DEBUG ("string_dichotomy:: input string is empty\n"); - return 'n'; - } - first = 0; - last = len-1; - - if ( (options & STRING_DICHOTOMY_STRIP_LEADING ) && (string[first] == sep) ) - do {first++;} while ( (first<len) && (string[first] == sep) ); - - if (options & STRING_DICHOTOMY_STRIP_TRAILING ) - while ((string[last] == sep) && (last>first)) - last--; - - if (first==last) { - if (prefix) *prefix=NULL; - if (suffix) *suffix=NULL; - CAMEL_LOG_FULL_DEBUG ("string_dichotomy: after stripping, string is empty\n"); - return 'n'; - } - - if (options & STRING_DICHOTOMY_RIGHT_DIR) { - sep_pos = last; - while ((sep_pos>=first) && (string[sep_pos]!=sep)) { - sep_pos--; - } - } else { - sep_pos = first; - while ((sep_pos<=last) && (string[sep_pos]!=sep)) { - sep_pos++; - } - - } - - if ( (sep_pos<first) || (sep_pos>last) ) - { - if (suffix) *suffix=NULL; - if (prefix) *prefix=NULL; - CAMEL_LOG_FULL_DEBUG ("string_dichotomy: separator not found\n"); - return 'n'; - } - - /* if we have stripped trailing separators, we should */ - /* never enter here */ - if (sep_pos==last) - { - if (suffix) *suffix=NULL; - if (prefix) *prefix=NULL; - CAMEL_LOG_FULL_DEBUG ("string_dichotomy: separator is last character\n"); - return 'l'; - } - /* if we have stripped leading separators, we should */ - /* never enter here */ - if (sep_pos==first) - { - if (suffix) *suffix=NULL; - if (prefix) *prefix=NULL; - CAMEL_LOG_FULL_DEBUG ("string_dichotomy: separator is first character\n"); - return 'l'; - } - CAMEL_LOG_FULL_DEBUG ("string_dichotomy: separator found at :%d\n", sep_pos); - if (prefix) { /* return the prefix */ - *prefix = g_strndup (string+first,sep_pos-first); - CAMEL_LOG_FULL_DEBUG ( "string_dichotomy:: prefix:\"%s\"\n", *prefix); - } - if (suffix) { /* return the suffix */ - *suffix = g_strndup (string+sep_pos+1, last-sep_pos); - CAMEL_LOG_FULL_DEBUG ( "string_dichotomy:: suffix:\"%s\"\n", *suffix); - } - - return 'o'; -} - - - - - - -/* utility func : frees a gchar element in a GList */ -static void -__string_list_free_string (gpointer data, gpointer user_data) -{ - gchar *string = (gchar *)data; - g_free (string); -} - - -void -string_list_free (GList *string_list) -{ - if (string_list == NULL) return; - - g_list_foreach (string_list, __string_list_free_string, NULL); - g_list_free (string_list); -} - - - - - - -GList * -string_split (const gchar *string, char sep, const gchar *trim_chars, StringTrimOption trim_options) -{ - GList *result = NULL; - gint first, last, pos; - gchar *new_string; - - g_assert (string); - - first = 0; - last = strlen(string) - 1; - - /* strip leading and trailing separators */ - while ( (first<=last) && (string[first]==sep) ) - first++; - while ( (first<=last) && (string[last]==sep) ) - last--; - - - CAMEL_LOG_FULL_DEBUG ("string_split:: trim options: %d\n", trim_options); - - while (first<=last) { - pos = first; - /* find next separator */ - while ((pos<=last) && (string[pos]!=sep)) pos++; - if (first != pos) { - new_string = g_strndup (string+first, pos-first); - /* could do trimming in line to speed up this code */ - if (trim_chars) string_trim (new_string, trim_chars, trim_options); - result = g_list_append (result, new_string); - } - first = pos + 1; - } - - return result; -} - - -void -string_trim (gchar *string, const gchar *trim_chars, StringTrimOption options) -{ - gint first_ok; - gint last_ok; - guint length; - - CAMEL_LOG_FULL_DEBUG ("string-utils:: Entering string_trim::\n"); - CAMEL_LOG_FULL_DEBUG ("string_trim:: trim_chars:\"%s\"", trim_chars); - CAMEL_LOG_FULL_DEBUG ("string_trim:: trim_options:%d\n", options); - - g_return_if_fail (string); - length = strlen (string); - g_return_if_fail (length > 0); - - first_ok = 0; - last_ok = length - 1; - - if (options & STRING_TRIM_STRIP_LEADING) - while ( (first_ok <= last_ok) && (strchr (trim_chars, string[first_ok])!=NULL) ) - first_ok++; - - if (options & STRING_TRIM_STRIP_TRAILING) - while ( (first_ok <= last_ok) && (strchr (trim_chars, string[last_ok])!=NULL) ) - last_ok--; - CAMEL_LOG_FULL_DEBUG ("string_trim::\n\t\"%s\":first ok:%d last_ok:%d\n", - string, first_ok, last_ok); - - if (first_ok > 0) - memmove (string, string+first_ok, last_ok - first_ok +2); - -} - - - - - -/** - * remove_suffix: remove a suffix from a string - * @s: the string to remove the suffix from. - * @suffix: the suffix to remove - * @suffix_found : suffix found flag - * - * Remove a suffix from a string. If the - * string ends with the full suffix, a copy - * of the string without the suffix is returned and - * @suffix_found is set to %TRUE. - * Otherwise, NULL is returned and - * @suffix_found is set to %FALSE. - * - * Return value: an allocated copy of the string without the suffix or NULL if the suffix was not found. - **/ -gchar * -string_prefix (const gchar *s, const gchar *suffix, gboolean *suffix_found) -{ - guint s_len, suf_len; - guint suffix_pos; - char *result_string; - - g_assert (s); - g_assert (suffix); - g_assert (suffix_found); - - s_len = strlen (s); - suf_len = strlen (suffix); - - /* if the string is shorter than the suffix, do nothing */ - if (s_len < suf_len) { - *suffix_found = FALSE; - return NULL; - } - - /* theoretical position of the prefix */ - suffix_pos = s_len - suf_len; - - /* compare the right hand side of the string with the suffix */ - if (!strncmp (s+suffix_pos, suffix, suf_len)) { - - /* if the suffix matches, check that there are - characters before */ - if (suffix_pos == 0) { - result_string = NULL; - *suffix_found = TRUE; - } else { - result_string = g_strndup (s, suffix_pos); - *suffix_found = TRUE; - } - - } else { - result_string = NULL; - *suffix_found = FALSE; - } - - return result_string; -} diff --git a/camel/string-utils.h b/camel/string-utils.h deleted file mode 100644 index f37abbd08b..0000000000 --- a/camel/string-utils.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* string-util : utilities for normal gchar * strings */ - -/* - * - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 STRING_UTIL_H -#define STRING_UTIL_H 1 - - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include <glib.h> - - - -typedef enum { - STRING_DICHOTOMY_NONE = 0, - STRING_DICHOTOMY_RIGHT_DIR = 1, - STRING_DICHOTOMY_STRIP_TRAILING = 2, - STRING_DICHOTOMY_STRIP_LEADING = 4 - -} StringDichotomyOption; - - -typedef enum { - STRING_TRIM_NONE = 0, - STRING_TRIM_STRIP_TRAILING = 1, - STRING_TRIM_STRIP_LEADING = 2 -} StringTrimOption; - - - -gboolean string_equal_for_glist (gconstpointer v, gconstpointer v2); - -gchar string_dichotomy (const gchar *string, gchar sep, - gchar **prefix, gchar **suffix, - StringDichotomyOption options); -void string_list_free (GList *string_list); - -GList *string_split (const gchar *string, char sep, - const gchar *trim_chars, StringTrimOption trim_options); -void string_trim (gchar *string, const gchar *chars, - StringTrimOption options); - -gchar *string_prefix (const gchar *s, const gchar *suffix, gboolean *suffix_found); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* STRING_UTIL_H */ diff --git a/camel/url-util.c b/camel/url-util.c deleted file mode 100644 index ba6bb1e813..0000000000 --- a/camel/url-util.c +++ /dev/null @@ -1,418 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* url-util.c : utility functions to parse URLs */ - - -/* - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 - */ - - - -/* - Here we deal with URL following the general scheme: - protocol://user:password@host:port/name - where name is a path-like string (ie dir1/dir2/....) - See rfc1738 for the complete description of - Uniform Ressource Locators - - Bertrand. */ -/* - XXX TODO: recover the words between #'s or ?'s after the path */ - -#include <config.h> -#include "url-util.h" - -/* general item finder */ -/* it begins the search at position @position in @url, - returns true when the item is found, amd set position after the item */ -typedef gboolean find_item_func(const gchar *url, gchar **item, guint *position, gboolean *error); - -/* used to find one item (protocol, then user .... */ -typedef struct { - char *item_name; /* item name : for debug only */ - gchar **item_value; /* where the item value will go */ - find_item_func *find_func; /* item finder */ -} FindStepStruct; - -static gboolean _find_protocol (const gchar *url, gchar **item, guint *position, gboolean *error); -static gboolean _find_user (const gchar *url, gchar **item, guint *position, gboolean *error); -static gboolean _find_passwd (const gchar *url, gchar **item, guint *position, gboolean *error); -static gboolean _find_host (const gchar *url, gchar **item, guint *position, gboolean *error); -static gboolean _find_port (const gchar *url, gchar **item, guint *position, gboolean *error); -static gboolean _find_path (const gchar *url, gchar **item, guint *position, gboolean *error); - - - -/** - * g_url_new: create an Gurl object from a string - * - * @url_string: The string containing the URL to scan - * - * This routine takes a gchar and parses it as an - * URL of the form: - * protocol://user:password@host:port/path - * there is no test on the values. For example, - * "port" can be a string, not only a number ! - * The Gurl structure fields ar filled with - * the scan results. When a member of the - * general URL can not be found, the corresponding - * Gurl member is NULL - * Fields filled in the Gurl structure are allocated - * and url_string is not modified. - * - * Return value: a Gurl structure containing the URL items. - **/ -Gurl *g_url_new (const gchar* url_string) -{ - Gurl *g_url; - - gchar *protocol; - gchar *user; - gchar *passwd; - gchar *host; - gchar *port; - gchar *path; - - guint position = 0; - gboolean error; - gboolean found; - guint i; - - g_url = g_new (Gurl,1); - -#define NB_STEP_URL 6 - { - FindStepStruct step[NB_STEP_URL] = { - { "protocol", &(g_url->protocol), _find_protocol}, - { "user", &(g_url->user), _find_user}, - { "password", &(g_url->passwd), _find_passwd}, - { "host", &(g_url->host), _find_host}, - { "port", &(g_url->port), _find_port}, - { "path", &(g_url->path), _find_path} - }; - - for (i = 0; i < NB_STEP_URL; i++) { - found = step[i].find_func (url_string, - step[i].item_value, - &position, - &error); - } - } - - return g_url; -} - - - -void -g_url_free (Gurl *url) -{ - g_assert (url); - - g_free (url->protocol); - g_free (url->user); - g_free (url->passwd); - g_free (url->host); - g_free (url->port); - g_free (url->path); - - g_free (url); - -} - -/**** PARSING FUNCTIONS ****/ - -/* So, yes, I must admit there would have been more elegant - ways to do this, but it works, and quite well :) */ - - -static gboolean -_find_protocol (const gchar *url, gchar **item, guint *position, gboolean *error) -{ - - guint i; - gint len_url; - - g_assert (url); - g_assert (item); - g_assert (position); - - len_url = strlen (url); - - *item = NULL; - *error = FALSE; - i = *position; - - /* find a ':' */ - while ((i < len_url) && (url[i] != ':')) i++; - - if (i == len_url) return FALSE; - i++; - - /* check if it is followed by a "//" */ - if ((i < len_url) && (url[i++] == '/')) - if ((i < len_url) && (url[i++] == '/')) - { - *item = g_strndup (url, i-3); - *position = i; - return TRUE; - } - - return FALSE; -} - - - - -static gboolean -_find_user (const gchar *url, gchar **item, guint *position, gboolean *error) -{ - guint i; - guint at_pos; - gint len_url; - - g_assert (url); - g_assert (item); - g_assert (position); - - len_url = strlen (url); - *item = NULL; - i = *position; - - /* find a '@' */ - while ((i < len_url) && (url[i] != '@')) i++; - - if (i == len_url) return FALSE; - at_pos = i; - i = *position; - - /* find a ':' */ - while ((i < at_pos) && (url[i] != ':')) i++; - - /* now if i has not been incremented at all, there is no user */ - if (i == *position) { - (*position)++; - return FALSE; - } - - *item = g_strndup (url+ *position, i - *position); - if (i < at_pos) *position = i + 1; /* there was a ':', skip it */ - else *position = i; - - return TRUE; -} - -static gboolean -_find_passwd (const gchar *url, gchar **item, guint *position, gboolean *error) -{ - guint i; - gint len_url; - gchar *str_passwd; - - g_assert (url); - g_assert (item); - g_assert (position); - - len_url = strlen (url); - *item = NULL; - i = *position; - - /* find a '@' */ - while ((i < len_url) && (url[i] != '@')) i++; - - if (i == len_url) return FALSE; - /*i has not been incremented at all, there is no passwd */ - if (i == *position) { - *position = i + 1; - return FALSE; - } - - *item = g_strndup (url + *position, i - *position); - *position = i + 1; /* skip it the '@' */ - - return TRUE; -} - - - -static gboolean -_find_host (const gchar *url, gchar **item, guint *position, gboolean *error) -{ - guint i; - guint slash_pos; - gint len_url; - - g_assert (url); - g_assert (item); - g_assert (position); - - len_url = strlen (url); - *item = NULL; - i = *position; - - /* find a '/' */ - while ((i < len_url) && (url[i] != '/')) i++; - - slash_pos = i; - i = *position; - - /* find a ':' */ - while ( (i < slash_pos) && (url[i] != ':') ) i++; - - /* at this point if i has not been incremented at all, - there is no host */ - if (i == *position) { - /* if we have not met / or \0, we have : and must skip it */ - if (i < slash_pos) (*position)++; - return FALSE; - } - - *item = g_strndup (url + *position, i - *position); - if (i < slash_pos) *position = i + 1; /* there was a ':', skip it */ - else *position=i; - - return TRUE; -} - - -static gboolean -_find_port (const gchar *url, gchar **item, guint *position, gboolean *error) -{ - guint i; - guint slash_pos; - gint len_url; - - g_assert (url); - g_assert (item); - g_assert (position); - - len_url = strlen (url); - *item = NULL; - i=*position; - - /* find a '/' */ - while ((i < len_url) && (url[i] != '/')) i++; - - slash_pos = i; - i = *position; - - /* find a ':' */ - while ((i < slash_pos) && (url[i] != ':')) i++; - - /* at this point if i has not been incremented at all, */ - /* there is no port */ - if (i == *position) return FALSE; - - *item = g_strndup (url+ *position, i - *position); - *position = i; - return TRUE; -} - - -static gboolean -_find_path (const gchar *url, gchar **item, guint *position, gboolean *error) -{ - guint i; - gint len_url; - - g_assert (url); - g_assert (item); - g_assert (position); - - len_url = strlen (url); - *item = NULL; - i = *position; - - - /* find a '#' */ - while ((i < len_url) && (url[i] != '#') && (url[i] != '?')) i++; - - /*i has not been incremented at all, there is no path */ - if (i == *position) return FALSE; - - *item = g_strndup (url + *position, i - *position); - *position=i; - - return TRUE; -} - - - - - -/**** TEST ROUTINE - NOT COMPILED BY DEFAULT ****/ - -/* to tests this file : - gcc -o test_url_util `glib-config --cflags` -I.. -DTEST_URL_UTIL url-util.c `glib-config --libs` - ./test_url_util URL -*/ -#ifdef TEST_URL_UTIL - - - -int -main (int argc, char **argv) -{ - - gchar *url; - gchar *protocol; - gchar *user; - gchar *passwd; - gchar *host; - gchar *port; - gchar *path; - guint position=0; - gboolean error; - gboolean found; - guint i; - guint i_pos; - -#define NB_STEP_TEST 6 - FindStepStruct test_step[NB_STEP_TEST] = { - { "protocol", &protocol, _find_protocol}, - { "user", &user, _find_user}, - { "password", &passwd, _find_passwd}, - { "host", &host, _find_host}, - { "port", &port, _find_port}, - { "path", &path, _find_path} - }; - url = argv[1]; - printf("URL to test : %s\n\n", url); - for (i=0; i<NB_STEP_TEST; i++) { - found = test_step[i].find_func (url, - test_step[i].item_value, - &position, - &error); - if (found) { - printf ("\t\t\t\t** %s found : %s\n", - test_step[i].item_name, - *(test_step[i].item_value)); - } else printf ("** %s not found in URL\n", test_step[i].item_name); - printf ("next item position:\n"); - printf ("%s\n", url); - for (i_pos = 0; i_pos < position; i_pos++) printf (" "); - printf ("^\n"); - - } - -} - -#endif /* TEST_URL_UTIL */ diff --git a/camel/url-util.h b/camel/url-util.h deleted file mode 100644 index 6afed454d5..0000000000 --- a/camel/url-util.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* url-util.h : utility functions to parse URLs */ - -/* - * Author : - * Bertrand Guiheneuf <bertrand@helixcode.com> - * - * 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 URL_UTIL_H -#define URL_UTIL_H 1 - -#include <glib.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -typedef struct { - gchar *protocol; - gchar *user; - gchar *passwd; - gchar *host; - gchar *port; - gchar *path; - -} Gurl; - -/* the cache system has been disabled because it would - need the user to use accessors instead of modifying the - structure field. As the speed is not so important here, - I chose not to use it */ - -Gurl *g_url_new (const gchar *url_string); -void g_url_free (Gurl *url); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* URL_UTIL_H */ |