dovecot-2.0: virtual: Fixed saving messages with keywords.

dovecot at dovecot.org dovecot at dovecot.org
Sun Jun 28 04:29:40 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/56dc85882e9e
changeset: 9541:56dc85882e9e
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 622509c562e8 -r 56dc85882e9e src/plugins/virtual/virtual-save.c
--- a/src/plugins/virtual/virtual-save.c	Sat Jun 27 21:08:45 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