dovecot-1.2: virtual: Fixed saving messages with keywords.
dovecot at dovecot.org
dovecot at dovecot.org
Sun Jun 28 04:29:30 EEST 2009
details: http://hg.dovecot.org/dovecot-1.2/rev/668bb851d9a6
changeset: 9171:668bb851d9a6
user: Timo Sirainen <tss at iki.fi>
date: Sat Jun 27 21:29:24 2009 -0400
description:
virtual: Fixed saving messages with keywords.
diffstat:
1 file changed, 36 insertions(+), 1 deletion(-)
src/plugins/virtual/virtual-save.c | 37 +++++++++++++++++++++++++++++++++++-
diffs (75 lines):
diff -r b1a27ed69e60 -r 668bb851d9a6 src/plugins/virtual/virtual-save.c
--- a/src/plugins/virtual/virtual-save.c Sat Jun 27 20:53:35 2009 -0400
+++ b/src/plugins/virtual/virtual-save.c Sat Jun 27 21:29:24 2009 -0400
@@ -1,12 +1,15 @@
/* Copyright (c) 2009 Dovecot authors, see the included COPYING file */
#include "lib.h"
+#include "array.h"
#include "virtual-transaction.h"
#include "virtual-storage.h"
struct virtual_save_context {
struct mail_save_context ctx;
struct mail_save_context *backend_save_ctx;
+ struct mailbox *backend_box;
+ struct mail_keywords *backend_keywords;
};
struct mail_save_context *
@@ -32,6 +35,31 @@ virtual_save_alloc(struct mailbox_transa
return &ctx->ctx;
}
+static struct mail_keywords *
+virtual_copy_keywords(struct mailbox *src_box,
+ const struct mail_keywords *src_keywords,
+ struct mailbox *dest_box)
+{
+ struct mailbox_status status;
+ ARRAY_TYPE(keywords) kw_strings;
+ const char *const *kwp;
+ unsigned int i;
+
+ if (src_keywords == NULL || src_keywords->count == 0)
+ return NULL;
+
+ t_array_init(&kw_strings, src_keywords->count + 1);
+ mailbox_get_status(src_box, STATUS_KEYWORDS, &status);
+
+ for (i = 0; i < src_keywords->count; i++) {
+ kwp = array_idx(status.keywords, src_keywords->idx[i]);
+ array_append(&kw_strings, kwp, 1);
+ }
+ (void)array_append_space(&kw_strings);
+ return mailbox_keywords_create_valid(dest_box,
+ array_idx(&kw_strings, 0));
+}
+
int virtual_save_begin(struct mail_save_context *_ctx, struct istream *input)
{
struct virtual_save_context *ctx = (struct virtual_save_context *)_ctx;
@@ -46,8 +74,13 @@ int virtual_save_begin(struct mail_save_
return -1;
}
+ ctx->backend_box = ctx->backend_save_ctx->transaction->box;
+ ctx->backend_keywords =
+ virtual_copy_keywords(_ctx->transaction->box, _ctx->keywords,
+ ctx->backend_box);
+
mailbox_save_set_flags(ctx->backend_save_ctx, _ctx->flags,
- _ctx->keywords);
+ ctx->backend_keywords);
mailbox_save_set_received_date(ctx->backend_save_ctx,
_ctx->received_date,
_ctx->received_tz_offset);
@@ -87,6 +120,8 @@ void virtual_save_cancel(struct mail_sav
void virtual_save_free(struct virtual_save_context *ctx)
{
+ if (ctx->backend_keywords != NULL)
+ mailbox_keywords_free(ctx->backend_box, &ctx->backend_keywords);
if (ctx->backend_save_ctx != NULL)
mailbox_save_cancel(&ctx->backend_save_ctx);
i_free(ctx);
More information about the dovecot-cvs
mailing list