diff options
Diffstat (limited to 'camel')
-rw-r--r-- | camel/camel-folder.c | 58 | ||||
-rw-r--r-- | camel/camel-folder.h | 1 | ||||
-rw-r--r-- | camel/providers/MH/camel-mh-folder.c | 102 |
3 files changed, 129 insertions, 32 deletions
diff --git a/camel/camel-folder.c b/camel/camel-folder.c index db3e7f9f8a..2f103283d4 100644 --- a/camel/camel-folder.c +++ b/camel/camel-folder.c @@ -315,7 +315,7 @@ _can_hold_messages (CamelFolder *folder) /** - * _exists: tests if the folder object exists in its parent store. + * _exists: tests if the folder object exists in its parent store. * @folder: folder object * * Test if a folder exists on a store. A folder can be @@ -327,7 +327,7 @@ _can_hold_messages (CamelFolder *folder) static gboolean _exists (CamelFolder *folder) { - return folder->exists_on_store; + return FALSE; } @@ -350,30 +350,32 @@ _is_open (CamelFolder *folder) -/** - * _get_folder: return the (sub)folder object that is specified. - * - * @folder : the folder - * @folder_name: subfolder path. - * - * This method returns a folder objects. This folder - * is necessarily a subfolder of the current folder. - * It is an error to ask a folder begining with the - * folder separator character. - * - * - * Return value: Required folder. NULL if the subfolder object - * could not be obtained - **/ + static CamelFolder * _get_folder (CamelFolder *folder, const gchar *folder_name) { - g_warning("getFolder called on the abstract CamelFolder class\n"); - return NULL; + CamelFolder *new_folder; + gchar *full_name; + const gchar *current_folder_full_name; + gchar separator; + + g_assert (folder); + g_assert (folder_name); + + if (!folder->parent_store) return NULL; + + current_folder_full_name = camel_folder_get_full_name (folder); + if (!current_folder_full_name) return NULL; + + separator = camel_store_get_separator (folder->parent_store); + full_name = g_strdup_printf ("%s%d%s", current_folder_full_name, separator, folder_name); + + new_folder = camel_store_get_folder (folder->parent_store, full_name); + return new_folder; } /** - * _get_folder: return the (sub)folder object that is specified. + * camel_folder_get_folder: return the (sub)folder object that is specified. * * @folder : the folder * @folder_name: subfolder path. @@ -396,16 +398,18 @@ camel_folder_get_folder(CamelFolder *folder, gchar *folder_name) /** - * _create: - * @folder: + * _create: creates a folder on its store + * @folder: a CamelFolder object. * * this routine handles the recursion mechanism. * Children classes have to implement the actual * creation mechanism. They must call this method * before physically creating the folder in order * to be sure the parent folder exists. + * Calling this routine on an existing folder is + * not an error, and returns %TRUE. * - * Return value: + * Return value: %TRUE if the folder exists, %FALSE otherwise **/ static gboolean _create(CamelFolder *folder) @@ -415,9 +419,9 @@ _create(CamelFolder *folder) CamelFolder *parent; gchar sep; - - g_assert(folder->parent_store); - g_assert(folder->name); + g_assert (folder); + g_assert (folder->parent_store); + g_assert (folder->name); if (CF_CLASS(folder)->exists (folder)) return TRUE; @@ -511,7 +515,7 @@ _delete (CamelFolder *folder, gboolean recurse) if (subfolders) { sf = subfolders; do { - CF_CLASS(sf->data)->delete(sf->data, TRUE);; + /* CF_CLASS(sf->data)->delete(sf->data, TRUE); */ } while (sf = sf->next); } } else if (subfolders) return FALSE; diff --git a/camel/camel-folder.h b/camel/camel-folder.h index 69a082fe1f..40d7d8f303 100644 --- a/camel/camel-folder.h +++ b/camel/camel-folder.h @@ -61,7 +61,6 @@ struct _CamelFolder gboolean can_hold_folders; gboolean can_hold_messages; - gboolean exists_on_store; CamelFolderOpenMode open_mode; CamelFolderState open_state; gchar *name; diff --git a/camel/providers/MH/camel-mh-folder.c b/camel/providers/MH/camel-mh-folder.c index 2db3a74e8e..206636578b 100644 --- a/camel/providers/MH/camel-mh-folder.c +++ b/camel/providers/MH/camel-mh-folder.c @@ -24,6 +24,11 @@ #include "camel-mh-folder.h" #include "camel-mh-store.h" #include "gstring-util.h" +#include <sys/stat.h> +#include <unistd.h> +#include <sys/types.h> +#include <fcntl.h> + static CamelFolderClass *parent_class=NULL; @@ -34,16 +39,23 @@ static CamelFolderClass *parent_class=NULL; #define CMHS_CLASS(so) CAMEL_STORE_CLASS (GTK_OBJECT(so)->klass) static void _set_name(CamelFolder *folder, const gchar *name); - +static void _init_with_store (CamelFolder *folder, CamelStore *parent_store); +static gboolean _exists (CamelFolder *folder); +static gboolean _create(CamelFolder *folder); static void camel_mh_folder_class_init (CamelMhFolderClass *camel_mh_folder_class) { + CamelFolderClass *camel_folder_class = CAMEL_FOLDER_CLASS(camel_mh_folder_class); + parent_class = gtk_type_class (camel_folder_get_type ()); - + /* virtual method definition */ /* virtual method overload */ - CAMEL_FOLDER_CLASS(camel_mh_folder_class)->set_name = _set_name; + camel_folder_class->init_with_store = _init_with_store; + camel_folder_class->set_name = _set_name; + camel_folder_class->exists = _exists; + } @@ -77,6 +89,20 @@ camel_mh_folder_get_type (void) } + + +static void +_init_with_store (CamelFolder *folder, CamelStore *parent_store) +{ + /* call parent method */ + parent_class->init_with_store (folder, parent_store); + + folder->can_hold_messages = TRUE; + folder->can_hold_folders = TRUE; +} + + + /** * camel_mh_folder_set_name: set the name of an MH folder * @folder: the folder to set the name @@ -88,10 +114,10 @@ camel_mh_folder_get_type (void) static void _set_name (CamelFolder *folder, const gchar *name) { + CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); const gchar *root_dir_path; gchar *full_name; const gchar *parent_full_name; - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); gchar separator; g_assert(folder); @@ -110,3 +136,71 @@ _set_name (CamelFolder *folder, const gchar *name) } + + +static gboolean +_exists (CamelFolder *folder) +{ + CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); + struct stat stat_buf; + gint stat_error; + gboolean exists; + + g_assert (folder); + + if (!mh_folder->directory_path) return FALSE; + + stat_error = stat (mh_folder->directory_path, &stat_buf); + if (stat_error == -1) return FALSE; + + exists = S_ISDIR(stat_buf.st_mode); + return exists; +} + + +static gboolean +_create(CamelFolder *folder) +{ + CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); + const gchar *directory_path; + mode_t dir_mode = S_IRWXU; + gint mkdir_error; + + g_assert(folder); + + /* call default implementation */ + parent_class->create (folder); + + directory_path = mh_folder->directory_path; + if (!directory_path) return FALSE; + + if (camel_folder_exists (folder)) return TRUE; + + mkdir_error = mkdir (directory_path, dir_mode); + return (mkdir_error == -1); +} + + + +static gboolean +_delete (CamelFolder *folder, gboolean recurse) +{ + + CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); + const gchar *directory_path; + gint rmdir_error; + + g_assert(folder); + + /* call default implementation */ + parent_class->delete (folder, recurse); + + directory_path = mh_folder->directory_path; + if (!directory_path) return FALSE; + + if (!camel_folder_exists (folder)) return TRUE; + + + rmdir_error = rmdir (directory_path); + +} |