diff options
Diffstat (limited to 'camel')
-rw-r--r-- | camel/camel-folder.h | 7 | ||||
-rw-r--r-- | camel/providers/MH/camel-mh-folder.c | 50 |
2 files changed, 54 insertions, 3 deletions
diff --git a/camel/camel-folder.h b/camel/camel-folder.h index 40d7d8f303..53ff89e70d 100644 --- a/camel/camel-folder.h +++ b/camel/camel-folder.h @@ -48,9 +48,10 @@ typedef enum { } CamelFolderState; typedef enum { - FOLDER_OPEN_UNKNOWN, /* folder open mode is unknown */ - FOLDER_OPEN_READ, /* folder is read only */ - FOLDER_OPEN_READ_WRITE /* folder is read/write */ + FOLDER_OPEN_UNKNOWN = 0, /* folder open mode is unknown */ + FOLDER_OPEN_READ = 1, /* folder is read only */ + FOLDER_OPEN_WRITE = 2, /* folder is write only */ + FOLDER_OPEN_RW = 3 /* folder is read/write */ } CamelFolderOpenMode; diff --git a/camel/providers/MH/camel-mh-folder.c b/camel/providers/MH/camel-mh-folder.c index 8027be95b6..ad910f4005 100644 --- a/camel/providers/MH/camel-mh-folder.c +++ b/camel/providers/MH/camel-mh-folder.c @@ -47,6 +47,7 @@ static gboolean _exists (CamelFolder *folder); static gboolean _create(CamelFolder *folder); static gboolean _delete (CamelFolder *folder, gboolean recurse); static gboolean _delete_messages (CamelFolder *folder); +static GList *_list_subfolders (CamelFolder *folder); static void camel_mh_folder_class_init (CamelMhFolderClass *camel_mh_folder_class) @@ -62,6 +63,7 @@ camel_mh_folder_class_init (CamelMhFolderClass *camel_mh_folder_class) camel_folder_class->exists = _exists; camel_folder_class->delete = _delete; camel_folder_class->delete_messages = _delete_messages; + camel_folder_class->list_subfolders = _list_subfolders; } @@ -279,6 +281,54 @@ _delete_messages (CamelFolder *folder) +static GList * +_list_subfolders(CamelFolder *folder) +{ + GList *subfolder_name_list = NULL; + + CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); + const gchar *directory_path; + struct stat stat_buf; + gint stat_error = 0; + GList *file_list; + gchar *entry_name; + struct dirent *dir_entry; + DIR *dir_handle; + + g_assert(folder); + + /* call default implementation */ + parent_class->delete_messages (folder); + + directory_path = mh_folder->directory_path; + if (!directory_path) return FALSE; + + if (!camel_folder_exists (folder)) return TRUE; + + dir_handle = opendir (directory_path); + + /* read first entry in the directory */ + dir_entry = readdir (dir_handle); + while ((stat_error != -1) && (unlink_error != -1) && (dir_entry != NULL)) { + + /* get the name of the next entry in the dir */ + entry_name = dir_entry->d_name; + stat_error = stat (mh_folder->directory_path, &stat_buf); + + /* is it a directory ? */ + if ((stat_error != -1) && S_ISDIR (stat_buf.st_mode)) { + /* yes, add it to the list */ + CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::list_subfolders adding %s\n", entry_name); + subfolder_name_list = g_list_append (subfolder_name_list, g_strdup (entry_name)); + } + /* read next entry */ + dir_entry = readdir (dir_handle); + } + + closedir (dir_handle); + + return subfolder_name_list; +} |