diff options
-rw-r--r-- | camel/ChangeLog | 21 | ||||
-rw-r--r-- | camel/camel-folder.c | 378 | ||||
-rw-r--r-- | camel/camel-folder.h | 71 | ||||
-rw-r--r-- | camel/providers/mbox/camel-mbox-folder.c | 186 | ||||
-rw-r--r-- | camel/providers/nntp/camel-nntp-folder.c | 18 | ||||
-rw-r--r-- | camel/providers/pop3/camel-pop3-folder.c | 84 | ||||
-rw-r--r-- | camel/providers/pop3/camel-pop3-folder.h | 3 | ||||
-rw-r--r-- | camel/providers/vee/camel-vee-folder.c | 35 |
8 files changed, 309 insertions, 487 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index 1b7d5734c3..a2a09c9e05 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,24 @@ +2000-05-18 Dan Winship <danw@helixcode.com> + + * camel-folder.c: remove message_number_capability and require uid + capatibility. + (camel_folder_list_subfolders, camel_folder_get_uid_list, + camel_folder_get_subfolder_info, camel_folder_get_message_info): + removed + (camel_folder_get_subfolder_names, + camel_folder_free_subfolder_names): new subfolder interfaces. + (camel_folder_get_uids, camel_folder_free_uids): new uid + interfaces + (camel_folder_get_summary, camel_folder_free_summary): new summary + interfaces + + * providers/mbox/camel-mbox-folder.c, + * providers/nntp/camel-nntp-folder.c: + * providers/vee/camel-vee-folder.c: Update for changes + + * providers/pop3/camel-pop3-folder.c: Implement get_uids, update + for other changes. + 2000-05-18 NotZed <NotZed@HelixCode.com> * providers/vee/camel-vee-folder.c: Guess! diff --git a/camel/camel-folder.c b/camel/camel-folder.c index e7d5187d3b..2c6e04d73b 100644 --- a/camel/camel-folder.c +++ b/camel/camel-folder.c @@ -73,7 +73,7 @@ static gboolean delete (CamelFolder *folder, gboolean recurse, CamelException *ex); -static GList *list_subfolders (CamelFolder *folder, +static GPtrArray *get_subfolder_names (CamelFolder *folder, CamelException *ex); static CamelFolder *get_subfolder (CamelFolder *folder, const gchar *folder_name, @@ -84,15 +84,7 @@ static CamelStore *get_parent_store (CamelFolder *folder, CamelException *ex); -static gboolean has_message_number_capability (CamelFolder *folder); -static CamelMimeMessage *get_message_by_number (CamelFolder *folder, - gint number, - CamelException *ex); -static void delete_message_by_number (CamelFolder *folder, - gint number, - CamelException *ex); -static gint get_message_count (CamelFolder *folder, - CamelException *ex); +static gint get_message_count (CamelFolder *folder, CamelException *ex); static gboolean delete_messages (CamelFolder *folder, @@ -105,8 +97,14 @@ static void append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex); -static GList *get_uid_list (CamelFolder *folder, +static GPtrArray *get_uids (CamelFolder *folder, CamelException *ex); +static void free_uids (CamelFolder *folder, + GPtrArray *array); +static GPtrArray *get_summary (CamelFolder *folder, + CamelException *ex); +static void free_summary (CamelFolder *folder, + GPtrArray *array); static const gchar *get_message_uid (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex); @@ -117,11 +115,6 @@ static void delete_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex); -static GPtrArray *get_message_info (CamelFolder *folder, - int first, int count); -static GPtrArray *get_subfolder_info (CamelFolder *folder, - int first, int count); - static const CamelMessageInfo *summary_get_by_uid (CamelFolder *folder, const char *uid); @@ -153,23 +146,20 @@ camel_folder_class_init (CamelFolderClass *camel_folder_class) 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->get_subfolder_names = get_subfolder_names; + camel_folder_class->free_subfolder_names = free_uids; 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->delete_message_by_number = - delete_message_by_number; camel_folder_class->get_message_count = get_message_count; camel_folder_class->append_message = append_message; camel_folder_class->get_permanent_flags = get_permanent_flags; camel_folder_class->get_message_uid = get_message_uid; camel_folder_class->get_message_by_uid = get_message_by_uid; camel_folder_class->delete_message_by_uid = delete_message_by_uid; - camel_folder_class->get_uid_list = get_uid_list; + camel_folder_class->get_uids = get_uids; + camel_folder_class->free_uids = free_uids; + camel_folder_class->get_summary = get_summary; + camel_folder_class->free_summary = free_summary; camel_folder_class->search_by_expression = search_by_expression; - camel_folder_class->get_subfolder_info = get_subfolder_info; - camel_folder_class->get_message_info = get_message_info; camel_folder_class->summary_get_by_uid = summary_get_by_uid; /* virtual method overload */ @@ -603,28 +593,30 @@ camel_folder_create (CamelFolder *folder, CamelException *ex) static gboolean delete (CamelFolder *folder, gboolean recurse, CamelException *ex) { - GList *subfolders=NULL; - GList *sf; + GPtrArray *subfolders; + int i; gboolean ok; /* delete all messages in the folder */ CF_CLASS (folder)->delete_messages (folder, ex); - if (camel_exception_get_id (ex)) return FALSE; + 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); + subfolders = camel_folder_get_subfolder_names (folder, ex); + if (camel_exception_get_id (ex)) 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)); + for (i = 0; ok && i < subfolders->len; i++) { + CamelFolder *sf; + + sf = camel_folder_get_subfolder (folder, subfolders->pdata[i], ex); + camel_folder_delete (sf, TRUE, ex); + if (camel_exception_get_id (ex)) + ok = FALSE; + } } } else if (subfolders) { camel_exception_set (ex, CAMEL_EXCEPTION_FOLDER_NON_EMPTY, @@ -632,7 +624,8 @@ delete (CamelFolder *folder, gboolean recurse, CamelException *ex) ok = FALSE; } - if (subfolders) g_list_free (subfolders); + if (subfolders) + camel_folder_free_subfolder_names (folder, subfolders); return ok; } @@ -753,144 +746,72 @@ camel_folder_get_mode (CamelFolder *folder, CamelException *ex) } -static GList * -list_subfolders (CamelFolder *folder, CamelException *ex) +static GPtrArray * +get_subfolder_names (CamelFolder *folder, CamelException *ex) { - g_warning ("CamelFolder::list_folders not implemented for `%s'", + g_warning ("CamelFolder::get_subfolder_names not implemented for `%s'", gtk_type_name (GTK_OBJECT_TYPE (folder))); return NULL; } /** - * camel_folder_list_subfolders: + * camel_folder_get_subfolder_names: * @folder: the folder * @ex: a CamelException * - * List subfolders in a folder. - * - * Return value: list of subfolder names + * Return value: an array containing the names of the folder's + * subfolders. The array should not be modified and must be freed with + * camel_folder_free_subfolder_names(). **/ -GList * -camel_folder_list_subfolders (CamelFolder *folder, CamelException *ex) +GPtrArray * +camel_folder_get_subfolder_names (CamelFolder *folder, CamelException *ex) { g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); g_return_val_if_fail (camel_folder_is_open (folder), NULL); - return CF_CLASS (folder)->list_subfolders (folder, ex); -} - - -static void -expunge (CamelFolder *folder, CamelException *ex) -{ - g_warning ("CamelFolder::expunge not implemented for `%s'", - gtk_type_name (GTK_OBJECT_TYPE (folder))); + return CF_CLASS (folder)->get_subfolder_names (folder, ex); } /** - * camel_folder_expunge: - * @folder: the folder - * @ex: a CamelException + * camel_folder_free_subfolder_names: + * @folder: folder object + * @array: the array of subfolder names to free * - * Delete messages which have been marked as "DELETED" + * Frees the array of names returned by camel_folder_get_subfolder_names(). **/ void -camel_folder_expunge (CamelFolder *folder, CamelException *ex) +camel_folder_free_subfolder_names (CamelFolder *folder, GPtrArray *array) { g_return_if_fail (CAMEL_IS_FOLDER (folder)); g_return_if_fail (camel_folder_is_open (folder)); - return CF_CLASS (folder)->expunge (folder, ex); + CF_CLASS (folder)->free_subfolder_names (folder, array); } -static gboolean -has_message_number_capability (CamelFolder *folder) +static void +expunge (CamelFolder *folder, CamelException *ex) { - g_warning ("CamelFolder::has_message_number_capability not " - "implemented for `%s'", + g_warning ("CamelFolder::expunge not implemented for `%s'", gtk_type_name (GTK_OBJECT_TYPE (folder))); - return FALSE; -} - -/** - * camel_folder_has_message_number_capability: - * @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: whether or not the folder supports message numbers - **/ -gboolean -camel_folder_has_message_number_capability (CamelFolder *folder) -{ - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), FALSE); - - return CF_CLASS (folder)->has_message_number_capability (folder); -} - - -static CamelMimeMessage * -get_message_by_number (CamelFolder *folder, gint number, CamelException *ex) -{ - g_warning ("CamelFolder::get_message_by_number not implemented " - "for `%s'", gtk_type_name (GTK_OBJECT_TYPE (folder))); - return NULL; } -/** - * camel_folder_get_message_by_number: - * @folder: a CamelFolder object - * @number: the number of the message within the folder. - * @ex: a CamelException - * - * 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) -{ - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); - g_return_val_if_fail (camel_folder_is_open (folder), NULL); - g_return_val_if_fail (camel_folder_has_message_number_capability (folder), NULL); - - return CF_CLASS (folder)->get_message_by_number (folder, number, ex); -} - - -static void -delete_message_by_number (CamelFolder *folder, gint number, - CamelException *ex) -{ - g_warning ("CamelFolder::delete_message_by_number not implemented " - "for `%s'", gtk_type_name (GTK_OBJECT_TYPE (folder))); -} /** - * camel_folder_delete_message_by_number: - * @folder: a CamelFolder object - * @number: the number of the message within the folder. + * camel_folder_expunge: + * @folder: the folder * @ex: a CamelException * - * Delete the message corresponding to that number within the folder. + * Delete messages which have been marked as "DELETED" **/ void -camel_folder_delete_message_by_number (CamelFolder *folder, gint number, - CamelException *ex) +camel_folder_expunge (CamelFolder *folder, CamelException *ex) { g_return_if_fail (CAMEL_IS_FOLDER (folder)); g_return_if_fail (camel_folder_is_open (folder)); - g_return_if_fail (camel_folder_has_message_number_capability (folder)); - return CF_CLASS (folder)->delete_message_by_number (folder, number, - ex); + return CF_CLASS (folder)->expunge (folder, ex); } @@ -964,66 +885,6 @@ camel_folder_get_permanent_flags (CamelFolder *folder, CamelException *ex) } -static GPtrArray * -get_subfolder_info (CamelFolder *folder, int first, int count) -{ - g_warning ("CamelFolder::get_subfolder_info not implemented for `%s'", - gtk_type_name (GTK_OBJECT_TYPE (folder))); - return NULL; -} - -/** - * camel_folder_summary_get_subfolder_info: - * @summary: a summary - * @first: the index of the first subfolder to return information for - * (starting from 0) - * @count: the number of subfolders to return information for - * - * Returns an array of pointers to CamelFolderInfo objects. The caller - * must free the array when it is done with it, but should not modify - * the elements. - * - * Return value: an array containing information about the subfolders. - **/ -GPtrArray * -camel_folder_summary_get_subfolder_info (CamelFolder *folder, - int first, int count) -{ - g_assert (folder != NULL); - return CF_CLASS (folder)->get_subfolder_info (folder, first, count); -} - - -static GPtrArray * -get_message_info (CamelFolder *folder, int first, int count) -{ - g_warning ("CamelFolder::get_message_info not implemented for `%s'", - gtk_type_name (GTK_OBJECT_TYPE (folder))); - return NULL; -} - -/** - * camel_folder_summary_get_message_info: - * @folder: a camel folder - * @first: the index of the first message to return information for - * (starting from 0) - * @count: the number of messages to return information for - * - * Returns an array of pointers to CamelMessageInfo objects. The caller - * must free the array when it is done with it, but should not modify - * the elements. - * - * Return value: an array containing information about the messages. - **/ -GPtrArray * -camel_folder_summary_get_message_info (CamelFolder *folder, - int first, int count) -{ - g_assert (folder != NULL); - return CF_CLASS (folder)->get_message_info (folder, first, count); -} - - static const CamelMessageInfo * summary_get_by_uid (CamelFolder *folder, const char *uid) { @@ -1061,24 +922,6 @@ camel_folder_has_summary_capability (CamelFolder *folder) /* 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) -{ - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), FALSE); - - return folder->has_uid_capability; -} - - static const gchar * get_message_uid (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex) @@ -1107,7 +950,6 @@ camel_folder_get_message_uid (CamelFolder *folder, CamelMimeMessage *message, { g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), NULL); - g_return_val_if_fail (folder->has_uid_capability, NULL); g_return_val_if_fail (camel_folder_is_open (folder), NULL); return CF_CLASS (folder)->get_message_uid (folder, message, ex); @@ -1139,7 +981,6 @@ camel_folder_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex) { g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); - g_return_val_if_fail (folder->has_uid_capability, NULL); g_return_val_if_fail (camel_folder_is_open (folder), NULL); return CF_CLASS (folder)->get_message_by_uid (folder, uid, ex); @@ -1167,44 +1008,127 @@ camel_folder_delete_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex) { g_return_if_fail (CAMEL_IS_FOLDER (folder)); - g_return_if_fail (folder->has_uid_capability); g_return_if_fail (camel_folder_is_open (folder)); return CF_CLASS (folder)->delete_message_by_uid (folder, uid, ex); } -static GList * -get_uid_list (CamelFolder *folder, CamelException *ex) +static GPtrArray * +get_uids (CamelFolder *folder, CamelException *ex) { - g_warning ("CamelFolder::get_uid_list not implemented for `%s'", + g_warning ("CamelFolder::get_uids not implemented for `%s'", gtk_type_name (GTK_OBJECT_TYPE (folder))); return NULL; } /** - * camel_folder_get_uid_list: + * camel_folder_get_uids: * @folder: folder object * @ex: a CamelException * * Get the list of UIDs available in a folder. This routine is useful * for finding 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. + * support summaries. The returned array shoudl not be modified, and + * must be freed by passing it to camel_folder_free_uids(). + * + * Return value: GPtrArray of UIDs corresponding to the messages + * available in the folder. + **/ +GPtrArray * +camel_folder_get_uids (CamelFolder *folder, CamelException *ex) +{ + g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); + g_return_val_if_fail (camel_folder_is_open (folder), NULL); + + return CF_CLASS (folder)->get_uids (folder, ex); +} + + +/* This is also the default implementation of free_subfolder_names. */ +static void +free_uids (CamelFolder *folder, GPtrArray *array) +{ + int i; + + /* Default implementation: free all of the strings and + * the array itself. + */ + for (i = 0; i < array->len; i++) + g_free (array->pdata[i]); + g_ptr_array_free (array, TRUE); +} + +/** + * camel_folder_free_uids: + * @folder: folder object + * @array: the array of uids to free + * + * Frees the array of UIDs returned by camel_folder_get_uids(). + **/ +void +camel_folder_free_uids (CamelFolder *folder, GPtrArray *array) +{ + g_return_if_fail (CAMEL_IS_FOLDER (folder)); + g_return_if_fail (camel_folder_is_open (folder)); + + CF_CLASS (folder)->free_uids (folder, array); +} + + +static GPtrArray * +get_summary (CamelFolder *folder, CamelException *ex) +{ + g_warning ("CamelFolder::get_summary not implemented for `%s'", + gtk_type_name (GTK_OBJECT_TYPE (folder))); + return NULL; +} + +/** + * camel_folder_get_summary: + * @folder: a folder object + * @ex: a CamelException + * + * This returns the summary information for the folder. This array + * should not be modified, and must be freed with + * camel_folder_free_summary(). * - * Return value: GList of UIDs corresponding to the messages available - * in the folder. + * Return value: an array of CamelMessageInfo **/ -GList * -camel_folder_get_uid_list (CamelFolder *folder, CamelException *ex) +GPtrArray * +camel_folder_get_summary (CamelFolder *folder, CamelException *ex) { g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); - g_return_val_if_fail (folder->has_uid_capability, NULL); g_return_val_if_fail (camel_folder_is_open (folder), NULL); - return CF_CLASS (folder)->get_uid_list (folder, ex); + return CF_CLASS (folder)->get_summary (folder, ex); } + +static void +free_summary (CamelFolder *folder, GPtrArray *array) +{ + g_warning ("CamelFolder::free_summary not implemented for `%s'", + gtk_type_name (GTK_OBJECT_TYPE (folder))); +} + +/** + * camel_folder_free_summary: + * @folder: folder object + * @array: the summary array to free + * + * Frees the summary array returned by camel_folder_get_summary(). + **/ +void +camel_folder_free_summary (CamelFolder *folder, GPtrArray *array) +{ + g_return_if_fail (CAMEL_IS_FOLDER (folder)); + g_return_if_fail (camel_folder_is_open (folder)); + + CF_CLASS (folder)->free_summary (folder, array); +} + + /** * camel_folder_has_search_capability: * @folder: Folder object diff --git a/camel/camel-folder.h b/camel/camel-folder.h index 1bd617a1cd..c90802c6c2 100644 --- a/camel/camel-folder.h +++ b/camel/camel-folder.h @@ -1,9 +1,8 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* camelFolder.h : Abstract class for an email folder */ +/* camel-folder.h: Abstract class for an email folder */ /* - * - * Author : + * Author: * Bertrand Guiheneuf <bertrand@helixcode.com> * * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com) @@ -70,7 +69,6 @@ struct _CamelFolder gboolean can_hold_folders:1; gboolean can_hold_messages:1; gboolean has_summary_capability:1; - gboolean has_uid_capability:1; gboolean has_search_capability:1; }; @@ -129,22 +127,9 @@ typedef struct { CamelFolderOpenMode (*get_mode) (CamelFolder *folder, CamelException *ex); - GList * (*list_subfolders) (CamelFolder *folder, - CamelException *ex); - void (*expunge) (CamelFolder *folder, CamelException *ex); - gboolean (*has_message_number_capability) (CamelFolder *folder); - - CamelMimeMessage * (*get_message_by_number) (CamelFolder *folder, - gint number, - CamelException *ex); - - void (*delete_message_by_number) (CamelFolder *folder, - gint number, - CamelException *ex); - gint (*get_message_count) (CamelFolder *folder, CamelException *ex); @@ -155,8 +140,6 @@ typedef struct { guint32 (*get_permanent_flags) (CamelFolder *folder, CamelException *ex); - gboolean (*has_uid_capability) (CamelFolder *folder); - const gchar * (*get_message_uid) (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex); @@ -169,17 +152,25 @@ typedef struct { const gchar *uid, CamelException *ex); - GList * (*get_uid_list) (CamelFolder *folder, - CamelException *ex); + GPtrArray * (*get_uids) (CamelFolder *folder, + CamelException *ex); + void (*free_uids) (CamelFolder *folder, + GPtrArray *array); + + GPtrArray * (*get_summary) (CamelFolder *folder, + CamelException *ex); + void (*free_summary) (CamelFolder *folder, + GPtrArray *summary); + + GPtrArray * (*get_subfolder_names) (CamelFolder *folder, + CamelException *ex); + void (*free_subfolder_names) (CamelFolder *folder, + GPtrArray *subfolders); gboolean (*has_search_capability) (CamelFolder *folder); GList * (*search_by_expression) (CamelFolder *folder, const char *expression, CamelException *ex); - /* moved the old summary stuff from camel-folder-summary.h here */ - GPtrArray * (*get_subfolder_info) (CamelFolder *, int first, int count); - GPtrArray * (*get_message_info) (CamelFolder *, int first, int count); - const CamelMessageInfo * (*summary_get_by_uid) (CamelFolder *, const char *uid); } CamelFolderClass; @@ -253,20 +244,21 @@ void camel_folder_append_message (CamelFolder *folder, gboolean camel_folder_has_summary_capability (CamelFolder *folder); -/* number based access operations */ -gboolean camel_folder_has_message_number_capability (CamelFolder *folder); -CamelMimeMessage * camel_folder_get_message_by_number (CamelFolder *folder, - gint number, - CamelException *ex); -void camel_folder_delete_message_by_number (CamelFolder *folder, - gint number, - CamelException *ex); gint camel_folder_get_message_count (CamelFolder *folder, CamelException *ex); +GPtrArray * camel_folder_get_summary (CamelFolder *folder, + CamelException *ex); +void camel_folder_free_summary (CamelFolder *folder, + GPtrArray *array); + +GPtrArray * camel_folder_get_subfolder_names (CamelFolder *folder, + CamelException *ex); +void camel_folder_free_subfolder_names (CamelFolder *folder, + GPtrArray *array); + /* uid based access operations */ -gboolean camel_folder_has_uid_capability (CamelFolder *folder); const gchar * camel_folder_get_message_uid (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex); @@ -276,19 +268,16 @@ CamelMimeMessage * camel_folder_get_message_by_uid (CamelFolder *folder, void camel_folder_delete_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex); -GList * camel_folder_get_uid_list (CamelFolder *folder, +GPtrArray * camel_folder_get_uids (CamelFolder *folder, CamelException *ex); +void camel_folder_free_uids (CamelFolder *folder, + GPtrArray *array); /* search api */ gboolean camel_folder_has_search_capability (CamelFolder *folder); GList * camel_folder_search_by_expression(CamelFolder *folder, const char *expression, CamelException *ex); -/* summary info, from the old camel-folder-summary - FIXME: rename these slightly? */ -GPtrArray *camel_folder_summary_get_subfolder_info (CamelFolder *summary, - int first, int count); -GPtrArray *camel_folder_summary_get_message_info (CamelFolder *summary, - int first, int count); +/* summary info. FIXME: rename this slightly? */ const CamelMessageInfo *camel_folder_summary_get_by_uid (CamelFolder *summary, const char *uid); diff --git a/camel/providers/mbox/camel-mbox-folder.c b/camel/providers/mbox/camel-mbox-folder.c index a67d2ee67e..707fea1206 100644 --- a/camel/providers/mbox/camel-mbox-folder.c +++ b/camel/providers/mbox/camel-mbox-folder.c @@ -66,11 +66,12 @@ static gboolean mbox_exists (CamelFolder *folder, CamelException *ex); static gboolean mbox_create(CamelFolder *folder, CamelException *ex); static gboolean mbox_delete (CamelFolder *folder, gboolean recurse, CamelException *ex); static gboolean mbox_delete_messages (CamelFolder *folder, CamelException *ex); -static GList *mbox_list_subfolders (CamelFolder *folder, CamelException *ex); -static CamelMimeMessage *mbox_get_message_by_number (CamelFolder *folder, gint number, CamelException *ex); static gint mbox_get_message_count (CamelFolder *folder, CamelException *ex); static void mbox_append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex); -static GList *mbox_get_uid_list (CamelFolder *folder, CamelException *ex); +static GPtrArray *mbox_get_uids (CamelFolder *folder, CamelException *ex); +static GPtrArray *mbox_get_subfolder_names (CamelFolder *folder, CamelException *ex); +static GPtrArray *mbox_get_summary (CamelFolder *folder, CamelException *ex); +static void mbox_free_summary (CamelFolder *folder, GPtrArray *array); static CamelMimeMessage *mbox_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex); static void mbox_expunge (CamelFolder *folder, CamelException *ex); @@ -81,7 +82,6 @@ static const gchar *_get_message_uid (CamelFolder *folder, CamelMimeMessage *mes static void mbox_delete_message_by_uid(CamelFolder *folder, const gchar *uid, CamelException *ex); -GPtrArray *summary_get_message_info (CamelFolder *folder, int first, int count); static const CamelMessageInfo *mbox_summary_get_by_uid(CamelFolder *f, const char *uid); static GList *mbox_search_by_expression(CamelFolder *folder, const char *expression, CamelException *ex); @@ -106,11 +106,12 @@ camel_mbox_folder_class_init (CamelMboxFolderClass *camel_mbox_folder_class) camel_folder_class->create = mbox_create; camel_folder_class->delete = mbox_delete; camel_folder_class->delete_messages = mbox_delete_messages; - camel_folder_class->list_subfolders = mbox_list_subfolders; - camel_folder_class->get_message_by_number = mbox_get_message_by_number; camel_folder_class->get_message_count = mbox_get_message_count; camel_folder_class->append_message = mbox_append_message; - camel_folder_class->get_uid_list = mbox_get_uid_list; + camel_folder_class->get_uids = mbox_get_uids; + camel_folder_class->get_subfolder_names = mbox_get_subfolder_names; + camel_folder_class->get_summary = mbox_get_summary; + camel_folder_class->free_summary = mbox_free_summary; camel_folder_class->expunge = mbox_expunge; camel_folder_class->get_message_by_uid = mbox_get_message_by_uid; @@ -118,7 +119,6 @@ camel_mbox_folder_class_init (CamelMboxFolderClass *camel_mbox_folder_class) camel_folder_class->search_by_expression = mbox_search_by_expression; - camel_folder_class->get_message_info = summary_get_message_info; camel_folder_class->summary_get_by_uid = mbox_summary_get_by_uid; gtk_object_class->finalize = mbox_finalize; @@ -179,7 +179,6 @@ mbox_init (CamelFolder *folder, CamelStore *parent_store, folder->can_hold_messages = TRUE; folder->can_hold_folders = TRUE; folder->has_summary_capability = TRUE; - folder->has_uid_capability = TRUE; folder->has_search_capability = TRUE; folder->permanent_flags = CAMEL_MESSAGE_ANSWERED | @@ -577,125 +576,6 @@ mbox_delete_messages (CamelFolder *folder, CamelException *ex) } -/* FIXME: cleanup */ -static GList * -mbox_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; - gchar *entry_name; - gchar *full_entry_name; - gchar *real_folder_name; - struct dirent *dir_entry; - DIR *dir_handle; - gboolean folder_suffix_found; - - - /* 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] != '.') { - /* 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 */ - 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 gint mbox_get_message_count (CamelFolder *folder, CamelException *ex) { @@ -789,40 +669,29 @@ fail: } } -static GList * -mbox_get_uid_list (CamelFolder *folder, CamelException *ex) +static GPtrArray * +mbox_get_uids (CamelFolder *folder, CamelException *ex) { - GList *uid_list = NULL; + GPtrArray *array; CamelMboxFolder *mbox_folder = (CamelMboxFolder *)folder; int i, count; - /* FIXME: how are these allocated strings ever free'd? */ count = camel_folder_summary_count((CamelFolderSummary *)mbox_folder->summary); + array = g_ptr_array_new (); + g_ptr_array_set_size (array, count); for (i=0;i<count;i++) { CamelMboxMessageInfo *info = (CamelMboxMessageInfo *)camel_folder_summary_index((CamelFolderSummary *)mbox_folder->summary, i); - uid_list = g_list_prepend(uid_list, g_strdup(info->info.uid)); + array->pdata[i] = g_strdup(info->info.uid); } - return uid_list; + return array; } -static CamelMimeMessage * -mbox_get_message_by_number (CamelFolder *folder, gint number, CamelException *ex) +static GPtrArray * +mbox_get_subfolder_names (CamelFolder *folder, CamelException *ex) { - CamelMboxFolder *mbox_folder = (CamelMboxFolder *)folder; - CamelMboxMessageInfo *info; - - g_warning("YOUR CODE SHOULD NOT BE GETTING MESSAGES BY NUMBER, CHANGE IT"); - - info = (CamelMboxMessageInfo *)camel_folder_summary_index((CamelFolderSummary *)mbox_folder->summary, number); - if (info == NULL) { - camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_INVALID, - "No such message %d in folder `%s'.", - number, folder->name); - return NULL; - } - - return mbox_get_message_by_uid (folder, info->info.uid, ex); + /* No subfolders. */ + return g_ptr_array_new (); } static void @@ -948,19 +817,18 @@ fail: return NULL; } -/* get message info for a range of messages */ -GPtrArray *summary_get_message_info (CamelFolder *folder, int first, int count) +GPtrArray * +mbox_get_summary (CamelFolder *folder, CamelException *ex) { - GPtrArray *array = g_ptr_array_new(); - int i, maxcount; CamelMboxFolder *mbox_folder = (CamelMboxFolder *)folder; - maxcount = camel_folder_summary_count((CamelFolderSummary *)mbox_folder->summary); - maxcount = MIN(count, maxcount); - for (i=first;i<maxcount;i++) - g_ptr_array_add(array, camel_folder_summary_index((CamelFolderSummary *)mbox_folder->summary, i)); + return ((CamelFolderSummary *)mbox_folder->summary)->messages; +} - return array; +void +mbox_free_summary (CamelFolder *folder, GPtrArray *array) +{ + /* no-op */ } /* get a single message info, by uid */ diff --git a/camel/providers/nntp/camel-nntp-folder.c b/camel/providers/nntp/camel-nntp-folder.c index 067849712c..8bc623add7 100644 --- a/camel/providers/nntp/camel-nntp-folder.c +++ b/camel/providers/nntp/camel-nntp-folder.c @@ -71,7 +71,7 @@ static GList *_list_subfolders (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 GList *_get_uid_list (CamelFolder *folder, CamelException *ex); +static GPtrArray *_get_uid_array (CamelFolder *folder, CamelException *ex); static CamelMimeMessage *_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex); #if 0 static void _expunge (CamelFolder *folder, CamelException *ex); @@ -101,7 +101,7 @@ camel_nntp_folder_class_init (CamelNNTPFolderClass *camel_nntp_folder_class) camel_folder_class->delete_messages = _delete_messages; camel_folder_class->list_subfolders = _list_subfolders; camel_folder_class->get_message_count = _get_message_count; - camel_folder_class->get_uid_list = _get_uid_list; + camel_folder_class->get_uid_array = _get_uid_array; camel_folder_class->get_message_by_uid = _get_message_by_uid; #if 0 camel_folder_class->append_message = _append_message; @@ -487,23 +487,25 @@ _append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException -static GList * -_get_uid_list (CamelFolder *folder, CamelException *ex) +static GPtrArray * +_get_uid_array (CamelFolder *folder, CamelException *ex) { CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder); - GPtrArray *message_info_array; + GPtrArray *message_info_array, *out; CamelMessageInfo *message_info; - GList *uid_list = NULL; int i; message_info_array = nntp_folder->summary->messages; + + out = g_ptr_array_new (); + g_ptr_array_set_size (out, message_info_array->len); for (i=0; i<message_info_array->len; i++) { message_info = (CamelMessageInfo *)(message_info_array->pdata) + i; - uid_list = g_list_prepend (uid_list, g_strdup (message_info->uid)); + out->pdata[i] = g_strdup (message_info->uid); } - return uid_list; + return out; } static CamelMimeMessage * diff --git a/camel/providers/pop3/camel-pop3-folder.c b/camel/providers/pop3/camel-pop3-folder.c index 838f247ac6..45687e4f33 100644 --- a/camel/providers/pop3/camel-pop3-folder.c +++ b/camel/providers/pop3/camel-pop3-folder.c @@ -30,6 +30,7 @@ #include "camel-mime-message.h" #include <stdlib.h> +#include <string.h> #define CF_CLASS(o) (CAMEL_FOLDER_CLASS (GTK_OBJECT (o)->klass)) static CamelFolderClass *parent_class; @@ -39,13 +40,14 @@ static void pop3_open (CamelFolder *folder, CamelFolderOpenMode mode, static void pop3_close (CamelFolder *folder, gboolean expunge, CamelException *ex); static gboolean delete_messages (CamelFolder *folder, CamelException *ex); -static gboolean has_message_number_capability (CamelFolder *folder); -static CamelMimeMessage *get_message_by_number (CamelFolder *folder, - gint number, - CamelException *ex); -static void delete_message_by_number (CamelFolder *folder, gint number, - CamelException *ex); + static gint get_message_count (CamelFolder *folder, CamelException *ex); +static GPtrArray *get_uids (CamelFolder *folder, CamelException *ex); +static CamelMimeMessage *get_message_by_uid (CamelFolder *folder, + const char *uid, + CamelException *ex); +static void delete_message_by_uid (CamelFolder *folder, const char *uid, + CamelException *ex); static void @@ -60,33 +62,28 @@ camel_pop3_folder_class_init (CamelPop3FolderClass *camel_pop3_folder_class) camel_folder_class->open = pop3_open; camel_folder_class->close = pop3_close; camel_folder_class->delete_messages = delete_messages; - 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->delete_message_by_number = - delete_message_by_number; - camel_folder_class->get_message_count = - get_message_count; -} + camel_folder_class->get_message_count = get_message_count; + camel_folder_class->get_uids = get_uids; + + camel_folder_class->get_message_by_uid = get_message_by_uid; + camel_folder_class->delete_message_by_uid = delete_message_by_uid; +} static void camel_pop3_folder_init (gpointer object, gpointer klass) { + CamelPop3Folder *pop3_folder = CAMEL_POP3_FOLDER (object); CamelFolder *folder = CAMEL_FOLDER (object); folder->can_hold_messages = TRUE; folder->can_hold_folders = FALSE; - - /* Hi. I'm CamelPop3Folder. I'm useless. */ folder->has_summary_capability = FALSE; - folder->has_uid_capability = FALSE; folder->has_search_capability = FALSE; -} - + pop3_folder->count = -1; +} GtkType @@ -168,14 +165,8 @@ delete_messages (CamelFolder *folder, CamelException *ex) } -static gboolean -has_message_number_capability (CamelFolder *folder) -{ - return TRUE; -} - static CamelMimeMessage * -get_message_by_number (CamelFolder *folder, gint number, CamelException *ex) +get_message_by_uid (CamelFolder *folder, const char *uid, CamelException *ex) { int status; char *result, *body; @@ -183,7 +174,7 @@ get_message_by_number (CamelFolder *folder, gint number, CamelException *ex) CamelMimeMessage *msg; status = camel_pop3_command (CAMEL_POP3_STORE (folder->parent_store), - &result, "RETR %d", number); + &result, "RETR %d", atoi (uid)); if (status != CAMEL_POP3_OK) { CamelService *service = CAMEL_SERVICE (folder->parent_store); camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, @@ -216,17 +207,18 @@ get_message_by_number (CamelFolder *folder, gint number, CamelException *ex) } static void -delete_message_by_number (CamelFolder *folder, gint number, CamelException *ex) +delete_message_by_uid (CamelFolder *folder, const char *uid, + CamelException *ex) { int status; char *resp; status = camel_pop3_command (CAMEL_POP3_STORE (folder->parent_store), - &resp, "DELE %d", number); + &resp, "DELE %d", atoi (uid)); if (status != CAMEL_POP3_OK) { camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID, - "Unable to delete message %d%s%s", - number, resp ? ": " : "", + "Unable to delete message %s%s%s", + uid, resp ? ": " : "", resp ? resp : ""); } g_free (resp); @@ -235,9 +227,13 @@ delete_message_by_number (CamelFolder *folder, gint number, CamelException *ex) static gint get_message_count (CamelFolder *folder, CamelException *ex) { - int status, count; + CamelPop3Folder *pop3_folder = CAMEL_POP3_FOLDER (folder); + int status; char *result; + if (pop3_folder->count != -1) + return pop3_folder->count; + status = camel_pop3_command (CAMEL_POP3_STORE (folder->parent_store), &result, "STAT"); if (status != CAMEL_POP3_OK) { @@ -251,7 +247,25 @@ get_message_count (CamelFolder *folder, CamelException *ex) return -1; } - count = atoi (result); + pop3_folder->count = atoi (result); g_free (result); - return count; + return pop3_folder->count; +} + +static GPtrArray * +get_uids (CamelFolder *folder, CamelException *ex) +{ + int count, i; + GPtrArray *array; + + count = get_message_count (folder, ex); + if (count == -1) + return NULL; + + array = g_ptr_array_new (); + g_ptr_array_set_size (array, count); + for (i = 0; i < count; i++) + array->pdata[i] = g_strdup_printf ("%d", i + 1); + + return array; } diff --git a/camel/providers/pop3/camel-pop3-folder.h b/camel/providers/pop3/camel-pop3-folder.h index 4199e30ead..2a478dc283 100644 --- a/camel/providers/pop3/camel-pop3-folder.h +++ b/camel/providers/pop3/camel-pop3-folder.h @@ -45,6 +45,9 @@ extern "C" { typedef struct { CamelFolder parent_object; + CamelMessageInfo *msg_info; + int count; + } CamelPop3Folder; diff --git a/camel/providers/vee/camel-vee-folder.c b/camel/providers/vee/camel-vee-folder.c index d759fd30eb..88e48134a3 100644 --- a/camel/providers/vee/camel-vee-folder.c +++ b/camel/providers/vee/camel-vee-folder.c @@ -46,12 +46,13 @@ static void vee_open (CamelFolder *folder, CamelFolderOpenMode mode, CamelExcept static void vee_close (CamelFolder *folder, gboolean expunge, CamelException *ex); static gboolean vee_exists (CamelFolder *folder, CamelException *ex); -static GList *vee_get_uid_list (CamelFolder *folder, CamelException *ex); +static GPtrArray *vee_get_uids (CamelFolder *folder, CamelException *ex); +GPtrArray *vee_get_summary (CamelFolder *folder, CamelException *ex); +void vee_free_summary (CamelFolder *folder, GPtrArray *array); static gint vee_get_message_count (CamelFolder *folder, CamelException *ex); static CamelMimeMessage *vee_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex); -GPtrArray *vee_summary_get_message_info (CamelFolder *folder, int first, int count); static const CamelMessageInfo *vee_summary_get_by_uid(CamelFolder *f, const char *uid); @@ -106,10 +107,11 @@ camel_vee_folder_class_init (CamelVeeFolderClass *klass) folder_class->close = vee_close; folder_class->exists = vee_exists; - folder_class->get_uid_list = vee_get_uid_list; + folder_class->get_uids = vee_get_uids; + folder_class->get_summary = vee_get_summary; + folder_class->free_summary = vee_free_summary; folder_class->get_message_by_uid = vee_get_message_by_uid; - folder_class->get_message_info = vee_summary_get_message_info; folder_class->summary_get_by_uid = vee_summary_get_by_uid; folder_class->get_message_count = vee_get_message_count; @@ -163,7 +165,6 @@ static void vee_init (CamelFolder *folder, CamelStore *parent_store, folder->can_hold_messages = TRUE; folder->can_hold_folders = FALSE; folder->has_summary_capability = TRUE; - folder->has_uid_capability = TRUE; folder->has_search_capability = TRUE; /* FIXME: what to do about user flags if the subfolder doesn't support them? */ @@ -223,18 +224,16 @@ static CamelMimeMessage *vee_get_message_by_uid (CamelFolder *folder, const gcha return camel_folder_get_message_by_uid(mi->folder, strchr(mi->info.uid, ':')+1, ex); } -GPtrArray *vee_summary_get_message_info (CamelFolder *folder, int first, int count) +GPtrArray *vee_get_summary (CamelFolder *folder, CamelException *ex) { - GPtrArray *result; - int i, max; CamelVeeFolder *vf = (CamelVeeFolder *)folder; - result = g_ptr_array_new(); - max = MIN(vf->messages->len, count+first); - for (i=first;i<max;i++) { - g_ptr_array_add(result, g_ptr_array_index(vf->messages, i)); - } - return result; + return vf->messages; +} + +void vee_free_summary (CamelFolder *folder, GPtrArray *array) +{ + /* no op */ } static const CamelMessageInfo *vee_summary_get_by_uid(CamelFolder *f, const char *uid) @@ -244,15 +243,17 @@ static const CamelMessageInfo *vee_summary_get_by_uid(CamelFolder *f, const char return g_hash_table_lookup(vf->messages_uid, uid); } -static GList *vee_get_uid_list (CamelFolder *folder, CamelException *ex) +static GPtrArray *vee_get_uids (CamelFolder *folder, CamelException *ex) { - GList *result = NULL; + GPtrArray *result; int i; CamelVeeFolder *vf = (CamelVeeFolder *)folder; + result = g_ptr_array_new (); + g_ptr_array_set_size (result, vf->messages->len); for (i=0;i<vf->messages->len;i++) { CamelMessageInfo *mi = g_ptr_array_index(vf->messages, i); - result = g_list_prepend(result, g_strdup(mi->uid)); + result->pdata[i] = g_strdup(mi->uid); } return result; |