# HG changeset patch # User Timo Sirainen # Date 1187280454 -10800 # Node ID aa00e299dfe66580b304dee3b956d08359d20b25 # Parent 9e33d9b9905ae34eb7291044b51c99414027f3af Added support for binc IMAP style IMAPdir. It doesn't support escaping, but should be good enough. diff -r 9e33d9b9905a -r aa00e299dfe6 src/lib-storage/list/mailbox-list-maildir-iter.c --- a/src/lib-storage/list/mailbox-list-maildir-iter.c Thu Aug 16 19:06:27 2007 +0300 +++ b/src/lib-storage/list/mailbox-list-maildir-iter.c Thu Aug 16 19:07:34 2007 +0300 @@ -81,13 +81,13 @@ { DIR *dirp; struct dirent *d; - const char *mailbox_c; + const char *mailbox_name, *mailbox_c; string_t *mailbox; enum mailbox_info_flags flags; enum imap_match_result match; struct mailbox_node *node; bool created; - char hierarchy_sep; + char prefix_char; int ret; dirp = opendir(ctx->dir); @@ -100,15 +100,22 @@ return 0; } - hierarchy_sep = ctx->ctx.list->hierarchy_sep; + prefix_char = + strcmp(ctx->ctx.list->name, MAILBOX_LIST_NAME_IMAPDIR) != 0 ? + ctx->ctx.list->hierarchy_sep : '\0'; t_push(); mailbox = t_str_new(PATH_MAX); while ((d = readdir(dirp)) != NULL) { const char *fname = d->d_name; - if (fname[0] != hierarchy_sep) - continue; + if (fname[0] == prefix_char) + mailbox_name = fname + 1; + else { + if (prefix_char != '\0' || fname[0] == '.') + continue; + mailbox_name = fname; + } /* skip . and .. */ if (fname[0] == '.' && @@ -118,9 +125,9 @@ /* make sure the pattern matches */ str_truncate(mailbox, 0); if ((ctx->ctx.list->ns->flags & NAMESPACE_FLAG_INBOX) == 0 || - strcasecmp(fname + 1, "INBOX") != 0) + strcasecmp(mailbox_name, "INBOX") != 0) str_append(mailbox, ctx->ctx.list->ns->prefix); - str_append(mailbox, fname + 1); + str_append(mailbox, mailbox_name); mailbox_c = str_c(mailbox); match = imap_match(glob, mailbox_c); diff -r 9e33d9b9905a -r aa00e299dfe6 src/lib-storage/list/mailbox-list-maildir.c --- a/src/lib-storage/list/mailbox-list-maildir.c Thu Aug 16 19:06:27 2007 +0300 +++ b/src/lib-storage/list/mailbox-list-maildir.c Thu Aug 16 19:07:34 2007 +0300 @@ -11,6 +11,7 @@ #include extern struct mailbox_list maildir_mailbox_list; +extern struct mailbox_list imapdir_mailbox_list; static struct mailbox_list *maildir_list_alloc(void) { @@ -18,7 +19,6 @@ pool_t pool; pool = pool_alloconly_create("maildir++ list", 1024); - list = p_new(pool, struct maildir_mailbox_list, 1); list->list = maildir_mailbox_list; list->list.pool = pool; @@ -28,6 +28,21 @@ return &list->list; } +static struct mailbox_list *imapdir_list_alloc(void) +{ + struct maildir_mailbox_list *list; + pool_t pool; + + pool = pool_alloconly_create("imapdir list", 1024); + list = p_new(pool, struct maildir_mailbox_list, 1); + list->list = imapdir_mailbox_list; + list->list.pool = pool; + + list->temp_prefix = p_strconcat(pool, ".temp.", my_hostname, ".", + my_pid, ".", NULL); + return &list->list; +} + static void maildir_list_deinit(struct mailbox_list *_list) { struct maildir_mailbox_list *list = @@ -37,6 +52,16 @@ } static const char * +maildir_list_get_dirname_path(struct mailbox_list *list, const char *dir, + const char *name) +{ + if (strcmp(list->name, MAILBOX_LIST_NAME_IMAPDIR) == 0) + return t_strdup_printf("%s/%s", dir, name); + + return t_strdup_printf("%s/%c%s", dir, list->hierarchy_sep, name); +} + +static const char * maildir_list_get_absolute_path(struct mailbox_list *list, const char *name) { const char *p; @@ -49,8 +74,8 @@ p = strrchr(name, '/'); if (p == NULL) return name; - return t_strdup_printf("%s/%c%s", t_strdup_until(name, p), - list->hierarchy_sep, p+1); + return maildir_list_get_dirname_path(list, t_strdup_until(name, p), + p+1); } static bool @@ -170,17 +195,16 @@ break; case MAILBOX_LIST_PATH_TYPE_CONTROL: if (_list->set.control_dir != NULL) { - return t_strdup_printf("%s/%c%s", - _list->set.control_dir, - _list->hierarchy_sep, name); + return maildir_list_get_dirname_path(_list, + _list->set.control_dir, name); } break; case MAILBOX_LIST_PATH_TYPE_INDEX: if (_list->set.index_dir != NULL) { if (*_list->set.index_dir == '\0') return ""; - return t_strdup_printf("%s/%c%s", _list->set.index_dir, - _list->hierarchy_sep, name); + return maildir_list_get_dirname_path(_list, + _list->set.index_dir, name); } break; } @@ -190,8 +214,7 @@ _list->set.inbox_path : _list->set.root_dir; } - return t_strdup_printf("%s/%c%s", _list->set.root_dir, - _list->hierarchy_sep, name); + return maildir_list_get_dirname_path(_list, _list->set.root_dir, name); } static int @@ -403,7 +426,7 @@ } struct mailbox_list maildir_mailbox_list = { - MEMBER(name) "maildir++", + MEMBER(name) MAILBOX_LIST_NAME_MAILDIRPLUSPLUS, MEMBER(hierarchy_sep) '.', MEMBER(mailbox_name_max_length) PATH_MAX, @@ -426,3 +449,28 @@ maildir_list_rename_mailbox } }; + +struct mailbox_list imapdir_mailbox_list = { + MEMBER(name) MAILBOX_LIST_NAME_IMAPDIR, + MEMBER(hierarchy_sep) '.', + MEMBER(mailbox_name_max_length) PATH_MAX, + + { + imapdir_list_alloc, + maildir_list_deinit, + maildir_is_valid_pattern, + maildir_is_valid_existing_name, + maildir_is_valid_create_name, + maildir_list_get_path, + maildir_list_get_mailbox_name_status, + maildir_list_get_temp_prefix, + NULL, + maildir_list_iter_init, + maildir_list_iter_next, + maildir_list_iter_deinit, + NULL, + maildir_list_set_subscribed, + maildir_list_delete_mailbox, + maildir_list_rename_mailbox + } +}; diff -r 9e33d9b9905a -r aa00e299dfe6 src/lib-storage/list/mailbox-list-maildir.h --- a/src/lib-storage/list/mailbox-list-maildir.h Thu Aug 16 19:06:27 2007 +0300 +++ b/src/lib-storage/list/mailbox-list-maildir.h Thu Aug 16 19:07:34 2007 +0300 @@ -3,6 +3,9 @@ #include "mailbox-list-private.h" +#define MAILBOX_LIST_NAME_MAILDIRPLUSPLUS "maildir++" +#define MAILBOX_LIST_NAME_IMAPDIR "imapdir" + /* Don't allow creating too long mailbox names. They could start causing problems when they reach the limit. */ #define MAILDIR_MAX_CREATE_MAILBOX_NAME_LENGTH (PATH_MAX/2) diff -r 9e33d9b9905a -r aa00e299dfe6 src/lib-storage/register/Makefile.am --- a/src/lib-storage/register/Makefile.am Thu Aug 16 19:06:27 2007 +0300 +++ b/src/lib-storage/register/Makefile.am Thu Aug 16 19:07:34 2007 +0300 @@ -3,7 +3,7 @@ BUILT_SOURCES = mail-storage-register.c mail_storages = @mail_storages@ -mailbox_list_drivers = maildir fs +mailbox_list_drivers = maildir imapdir fs mail-storage-register.c: Makefile rm -f $@