fix to show a sample correct implementation.

2000-02-22  bertrand  <Bertrand.Guiheneuf@aful.org>

	* message-list.c (message_list_set_folder):
	fix to show a sample correct implementation.

	* camel-folder.c (camel_folder_get_subfolder):
	(camel_folder_create):
	(camel_folder_delete):
	(camel_folder_delete_messages):
	(camel_folder_list_subfolders):
	(camel_folder_expunge):
	(camel_folder_get_message_by_number):
	(camel_folder_get_message_count):
	(camel_folder_append_message):
	(camel_folder_copy_message_to):
	(camel_folder_get_summary):
	(camel_folder_get_message_uid):
	(camel_folder_get_message_by_uid):
	(camel_folder_get_uid_list):
	Check folder state (open/close) and raise an
	exception if it is not ok.

	* providers/mbox/camel-mbox-folder.c (_create):
	create the file and the path with two different
	names.

	* camel-folder.c (_create): handle the case
	when the folder name starts with '/'

	* camel-exception.c (camel_exception_new): use
	(void) instead of () in decl.

	* camel-exception.h: cosmetic fixes.

	* camel-exception.c (camel_exception_init): new routine.
	Fix a bug in mail/message-list.c


	* camel-folder.h: cosmetic changes.

	* camel-stream-b64.c (reset__static): added a
	reset method. Thanks message-browser to find
	so much bugs :)

	* providers/mbox/Makefile.am (libcamelmbox_la_LIBADD): readd
	Unicode libs.

Fixes and exception handling in camel-folder.
Fixes in mail/evolution-mail to make it not
segfault and to demonstrate a correct implementation.

svn path=/trunk/; revision=1902
This commit is contained in:
bertrand
2000-02-22 11:16:36 +00:00
committed by Bertrand Guiheneuf
parent 7c6897ee95
commit f65a2d78c6
10 changed files with 341 additions and 73 deletions

View File

@ -1,5 +1,40 @@
2000-02-22 bertrand <Bertrand.Guiheneuf@aful.org>
* camel-folder.c (camel_folder_get_subfolder):
(camel_folder_create):
(camel_folder_delete):
(camel_folder_delete_messages):
(camel_folder_list_subfolders):
(camel_folder_expunge):
(camel_folder_get_message_by_number):
(camel_folder_get_message_count):
(camel_folder_append_message):
(camel_folder_copy_message_to):
(camel_folder_get_summary):
(camel_folder_get_message_uid):
(camel_folder_get_message_by_uid):
(camel_folder_get_uid_list):
Check folder state (open/close) and raise an
exception if it is not ok.
* providers/mbox/camel-mbox-folder.c (_create):
create the file and the path with two different
names.
* camel-folder.c (_create): handle the case
when the folder name starts with '/'
* camel-exception.c (camel_exception_new): use
(void) instead of () in decl.
* camel-exception.h: cosmetic fixes.
* camel-exception.c (camel_exception_init): new routine.
Fix a bug in mail/message-list.c
* camel-folder.h: cosmetic changes.
* camel-stream-b64.c (reset__static): added a
reset method. Thanks message-browser to find
so much bugs :)

View File

