dovecot-2.0: doveadm: Added API for iterating through mailboxes ...
dovecot at dovecot.org
dovecot at dovecot.org
Wed Apr 28 22:09:22 EEST 2010
details: http://hg.dovecot.org/dovecot-2.0/rev/3d48ead930ba
changeset: 11201:3d48ead930ba
user: Timo Sirainen <tss at iki.fi>
date: Wed Apr 28 22:07:05 2010 +0300
description:
doveadm: Added API for iterating through mailboxes more easily.
diffstat:
src/doveadm/Makefile.am | 2 +
src/doveadm/doveadm-mail-list-iter.c | 107 +++++++++++++++++++++++++++++++++++
src/doveadm/doveadm-mail-list-iter.h | 13 ++++
3 files changed, 122 insertions(+), 0 deletions(-)
diffs (146 lines):
diff -r af59d2d02f33 -r 3d48ead930ba src/doveadm/Makefile.am
--- a/src/doveadm/Makefile.am Wed Apr 28 22:05:13 2010 +0300
+++ b/src/doveadm/Makefile.am Wed Apr 28 22:07:05 2010 +0300
@@ -54,6 +54,7 @@
doveadm-mail.c \
doveadm-mail-altmove.c \
doveadm-mail-fetch.c \
+ doveadm-mail-list-iter.c \
doveadm-penalty.c \
doveadm-pw.c \
doveadm-settings.c \
@@ -63,5 +64,6 @@
doveadm.h \
doveadm-dump.h \
doveadm-mail.h \
+ doveadm-mail-list-iter.h \
doveadm-settings.h \
doveadm-who.h
diff -r af59d2d02f33 -r 3d48ead930ba src/doveadm/doveadm-mail-list-iter.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/doveadm/doveadm-mail-list-iter.c Wed Apr 28 22:07:05 2010 +0300
@@ -0,0 +1,107 @@
+/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "array.h"
+#include "str.h"
+#include "mail-search.h"
+#include "mail-namespace.h"
+#include "mailbox-list.h"
+#include "doveadm-mail-list-iter.h"
+
+struct doveadm_mail_list_iter {
+ struct mail_search_args *search_args;
+ enum mailbox_list_iter_flags iter_flags;
+
+ struct mailbox_list_iterate_context *iter;
+ string_t *vname;
+};
+
+static void
+search_args_get_mailbox_patterns(const struct mail_search_arg *args,
+ ARRAY_TYPE(const_string) *patterns)
+{
+ const struct mail_search_arg *subargs;
+
+ for (; args != NULL; args = args->next) {
+ switch (args->type) {
+ case SEARCH_OR:
+ case SEARCH_SUB:
+ case SEARCH_INTHREAD:
+ subargs = args->value.subargs;
+ for (; subargs != NULL; subargs = subargs->next) {
+ search_args_get_mailbox_patterns(subargs,
+ patterns);
+ }
+ break;
+ case SEARCH_MAILBOX:
+ case SEARCH_MAILBOX_GLOB:
+ array_append(patterns, &args->value.str, 1);
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+struct doveadm_mail_list_iter *
+doveadm_mail_list_iter_init(struct mail_user *user,
+ struct mail_search_args *search_args,
+ enum mailbox_list_iter_flags iter_flags)
+{
+ static const char *all_pattern = "*";
+ struct doveadm_mail_list_iter *iter;
+ ARRAY_TYPE(const_string) patterns;
+
+ iter = i_new(struct doveadm_mail_list_iter, 1);
+ iter->search_args = search_args;
+
+ t_array_init(&patterns, 16);
+ search_args_get_mailbox_patterns(search_args->args, &patterns);
+ if (array_count(&patterns) == 0) {
+ iter_flags |= MAILBOX_LIST_ITER_SKIP_ALIASES;
+ array_append(&patterns, &all_pattern, 1);
+ } else {
+ iter_flags |= MAILBOX_LIST_ITER_STAR_WITHIN_NS;
+ }
+ (void)array_append_space(&patterns);
+
+ iter->iter_flags = iter_flags;
+ iter->iter = mailbox_list_iter_init_namespaces(user->namespaces,
+ array_idx(&patterns, 0),
+ NAMESPACE_PRIVATE,
+ iter_flags);
+ iter->vname = str_new(default_pool, 256);
+ return iter;
+}
+
+void doveadm_mail_list_iter_deinit(struct doveadm_mail_list_iter **_iter)
+{
+ struct doveadm_mail_list_iter *iter = *_iter;
+
+ *_iter = NULL;
+
+ if (mailbox_list_iter_deinit(&iter->iter) < 0)
+ i_error("Listing mailboxes failed");
+ str_free(&iter->vname);
+ i_free(iter);
+}
+
+const struct mailbox_info *
+doveadm_mail_list_iter_next(struct doveadm_mail_list_iter *iter)
+{
+ const struct mailbox_info *info;
+ const char *vname;
+
+ while ((info = mailbox_list_iter_next(iter->iter)) != NULL) {
+ if ((iter->iter_flags & MAILBOX_LIST_ITER_VIRTUAL_NAMES) != 0)
+ vname = info->name;
+ else {
+ vname = mail_namespace_get_vname(info->ns, iter->vname,
+ info->name);
+ }
+ if (mail_search_args_match_mailbox(iter->search_args, vname,
+ info->ns->sep))
+ break;
+ }
+ return info;
+}
diff -r af59d2d02f33 -r 3d48ead930ba src/doveadm/doveadm-mail-list-iter.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/doveadm/doveadm-mail-list-iter.h Wed Apr 28 22:07:05 2010 +0300
@@ -0,0 +1,13 @@
+#ifndef DOVEADM_MAIL_LIST_ITER_H
+#define DOVEADM_MAIL_LIST_ITER_H
+
+struct doveadm_mail_list_iter *
+doveadm_mail_list_iter_init(struct mail_user *user,
+ struct mail_search_args *search_args,
+ enum mailbox_list_iter_flags iter_flags);
+void doveadm_mail_list_iter_deinit(struct doveadm_mail_list_iter **iter);
+
+const struct mailbox_info *
+doveadm_mail_list_iter_next(struct doveadm_mail_list_iter *iter);
+
+#endif
More information about the dovecot-cvs
mailing list