dovecot-2.0: listescape: Fixed to support multiple simultaneous ...
dovecot at dovecot.org
dovecot at dovecot.org
Thu Aug 5 19:22:41 EEST 2010
details: http://hg.dovecot.org/dovecot-2.0/rev/e77310eedfbb
changeset: 11947:e77310eedfbb
user: Timo Sirainen <tss at iki.fi>
date: Thu Aug 05 17:22:36 2010 +0100
description:
listescape: Fixed to support multiple simultaneous mailbox list iterators.
diffstat:
src/plugins/listescape/listescape-plugin.c | 55 +++++++++++++++++++++++----
1 files changed, 46 insertions(+), 9 deletions(-)
diffs (119 lines):
diff -r 756752d91378 -r e77310eedfbb src/plugins/listescape/listescape-plugin.c
--- a/src/plugins/listescape/listescape-plugin.c Thu Aug 05 17:07:56 2010 +0100
+++ b/src/plugins/listescape/listescape-plugin.c Thu Aug 05 17:22:36 2010 +0100
@@ -22,10 +22,15 @@
union mail_storage_module_context module_ctx;
};
+struct listescape_mailbox_list_iter {
+ struct mailbox_list_iterate_context *ctx;
+ string_t *name;
+ struct mailbox_info info;
+};
+
struct listescape_mailbox_list {
union mailbox_list_module_context module_ctx;
- struct mailbox_info info;
- string_t *list_name;
+ ARRAY_DEFINE(iters, struct listescape_mailbox_list_iter);
char escape_char;
};
@@ -111,6 +116,7 @@
{
struct listescape_mailbox_list *mlist = LIST_ESCAPE_LIST_CONTEXT(list);
struct mailbox_list_iterate_context *ctx;
+ struct listescape_mailbox_list_iter *liter;
const char **escaped_patterns;
unsigned int i;
@@ -134,6 +140,10 @@
list->ns->real_sep = list->hierarchy_sep;
ctx = mlist->module_ctx.super.iter_init(list, patterns, flags);
list->ns->real_sep = list->ns->sep;
+
+ liter = array_append_space(&mlist->iters);
+ liter->ctx = ctx;
+ liter->name = str_new(default_pool, 256);
return ctx;
}
@@ -157,14 +167,31 @@
return best != NULL ? best : parent_ns;
}
+static struct listescape_mailbox_list_iter *
+listescape_mailbox_list_iter_find(struct listescape_mailbox_list *mlist,
+ struct mailbox_list_iterate_context *ctx)
+{
+ struct listescape_mailbox_list_iter *liter;
+
+ array_foreach_modifiable(&mlist->iters, liter) {
+ if (liter->ctx == ctx)
+ return liter;
+ }
+ return NULL;
+}
+
static const struct mailbox_info *
listescape_mailbox_list_iter_next(struct mailbox_list_iterate_context *ctx)
{
struct listescape_mailbox_list *mlist =
LIST_ESCAPE_LIST_CONTEXT(ctx->list);
struct mail_namespace *ns;
+ struct listescape_mailbox_list_iter *liter;
const struct mailbox_info *info;
+ liter = listescape_mailbox_list_iter_find(mlist, ctx);
+ i_assert(liter != NULL);
+
ctx->list->ns->real_sep = ctx->list->hierarchy_sep;
info = mlist->module_ctx.super.iter_next(ctx);
ctx->list->ns->real_sep = ctx->list->ns->sep;
@@ -179,12 +206,12 @@
strcasecmp(info->name, "INBOX") == 0)
return info;
- str_truncate(mlist->list_name, 0);
- str_append(mlist->list_name, ns->prefix);
- list_unescape_str(ns, info->name + ns->prefix_len, mlist->list_name);
- mlist->info = *info;
- mlist->info.name = str_c(mlist->list_name);
- return &mlist->info;
+ str_truncate(liter->name, 0);
+ str_append(liter->name, ns->prefix);
+ list_unescape_str(ns, info->name + ns->prefix_len, liter->name);
+ liter->info = *info;
+ liter->info.name = str_c(liter->name);
+ return &liter->info;
}
static int
@@ -193,8 +220,18 @@
struct mailbox_list *list = ctx->list;
struct listescape_mailbox_list *mlist =
LIST_ESCAPE_LIST_CONTEXT(ctx->list);
+ struct listescape_mailbox_list_iter *liters;
+ unsigned int i, count;
int ret;
+ liters = array_get_modifiable(&mlist->iters, &count);
+ for (i = 0; i < count; i++) {
+ if (liters[i].ctx == ctx) {
+ str_free(&liters[i].name);
+ array_delete(&mlist->iters, i, 1);
+ }
+ }
+
list->ns->real_sep = list->hierarchy_sep;
ret = mlist->module_ctx.super.iter_deinit(ctx);
list->ns->real_sep = list->ns->sep;
@@ -287,7 +324,7 @@
mlist = p_new(list->pool, struct listescape_mailbox_list, 1);
mlist->module_ctx.super = *v;
list->vlast = &mlist->module_ctx.super;
- mlist->list_name = str_new(list->pool, 256);
+ p_array_init(&mlist->iters, list->pool, 4);
v->iter_init = listescape_mailbox_list_iter_init;
v->iter_next = listescape_mailbox_list_iter_next;
v->iter_deinit = listescape_mailbox_list_iter_deinit;
More information about the dovecot-cvs
mailing list