@ -38,7 +38,7 @@
* Return value: The newly allocated exception object.
**/
CamelException *
camel_exception_new ()
camel_exception_new (void)
{
CamelException *ex;
@ -51,6 +51,26 @@ camel_exception_new ()
return ex;
}
/**
* camel_exception_init: init a (statically allocated) exception.
*
* Init an exception. This routine is mainly
* useful when using a statically allocated
* exception.
*
*
**/
void
camel_exception_init (CamelException *ex)
{
ex->desc = NULL;
/* set the Exception Id to NULL */
ex->id = CAMEL_EXCEPTION_NONE;
return ex;
}
/**
* camel_exception_clear: Clear an exception

View File

@ -54,8 +54,9 @@ struct _CamelException {
/* creation and destruction functions */
CamelException *camel_exception_new ();
CamelException * camel_exception_new (void);
void camel_exception_free (CamelException *exception);
void camel_exception_init (CamelException *ex);
/* exception content manipulation */
@ -76,7 +77,7 @@ void camel_exception_xfer (CamelException *ex_dst,
/* exception content retrieval */
ExceptionId camel_exception_get_id (CamelException *ex);
const gchar *camel_exception_get_description (CamelException *ex);
const gchar * camel_exception_get_description (CamelException *ex);

View File

@ -504,7 +504,7 @@ _set_name (CamelFolder *folder,
if (camel_folder_is_open (folder, ex)) {
if (camel_exception_get_id (ex)) return;
camel_exception_set (ex,
CAMEL_EXCEPTION_FOLDER_INVALID,
CAMEL_EXCEPTION_FOLDER_INVALID_STATE,
"CamelFolder::set_name is valid only on closed folders");
return;
}
@ -870,6 +870,15 @@ camel_folder_get_subfolder (CamelFolder *folder, gchar *folder_name, CamelExcept
return FALSE;
}
/* check if the folder is open */
if (!camel_folder_is_open (folder, ex)) {
if (camel_exception_get_id (ex)) return NULL;
camel_exception_set (ex,
CAMEL_EXCEPTION_FOLDER_INVALID_STATE,
"CamelFolder::get_subfolder is valid only on open folders");
return NULL;
}
return (CF_CLASS(folder)->get_subfolder(folder,folder_name, ex));
}
@ -941,8 +950,10 @@ _create (CamelFolder *folder, CamelException *ex)
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;
if (prefix == NULL) {
/* separator is the first caracter, no folder above */
return TRUE;
}
} else {
parent = camel_store_get_folder (folder->parent_store, prefix, ex);
camel_folder_create (parent, ex);
@ -978,6 +989,15 @@ camel_folder_create (CamelFolder *folder, CamelException *ex)
return FALSE;
}
/* check if the folder is closed */
if (camel_folder_is_open (folder, ex)) {
if (camel_exception_get_id (ex)) return FALSE;
camel_exception_set (ex,
CAMEL_EXCEPTION_FOLDER_INVALID_STATE,
"CamelFolder::create is valid only on close folders");
return FALSE;
}
return (CF_CLASS(folder)->create(folder, ex));
}
@ -1070,7 +1090,8 @@ _delete (CamelFolder *folder, gboolean recurse, CamelException *ex)
*
* Return value: TRUE if deletion was successful
**/
gboolean camel_folder_delete (CamelFolder *folder, gboolean recurse, CamelException *ex)
gboolean
camel_folder_delete (CamelFolder *folder, gboolean recurse, CamelException *ex)
{
if (!folder) {
camel_exception_set (ex,
@ -1079,6 +1100,15 @@ gboolean camel_folder_delete (CamelFolder *folder, gboolean recurse, CamelExcept
return FALSE;
}
/* check if the folder is closed */
if (camel_folder_is_open (folder, ex)) {
if (camel_exception_get_id (ex)) return FALSE;
camel_exception_set (ex,
CAMEL_EXCEPTION_FOLDER_INVALID_STATE,
"CamelFolder::delete is valid only on closed folders");
return FALSE;
}
return CF_CLASS(folder)->delete(folder, recurse, ex);
}
@ -1128,6 +1158,15 @@ camel_folder_delete_messages (CamelFolder *folder, CamelException *ex)
return FALSE;
}
/* check if the folder is closed */
if (camel_folder_is_open (folder, ex)) {
if (camel_exception_get_id (ex)) return FALSE;
camel_exception_set (ex,
CAMEL_EXCEPTION_FOLDER_INVALID_STATE,
"CamelFolder::delete_messages is valid only on closed folders");
return FALSE;
}
return CF_CLASS(folder)->delete_messages(folder, ex);
}
@ -1298,6 +1337,15 @@ camel_folder_list_subfolders (CamelFolder *folder, CamelException *ex)
return NULL;
}
/* check if the folder is open */
if (!camel_folder_is_open (folder, ex)) {
if (camel_exception_get_id (ex)) return NULL;
camel_exception_set (ex,
CAMEL_EXCEPTION_FOLDER_INVALID_STATE,
"CamelFolder::list_subfolder is valid only on open folders");
return NULL;
}
return CF_CLASS(folder)->list_subfolders(folder, ex);
}
@ -1338,6 +1386,15 @@ camel_folder_expunge (CamelFolder *folder, CamelException *ex)
return NULL;
}
/* check if the folder is closed */
if (camel_folder_is_open (folder, ex)) {
if (camel_exception_get_id (ex)) return NULL;
camel_exception_set (ex,
CAMEL_EXCEPTION_FOLDER_INVALID_STATE,
"CamelFolder::expunge is valid only on closed folders");
return NULL;
}
return CF_CLASS (folder)->expunge (folder, ex);
}
@ -1425,6 +1482,15 @@ camel_folder_get_message_by_number (CamelFolder *folder, gint number, CamelExcep
return NULL;
}
/* check if the folder is open */
if (!camel_folder_is_open (folder, ex)) {
if (camel_exception_get_id (ex)) return NULL;
camel_exception_set (ex,
CAMEL_EXCEPTION_FOLDER_INVALID_STATE,
"CamelFolder::get_message_by_number is valid only on open folders");
return NULL;
}
return CF_CLASS (folder)->get_message_by_number (folder, number, ex);
}
@ -1457,6 +1523,15 @@ camel_folder_get_message_count (CamelFolder *folder, CamelException *ex)
return -1;
}
/* check if the folder is open */
if (!camel_folder_is_open (folder, ex)) {
if (camel_exception_get_id (ex)) return -1;
camel_exception_set (ex,
CAMEL_EXCEPTION_FOLDER_INVALID_STATE,
"CamelFolder::get_message_count is valid only on open folders");
return -1;
}
return CF_CLASS (folder)->get_message_count (folder, ex);
}
@ -1499,6 +1574,15 @@ camel_folder_append_message (CamelFolder *folder,
return;
}
/* check if the folder is open */
if (!camel_folder_is_open (folder, ex)) {
if (camel_exception_get_id (ex)) return;
camel_exception_set (ex,
CAMEL_EXCEPTION_FOLDER_INVALID_STATE,
"CamelFolder::append_message is valid only on open folders");
return;
}
CF_CLASS (folder)->append_message (folder, message, ex);
}
@ -1560,6 +1644,15 @@ camel_folder_copy_message_to (CamelFolder *folder,
return;
}
/* check if the folder is open */
if (!camel_folder_is_open (folder, ex)) {
if (camel_exception_get_id (ex)) return;
camel_exception_set (ex,
CAMEL_EXCEPTION_FOLDER_INVALID_STATE,
"CamelFolder::copy_message_to is valid only on open folders");
return;
}
CF_CLASS (folder)->copy_message_to (folder, message, dest_folder, ex);;
}
@ -1606,6 +1699,15 @@ camel_folder_get_summary (CamelFolder *folder,
return NULL;
}
/* check if the folder is open */
if (!camel_folder_is_open (folder, ex)) {
if (camel_exception_get_id (ex)) return NULL;
camel_exception_set (ex,
CAMEL_EXCEPTION_FOLDER_INVALID_STATE,
"CamelFolder::get_summary is valid only on open folders");
return NULL;
}
return folder->summary;
}
@ -1676,6 +1778,15 @@ camel_folder_get_message_uid (CamelFolder *folder, CamelMimeMessage *message, Ca
return NULL;
}
/* check if the folder is open */
if (!camel_folder_is_open (folder, ex)) {
if (camel_exception_get_id (ex)) return NULL;
camel_exception_set (ex,
CAMEL_EXCEPTION_FOLDER_INVALID_STATE,
"CamelFolder::get_message_uid is valid only on open folders");
return NULL;
}
return CF_CLASS (folder)->get_message_uid (folder, message, ex);
}
@ -1767,6 +1878,16 @@ camel_folder_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelEx
return NULL;
}
/* check if the folder is open */
if (!camel_folder_is_open (folder, ex)) {
if (camel_exception_get_id (ex)) return NULL;
camel_exception_set (ex,
CAMEL_EXCEPTION_FOLDER_INVALID_STATE,
"CamelFolder::get_message_by_uid is valid only on open folders");
return NULL;
}
return CF_CLASS (folder)->get_message_by_uid (folder, uid, ex);
}
@ -1821,6 +1942,15 @@ camel_folder_get_uid_list (CamelFolder *folder, CamelException *ex)
return NULL;
}
/* check if the folder is open */
if (!camel_folder_is_open (folder, ex)) {
if (camel_exception_get_id (ex)) return NULL;
camel_exception_set (ex,
CAMEL_EXCEPTION_FOLDER_INVALID_STATE,
"CamelFolder::get_uid_list is valid only on open folders");
return NULL;
}
return CF_CLASS (folder)->get_uid_list (folder, ex);
}

