diff options
Diffstat (limited to 'camel')
21 files changed, 502 insertions, 646 deletions
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 <danw@helixcode.com> + + * 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 <clahey@helixcode.com> * camel-folder-search.c, camel-folder-search.h, @@ -7,7 +36,7 @@ 2000-09-17 Dan Winship <danw@helixcode.com> - * 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; @@ -128,6 +124,26 @@ camel_mbox_folder_class_init(CamelMboxFolderClass * camel_mbox_folder_class) } 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) { CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(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 <fcntl.h> #include <unistd.h> #include "camel-nntp-newsrc.h" +#include <camel/camel-folder-summary.h> 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 * |