[evolution-data-server] Change the maildir folder hierarchy as per maildir++ spec
- From: Chenthill Palanisamy <pchen src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Change the maildir folder hierarchy as per maildir++ spec
- Date: Mon, 25 Oct 2010 10:43:05 +0000 (UTC)
commit 704d09d7de882c660cfc36682e317389f2920c11
Author: Chenthill Palanisamy <pchenthill novell com>
Date: Fri Sep 24 14:50:06 2010 +0530
Change the maildir folder hierarchy as per maildir++ spec
camel/providers/local/camel-maildir-store.c | 570 +++++++++++++++++++++------
1 files changed, 442 insertions(+), 128 deletions(-)
---
diff --git a/camel/providers/local/camel-maildir-store.c b/camel/providers/local/camel-maildir-store.c
index 0acde10..d70ce5b 100644
--- a/camel/providers/local/camel-maildir-store.c
+++ b/camel/providers/local/camel-maildir-store.c
@@ -37,10 +37,51 @@
#include "camel-maildir-store.h"
#include "camel-maildir-summary.h"
-#define d(x)
+#define d(x) x
G_DEFINE_TYPE (CamelMaildirStore, camel_maildir_store, CAMEL_TYPE_LOCAL_STORE)
+#define HIER_SEP "."
+#define HIER_SEP_CHAR '.'
+
+static CamelFolder *maildir_get_folder (CamelStore * store, const gchar *folder_name, guint32 flags, GError **error);
+static CamelFolderInfo *maildir_create_folder (CamelStore *store, const gchar *parent_name, const gchar *folder_name,
+ GError **error);
+static CamelFolder *maildir_get_inbox (CamelStore *store, GError **error);
+static gboolean maildir_delete_folder (CamelStore * store, const gchar *folder_name, GError **error);
+static gboolean maildir_rename_folder (CamelStore *store, const gchar *old, const gchar *new, GError **error);
+
+static CamelFolderInfo * maildir_get_folder_info (CamelStore *store, const gchar *top, guint32 flags, GError **error);
+
+static gboolean maildir_compare_folder_name (gconstpointer a, gconstpointer b);
+static guint maildir_hash_folder_name (gconstpointer a);
+static char * maildir_full_name_to_dir_name (const gchar *full_name);
+static char * maildir_dir_name_to_fullname (const gchar *dir_name);
+
+G_DEFINE_TYPE (CamelMaildirStore, camel_maildir_store, CAMEL_TYPE_LOCAL_STORE)
+
+static void
+camel_maildir_store_class_init (CamelMaildirStoreClass *class)
+{
+ CamelStoreClass *store_class;
+
+ store_class = CAMEL_STORE_CLASS (class);
+ store_class->hash_folder_name = maildir_hash_folder_name;
+ store_class->compare_folder_name = maildir_compare_folder_name;
+ store_class->get_folder = maildir_get_folder;
+ store_class->create_folder = maildir_create_folder;
+ store_class->get_inbox = maildir_get_inbox;
+ store_class->delete_folder = maildir_delete_folder;
+ store_class->rename_folder = maildir_rename_folder;
+ store_class->get_folder_info = maildir_get_folder_info;
+ store_class->free_folder_info = camel_store_free_folder_info_full;
+}
+
+static void
+camel_maildir_store_init (CamelMaildirStore *maildir_store)
+{
+}
+
/* This fixes up some historical cruft of names starting with "./" */
static const gchar *
md_canon_name (const gchar *a)
@@ -55,6 +96,308 @@ md_canon_name (const gchar *a)
return a;
}
+static guint
+maildir_hash_folder_name (gconstpointer a)
+{
+ return g_str_hash (md_canon_name (a));
+}
+
+static gboolean
+maildir_compare_folder_name (gconstpointer a,
+ gconstpointer b)
+{
+ return g_str_equal (md_canon_name (a), md_canon_name (b));
+}
+
+static CamelFolderInfo *
+maildir_create_folder (CamelStore *store,
+ const gchar *parent_name,
+ const gchar *folder_name,
+ GError **error)
+{
+ gchar *path = ((CamelLocalStore *)store)->toplevel_dir;
+ gchar *name;
+ CamelFolder *folder;
+ CamelFolderInfo *info = NULL;
+ struct stat st;
+
+ /* This is a pretty hacky version of create folder, but should basically work */
+
+ if (!g_path_is_absolute (path)) {
+ g_set_error (
+ error, CAMEL_STORE_ERROR,
+ CAMEL_STORE_ERROR_NO_FOLDER,
+ _("Store root %s is not an absolute path"), path);
+ return NULL;
+ }
+
+ if (parent_name) {
+ gchar *dir_name = maildir_full_name_to_dir_name (parent_name);
+ name = g_strdup_printf("%s/%s.%s", path, dir_name, folder_name);
+ g_free (dir_name);
+ } else
+ name = g_strdup_printf("%s/.%s", path, folder_name);
+
+ if (g_stat (name, &st) == 0 || errno != ENOENT) {
+ g_set_error (
+ error, G_IO_ERROR,
+ g_io_error_from_errno (errno),
+ _("Cannot get folder: %s: %s"),
+ name, g_strerror (errno));
+ g_free (name);
+ return NULL;
+ }
+
+ g_free (name);
+
+ if (parent_name)
+ name = g_strdup_printf("%s/%s", parent_name, folder_name);
+ else
+ name = g_strdup_printf("%s", folder_name);
+
+ folder = maildir_get_folder (store, name, CAMEL_STORE_FOLDER_CREATE, error);
+ if (folder) {
+ g_object_unref (folder);
+ info = CAMEL_STORE_GET_CLASS (store)->get_folder_info (
+ store, name, 0, error);
+ }
+
+ g_free (name);
+
+ return info;
+}
+
+static CamelFolder *
+maildir_get_folder (CamelStore *store,
+ const gchar *folder_name,
+ guint32 flags,
+ GError **error)
+{
+ CamelStoreClass *store_class;
+ gchar *name, *tmp, *cur, *new, *dir_name;
+ struct stat st;
+ CamelFolder *folder = NULL;
+
+ folder_name = md_canon_name (folder_name);
+
+ /* Chain up to parent's get_folder() method. */
+ dir_name = maildir_full_name_to_dir_name (folder_name);
+
+ store_class = CAMEL_STORE_CLASS (camel_maildir_store_parent_class);
+ if (!store_class->get_folder (store, dir_name, flags, error))
+ return NULL;
+
+ /* maildir++ directory names start with a '.' */
+ name = g_strdup_printf("%s%s", CAMEL_LOCAL_STORE(store)->toplevel_dir, dir_name);
+ g_free (dir_name);
+
+ tmp = g_strdup_printf("%s/tmp", name);
+ cur = g_strdup_printf("%s/cur", name);
+ new = g_strdup_printf("%s/new", name);
+
+ if (!strcmp(folder_name, ".")) {
+ /* special case "." (aka inbox), may need to be created */
+ if (g_stat (tmp, &st) != 0 || !S_ISDIR (st.st_mode)
+ || g_stat (cur, &st) != 0 || !S_ISDIR (st.st_mode)
+ || g_stat (new, &st) != 0 || !S_ISDIR (st.st_mode)) {
+ if (mkdir (tmp, 0700) != 0
+ || mkdir (cur, 0700) != 0
+ || mkdir (new, 0700) != 0) {
+ g_set_error (
+ error, G_IO_ERROR,
+ g_io_error_from_errno (errno),
+ _("Cannot create folder '%s': %s"),
+ folder_name, g_strerror (errno));
+ rmdir (tmp);
+ rmdir (cur);
+ rmdir (new);
+ goto fail;
+ }
+ }
+ folder = camel_maildir_folder_new (store, folder_name, flags, error);
+ } else if (g_stat (name, &st) == -1) {
+ /* folder doesn't exist, see if we should create it */
+ if (errno != ENOENT) {
+ g_set_error (
+ error, G_IO_ERROR,
+ g_io_error_from_errno (errno),
+ _("Cannot get folder '%s': %s"),
+ folder_name, g_strerror (errno));
+ } else if ((flags & CAMEL_STORE_FOLDER_CREATE) == 0) {
+ g_set_error (
+ error, CAMEL_STORE_ERROR,
+ CAMEL_STORE_ERROR_NO_FOLDER,
+ _("Cannot get folder '%s': folder does not exist."),
+ folder_name);
+ } else {
+ if (mkdir (name, 0700) != 0
+ || mkdir (tmp, 0700) != 0
+ || mkdir (cur, 0700) != 0
+ || mkdir (new, 0700) != 0) {
+ g_set_error (
+ error, G_IO_ERROR,
+ g_io_error_from_errno (errno),
+ _("Cannot create folder '%s': %s"),
+ folder_name, g_strerror (errno));
+ rmdir (tmp);
+ rmdir (cur);
+ rmdir (new);
+ rmdir (name);
+ } else {
+ folder = camel_maildir_folder_new (store, folder_name, flags, error);
+ }
+ }
+ } else if (!S_ISDIR (st.st_mode)
+ || g_stat (tmp, &st) != 0 || !S_ISDIR (st.st_mode)
+ || g_stat (cur, &st) != 0 || !S_ISDIR (st.st_mode)
+ || g_stat (new, &st) != 0 || !S_ISDIR (st.st_mode)) {
+ /* folder exists, but not maildir */
+ g_set_error (
+ error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+ _("Cannot get folder '%s': not a maildir directory."),
+ name);
+ } else if (flags & CAMEL_STORE_FOLDER_EXCL) {
+ g_set_error (
+ error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
+ _("Cannot create folder '%s': folder exists."),
+ folder_name);
+ } else {
+ folder = camel_maildir_folder_new (store, folder_name, flags, error);
+ }
+fail:
+ g_free (name);
+ g_free (tmp);
+ g_free (cur);
+ g_free (new);
+
+ return folder;
+}
+
+static CamelFolder *
+maildir_get_inbox (CamelStore *store,
+ GError **error)
+{
+ return camel_store_get_folder (
+ store, ".", CAMEL_STORE_FOLDER_CREATE, error);
+}
+
+static gboolean
+maildir_delete_folder (CamelStore *store,
+ const gchar *folder_name,
+ GError **error)
+{
+ gchar *name, *tmp, *cur, *new, *dir_name;
+ struct stat st;
+ gboolean success = TRUE;
+
+ if (strcmp(folder_name, ".") == 0) {
+ g_set_error (
+ error, CAMEL_STORE_ERROR,
+ CAMEL_STORE_ERROR_NO_FOLDER,
+ _("Cannot delete folder: %s: Invalid operation"),
+ _("Inbox"));
+ return FALSE;
+ }
+
+ /* maildir++ directory names start with a '.' */
+ dir_name = maildir_full_name_to_dir_name (folder_name);
+ name = g_strdup_printf("%s%s", CAMEL_LOCAL_STORE(store)->toplevel_dir, dir_name);
+ g_free (dir_name);
+
+ tmp = g_strdup_printf("%s/tmp", name);
+ cur = g_strdup_printf("%s/cur", name);
+ new = g_strdup_printf("%s/new", name);
+
+ if (g_stat (name, &st) == -1 || !S_ISDIR (st.st_mode)
+ || g_stat (tmp, &st) == -1 || !S_ISDIR (st.st_mode)
+ || g_stat (cur, &st) == -1 || !S_ISDIR (st.st_mode)
+ || g_stat (new, &st) == -1 || !S_ISDIR (st.st_mode)) {
+ g_set_error (
+ error, G_IO_ERROR,
+ g_io_error_from_errno (errno),
+ _("Could not delete folder '%s': %s"),
+ folder_name, errno ? g_strerror (errno) :
+ _("not a maildir directory"));
+ } else {
+ gint err = 0;
+
+ /* remove subdirs first - will fail if not empty */
+ if (rmdir (cur) == -1 || rmdir (new) == -1) {
+ err = errno;
+ } else {
+ DIR *dir;
+ struct dirent *d;
+
+ /* for tmp (only), its contents is irrelevant */
+ dir = opendir (tmp);
+ if (dir) {
+ while ((d=readdir (dir))) {
+ gchar *name = d->d_name, *file;
+
+ if (!strcmp(name, ".") || !strcmp(name, ".."))
+ continue;
+ file = g_strdup_printf("%s/%s", tmp, name);
+ unlink (file);
+ g_free (file);
+ }
+ closedir (dir);
+ }
+ if (rmdir (tmp) == -1 || rmdir (name) == -1)
+ err = errno;
+ }
+
+ if (err != 0) {
+ /* easier just to mkdir all (and let them fail), than remember what we got to */
+ mkdir (name, 0700);
+ mkdir (cur, 0700);
+ mkdir (new, 0700);
+ mkdir (tmp, 0700);
+ g_set_error (
+ error, G_IO_ERROR,
+ g_io_error_from_errno (err),
+ _("Could not delete folder '%s': %s"),
+ folder_name, g_strerror (err));
+ } else {
+ CamelStoreClass *store_class;
+
+ /* Chain up to parent's delete_folder() method. */
+ store_class = CAMEL_STORE_CLASS (camel_maildir_store_parent_class);
+ success = store_class->delete_folder (
+ store, folder_name, error);
+ }
+ }
+
+ g_free (name);
+ g_free (tmp);
+ g_free (cur);
+ g_free (new);
+
+ return success;
+}
+
+static gboolean
+maildir_rename_folder (CamelStore *store,
+ const gchar *old,
+ const gchar *new,
+ GError **error)
+{
+ CamelStoreClass *store_class;
+
+ if (strcmp(old, ".") == 0) {
+ g_set_error (
+ error, CAMEL_STORE_ERROR,
+ CAMEL_STORE_ERROR_NO_FOLDER,
+ _("Cannot rename folder: %s: Invalid operation"),
+ _("Inbox"));
+ return FALSE;
+ }
+
+ /* Chain up to parent's rename_folder() method. */
+ store_class = CAMEL_STORE_CLASS (camel_maildir_store_parent_class);
+ return store_class->rename_folder (store, old, new, error);
+}
+
+>>>>>>> Change the maildir folder hierarchy as per maildir++ spec
static void
fill_fi (CamelStore *store,
CamelFolderInfo *fi,
@@ -77,14 +420,17 @@ fill_fi (CamelStore *store,
fi->total = camel_folder_get_message_count (folder);
g_object_unref (folder);
} else {
- gchar *path, *folderpath;
+ gchar *path, *folderpath, *dir_name;
CamelFolderSummary *s;
const gchar *root;
/* This should be fast enough not to have to test for INFO_FAST */
root = camel_local_store_get_toplevel_dir ((CamelLocalStore *)store);
- path = g_strdup_printf("%s/%s.ev-summary", root, fi->full_name);
- folderpath = g_strdup_printf("%s/%s", root, fi->full_name);
+
+ dir_name = maildir_full_name_to_dir_name (fi->full_name);
+
+ path = g_strdup_printf("%s/.%s.ev-summary", root, dir_name);
+ folderpath = g_strdup_printf("%s%s", root, dir_name);
s = (CamelFolderSummary *)camel_maildir_summary_new (NULL, path, folderpath, NULL);
if (camel_folder_summary_header_load_from_db (s, store, fi->full_name, NULL) != -1) {
fi->unread = s->unread_count;
@@ -93,6 +439,7 @@ fill_fi (CamelStore *store,
g_object_unref (s);
g_free (folderpath);
g_free (path);
+ g_free (dir_name);
}
if (camel_local_store_is_main_store (CAMEL_LOCAL_STORE (store)) && fi->full_name
@@ -101,38 +448,6 @@ fill_fi (CamelStore *store,
| camel_local_store_get_folder_type_by_full_name (CAMEL_LOCAL_STORE (store), fi->full_name);
}
-struct _scan_node {
- struct _scan_node *next;
- struct _scan_node *prev;
-
- CamelFolderInfo *fi;
-
- dev_t dnode;
- ino_t inode;
-};
-
-static guint
-scan_hash (gconstpointer d)
-{
- const struct _scan_node *v = d;
-
- return v->inode ^ v->dnode;
-}
-
-static gboolean
-scan_equal (gconstpointer a, gconstpointer b)
-{
- const struct _scan_node *v1 = a, *v2 = b;
-
- return v1->inode == v2->inode && v1->dnode == v2->dnode;
-}
-
-static void
-scan_free (gpointer k, gpointer v, gpointer d)
-{
- g_free (k);
-}
-
static CamelFolderInfo *
scan_fi (CamelStore *store,
guint32 flags,
@@ -142,7 +457,7 @@ scan_fi (CamelStore *store,
GCancellable *cancellable)
{
CamelFolderInfo *fi;
- gchar *tmp, *cur, *new;
+ gchar *tmp, *cur, *new, *dir_name;
struct stat st;
fi = camel_folder_info_new ();
@@ -158,11 +473,12 @@ scan_fi (CamelStore *store,
if (((flags & CAMEL_STORE_FOLDER_INFO_RECURSIVE) != 0))
fi->flags = CAMEL_FOLDER_NOCHILDREN;
- d(printf("Adding maildir info: '%s' '%s' '%s'\n", fi->name, fi->full_name, fi->uri));
+ dir_name = maildir_full_name_to_dir_name (fi->full_name);
+ d(printf("Adding maildir info: '%s' '%s' '%s'\n", fi->name, dir_name, fi->uri));
- tmp = g_build_filename(url->path, fi->full_name, "tmp", NULL);
- cur = g_build_filename(url->path, fi->full_name, "cur", NULL);
- new = g_build_filename(url->path, fi->full_name, "new", NULL);
+ tmp = g_build_filename(url->path, dir_name, "tmp", NULL);
+ cur = g_build_filename(url->path, dir_name, "cur", NULL);
+ new = g_build_filename(url->path, dir_name, "new", NULL);
if (!(g_stat (tmp, &st) == 0 && S_ISDIR (st.st_mode)
&& g_stat (cur, &st) == 0 && S_ISDIR (st.st_mode)
@@ -178,6 +494,32 @@ scan_fi (CamelStore *store,
return fi;
}
+/* Folder names begin with a dot */
+static char *
+maildir_full_name_to_dir_name (const gchar *full_name)
+{
+ gchar *path;
+
+ if (strcmp (full_name, ".")) {
+ path = g_strconcat (".", full_name, NULL);
+ g_strdelimit (path + 1, "/", HIER_SEP_CHAR);
+ } else
+ path = g_strdup (".");
+
+ return path;
+}
+
+static char *
+maildir_dir_name_to_fullname (const gchar *dir_name)
+{
+ gchar *full_name;
+
+ full_name = g_strdup (dir_name + 1);
+ g_strdelimit (full_name, HIER_SEP, '/');
+
+ return full_name;
+}
+
static gint
scan_dirs (CamelStore *store,
guint32 flags,
@@ -186,101 +528,81 @@ scan_dirs (CamelStore *store,
GCancellable *cancellable,
GError **error)
{
- CamelDList queue = CAMEL_DLIST_INITIALISER (queue);
- struct _scan_node *sn;
const gchar *root = ((CamelService *)store)->url->path;
- gchar *tmp;
- GHashTable *visited;
- struct stat st;
+ GPtrArray *folders;
gint res = -1;
+ DIR *dir;
+ struct dirent *d;
- visited = g_hash_table_new (scan_hash, scan_equal);
+ folders = g_ptr_array_new ();
+ g_ptr_array_add (folders, topfi);
- sn = g_malloc0 (sizeof (*sn));
- sn->fi = topfi;
- camel_dlist_addtail (&queue, (CamelDListNode *)sn);
- g_hash_table_insert (visited, sn, sn);
-
- while (!camel_dlist_empty (&queue)) {
- gchar *name;
- DIR *dir;
- struct dirent *d;
- CamelFolderInfo *last;
-
- sn = (struct _scan_node *)camel_dlist_remhead (&queue);
-
- last = (CamelFolderInfo *)&sn->fi->child;
-
- if (!strcmp(sn->fi->full_name, "."))
- name = g_strdup (root);
- else
- name = g_build_filename (root, sn->fi->full_name, NULL);
-
- dir = opendir (name);
- if (dir == NULL) {
- g_free (name);
- g_set_error (
+ dir = opendir (root);
+ if (dir == NULL) {
+ g_set_error (
error, G_IO_ERROR,
g_io_error_from_errno (errno),
_("Could not scan folder '%s': %s"),
root, g_strerror (errno));
- goto fail;
- }
+ goto fail;
+ }
- while ((d = readdir (dir))) {
- if (strcmp(d->d_name, "tmp") == 0
- || strcmp(d->d_name, "cur") == 0
- || strcmp(d->d_name, "new") == 0
- || strcmp(d->d_name, ".#evolution") == 0
- || strcmp(d->d_name, ".") == 0
- || strcmp(d->d_name, "..") == 0)
+ while ((d = readdir (dir))) {
+ gchar *full_name, *filename;
+ const gchar *short_name;
+ CamelFolderInfo *fi;
+ struct stat st;
+
+
+ if (strcmp(d->d_name, "tmp") == 0
+ || strcmp(d->d_name, "cur") == 0
+ || strcmp(d->d_name, "new") == 0
+ || strcmp(d->d_name, ".#evolution") == 0
+ || strcmp(d->d_name, ".") == 0
+ || strcmp(d->d_name, "..") == 0)
+
continue;
- tmp = g_build_filename (name, d->d_name, NULL);
- if (g_stat (tmp, &st) == 0 && S_ISDIR (st.st_mode)) {
- struct _scan_node in;
-
- in.dnode = st.st_dev;
- in.inode = st.st_ino;
-
- /* see if we've visited already */
- if (g_hash_table_lookup (visited, &in) == NULL) {
- struct _scan_node *snew = g_malloc (sizeof (*snew));
- gchar *full;
-
- snew->dnode = in.dnode;
- snew->inode = in.inode;
-
- if (!strcmp(sn->fi->full_name, "."))
- full = g_strdup (d->d_name);
- else
- full = g_strdup_printf("%s/%s", sn->fi->full_name, d->d_name);
- snew->fi = scan_fi (store, flags, url, full, d->d_name, cancellable);
- g_free (full);
-
- last->next = snew->fi;
- last = snew->fi;
- snew->fi->parent = sn->fi;
-
- sn->fi->flags &= ~CAMEL_FOLDER_NOCHILDREN;
- sn->fi->flags |= CAMEL_FOLDER_CHILDREN;
+ filename = g_build_filename (root, d->d_name, NULL);
+ if (!(g_stat (filename, &st) == 0 && S_ISDIR (st.st_mode))) {
+ g_free (filename);
+ continue;
+ }
+ g_free (filename);
+ full_name = maildir_dir_name_to_fullname (d->d_name);
+ short_name = strrchr (full_name, '/');
+ if (!short_name)
+ short_name = full_name;
+ else
+ short_name++;
+
+ if (strcmp (topfi->full_name, ".") != 0 &&
+ !g_str_has_prefix (topfi->full_name, full_name)) {
+
+ g_free (full_name);
+ continue;
+ }
- g_hash_table_insert (visited, snew, snew);
+ fi = scan_fi (store, flags, url, full_name, short_name);
+ g_free (full_name);
- if (((flags & CAMEL_STORE_FOLDER_INFO_RECURSIVE) != 0))
- camel_dlist_addtail (&queue, (CamelDListNode *)snew);
- }
- }
- g_free (tmp);
- }
- closedir (dir);
- g_free (name);
+ fi->flags &= ~CAMEL_FOLDER_NOCHILDREN;
+ fi->flags |= CAMEL_FOLDER_CHILDREN;
+
+ g_ptr_array_add (folders, fi);
}
+ closedir (dir);
+
+ if (!strcmp (topfi->full_name, "."))
+ camel_folder_info_build (folders, "", '/', TRUE);
+ else
+ camel_folder_info_build (folders, topfi->full_name, '/', TRUE);
+
res = 0;
+
fail:
- g_hash_table_foreach (visited, scan_free, NULL);
- g_hash_table_destroy (visited);
+ g_ptr_array_free (folders, TRUE);
return res;
}
@@ -416,19 +738,11 @@ maildir_store_get_folder_info_sync (CamelStore *store,
camel_url_set_path (url, ((CamelService *)local_store)->url->path);
if (top == NULL || top[0] == 0) {
- CamelFolderInfo *scan;
-
/* create a dummy "." parent inbox, use to scan, then put back at the top level */
fi = scan_fi(store, flags, url, ".", _("Inbox"), cancellable);
if (scan_dirs (store, flags, fi, url, cancellable, error) == -1)
goto fail;
- fi->next = fi->child;
- scan = fi->child;
- fi->child = NULL;
- while (scan) {
- scan->parent = NULL;
- scan = scan->next;
- }
+
fi->flags &= ~CAMEL_FOLDER_CHILDREN;
fi->flags |= CAMEL_FOLDER_SYSTEM|CAMEL_FOLDER_NOCHILDREN|CAMEL_FOLDER_NOINFERIORS|CAMEL_FOLDER_TYPE_INBOX;
} else if (!strcmp(top, ".")) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]