View File

@ -212,7 +212,7 @@ GtkType camel_folder_get_type (void);
CamelFolder *camel_folder_get_subfolder (CamelFolder *folder,
CamelFolder * camel_folder_get_subfolder (CamelFolder *folder,
gchar *folder_name,
CamelException *ex);
@ -225,37 +225,52 @@ void camel_folder_close (CamelFolder *folder,
gboolean expunge,
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);
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);
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);
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);
gboolean camel_folder_is_open (CamelFolder *folder, CamelException *ex);
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);
gboolean camel_folder_is_open (CamelFolder *folder,
CamelException *ex);
/* message manipulation */
void camel_folder_append_message (CamelFolder *folder,
CamelMimeMessage *message, CamelException *ex);
CamelMimeMessage *message,
CamelException *ex);
void camel_folder_copy_message_to (CamelFolder *folder,
CamelMimeMessage *message,
CamelFolder *dest_folder,
@ -263,27 +278,38 @@ void camel_folder_copy_message_to (CamelFolder *folder,
/* summary related operations */
gboolean camel_folder_has_summary_capability (CamelFolder *folder, CamelException *ex);
CamelFolderSummary *camel_folder_get_summary (CamelFolder *folder, CamelException *ex);
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);
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);
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);
/* search api */
gboolean camel_folder_has_search_capability (CamelFolder *folder,
CamelException *ex);
GList *camel_folder_search_by_expression (CamelFolder *folder,
GList * camel_folder_search_by_expression (CamelFolder *folder,
const char *expression,
CamelException *ex);

View File

@ -388,13 +388,14 @@ _set_name (CamelFolder *folder, const gchar *name, CamelException *ex)
static gboolean
_exists (CamelFolder *folder, CamelException *ex)
{
CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder);
CamelMboxFolder *mbox_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,
@ -403,6 +404,9 @@ _exists (CamelFolder *folder, CamelException *ex)
return FALSE;
}
mbox_folder = CAMEL_MBOX_FOLDER(folder);
/* check if the mbox file path is determined */
if (!mbox_folder->folder_file_path) {
camel_exception_set (ex,
@ -492,7 +496,7 @@ _create (CamelFolder *folder, CamelException *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;
folder_dir_path = mbox_folder->folder_dir_path;
if (!(folder_file_path || folder_dir_path)) {
camel_exception_set (ex,

View File

@ -21,6 +21,10 @@
* USA
*/
#include <config.h>
#include "camel-log.h"
#include "camel-mbox-store.h"
#include "camel-mbox-folder.h"
#include "camel-exception.h"
@ -104,12 +108,14 @@ _get_folder (CamelStore *store, const gchar *folder_name, CamelException *ex)
/* call the standard routine for that when */
/* it is done ... */
CAMEL_LOG_FULL_DEBUG ("Entering CamelMboxStore::get_folder\n");
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, ex);
CF_CLASS (new_folder)->set_name (new_folder, folder_name, ex);
CAMEL_LOG_FULL_DEBUG ("Leaving CamelMboxStore::get_folder\n");
return new_folder;
}

View File

@ -1,3 +1,8 @@
2000-02-22 bertrand <Bertrand.Guiheneuf@aful.org>
* message-list.c (message_list_set_folder):
fix to show a sample correct implementation.
2000-02-21 Matt Loper <matt@helixcode.com>
* Makefile.am: added -lunicode to evolution_mail_LDADD.

View File

@ -66,6 +66,9 @@ folder_browser_load_folder (FolderBrowser *fb, const char *name)
fb->folder = new_folder;
camel_folder_exists (new_folder, NULL);
printf ("In folder browser, folder = %p\n", new_folder);
message_list_set_folder (fb->message_list, new_folder);
return TRUE;

View File

@ -457,6 +457,7 @@ void
message_list_set_folder (MessageList *message_list, CamelFolder *camel_folder)
{
CamelException ex;
gboolean folder_exists;
g_return_if_fail (message_list != NULL);
g_return_if_fail (camel_folder != NULL);
@ -464,11 +465,48 @@ message_list_set_folder (MessageList *message_list, CamelFolder *camel_folder)
g_return_if_fail (CAMEL_IS_FOLDER (camel_folder));
g_return_if_fail (camel_folder_has_summary_capability (camel_folder, &ex));
camel_exception_init (&ex);
if (message_list->folder)
gtk_object_unref (GTK_OBJECT (message_list->folder));
message_list->folder = camel_folder;
folder_exists = camel_folder_exists (camel_folder, NULL);
if (camel_exception_get_id (&ex)) {
printf ("Unable to test for folder existence \n");
return;
}
if (!folder_exists) {
g_warning ("Folder does not exist, creating it\n");
/*
if you don't want the directory to be created
automatically here remove this.
*/
camel_folder_create (camel_folder, &ex);
if (camel_exception_get_id (&ex)) {
printf ("Unable to create folder\n");
return;
}
}
camel_folder_open (camel_folder, FOLDER_OPEN_RW, &ex);
if (camel_exception_get_id (&ex)) {
printf ("Unable to open folder\n");
return;
}
message_list->folder_summary = camel_folder_get_summary (camel_folder, &ex);
if (camel_exception_get_id (&ex)) {
printf ("Unable to get summary \n");
return;
}
gtk_object_ref (GTK_OBJECT (camel_folder));