From 7dcc0325454ed6c71c2532befbb6aadb32391766 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Tue, 19 Sep 2000 17:27:09 +0000 Subject: Removed (camel_folder_init, camel_folder_construct): New object init * camel-folder.c: (init): Removed (camel_folder_init, camel_folder_construct): New object init function and public object constructor to replace the old init method in a more Gtk-like fashion. (get_parent_folder, camel_folder_get_parent_folder): Removed. No CamelFolder subclass was ever setting the parent_folder member, no code has ever needed to look at it, and fixing it would actually be pretty hard. (get_subfolder_info, camel_folder_get_subfolder_info): Renamed from ..._names. Deals in CamelFolderInfo now. (free_subfolder_info, camel_folder_free_subfolder_info): Likewise. (get_subfolder, camel_folder_get_subfolder): Removed. CamelFolderInfo contains the subfolder's full name, so this is unnecessary now, and removing it lets us get rid of the CamelFolder separator member, which is needed for the default implementation of this function, but not otherwise needed for most providers. Also, lots of code style fixes. * providers/*: Update CamelFolder subclasses for changes, although none of them fill in the message counts in the CamelFolderInfo yet. svn path=/trunk/; revision=5503 --- camel/ChangeLog | 31 ++- camel/camel-folder.c | 438 ++++++++++++------------------- camel/camel-folder.h | 82 ++---- camel/providers/imap/camel-imap-folder.c | 107 +++----- camel/providers/imap/camel-imap-folder.h | 3 +- camel/providers/imap/camel-imap-store.c | 5 +- camel/providers/mbox/camel-mbox-folder.c | 91 ++++--- camel/providers/mbox/camel-mbox-folder.h | 1 + camel/providers/mbox/camel-mbox-store.c | 9 +- camel/providers/mh/camel-mh-folder.c | 88 +++---- camel/providers/mh/camel-mh-folder.h | 1 + camel/providers/mh/camel-mh-store.c | 21 +- camel/providers/nntp/camel-nntp-folder.c | 116 ++++---- camel/providers/nntp/camel-nntp-folder.h | 1 - camel/providers/nntp/camel-nntp-newsrc.c | 1 + camel/providers/nntp/camel-nntp-store.c | 7 + camel/providers/nntp/camel-nntp-utils.c | 8 +- camel/providers/pop3/camel-pop3-folder.c | 22 +- camel/providers/vee/camel-vee-folder.c | 105 ++++---- camel/providers/vee/camel-vee-folder.h | 4 +- camel/providers/vee/camel-vee-store.c | 7 +- 21 files changed, 502 insertions(+), 646 deletions(-) (limited to 'camel') diff --git a/camel/ChangeLog b/camel/ChangeLog index b769aac279..e49b992228 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,32 @@ +2000-09-19 Dan Winship + + * camel-folder.c: (init): Removed + (camel_folder_init, camel_folder_construct): New object init + function and public object constructor to replace the old init + method in a more Gtk-like fashion. + + (get_parent_folder, camel_folder_get_parent_folder): Removed. No + CamelFolder subclass was ever setting the parent_folder member, no + code has ever needed to look at it, and fixing it would actually + be pretty hard. + + (get_subfolder_info, camel_folder_get_subfolder_info): Renamed + from ..._names. Deals in CamelFolderInfo now. + (free_subfolder_info, camel_folder_free_subfolder_info): Likewise. + + (get_subfolder, camel_folder_get_subfolder): Removed. + CamelFolderInfo contains the subfolder's full name, so this is + unnecessary now, and removing it lets us get rid of the + CamelFolder separator member, which is needed for the default + implementation of this function, but not otherwise needed for most + providers. + + Also, lots of code style fixes. + + * providers/*: Update CamelFolder subclasses for changes, although + none of them fill in the message counts in the CamelFolderInfo + yet. + 2000-09-18 Christopher James Lahey * camel-folder-search.c, camel-folder-search.h, @@ -7,7 +36,7 @@ 2000-09-17 Dan Winship - * camel-folder-summary.h: update CamelFolderInfo + * camel-folder-summary.h: update CamelFolderInfo * camel-folder-summary.c (camel_folder_info_free): New function to free the contents of a CamelFolderInfo diff --git a/camel/camel-folder.c b/camel/camel-folder.c index 888845aed8..2904ac26d9 100644 --- a/camel/camel-folder.c +++ b/camel/camel-folder.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; fill-column: 160 -*- */ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* camel-folder.c: Abstract class for an email folder */ /* @@ -36,12 +36,6 @@ static CamelObjectClass *parent_class = NULL; /* Returns the class for a CamelFolder */ #define CF_CLASS(so) CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so)) - -static void init (CamelFolder *folder, CamelStore *parent_store, - CamelFolder *parent_folder, const gchar *name, - gchar *separator, gboolean path_begins_with_sep, - CamelException *ex); - static void camel_folder_finalize (CamelObject *object); static void refresh_info (CamelFolder *folder, CamelException *ex); @@ -51,7 +45,7 @@ static void folder_sync (CamelFolder *folder, gboolean expunge, static const gchar *get_name (CamelFolder *folder); static const gchar *get_full_name (CamelFolder *folder); - +static CamelStore *get_parent_store (CamelFolder *folder); static gboolean can_hold_folders (CamelFolder *folder); static gboolean can_hold_messages (CamelFolder *folder); @@ -65,15 +59,9 @@ static void set_message_user_flag (CamelFolder *folder, const char *uid, static const char *get_message_user_tag(CamelFolder *folder, const char *uid, const char *name); static void set_message_user_tag(CamelFolder *folder, const char *uid, const char *name, const char *value); -static GPtrArray *get_subfolder_names (CamelFolder *folder); -static void free_subfolder_names (CamelFolder *folder, +static GPtrArray *get_subfolder_info (CamelFolder *folder); +static void free_subfolder_info (CamelFolder *folder, GPtrArray *array); -static CamelFolder *get_subfolder (CamelFolder *folder, - const gchar *folder_name, - gboolean create, - CamelException *ex); -static CamelFolder *get_parent_folder (CamelFolder *folder); -static CamelStore *get_parent_store (CamelFolder *folder); static gint get_message_count (CamelFolder *folder); static gint get_unread_message_count (CamelFolder *folder); @@ -120,7 +108,7 @@ static void freeze (CamelFolder *folder); static void thaw (CamelFolder *folder); static gboolean folder_changed (CamelObject *object, - /*int type*/gpointer event_data); + gpointer event_data); static gboolean message_changed (CamelObject *object, /*const char *uid*/gpointer event_data); @@ -133,18 +121,15 @@ camel_folder_class_init (CamelFolderClass *camel_folder_class) parent_class = camel_type_get_global_classfuncs (camel_object_get_type ()); /* virtual method definition */ - camel_folder_class->init = init; camel_folder_class->sync = folder_sync; camel_folder_class->refresh_info = refresh_info; camel_folder_class->get_name = get_name; camel_folder_class->get_full_name = get_full_name; + camel_folder_class->get_parent_store = get_parent_store; camel_folder_class->can_hold_folders = can_hold_folders; camel_folder_class->can_hold_messages = can_hold_messages; - camel_folder_class->get_subfolder = get_subfolder; - camel_folder_class->get_parent_folder = get_parent_folder; - camel_folder_class->get_parent_store = get_parent_store; - camel_folder_class->get_subfolder_names = get_subfolder_names; - camel_folder_class->free_subfolder_names = free_subfolder_names; + camel_folder_class->get_subfolder_info = get_subfolder_info; + camel_folder_class->free_subfolder_info = free_subfolder_info; camel_folder_class->expunge = expunge; camel_folder_class->get_message_count = get_message_count; camel_folder_class->get_unread_message_count = get_unread_message_count; @@ -170,30 +155,20 @@ camel_folder_class_init (CamelFolderClass *camel_folder_class) camel_folder_class->thaw = thaw; /* virtual method overload */ - camel_object_class_declare_event (camel_object_class, "folder_changed", folder_changed); - camel_object_class_declare_event (camel_object_class, "message_changed", message_changed); - - /* - signals[FOLDER_CHANGED] = - gt_k_signal_new ("folder_changed", - GT_K_RUN_FIRST, - camel_object_class->type, - GT_K_SIGNAL_OFFSET (CamelFolderClass, - folder_changed), - gt_k_marshal_NONE__INT, - GT_K_TYPE_NONE, 1, GT_K_TYPE_INT); - - signals[MESSAGE_CHANGED] = - gt_k_signal_new ("message_changed", - GT_K_RUN_FIRST, - camel_object_class->type, - GT_K_SIGNAL_OFFSET (CamelFolderClass, - message_changed), - gt_k_marshal_NONE__STRING, - GT_K_TYPE_NONE, 1, GT_K_TYPE_STRING); - - camel_object_class_add_signals (camel_object_class, signals, LAST_SIGNAL); - */ + camel_object_class_declare_event (camel_object_class, + "folder_changed", folder_changed); + camel_object_class_declare_event (camel_object_class, + "message_changed", message_changed); +} + +static void +camel_folder_init (gpointer object, gpointer klass) +{ + CamelFolder *folder = object; + + folder->frozen = 0; + folder->folder_changed = FALSE; + folder->messages_changed = NULL; } static void @@ -207,8 +182,6 @@ camel_folder_finalize (CamelObject *object) if (camel_folder->parent_store) camel_object_unref (CAMEL_OBJECT (camel_folder->parent_store)); - if (camel_folder->parent_folder) - camel_object_unref (CAMEL_OBJECT (camel_folder->parent_folder)); for (m = camel_folder->messages_changed; m; m = m->next) g_free (m->data); @@ -226,7 +199,7 @@ camel_folder_get_type (void) sizeof (CamelFolderClass), (CamelObjectClassInitFunc) camel_folder_class_init, NULL, - NULL, + (CamelObjectInitFunc) camel_folder_init, (CamelObjectFinalizeFunc) camel_folder_finalize ); } @@ -235,67 +208,28 @@ camel_folder_get_type (void) /** - * init: init the folder - * @folder: folder object to initialize + * camel_folder_construct: + * @folder: folder object to construct * @parent_store: parent store object of the folder - * @parent_folder: parent folder of the folder (may be NULL) - * @name: (short) name of the folder - * @separator: separator between the parent folder name and this name - * @ex: a CamelException + * @full_name: full name of the folder + * @name: short name of the folder * - * Initalizes the folder by setting the parent store, parent folder, - * and name. + * Initalizes the folder by setting the parent store and name. **/ -static void -init (CamelFolder *folder, CamelStore *parent_store, - CamelFolder *parent_folder, const gchar *name, - gchar *separator, gboolean path_begins_with_sep, - CamelException *ex) +void +camel_folder_construct (CamelFolder *folder, CamelStore *parent_store, + const char *full_name, const char *name) { - gchar *full_name; - const gchar *parent_full_name; - g_return_if_fail (CAMEL_IS_FOLDER (folder)); g_return_if_fail (CAMEL_IS_STORE (parent_store)); - g_return_if_fail (parent_folder == NULL || CAMEL_IS_FOLDER (parent_folder)); g_return_if_fail (folder->parent_store == NULL); + g_return_if_fail (folder->name == NULL); folder->parent_store = parent_store; camel_object_ref (CAMEL_OBJECT (parent_store)); - folder->parent_folder = parent_folder; - if (parent_folder) - camel_object_ref (CAMEL_OBJECT (parent_folder)); - - folder->separator = separator; - folder->path_begins_with_sep = path_begins_with_sep; - - /* 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 (folder->parent_folder) { - parent_full_name = camel_folder_get_full_name(folder->parent_folder); - - full_name = g_strdup_printf("%s%s%s", parent_full_name, folder->separator, name); - } else { - if (path_begins_with_sep) - full_name = g_strdup_printf("%s%s", folder->separator, name); - else - full_name = g_strdup(name); - } - - folder->name = g_strdup(name); - folder->full_name = full_name; - - folder->frozen = 0; - folder->folder_changed = FALSE; - folder->messages_changed = NULL; + folder->name = g_strdup (name); + folder->full_name = g_strdup (full_name); } @@ -315,13 +249,15 @@ folder_sync (CamelFolder *folder, gboolean expunge, CamelException *ex) * Sync changes made to a folder to its backing store, possibly expunging * deleted messages as well. **/ -void camel_folder_sync(CamelFolder * folder, gboolean expunge, CamelException * ex) +void +camel_folder_sync (CamelFolder *folder, gboolean expunge, CamelException *ex) { - g_return_if_fail(CAMEL_IS_FOLDER(folder)); + g_return_if_fail (CAMEL_IS_FOLDER (folder)); - CF_CLASS(folder)->sync(folder, expunge, ex); + CF_CLASS (folder)->sync (folder, expunge, ex); } + static void refresh_info (CamelFolder *folder, CamelException *ex) { @@ -338,14 +274,17 @@ refresh_info (CamelFolder *folder, CamelException *ex) * (called upon creation and when the store's connection is lost * and then reestablished). **/ -void camel_folder_refresh_info (CamelFolder * folder, CamelException * ex) +void +camel_folder_refresh_info (CamelFolder *folder, CamelException *ex) { - g_return_if_fail(CAMEL_IS_FOLDER(folder)); + g_return_if_fail (CAMEL_IS_FOLDER (folder)); - CF_CLASS(folder)->refresh_info(folder, ex); + CF_CLASS (folder)->refresh_info (folder, ex); } -static const gchar *get_name(CamelFolder * folder) + +static const char * +get_name (CamelFolder *folder) { return folder->name; } @@ -359,14 +298,17 @@ static const gchar *get_name(CamelFolder * folder) * * Return value: name of the folder **/ -const gchar *camel_folder_get_name(CamelFolder * folder) +const char * +camel_folder_get_name (CamelFolder * folder) { - g_return_val_if_fail(CAMEL_IS_FOLDER(folder), NULL); + g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); - return CF_CLASS(folder)->get_name(folder); + return CF_CLASS (folder)->get_name (folder); } -static const gchar *get_full_name(CamelFolder * folder) + +static const char * +get_full_name (CamelFolder *folder) { return folder->full_name; } @@ -379,82 +321,78 @@ static const gchar *get_full_name(CamelFolder * folder) * * Return value: full name of the folder **/ -const gchar *camel_folder_get_full_name(CamelFolder * folder) +const char * +camel_folder_get_full_name (CamelFolder *folder) { - g_return_val_if_fail(CAMEL_IS_FOLDER(folder), NULL); + g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); - return CF_CLASS(folder)->get_full_name(folder); + return CF_CLASS (folder)->get_full_name (folder); } -static gboolean can_hold_folders(CamelFolder * folder) + +static gboolean +can_hold_folders (CamelFolder * folder) { return folder->can_hold_folders; } -static gboolean can_hold_messages(CamelFolder * folder) +static gboolean +can_hold_messages (CamelFolder * folder) { return folder->can_hold_messages; } -static CamelFolder *get_subfolder(CamelFolder * folder, const gchar * folder_name, gboolean create, CamelException * ex) -{ - CamelFolder *new_folder; - gchar *full_name; - const gchar *current_folder_full_name; - - g_return_val_if_fail(CAMEL_IS_STORE(folder->parent_store), NULL); - current_folder_full_name = camel_folder_get_full_name(folder); - - full_name = g_strdup_printf("%s%s%s", current_folder_full_name, folder->separator, folder_name); - new_folder = camel_store_get_folder(folder->parent_store, full_name, create, ex); - g_free(full_name); - - return new_folder; +static GPtrArray * +get_subfolder_info (CamelFolder *folder) +{ + g_warning ("CamelFolder::get_subfolder_info not implemented for `%s'", + camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); + return NULL; } /** - * camel_folder_get_subfolder: - * @folder: a folder - * @folder_name: subfolder path - * @create: whether or not to create the folder if it doesn't exist - * @ex: a CamelException - * - * This method returns a folder object. This folder is a subfolder of - * the given folder. It is an error to ask for a folder whose name begins - * with the folder separator character. + * camel_folder_get_subfolder_info: + * @folder: the folder * - * Return value: the requested folder, or %NULL if the subfolder object - * could not be obtained + * Return value: an array containing a CamelFolderInfo for each of + * @folder's subfolders. The array should not be modified and must be + * freed with camel_folder_free_subfolder_info(). **/ -CamelFolder *camel_folder_get_subfolder(CamelFolder * folder, const gchar * folder_name, - gboolean create, CamelException * ex) +GPtrArray * +camel_folder_get_subfolder_info (CamelFolder *folder) { - g_return_val_if_fail(CAMEL_IS_FOLDER(folder), NULL); - g_return_val_if_fail(folder_name != NULL, NULL); + g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); - return CF_CLASS(folder)->get_subfolder(folder, folder_name, create, ex); + return CF_CLASS (folder)->get_subfolder_info (folder); } -static CamelFolder *get_parent_folder(CamelFolder * folder) + +static void +free_subfolder_info (CamelFolder *folder, GPtrArray *array) { - return folder->parent_folder; + g_warning ("CamelFolder::free_subfolder_info not implemented " + "for `%s'", camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); } /** - * camel_folder_get_parent_folder: - * @folder: folder to get the parent of + * camel_folder_free_subfolder_info: + * @folder: folder object + * @array: the array of subfolder info to free * - * Return value: the folder's parent + * Frees the array of info returned by camel_folder_get_subfolder_info(). **/ -CamelFolder *camel_folder_get_parent_folder(CamelFolder * folder) +void +camel_folder_free_subfolder_info (CamelFolder *folder, GPtrArray *array) { - g_return_val_if_fail(CAMEL_IS_FOLDER(folder), NULL); + g_return_if_fail (CAMEL_IS_FOLDER (folder)); - return CF_CLASS(folder)->get_parent_folder(folder); + CF_CLASS (folder)->free_subfolder_info (folder, array); } -static CamelStore *get_parent_store(CamelFolder * folder) + +static CamelStore * +get_parent_store (CamelFolder * folder) { return folder->parent_store; } @@ -474,54 +412,6 @@ camel_folder_get_parent_store (CamelFolder *folder) } -static GPtrArray * -get_subfolder_names (CamelFolder *folder) -{ - g_warning ("CamelFolder::get_subfolder_names not implemented for `%s'", - camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); - return NULL; -} - -/** - * camel_folder_get_subfolder_names: - * @folder: the folder - * - * 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(). - **/ -GPtrArray * -camel_folder_get_subfolder_names (CamelFolder *folder) -{ - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); - - return CF_CLASS (folder)->get_subfolder_names (folder); -} - - -static void -free_subfolder_names (CamelFolder *folder, GPtrArray *array) -{ - g_warning ("CamelFolder::free_subfolder_names not implemented " - "for `%s'", camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))); -} - -/** - * camel_folder_free_subfolder_names: - * @folder: folder object - * @array: the array of subfolder names to free - * - * Frees the array of names returned by camel_folder_get_subfolder_names(). - **/ -void -camel_folder_free_subfolder_names (CamelFolder *folder, GPtrArray *array) -{ - g_return_if_fail (CAMEL_IS_FOLDER (folder)); - - CF_CLASS (folder)->free_subfolder_names (folder, array); -} - - static void expunge (CamelFolder *folder, CamelException *ex) { @@ -546,7 +436,7 @@ camel_folder_expunge (CamelFolder *folder, CamelException *ex) } -static gint +static int get_message_count (CamelFolder *folder) { g_warning ("CamelFolder::get_message_count not implemented " @@ -560,7 +450,7 @@ get_message_count (CamelFolder *folder) * * Return value: the number of messages in the folder, or -1 if unknown. **/ -gint +int camel_folder_get_message_count (CamelFolder *folder) { g_return_val_if_fail (CAMEL_IS_FOLDER (folder), -1); @@ -568,7 +458,8 @@ camel_folder_get_message_count (CamelFolder *folder) return CF_CLASS (folder)->get_message_count (folder); } -static gint + +static int get_unread_message_count (CamelFolder *folder) { g_warning ("CamelFolder::get_unread_message_count not implemented " @@ -582,7 +473,7 @@ get_unread_message_count (CamelFolder *folder) * * Return value: the number of unread messages in the folder, or -1 if unknown. **/ -gint +int camel_folder_get_unread_message_count (CamelFolder *folder) { g_return_val_if_fail (CAMEL_IS_FOLDER (folder), -1); @@ -605,19 +496,25 @@ append_message (CamelFolder *folder, CamelMimeMessage *message, * camel_folder_append_message: add a message to a folder * @folder: folder object to add the message to * @message: message object - * @info: optional message info with additional flags/etc to set on new message. + * @info: message info with additional flags/etc to set on + * new message, or %NULL * @ex: exception object * - * Add a message to a folder. + * Add a message to a folder. Only the flag and tag data from @info + * is used. If @info is %NULL, no flags or tags will be set. **/ -void camel_folder_append_message(CamelFolder * folder, CamelMimeMessage * message, const CamelMessageInfo *info, CamelException * ex) +void +camel_folder_append_message (CamelFolder *folder, CamelMimeMessage *message, + const CamelMessageInfo *info, CamelException *ex) { - g_return_if_fail(CAMEL_IS_FOLDER(folder)); + g_return_if_fail (CAMEL_IS_FOLDER (folder)); - CF_CLASS(folder)->append_message(folder, message, info, ex); + CF_CLASS (folder)->append_message (folder, message, info, ex); } -static guint32 get_permanent_flags(CamelFolder * folder) + +static guint32 +get_permanent_flags (CamelFolder *folder) { return folder->permanent_flags; } @@ -1013,13 +910,13 @@ camel_folder_search_by_expression (CamelFolder *folder, const char *expression, } static void -search_free(CamelFolder * folder, GPtrArray * result) +search_free (CamelFolder *folder, GPtrArray *result) { int i; for (i = 0; i < result->len; i++) - g_free(g_ptr_array_index(result, i)); - g_ptr_array_free(result, TRUE); + g_free (g_ptr_array_index (result, i)); + g_ptr_array_free (result, TRUE); } /** @@ -1030,12 +927,12 @@ search_free(CamelFolder * folder, GPtrArray * result) * Free the result of a search. **/ void -camel_folder_search_free(CamelFolder * folder, GPtrArray * result) +camel_folder_search_free (CamelFolder *folder, GPtrArray *result) { - g_return_if_fail(CAMEL_IS_FOLDER(folder)); - g_return_if_fail(folder->has_search_capability); + g_return_if_fail (CAMEL_IS_FOLDER (folder)); + g_return_if_fail (folder->has_search_capability); - return CF_CLASS(folder)->search_free(folder, result); + return CF_CLASS (folder)->search_free (folder, result); } @@ -1048,14 +945,12 @@ copy_message_to (CamelFolder *source, const char *uid, CamelFolder *dest, /* Default implementation. */ - msg = camel_folder_get_message(source, uid, ex); + msg = camel_folder_get_message (source, uid, ex); if (!msg) return; - info = camel_folder_get_message_info(source, uid); - camel_folder_append_message(dest, msg, info, ex); - camel_object_unref(CAMEL_OBJECT (msg)); - if (camel_exception_is_set(ex)) - return; + info = camel_folder_get_message_info (source, uid); + camel_folder_append_message (dest, msg, info, ex); + camel_object_unref (CAMEL_OBJECT (msg)); } /** @@ -1078,26 +973,28 @@ camel_folder_copy_message_to (CamelFolder *source, const char *uid, g_return_if_fail (uid != NULL); if (source->parent_store == dest->parent_store) { - return CF_CLASS (source)->copy_message_to(source, uid,dest, ex); + return CF_CLASS (source)->copy_message_to (source, uid, + dest, ex); } else - return copy_message_to(source, uid, dest, ex); + return copy_message_to (source, uid, dest, ex); } static void -move_message_to (CamelFolder *source, const char *uid, CamelFolder *dest, CamelException *ex) +move_message_to (CamelFolder *source, const char *uid, + CamelFolder *dest, CamelException *ex) { CamelMimeMessage *msg; const CamelMessageInfo *info; /* Default implementation. */ - msg = camel_folder_get_message(source, uid, ex); + msg = camel_folder_get_message (source, uid, ex); if (!msg) return; - info = camel_folder_get_message_info(source, uid); - camel_folder_append_message(dest, msg, info, ex); - camel_object_unref(CAMEL_OBJECT(msg)); + info = camel_folder_get_message_info (source, uid); + camel_folder_append_message (dest, msg, info, ex); + camel_object_unref (CAMEL_OBJECT (msg)); if (camel_exception_is_set(ex)) return; camel_folder_delete_message (source, uid); @@ -1115,19 +1012,23 @@ move_message_to (CamelFolder *source, const char *uid, CamelFolder *dest, CamelE * than a camel_folder_append_message() followed by * camel_folder_delete_message(). **/ -void camel_folder_move_message_to(CamelFolder * source, const char *uid, CamelFolder * dest, CamelException * ex) +void +camel_folder_move_message_to (CamelFolder *source, const char *uid, + CamelFolder *dest, CamelException *ex) { - g_return_if_fail(CAMEL_IS_FOLDER(source)); - g_return_if_fail(CAMEL_IS_FOLDER(dest)); - g_return_if_fail(uid != NULL); + g_return_if_fail (CAMEL_IS_FOLDER (source)); + g_return_if_fail (CAMEL_IS_FOLDER (dest)); + g_return_if_fail (uid != NULL); if (source->parent_store == dest->parent_store) { - return CF_CLASS(source)->move_message_to(source, uid, dest, ex); + return CF_CLASS (source)->move_message_to (source, uid, + dest, ex); } else - return move_message_to(source, uid, dest, ex); + return move_message_to (source, uid, dest, ex); } -static void freeze(CamelFolder * folder) +static void +freeze (CamelFolder *folder) { folder->frozen++; } @@ -1141,14 +1042,16 @@ static void freeze(CamelFolder * folder) * When the folder is later thawed with camel_folder_thaw(), the * suppressed signals will be emitted. **/ -void camel_folder_freeze(CamelFolder * folder) +void +camel_folder_freeze (CamelFolder * folder) { - g_return_if_fail(CAMEL_IS_FOLDER(folder)); + g_return_if_fail (CAMEL_IS_FOLDER (folder)); - CF_CLASS(folder)->freeze(folder); + CF_CLASS (folder)->freeze (folder); } -static void thaw(CamelFolder * folder) +static void +thaw (CamelFolder * folder) { GList *messages, *m; @@ -1168,13 +1071,16 @@ static void thaw(CamelFolder * folder) if (folder->folder_changed) { folder->folder_changed = FALSE; - camel_object_trigger_event (CAMEL_OBJECT (folder), "folder_changed", GINT_TO_POINTER(0)); + camel_object_trigger_event (CAMEL_OBJECT (folder), + "folder_changed", NULL); } else if (messages) { /* FIXME: would be nice to not emit more than once for * a given message */ for (m = messages; m; m = m->next) { - camel_object_trigger_event (CAMEL_OBJECT (folder), "message_changed", m->data); + camel_object_trigger_event (CAMEL_OBJECT (folder), + "message_changed", + m->data); g_free (m->data); } g_list_free (messages); @@ -1206,7 +1112,8 @@ camel_folder_thaw (CamelFolder *folder) /* Event hooks that block emission when frozen */ -static gboolean folder_changed (CamelObject *obj, /*int type*/gpointer event_data) +static gboolean +folder_changed (CamelObject *obj, gpointer event_data) { CamelFolder *folder = CAMEL_FOLDER (obj); @@ -1218,15 +1125,14 @@ static gboolean folder_changed (CamelObject *obj, /*int type*/gpointer event_dat return TRUE; } -static gboolean message_changed (CamelObject *obj, /*const char *uid*/gpointer event_data) +static gboolean +message_changed (CamelObject *obj, /*const char *uid*/gpointer event_data) { CamelFolder *folder = CAMEL_FOLDER (obj); if (folder->frozen) { - /* - * if g_tk_signal_handler_pending (CAMEL_OBJECT (folder), - * signals[MESSAGE_CHANGED], - * FALSE)) { + /* FIXME: if there are no hooks attached, we can just + * return here. */ /* Only record the UID if it will be useful later. */ @@ -1246,14 +1152,15 @@ static gboolean message_changed (CamelObject *obj, /*const char *uid*/gpointer e /** * camel_folder_free_nop: * @folder: a folder - * @array: an array of uids, subfolder names, or CamelMessageInfo + * @array: an array of uids, CamelFolderInfo, or CamelMessageInfo * * "Frees" the provided array by doing nothing. Used by CamelFolder * subclasses as an implementation for free_uids, free_summary, - * or free_subfolder_names when the returned array is "static" + * or free_subfolder_info when the returned array is "static" * information and should not be freed. **/ -void camel_folder_free_nop(CamelFolder * folder, GPtrArray * array) +void +camel_folder_free_nop (CamelFolder *folder, GPtrArray *array) { ; } @@ -1261,33 +1168,34 @@ void camel_folder_free_nop(CamelFolder * folder, GPtrArray * array) /** * camel_folder_free_shallow: * @folder: a folder - * @array: an array of uids, subfolder names, or CamelMessageInfo + * @array: an array of uids, CamelFolderInfo, or CamelMessageInfo * * Frees the provided array but not its contents. Used by CamelFolder * subclasses as an implementation for free_uids, free_summary, or - * free_subfolder_names when the returned array needs to be freed + * free_subfolder_info when the returned array needs to be freed * but its contents come from "static" information. **/ -void camel_folder_free_shallow(CamelFolder * folder, GPtrArray * array) +void +camel_folder_free_shallow (CamelFolder *folder, GPtrArray *array) { - g_ptr_array_free(array, TRUE); + g_ptr_array_free (array, TRUE); } /** * camel_folder_free_deep: * @folder: a folder - * @array: an array of uids or subfolder names + * @array: an array of uids * * Frees the provided array and its contents. Used by CamelFolder - * subclasses as an implementation for free_uids or - * free_subfolder_names (but NOT free_summary) when the provided + * subclasses as an implementation for free_uids when the provided * information was created explicitly by the corresponding get_ call. **/ -void camel_folder_free_deep(CamelFolder * folder, GPtrArray * array) +void +camel_folder_free_deep (CamelFolder *folder, GPtrArray *array) { int i; for (i = 0; i < array->len; i++) - g_free(array->pdata[i]); - g_ptr_array_free(array, TRUE); + g_free (array->pdata[i]); + g_ptr_array_free (array, TRUE); } diff --git a/camel/camel-folder.h b/camel/camel-folder.h index c78ed28b61..fe1ed75f0c 100644 --- a/camel/camel-folder.h +++ b/camel/camel-folder.h @@ -49,15 +49,11 @@ struct _CamelFolder gboolean folder_changed; GList *messages_changed; - gchar *name; - gchar *full_name; - gchar *separator; + char *name; + char *full_name; CamelStore *parent_store; - CamelFolder *parent_folder; - guint32 permanent_flags; - gboolean path_begins_with_sep; - + guint32 permanent_flags; gboolean can_hold_folders:1; gboolean can_hold_messages:1; gboolean has_summary_capability:1; @@ -67,47 +63,30 @@ struct _CamelFolder typedef struct { CamelObjectClass parent_class; - /* signals */ - /* Not anymore! bwahahahah! - * void (*folder_changed) (CamelFolder *, int type); - * void (*message_changed) (CamelFolder *, - * const char *uid); - */ - /* Virtual methods */ - void (*init) (CamelFolder *folder, CamelStore *parent_store, - CamelFolder *parent_folder, const gchar *name, - gchar *separator, gboolean path_begins_with_sep, - CamelException *ex); - void (*refresh_info) (CamelFolder *folder, CamelException *ex); void (*sync) (CamelFolder *folder, gboolean expunge, CamelException *ex); - const gchar * (*get_name) (CamelFolder *folder); + const char * (*get_name) (CamelFolder *folder); + const char * (*get_full_name) (CamelFolder *folder); - const gchar * (*get_full_name) (CamelFolder *folder); + CamelStore * (*get_parent_store) (CamelFolder *folder); gboolean (*can_hold_folders) (CamelFolder *folder); - gboolean (*can_hold_messages) (CamelFolder *folder); - CamelFolder * (*get_subfolder) (CamelFolder *folder, - const gchar *folder_name, - gboolean create, - CamelException *ex); - - CamelFolder * (*get_parent_folder) (CamelFolder *folder); - - CamelStore * (*get_parent_store) (CamelFolder *folder); + GPtrArray * (*get_subfolder_info)(CamelFolder *folder); + void (*free_subfolder_info) (CamelFolder *folder, + GPtrArray *subfolders); void (*expunge) (CamelFolder *folder, CamelException *ex); - gint (*get_message_count) (CamelFolder *folder); + int (*get_message_count) (CamelFolder *folder); - gint (*get_unread_message_count) (CamelFolder *folder); + int (*get_unread_message_count) (CamelFolder *folder); void (*append_message) (CamelFolder *folder, CamelMimeMessage *message, @@ -138,13 +117,9 @@ typedef struct { const char *value); CamelMimeMessage * (*get_message) (CamelFolder *folder, - const gchar *uid, + const char *uid, CamelException *ex); - void (*delete_message) (CamelFolder *folder, - const gchar *uid, - CamelException *ex); - GPtrArray * (*get_uids) (CamelFolder *folder); void (*free_uids) (CamelFolder *folder, GPtrArray *array); @@ -153,10 +128,6 @@ typedef struct { void (*free_summary) (CamelFolder *folder, GPtrArray *summary); - GPtrArray * (*get_subfolder_names) (CamelFolder *folder); - void (*free_subfolder_names) (CamelFolder *folder, - GPtrArray *subfolders); - gboolean (*has_search_capability) (CamelFolder *folder); GPtrArray * (*search_by_expression) (CamelFolder *folder, @@ -188,13 +159,14 @@ CamelType camel_folder_get_type (void); /* public methods */ +void camel_folder_construct (CamelFolder *folder, + CamelStore *parent_store, + const char *full_name, + const char *name); - - -CamelFolder * camel_folder_get_subfolder (CamelFolder *folder, - const gchar *folder_name, - gboolean create, - CamelException *ex); +GPtrArray * camel_folder_get_subfolder_info (CamelFolder *folder); +void camel_folder_free_subfolder_info (CamelFolder *folder, + GPtrArray *array); void camel_folder_refresh_info (CamelFolder * folder, CamelException * ex); @@ -202,7 +174,6 @@ void camel_folder_sync (CamelFolder *folder, gboolean expunge, CamelException *ex); -CamelFolder * camel_folder_get_parent_folder (CamelFolder *folder); CamelStore * camel_folder_get_parent_store (CamelFolder *folder); @@ -212,8 +183,8 @@ void camel_folder_expunge (CamelFolder *folder, /* folder name operations */ -const gchar * camel_folder_get_name (CamelFolder *folder); -const gchar * camel_folder_get_full_name (CamelFolder *folder); +const char * camel_folder_get_name (CamelFolder *folder); +const char * camel_folder_get_full_name (CamelFolder *folder); /* various properties accessors */ @@ -257,22 +228,17 @@ void camel_folder_append_message (CamelFolder *folder, gboolean camel_folder_has_summary_capability (CamelFolder *folder); -gint camel_folder_get_message_count (CamelFolder *folder); +int camel_folder_get_message_count (CamelFolder *folder); -gint camel_folder_get_unread_message_count (CamelFolder *folder); +int camel_folder_get_unread_message_count (CamelFolder *folder); GPtrArray * camel_folder_get_summary (CamelFolder *folder); void camel_folder_free_summary (CamelFolder *folder, GPtrArray *array); -GPtrArray * camel_folder_get_subfolder_names (CamelFolder *folder); -void camel_folder_free_subfolder_names (CamelFolder *folder, - GPtrArray *array); - - /* uid based access operations */ CamelMimeMessage * camel_folder_get_message (CamelFolder *folder, - const gchar *uid, + const char *uid, CamelException *ex); #define camel_folder_delete_message(folder, uid) \ camel_folder_set_message_flags (folder, uid, CAMEL_MESSAGE_DELETED, CAMEL_MESSAGE_DELETED) diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c index 473659fb84..c6771cfd4c 100644 --- a/camel/providers/imap/camel-imap-folder.c +++ b/camel/providers/imap/camel-imap-folder.c @@ -59,10 +59,6 @@ static CamelFolderClass *parent_class = NULL; -static void imap_init (CamelFolder *folder, CamelStore *parent_store, - CamelFolder *parent_folder, const gchar *name, - gchar *separator, gboolean path_begns_with_sep, - CamelException *ex); static void imap_finalize (CamelObject *object); static void imap_refresh_info (CamelFolder *folder, CamelException *ex); static void imap_sync (CamelFolder *folder, gboolean expunge, CamelException *ex); @@ -84,8 +80,8 @@ static void imap_move_message_to (CamelFolder *source, const char *uid, CamelFolder *destination, CamelException *ex); /* subfolder listing */ -static GPtrArray *imap_get_subfolder_names_internal (CamelFolder *folder, CamelException *ex); -static GPtrArray *imap_get_subfolder_names (CamelFolder *folder); +static GPtrArray *imap_get_subfolder_info_internal (CamelFolder *folder, CamelException *ex); +static GPtrArray *imap_get_subfolder_info (CamelFolder *folder); /* summary info */ static GPtrArray *imap_get_uids (CamelFolder *folder); @@ -115,15 +111,14 @@ camel_imap_folder_class_init (CamelImapFolderClass *camel_imap_folder_class) /* virtual method definition */ /* virtual method overload */ - camel_folder_class->init = imap_init; camel_folder_class->refresh_info = imap_refresh_info; camel_folder_class->sync = imap_sync; camel_folder_class->expunge = imap_expunge; camel_folder_class->get_uids = imap_get_uids; camel_folder_class->free_uids = camel_folder_free_nop; - camel_folder_class->get_subfolder_names = imap_get_subfolder_names; - camel_folder_class->free_subfolder_names = camel_folder_free_nop; + camel_folder_class->get_subfolder_info = imap_get_subfolder_info; + camel_folder_class->free_subfolder_info = camel_folder_free_nop; camel_folder_class->get_message_count = imap_get_message_count; camel_folder_class->get_unread_message_count = imap_get_unread_message_count; @@ -159,6 +154,16 @@ camel_imap_folder_init (gpointer object, gpointer klass) imap_folder->summary = NULL; imap_folder->summary_hash = NULL; imap_folder->lsub = NULL; + + /* some IMAP daemons support user-flags * + * I would not, however, rely on this feature as * + * most IMAP daemons do not support all the features */ + folder->permanent_flags = CAMEL_MESSAGE_SEEN | + CAMEL_MESSAGE_ANSWERED | + CAMEL_MESSAGE_FLAGGED | + CAMEL_MESSAGE_DELETED | + CAMEL_MESSAGE_DRAFT | + CAMEL_MESSAGE_USER; } CamelType @@ -181,29 +186,23 @@ camel_imap_folder_get_type (void) } CamelFolder * -camel_imap_folder_new (CamelStore *parent, char *folder_name, CamelException *ex) +camel_imap_folder_new (CamelStore *parent, char *folder_name) { CamelFolder *folder = CAMEL_FOLDER (camel_object_new (camel_imap_folder_get_type ())); CamelURL *url = CAMEL_SERVICE (parent)->url; - char *dir_sep; + char *dir_sep, *short_name; dir_sep = CAMEL_IMAP_STORE (parent)->dir_sep; - - CF_CLASS (folder)->init (folder, parent, NULL, folder_name, dir_sep, FALSE, ex); - - if (camel_exception_is_set (ex)) { - camel_object_unref (CAMEL_OBJECT (folder)); - return NULL; - } + short_name = strrchr (folder_name, *dir_sep); + if (short_name) + short_name++; + else + short_name = folder_name; + camel_folder_construct (folder, parent, folder_name, short_name); if (!strcmp (folder_name, url->path + 1)) folder->can_hold_messages = FALSE; - if (camel_exception_is_set (ex)) { - camel_object_unref (CAMEL_OBJECT (folder)); - return NULL; - } - return folder; } @@ -249,60 +248,22 @@ static void imap_finalize (CamelObject *object) { CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (object); - gint max, i; + gint i; imap_folder_summary_free (imap_folder); if (imap_folder->lsub) { - max = imap_folder->lsub->len; - - for (i = 0; i < max; i++) { - g_free (imap_folder->lsub->pdata[i]); - imap_folder->lsub->pdata[i] = NULL; - } + for (i = 0; i < imap_folder->lsub->len; i++) + camel_folder_info_free (imap_folder->lsub->pdata[i]); g_ptr_array_free (imap_folder->lsub, TRUE); } } -static void -imap_init (CamelFolder *folder, CamelStore *parent_store, CamelFolder *parent_folder, - const gchar *name, gchar *separator, gboolean path_begins_with_sep, CamelException *ex) -{ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - - /* call parent method */ - parent_class->init (folder, parent_store, parent_folder, name, separator, path_begins_with_sep, ex); - if (camel_exception_get_id (ex)) - return; - - /* we assume that the parent init - method checks for the existance of @folder */ - folder->can_hold_messages = TRUE; - folder->can_hold_folders = TRUE; - folder->has_summary_capability = TRUE; - folder->has_search_capability = TRUE; - - /* some IMAP daemons support user-flags * - * I would not, however, rely on this feature as * - * most IMAP daemons do not support all the features */ - folder->permanent_flags = CAMEL_MESSAGE_SEEN | - CAMEL_MESSAGE_ANSWERED | - CAMEL_MESSAGE_FLAGGED | - CAMEL_MESSAGE_DELETED | - CAMEL_MESSAGE_DRAFT | - CAMEL_MESSAGE_USER; - - imap_folder->search = NULL; - imap_folder->summary = NULL; - imap_folder->summary_hash = NULL; - imap_folder->lsub = NULL; -} - static void imap_refresh_info (CamelFolder *folder, CamelException *ex) { - imap_get_subfolder_names_internal (folder, ex); + imap_get_subfolder_info_internal (folder, ex); if (folder->can_hold_messages) imap_get_summary_internal (folder, ex); @@ -613,7 +574,7 @@ imap_get_uids (CamelFolder *folder) } static GPtrArray * -imap_get_subfolder_names_internal (CamelFolder *folder, CamelException *ex) +imap_get_subfolder_info_internal (CamelFolder *folder, CamelException *ex) { CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); CamelStore *store = CAMEL_STORE (folder->parent_store); @@ -622,6 +583,7 @@ imap_get_subfolder_names_internal (CamelFolder *folder, CamelException *ex) gboolean found_inbox = FALSE; gint status; gchar *result, *namespace, *dir_sep; + CamelFolderInfo *fi; g_return_val_if_fail (folder != NULL, g_ptr_array_new ()); @@ -687,9 +649,18 @@ imap_get_subfolder_names_internal (CamelFolder *folder, CamelException *ex) if (*dir) { d(fprintf (stderr, "adding folder: %s\n", dir)); + fi = g_new0 (CamelFolderInfo, 1); + fi->full_name = dir; + fi->name = strrchr (dir, *sep); + if (fi->name) + fi->name = g_strdup (fi->name + 1); + else + fi->name = g_strdup (dir); + /* FIXME: read/unread msg count */ + if (!g_strcasecmp (dir, "INBOX")) found_inbox = TRUE; - g_ptr_array_add (listing, dir); + g_ptr_array_add (listing, fi); } g_free (sep); @@ -712,7 +683,7 @@ imap_get_subfolder_names_internal (CamelFolder *folder, CamelException *ex) } static GPtrArray * -imap_get_subfolder_names (CamelFolder *folder) +imap_get_subfolder_info (CamelFolder *folder) { CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); diff --git a/camel/providers/imap/camel-imap-folder.h b/camel/providers/imap/camel-imap-folder.h index 4df50ed027..3dc10b3682 100644 --- a/camel/providers/imap/camel-imap-folder.h +++ b/camel/providers/imap/camel-imap-folder.h @@ -62,8 +62,7 @@ typedef struct { /* public methods */ -CamelFolder *camel_imap_folder_new (CamelStore *parent, char *folder_name, - CamelException *ex); +CamelFolder *camel_imap_folder_new (CamelStore *parent, char *folder_name); void camel_imap_folder_changed (CamelFolder *folder, gint recent, GPtrArray *expunged, CamelException *ex); diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c index 22a89a9751..8dc82ed7e5 100644 --- a/camel/providers/imap/camel-imap-store.c +++ b/camel/providers/imap/camel-imap-store.c @@ -502,10 +502,7 @@ get_folder (CamelStore *store, const char *folder_name, gboolean create, CamelEx else folder_path = g_strdup (folder_name); - new_folder = camel_imap_folder_new (store, folder_path, ex); - - if (camel_exception_is_set (ex)) - return NULL; + new_folder = camel_imap_folder_new (store, folder_path); /* this is the top-level dir, we already know it exists - it has to! */ /* Yes, we use a hard-coded "/" here - this just means top-level directory */ diff --git a/camel/providers/mbox/camel-mbox-folder.c b/camel/providers/mbox/camel-mbox-folder.c index f924d1d4ab..7aaf9d8593 100644 --- a/camel/providers/mbox/camel-mbox-folder.c +++ b/camel/providers/mbox/camel-mbox-folder.c @@ -56,9 +56,6 @@ static CamelFolderClass *parent_class = NULL; #define CMBOXS_CLASS(so) CAMEL_STORE_CLASS (CAMEL_OBJECT_GET_CLASS(so)) -static void mbox_init(CamelFolder *folder, CamelStore * parent_store, - CamelFolder *parent_folder, const gchar * name, - gchar * separator, gboolean path_begins_with_sep, CamelException *ex); static void mbox_refresh_info (CamelFolder *folder, CamelException *ex); static void mbox_sync(CamelFolder *folder, gboolean expunge, CamelException *ex); static gint mbox_get_message_count(CamelFolder *folder); @@ -67,7 +64,7 @@ static void mbox_append_message(CamelFolder *folder, CamelMimeMessage * message, CamelException *ex); static GPtrArray *mbox_get_uids(CamelFolder *folder); -static GPtrArray *mbox_get_subfolder_names(CamelFolder *folder); +static GPtrArray *mbox_get_subfolder_info(CamelFolder *folder); static GPtrArray *mbox_get_summary(CamelFolder *folder); static CamelMimeMessage *mbox_get_message(CamelFolder *folder, const gchar * uid, CamelException *ex); @@ -98,7 +95,6 @@ camel_mbox_folder_class_init(CamelMboxFolderClass * camel_mbox_folder_class) /* virtual method definition */ /* virtual method overload */ - camel_folder_class->init = mbox_init; camel_folder_class->refresh_info = mbox_refresh_info; camel_folder_class->sync = mbox_sync; camel_folder_class->get_message_count = mbox_get_message_count; @@ -106,8 +102,8 @@ camel_mbox_folder_class_init(CamelMboxFolderClass * camel_mbox_folder_class) camel_folder_class->append_message = mbox_append_message; camel_folder_class->get_uids = mbox_get_uids; camel_folder_class->free_uids = camel_folder_free_deep; - camel_folder_class->get_subfolder_names = mbox_get_subfolder_names; - camel_folder_class->free_subfolder_names = camel_folder_free_deep; + camel_folder_class->get_subfolder_info = mbox_get_subfolder_info; + camel_folder_class->free_subfolder_info = camel_folder_free_shallow; camel_folder_class->get_summary = mbox_get_summary; camel_folder_class->free_summary = camel_folder_free_nop; camel_folder_class->expunge = mbox_expunge; @@ -127,6 +123,26 @@ camel_mbox_folder_class_init(CamelMboxFolderClass * camel_mbox_folder_class) camel_folder_class->set_message_user_tag = mbox_set_message_user_tag; } +static void +mbox_init(gpointer object, gpointer klass) +{ + CamelFolder *folder = object; + CamelMboxFolder *mbox_folder = object; + + folder->can_hold_messages = TRUE; + folder->can_hold_folders = TRUE; + folder->has_summary_capability = TRUE; + folder->has_search_capability = TRUE; + + folder->permanent_flags = CAMEL_MESSAGE_ANSWERED | + CAMEL_MESSAGE_DELETED | CAMEL_MESSAGE_DRAFT | + CAMEL_MESSAGE_FLAGGED | CAMEL_MESSAGE_SEEN | CAMEL_MESSAGE_USER; + /* FIXME: we don't actually preserve user flags right now. */ + + mbox_folder->summary = NULL; + mbox_folder->search = NULL; +} + static void mbox_finalize(CamelObject * object) { @@ -152,54 +168,45 @@ CamelType camel_mbox_folder_get_type(void) sizeof(CamelMboxFolderClass), (CamelObjectClassInitFunc) camel_mbox_folder_class_init, NULL, - (CamelObjectInitFunc) NULL, + (CamelObjectInitFunc) mbox_init, (CamelObjectFinalizeFunc) mbox_finalize); } return camel_mbox_folder_type; } -static void -mbox_init(CamelFolder *folder, CamelStore * parent_store, - CamelFolder *parent_folder, const gchar * name, gchar * separator, - gboolean path_begins_with_sep, CamelException *ex) +CamelFolder * +camel_mbox_folder_new(CamelStore *parent_store, const char *full_name, CamelException *ex) { - CamelMboxFolder *mbox_folder = (CamelMboxFolder *) folder; - const gchar *root_dir_path; - gchar *real_name; + CamelFolder *folder; + CamelMboxFolder *mbox_folder; + const char *root_dir_path, *name; - /* call parent method */ - parent_class->init(folder, parent_store, parent_folder, name, separator, path_begins_with_sep, ex); - if (camel_exception_get_id(ex)) - return; + folder = CAMEL_FOLDER (camel_object_new (CAMEL_MBOX_FOLDER_TYPE)); + mbox_folder = (CamelMboxFolder *)folder; - /* we assume that the parent init - method checks for the existance of @folder */ - folder->can_hold_messages = TRUE; - folder->can_hold_folders = TRUE; - folder->has_summary_capability = TRUE; - folder->has_search_capability = TRUE; + name = strrchr(full_name, '/'); + if (name) + name++; + else + name = full_name; - folder->permanent_flags = CAMEL_MESSAGE_ANSWERED | - CAMEL_MESSAGE_DELETED | - CAMEL_MESSAGE_DRAFT | CAMEL_MESSAGE_FLAGGED | CAMEL_MESSAGE_SEEN | CAMEL_MESSAGE_USER; - /* FIXME: we don't actually preserve user flags right now. */ + camel_folder_construct(folder, parent_store, full_name, name); - mbox_folder->summary = NULL; - mbox_folder->search = NULL; + root_dir_path = camel_mbox_store_get_toplevel_dir(CAMEL_MBOX_STORE(folder->parent_store)); - /* now set the name info */ - g_free(mbox_folder->folder_file_path); - g_free(mbox_folder->folder_dir_path); - g_free(mbox_folder->index_file_path); + mbox_folder->folder_file_path = g_strdup_printf("%s/%s", root_dir_path, full_name); + mbox_folder->summary_file_path = g_strdup_printf("%s/%s-ev-summary", root_dir_path, full_name); + mbox_folder->folder_dir_path = g_strdup_printf("%s/%s.sdb", root_dir_path, full_name); + mbox_folder->index_file_path = g_strdup_printf("%s/%s.ibex", root_dir_path, full_name); - root_dir_path = camel_mbox_store_get_toplevel_dir(CAMEL_MBOX_STORE(folder->parent_store)); + mbox_refresh_info (folder, ex); + if (camel_exception_is_set (ex)) { + camel_object_unref (CAMEL_OBJECT (folder)); + folder = NULL; + } - real_name = g_basename(folder->full_name); - mbox_folder->folder_file_path = g_strdup_printf("%s/%s", root_dir_path, real_name); - mbox_folder->summary_file_path = g_strdup_printf("%s/%s-ev-summary", root_dir_path, real_name); - mbox_folder->folder_dir_path = g_strdup_printf("%s/%s.sdb", root_dir_path, real_name); - mbox_folder->index_file_path = g_strdup_printf("%s/%s.ibex", root_dir_path, real_name); + return folder; } static void @@ -432,7 +439,7 @@ mbox_get_uids(CamelFolder *folder) } static GPtrArray * -mbox_get_subfolder_names(CamelFolder *folder) +mbox_get_subfolder_info(CamelFolder *folder) { /* No subfolders. */ return g_ptr_array_new(); diff --git a/camel/providers/mbox/camel-mbox-folder.h b/camel/providers/mbox/camel-mbox-folder.h index 7c5558f362..4cc91eda75 100644 --- a/camel/providers/mbox/camel-mbox-folder.h +++ b/camel/providers/mbox/camel-mbox-folder.h @@ -69,6 +69,7 @@ typedef struct { /* public methods */ +CamelFolder *camel_mbox_folder_new (CamelStore *parent_store, const char *full_name, CamelException *ex); /* Standard Camel function */ CamelType camel_mbox_folder_get_type (void); diff --git a/camel/providers/mbox/camel-mbox-store.c b/camel/providers/mbox/camel-mbox-store.c index 05e5af406b..0a6c7c2ce1 100644 --- a/camel/providers/mbox/camel-mbox-store.c +++ b/camel/providers/mbox/camel-mbox-store.c @@ -106,7 +106,6 @@ static CamelFolder * get_folder (CamelStore *store, const char *folder_name, gboolean create, CamelException *ex) { - CamelFolder *new_folder; char *name; struct stat st; @@ -151,13 +150,7 @@ get_folder (CamelStore *store, const char *folder_name, gboolean create, } else g_free (name); - new_folder = CAMEL_FOLDER (camel_object_new (CAMEL_MBOX_FOLDER_TYPE)); - - CF_CLASS (new_folder)->init (new_folder, store, NULL, - folder_name, "/", TRUE, ex); - CF_CLASS (new_folder)->refresh_info (new_folder, ex); - - return new_folder; + return camel_mbox_folder_new (store, folder_name, ex); } static void diff --git a/camel/providers/mh/camel-mh-folder.c b/camel/providers/mh/camel-mh-folder.c index 3112e2f4f4..ec434bbcf0 100644 --- a/camel/providers/mh/camel-mh-folder.c +++ b/camel/providers/mh/camel-mh-folder.c @@ -53,16 +53,12 @@ static CamelFolderClass *parent_class = NULL; #define CF_CLASS(so) CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so)) #define CMHS_CLASS(so) CAMEL_STORE_CLASS (CAMEL_OBJECT_GET_CLASS(so)) -static void mh_init(CamelFolder * folder, CamelStore * parent_store, - CamelFolder * parent_folder, const gchar * name, - gchar * separator, gboolean path_begins_with_sep, CamelException * ex); - static void mh_sync(CamelFolder * folder, gboolean expunge, CamelException * ex); static gint mh_get_message_count(CamelFolder * folder); static gint mh_get_unread_message_count(CamelFolder * folder); static void mh_append_message(CamelFolder * folder, CamelMimeMessage * message, const CamelMessageInfo *info, CamelException * ex); static GPtrArray *mh_get_uids(CamelFolder * folder); -static GPtrArray *mh_get_subfolder_names(CamelFolder * folder); +static GPtrArray *mh_get_subfolder_info(CamelFolder * folder); static GPtrArray *mh_get_summary(CamelFolder * folder); static CamelMimeMessage *mh_get_message(CamelFolder * folder, const gchar * uid, CamelException * ex); @@ -91,15 +87,14 @@ static void camel_mh_folder_class_init(CamelObjectClass * camel_mh_folder_class) /* virtual method definition */ /* virtual method overload */ - camel_folder_class->init = mh_init; camel_folder_class->sync = mh_sync; camel_folder_class->get_message_count = mh_get_message_count; camel_folder_class->get_unread_message_count = mh_get_unread_message_count; camel_folder_class->append_message = mh_append_message; camel_folder_class->get_uids = mh_get_uids; camel_folder_class->free_uids = camel_folder_free_deep; - camel_folder_class->get_subfolder_names = mh_get_subfolder_names; - camel_folder_class->free_subfolder_names = camel_folder_free_deep; + camel_folder_class->get_subfolder_info = mh_get_subfolder_info; + camel_folder_class->free_subfolder_info = camel_folder_free_deep; camel_folder_class->get_summary = mh_get_summary; camel_folder_class->free_summary = camel_folder_free_nop; camel_folder_class->expunge = mh_expunge; @@ -119,6 +114,24 @@ static void camel_mh_folder_class_init(CamelObjectClass * camel_mh_folder_class) camel_folder_class->set_message_user_tag = mh_set_message_user_tag; } +static void mh_init(gpointer object, gpointer klass) +{ + CamelFolder *folder = object; + CamelMhFolder *mh_folder = object; + + folder->can_hold_messages = TRUE; + folder->can_hold_folders = TRUE; + folder->has_summary_capability = TRUE; + folder->has_search_capability = TRUE; + + folder->permanent_flags = CAMEL_MESSAGE_ANSWERED | + CAMEL_MESSAGE_DELETED | CAMEL_MESSAGE_DRAFT | + CAMEL_MESSAGE_FLAGGED | CAMEL_MESSAGE_SEEN | CAMEL_MESSAGE_USER; + + mh_folder->summary = NULL; + mh_folder->search = NULL; +} + static void mh_finalize(CamelObject * object) { CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(object); @@ -142,54 +155,38 @@ CamelType camel_mh_folder_get_type(void) sizeof(CamelMhFolderClass), (CamelObjectClassInitFunc) camel_mh_folder_class_init, NULL, - (CamelObjectInitFunc) NULL, + (CamelObjectInitFunc) mh_init, (CamelObjectFinalizeFunc) mh_finalize); } return camel_mh_folder_type; } -static void -mh_init(CamelFolder * folder, CamelStore * parent_store, - CamelFolder * parent_folder, const gchar * name, gchar * separator, - gboolean path_begins_with_sep, CamelException * ex) +CamelFolder * +camel_mh_folder_new(CamelStore *parent_store, const char *full_name, CamelException *ex) { - CamelMhFolder *mh_folder = (CamelMhFolder *) folder; - const gchar *root_dir_path; - gchar *real_name; + CamelFolder *folder; + CamelMhFolder *mh_folder; + const char *root_dir_path, *name; int forceindex; struct stat st; - /* call parent method */ - parent_class->init(folder, parent_store, parent_folder, name, separator, path_begins_with_sep, ex); - if (camel_exception_get_id(ex)) - return; + folder = CAMEL_FOLDER (camel_object_new(CAMEL_MH_FOLDER_TYPE)); + mh_folder = (CamelMhFolder *)folder; - /* we assume that the parent init method checks for the existance of @folder */ - folder->can_hold_messages = TRUE; - folder->can_hold_folders = TRUE; - folder->has_summary_capability = TRUE; - folder->has_search_capability = TRUE; - - folder->permanent_flags = CAMEL_MESSAGE_ANSWERED | - CAMEL_MESSAGE_DELETED | - CAMEL_MESSAGE_DRAFT | CAMEL_MESSAGE_FLAGGED | CAMEL_MESSAGE_SEEN | CAMEL_MESSAGE_USER; - - mh_folder->summary = NULL; - mh_folder->search = NULL; - - /* now set the name info */ - g_free(mh_folder->folder_file_path); - g_free(mh_folder->folder_dir_path); - g_free(mh_folder->index_file_path); + name = strrchr(full_name, '/'); + if (name) + name++; + else + name = full_name; + camel_folder_construct (folder, parent_store, full_name, name); root_dir_path = camel_mh_store_get_toplevel_dir(CAMEL_MH_STORE(folder->parent_store)); - real_name = g_basename(folder->full_name); - mh_folder->folder_file_path = g_strdup_printf("%s/%s", root_dir_path, real_name); - mh_folder->summary_file_path = g_strdup_printf("%s/%s/ev-summary", root_dir_path, real_name); - mh_folder->folder_dir_path = g_strdup_printf("%s/%s", root_dir_path, real_name); - mh_folder->index_file_path = g_strdup_printf("%s/%s/ev-index.ibex", root_dir_path, real_name); + mh_folder->folder_file_path = g_strdup_printf("%s/%s", root_dir_path, full_name); + mh_folder->summary_file_path = g_strdup_printf("%s/%s/ev-summary", root_dir_path, full_name); + mh_folder->folder_dir_path = g_strdup_printf("%s/%s", root_dir_path, full_name); + mh_folder->index_file_path = g_strdup_printf("%s/%s/ev-index.ibex", root_dir_path, full_name); /* if we have no index file, force it */ forceindex = stat(mh_folder->index_file_path, &st) == -1; @@ -208,8 +205,11 @@ mh_init(CamelFolder * folder, CamelStore * parent_store, if (camel_mh_summary_load(mh_folder->summary, forceindex) == -1) { camel_exception_set(ex, CAMEL_EXCEPTION_FOLDER_INVALID, /* FIXME: right error code */ "Could not load or create summary"); - return; + camel_object_unref (CAMEL_OBJECT (folder)); + return NULL; } + + return folder; } static void mh_sync(CamelFolder * folder, gboolean expunge, CamelException * ex) @@ -356,7 +356,7 @@ static GPtrArray *mh_get_uids(CamelFolder * folder) return array; } -static GPtrArray *mh_get_subfolder_names(CamelFolder * folder) +static GPtrArray *mh_get_subfolder_info(CamelFolder * folder) { /* FIXME: scan for sub-folders */ /* No subfolders. */ diff --git a/camel/providers/mh/camel-mh-folder.h b/camel/providers/mh/camel-mh-folder.h index 37ff133c9e..90f2324d11 100644 --- a/camel/providers/mh/camel-mh-folder.h +++ b/camel/providers/mh/camel-mh-folder.h @@ -62,6 +62,7 @@ typedef struct { } CamelMhFolderClass; /* public methods */ +CamelFolder *camel_mh_folder_new(CamelStore *parent_store, const char *full_name, CamelException *ex); /* Standard Camel function */ CamelType camel_mh_folder_get_type(void); diff --git a/camel/providers/mh/camel-mh-store.c b/camel/providers/mh/camel-mh-store.c index c720cb1c91..e45a5b72e2 100644 --- a/camel/providers/mh/camel-mh-store.c +++ b/camel/providers/mh/camel-mh-store.c @@ -98,7 +98,6 @@ const gchar *camel_mh_store_get_toplevel_dir(CamelMhStore * store) static CamelFolder *get_folder(CamelStore * store, const char *folder_name, gboolean create, CamelException * ex) { - CamelFolder *new_folder = NULL; char *name; struct stat st; @@ -110,33 +109,33 @@ static CamelFolder *get_folder(CamelStore * store, const char *folder_name, gboo if (errno != ENOENT) { camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, "Could not open folder `%s':" "\n%s", folder_name, g_strerror(errno)); - goto done; + g_free (name); + return NULL; } if (!create) { camel_exception_setv(ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, "Folder `%s' does not exist.", folder_name); - goto done; + g_free (name); + return NULL; } printf("creating ...\n"); if (mkdir(name, 0700) != 0) { camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, "Could not create folder `%s':" "\n%s", folder_name, g_strerror(errno)); - goto done; + g_free (name); + return NULL; } printf("created ok?\n"); } else if (!S_ISDIR(st.st_mode)) { camel_exception_setv(ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, "`%s' is not a directory.", name); - goto done; + g_free (name); + return NULL; } - - new_folder = CAMEL_FOLDER (camel_object_new(CAMEL_MH_FOLDER_TYPE)); - - CF_CLASS(new_folder)->init(new_folder, store, NULL, folder_name, "/", TRUE, ex); -done: g_free(name); - return new_folder; + + return camel_mh_folder_new (store, folder_name, ex); } static void delete_folder(CamelStore * store, const char *folder_name, CamelException * ex) diff --git a/camel/providers/nntp/camel-nntp-folder.c b/camel/providers/nntp/camel-nntp-folder.c index 6ab92923a2..2206064289 100644 --- a/camel/providers/nntp/camel-nntp-folder.c +++ b/camel/providers/nntp/camel-nntp-folder.c @@ -57,37 +57,6 @@ static CamelFolderClass *parent_class=NULL; #define CNNTPS_CLASS(so) CAMEL_STORE_CLASS (CAMEL_OBJECT_GET_CLASS(so)) -static void -nntp_folder_init (CamelFolder *folder, CamelStore *parent_store, - CamelFolder *parent_folder, const gchar *name, - gchar *separator, gboolean path_begins_with_sep, - CamelException *ex) -{ - CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder); - - /* call parent method */ - parent_class->init (folder, parent_store, parent_folder, - name, separator, path_begins_with_sep, - ex); - if (camel_exception_is_set (ex)) return; - - /* set flags */ - - if (!strcmp (name, "/")) { - /* the root folder is the only folder that has "subfolders" */ - folder->can_hold_folders = TRUE; - folder->can_hold_messages = FALSE; - } - else { - folder->can_hold_folders = FALSE; - folder->can_hold_messages = TRUE; - folder->has_summary_capability = TRUE; - } - - /* XX */ - nntp_folder->group_name = g_strdup (strrchr (name, '/') + 1); -} - static void nntp_refresh_info (CamelFolder *folder, CamelException *ex) { @@ -101,7 +70,7 @@ nntp_refresh_info (CamelFolder *folder, CamelException *ex) nntp_folder->summary_file_path = g_strdup_printf ("%s/%s-ev-summary", root_dir_path, - nntp_folder->group_name); + folder->name); nntp_folder->summary = camel_folder_summary_new (); camel_folder_summary_set_filename (nntp_folder->summary, @@ -134,16 +103,6 @@ nntp_folder_sync (CamelFolder *folder, gboolean expunge, camel_nntp_newsrc_write (store->newsrc); } -static CamelFolder* -nntp_folder_get_subfolder (CamelFolder *folder, - const gchar *folder_name, - gboolean create, - CamelException *ex) -{ - g_assert (0); - return NULL; -} - static gint nntp_folder_get_message_count (CamelFolder *folder) { @@ -180,7 +139,7 @@ nntp_folder_set_message_flags (CamelFolder *folder, const char *uid, sscanf (uid, "%d", &article_num); camel_nntp_newsrc_mark_article_read (nntp_store->newsrc, - nntp_folder->group_name, + folder->name, article_num); } @@ -304,27 +263,34 @@ nntp_folder_get_summary (CamelFolder *folder) } static GPtrArray * -nntp_folder_get_subfolder_names (CamelFolder *folder) +nntp_folder_get_subfolder_info (CamelFolder *folder) { - if (!strcmp (folder->name, "/")) { - CamelStore *store = camel_folder_get_parent_store (folder); + CamelNNTPNewsrc *newsrc; + GPtrArray *names, *info; + CamelFolderInfo *fi; + int i; - if (CAMEL_NNTP_STORE (store)->newsrc) { - GPtrArray *array = camel_nntp_newsrc_get_subscribed_group_names (CAMEL_NNTP_STORE (store)->newsrc); - return array; - } - } - - return NULL; -} + /* Only top-level folder has subfolders. */ + if (*folder->name) + return NULL; -static void -nntp_folder_free_subfolder_names (CamelFolder *folder, GPtrArray *subfolders) -{ - if (subfolders) { - CamelStore *store = camel_folder_get_parent_store (folder); - camel_nntp_newsrc_free_group_names (CAMEL_NNTP_STORE (store)->newsrc, subfolders); + newsrc = CAMEL_NNTP_STORE (camel_folder_get_parent_store (folder))->newsrc; + if (!newsrc) + return NULL; + + info = g_ptr_array_new (); + names = camel_nntp_newsrc_get_subscribed_group_names (newsrc); + for (i = 0; i < names->len; i++) { + fi = g_new (CamelFolderInfo, 1); + fi->name = fi->full_name = names->pdata[i]; + /* FIXME */ + fi->message_count = 0; + fi->unread_message_count = 0; + g_ptr_array_add (info, fi); } + camel_nntp_newsrc_free_group_names (newsrc, names); + + return info; } static GPtrArray* @@ -360,10 +326,8 @@ camel_nntp_folder_class_init (CamelNNTPFolderClass *camel_nntp_folder_class) /* virtual method definition */ /* virtual method overload */ - camel_folder_class->init = nntp_folder_init; camel_folder_class->refresh_info = nntp_refresh_info; camel_folder_class->sync = nntp_folder_sync; - camel_folder_class->get_subfolder = nntp_folder_get_subfolder; camel_folder_class->get_message_count = nntp_folder_get_message_count; camel_folder_class->set_message_flags = nntp_folder_set_message_flags; camel_folder_class->get_message_flags = nntp_folder_get_message_flags; @@ -372,8 +336,8 @@ camel_nntp_folder_class_init (CamelNNTPFolderClass *camel_nntp_folder_class) camel_folder_class->free_uids = camel_folder_free_deep; camel_folder_class->get_summary = nntp_folder_get_summary; camel_folder_class->free_summary = camel_folder_free_nop; - camel_folder_class->get_subfolder_names = nntp_folder_get_subfolder_names; - camel_folder_class->free_subfolder_names = nntp_folder_free_subfolder_names; + camel_folder_class->get_subfolder_info = nntp_folder_get_subfolder_info; + camel_folder_class->free_subfolder_info = camel_folder_free_deep; camel_folder_class->search_by_expression = nntp_folder_search_by_expression; camel_folder_class->get_message_info = nntp_folder_get_message_info; } @@ -399,12 +363,26 @@ camel_nntp_folder_get_type (void) CamelFolder * camel_nntp_folder_new (CamelStore *parent, const char *folder_name, CamelException *ex) { - CamelFolder *new_folder = CAMEL_FOLDER (camel_object_new (CAMEL_NNTP_FOLDER_TYPE)); + CamelFolder *folder = CAMEL_FOLDER (camel_object_new (CAMEL_NNTP_FOLDER_TYPE)); - CF_CLASS (new_folder)->init (new_folder, parent, NULL, - folder_name, ".", FALSE, ex); + camel_folder_construct (folder, parent, folder_name, folder_name); - CF_CLASS (new_folder)->refresh_info (new_folder, ex); + /* set flags */ + if (!*folder->name) { + /* the root folder is the only folder that has "subfolders" */ + folder->can_hold_folders = TRUE; + folder->can_hold_messages = FALSE; + } + else { + folder->can_hold_folders = FALSE; + folder->can_hold_messages = TRUE; + folder->has_summary_capability = TRUE; + } - return new_folder; + camel_folder_refresh_info (folder, ex); + if (camel_exception_is_set (ex)) { + camel_object_unref (CAMEL_OBJECT (folder)); + folder = NULL; + } + return folder; } diff --git a/camel/providers/nntp/camel-nntp-folder.h b/camel/providers/nntp/camel-nntp-folder.h index db1687c907..eed946fb5c 100644 --- a/camel/providers/nntp/camel-nntp-folder.h +++ b/camel/providers/nntp/camel-nntp-folder.h @@ -46,7 +46,6 @@ extern "C" { typedef struct { CamelFolder parent_object; - gchar *group_name; gchar *summary_file_path; /* contains the messages summary */ CamelFolderSummary *summary; } CamelNNTPFolder; diff --git a/camel/providers/nntp/camel-nntp-newsrc.c b/camel/providers/nntp/camel-nntp-newsrc.c index af40308219..a44e42c910 100644 --- a/camel/providers/nntp/camel-nntp-newsrc.c +++ b/camel/providers/nntp/camel-nntp-newsrc.c @@ -29,6 +29,7 @@ #include #include #include "camel-nntp-newsrc.h" +#include typedef struct { guint low; diff --git a/camel/providers/nntp/camel-nntp-store.c b/camel/providers/nntp/camel-nntp-store.c index bedcd3f13c..609520251b 100644 --- a/camel/providers/nntp/camel-nntp-store.c +++ b/camel/providers/nntp/camel-nntp-store.c @@ -296,6 +296,12 @@ nntp_store_get_folder (CamelStore *store, const gchar *folder_name, return camel_nntp_folder_new (store, folder_name, ex); } +static char * +nntp_store_get_root_folder_name (CamelStore *store, CamelException *ex) +{ + return g_strdup (""); +} + static void finalize (CamelObject *object) { @@ -325,6 +331,7 @@ camel_nntp_store_class_init (CamelNNTPStoreClass *camel_nntp_store_class) camel_service_class->get_name = nntp_store_get_name; camel_store_class->get_folder = nntp_store_get_folder; + camel_store_class->get_root_folder_name = nntp_store_get_root_folder_name; } diff --git a/camel/providers/nntp/camel-nntp-utils.c b/camel/providers/nntp/camel-nntp-utils.c index c741146f26..1a990fb94f 100644 --- a/camel/providers/nntp/camel-nntp-utils.c +++ b/camel/providers/nntp/camel-nntp-utils.c @@ -87,7 +87,7 @@ get_OVER_headers(CamelNNTPStore *nntp_store, CamelFolder *folder, new_info->subject = g_strdup(subject); new_info->from = g_strdup(from); - new_info->to = g_strdup(nntp_folder->group_name); + new_info->to = g_strdup(folder->name); new_info->date_sent = header_decode_date(date, NULL); #if 0 /* XXX do we need to fill in both dates? */ @@ -98,7 +98,7 @@ get_OVER_headers(CamelNNTPStore *nntp_store, CamelFolder *folder, new_info->message_id = g_strdup(message_id); if (camel_nntp_newsrc_article_is_read (nntp_store->newsrc, - nntp_folder->group_name, + folder->name, atoi (split_line[0]))) new_info->flags |= CAMEL_MESSAGE_SEEN; @@ -222,7 +222,7 @@ camel_nntp_get_headers (CamelStore *store, int status; status = camel_nntp_command (nntp_store, ex, &ret, - "GROUP %s", CAMEL_NNTP_FOLDER (folder)->group_name); + "GROUP %s", folder->name); sscanf (ret, "%d %d %d", &nb_message, &first_message, &last_message); g_free (ret); @@ -232,7 +232,7 @@ camel_nntp_get_headers (CamelStore *store, camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_INVALID, "group %s not found on server", - CAMEL_NNTP_FOLDER (folder)->group_name); + folder->name); return; } diff --git a/camel/providers/pop3/camel-pop3-folder.c b/camel/providers/pop3/camel-pop3-folder.c index f7a86a741c..d367cac1ab 100644 --- a/camel/providers/pop3/camel-pop3-folder.c +++ b/camel/providers/pop3/camel-pop3-folder.c @@ -76,11 +76,15 @@ static void camel_pop3_folder_init (gpointer object) { CamelFolder *folder = CAMEL_FOLDER (object); + CamelPop3Folder *pop3_folder = CAMEL_POP3_FOLDER (object); folder->can_hold_messages = TRUE; folder->can_hold_folders = FALSE; folder->has_summary_capability = FALSE; folder->has_search_capability = FALSE; + + pop3_folder->uids = NULL; + pop3_folder->flags = NULL; } CamelType @@ -113,16 +117,18 @@ pop3_finalize (CamelObject *object) CamelFolder * camel_pop3_folder_new (CamelStore *parent, CamelException *ex) { - CamelPop3Folder *pop3_folder; + CamelFolder *folder; - pop3_folder = CAMEL_POP3_FOLDER(camel_object_new (CAMEL_POP3_FOLDER_TYPE)); - CF_CLASS (pop3_folder)->init ((CamelFolder *)pop3_folder, parent, - NULL, "inbox", "/", TRUE, ex); - pop3_folder->uids = NULL; - pop3_folder->flags = NULL; - CF_CLASS (pop3_folder)->refresh_info ((CamelFolder *)pop3_folder, ex); + folder = CAMEL_FOLDER (camel_object_new (CAMEL_POP3_FOLDER_TYPE)); + camel_folder_construct (folder, parent, "inbox", "inbox"); + + camel_folder_refresh_info (folder, ex); + if (camel_exception_is_set (ex)) { + camel_object_unref (CAMEL_OBJECT (folder)); + folder = NULL; + } - return (CamelFolder *)pop3_folder; + return folder; } static void diff --git a/camel/providers/vee/camel-vee-folder.c b/camel/providers/vee/camel-vee-folder.c index 26e6be2667..0be1f152d1 100644 --- a/camel/providers/vee/camel-vee-folder.c +++ b/camel/providers/vee/camel-vee-folder.c @@ -39,10 +39,6 @@ struct _CamelVeeFolderPrivate { #define _PRIVATE(o) (((CamelVeeFolder *)(o))->priv) -static void vee_init (CamelFolder *folder, CamelStore *parent_store, - CamelFolder *parent_folder, const gchar *name, - gchar *separator, gboolean path_begins_with_sep, - CamelException *ex); static void vee_sync (CamelFolder *folder, gboolean expunge, CamelException *ex); static GPtrArray *vee_get_uids (CamelFolder *folder); @@ -95,7 +91,6 @@ camel_vee_folder_class_init (CamelVeeFolderClass *klass) camel_vee_folder_parent = CAMEL_FOLDER_CLASS(camel_type_get_global_classfuncs (camel_folder_get_type ())); - folder_class->init = vee_init; folder_class->sync = vee_sync; folder_class->get_uids = vee_get_uids; @@ -120,8 +115,21 @@ static void camel_vee_folder_init (CamelVeeFolder *obj) { struct _CamelVeeFolderPrivate *p; + CamelFolder *folder = (CamelFolder *)obj; p = _PRIVATE(obj) = g_malloc0(sizeof(*p)); + + folder->can_hold_messages = TRUE; + folder->can_hold_folders = FALSE; + folder->has_summary_capability = TRUE; + folder->has_search_capability = TRUE; + + /* FIXME: what to do about user flags if the subfolder doesn't support them? */ + folder->permanent_flags = CAMEL_MESSAGE_ANSWERED | + CAMEL_MESSAGE_DELETED | + CAMEL_MESSAGE_DRAFT | + CAMEL_MESSAGE_FLAGGED | + CAMEL_MESSAGE_SEEN; } static void @@ -141,16 +149,49 @@ camel_vee_folder_finalise (CamelObject *obj) /** * camel_vee_folder_new: + * @parent_store: the parent CamelVeeStore + * @name: the vfolder name + * @ex: a CamelException * * Create a new CamelVeeFolder object. - * + * * Return value: A new CamelVeeFolder widget. **/ -CamelVeeFolder * -camel_vee_folder_new (void) +CamelFolder * +camel_vee_folder_new (CamelStore *parent_store, const char *name, + CamelException *ex) { - CamelVeeFolder *new = CAMEL_VEE_FOLDER ( camel_object_new (camel_vee_folder_get_type ())); - return new; + CamelFolder *folder; + CamelVeeFolder *vf; + char *namepart, *searchpart; + + folder = CAMEL_FOLDER (camel_object_new (camel_vee_folder_get_type())); + vf = (CamelVeeFolder *)folder; + + camel_folder_construct (folder, parent_store, name, name); + + namepart = g_strdup(name); + searchpart = strchr(namepart, '?'); + if (searchpart == NULL) { + /* no search, no result! */ + searchpart = "(body-contains \"=some-invalid_string-sequence=xx\")"; + } else { + *searchpart++ = 0; + } + + vf->messages = g_ptr_array_new(); + vf->messages_uid = g_hash_table_new(g_str_hash, g_str_equal); + + vf->expression = g_strdup(searchpart); + vf->vname = namepart; + + vee_folder_build(vf, ex); + if (camel_exception_is_set (ex)) { + camel_object_unref (CAMEL_OBJECT (folder)); + return NULL; + } + + return folder; } static void @@ -211,50 +252,6 @@ camel_vee_folder_add_folder(CamelVeeFolder *vf, CamelFolder *sub) } -static void vee_init (CamelFolder *folder, CamelStore *parent_store, - CamelFolder *parent_folder, const gchar *name, - gchar *separator, gboolean path_begins_with_sep, - CamelException *ex) -{ - CamelVeeFolder *vf = (CamelVeeFolder *)folder; - char *namepart, *searchpart; - - namepart = g_strdup(name); - searchpart = strchr(namepart, '?'); - if (searchpart == NULL) { - /* no search, no result! */ - searchpart = "(body-contains \"=some-invalid_string-sequence=xx\")"; - } else { - *searchpart++ = 0; - } - - camel_vee_folder_parent->init (folder, parent_store, parent_folder, name, separator, TRUE, ex); - if (camel_exception_get_id (ex)) - return; - - folder->can_hold_messages = TRUE; - folder->can_hold_folders = FALSE; - folder->has_summary_capability = TRUE; - folder->has_search_capability = TRUE; - - /* FIXME: what to do about user flags if the subfolder doesn't support them? */ - folder->permanent_flags = CAMEL_MESSAGE_ANSWERED | - CAMEL_MESSAGE_DELETED | - CAMEL_MESSAGE_DRAFT | - CAMEL_MESSAGE_FLAGGED | - CAMEL_MESSAGE_SEEN; - - vf->messages = g_ptr_array_new(); - vf->messages_uid = g_hash_table_new(g_str_hash, g_str_equal); - - vf->expression = g_strdup_printf("(or\n (match-all (user-flag \"%s\"))\n %s\n)", namepart, searchpart); - vf->vname = g_strdup(namepart); - - g_free(namepart); - - vee_folder_build(vf, ex); -} - static void vee_sync (CamelFolder *folder, gboolean expunge, CamelException *ex) { diff --git a/camel/providers/vee/camel-vee-folder.h b/camel/providers/vee/camel-vee-folder.h index 6f7c788125..2263854912 100644 --- a/camel/providers/vee/camel-vee-folder.h +++ b/camel/providers/vee/camel-vee-folder.h @@ -50,7 +50,9 @@ struct _CamelVeeFolderClass { }; guint camel_vee_folder_get_type (void); -CamelVeeFolder *camel_vee_folder_new (void); +CamelFolder *camel_vee_folder_new (CamelStore *parent_store, + const char *name, + CamelException *ex); void camel_vee_folder_add_folder(CamelVeeFolder *vf, CamelFolder *sub); diff --git a/camel/providers/vee/camel-vee-store.c b/camel/providers/vee/camel-vee-store.c index 8be8298b2c..201c4b1fd8 100644 --- a/camel/providers/vee/camel-vee-store.c +++ b/camel/providers/vee/camel-vee-store.c @@ -91,12 +91,7 @@ camel_vee_store_new (void) static CamelFolder * vee_get_folder (CamelStore *store, const char *folder_name, gboolean create, CamelException *ex) { - CamelFolder *folder; - - folder = CAMEL_FOLDER (camel_object_new (camel_vee_folder_get_type())); - - ((CamelFolderClass *)(CAMEL_OBJECT_GET_CLASS(folder)))->init (folder, store, NULL, folder_name, "/", TRUE, ex); - return folder; + return camel_vee_folder_new (store, folder_name, ex); } static char * -- cgit v1.2.3