changeset 3641:3de464cb604f HEAD

Added flags and keywords parameters to mailbox_copy() in case they're wanted to be changed while copying.
author Timo Sirainen <tss@iki.fi>
date Fri, 07 Oct 2005 12:34:04 +0300
parents e06617e148fc
children aab106e80c3c
files src/imap/cmd-copy.c src/lib-storage/index/maildir/maildir-copy.c src/lib-storage/index/maildir/maildir-storage.h src/lib-storage/mail-copy.c src/lib-storage/mail-copy.h src/lib-storage/mail-storage-private.h src/lib-storage/mail-storage.c src/lib-storage/mail-storage.h
diffstat 8 files changed, 32 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/src/imap/cmd-copy.c	Wed Oct 05 22:44:05 2005 +0300
+++ b/src/imap/cmd-copy.c	Fri Oct 07 12:34:04 2005 +0300
@@ -11,6 +11,8 @@
 {
 	struct mail_search_context *search_ctx;
         struct mailbox_transaction_context *src_trans;
+	struct mail_keywords *keywords;
+	const char *const *keywords_list;
 	struct mail *mail;
 	int ret;
 
@@ -20,15 +22,19 @@
 	mail = mail_alloc(src_trans, MAIL_FETCH_STREAM_HEADER |
 			  MAIL_FETCH_STREAM_BODY, NULL);
 	ret = 1;
-	while (mailbox_search_next(search_ctx, mail) > 0) {
+	while (mailbox_search_next(search_ctx, mail) > 0 && ret > 0) {
 		if (mail->expunged) {
 			ret = 0;
 			break;
 		}
-		if (mailbox_copy(t, mail, NULL) < 0) {
+
+		keywords_list = mail_get_keywords(mail);
+		keywords = strarray_length(keywords_list) == 0 ? NULL :
+			mailbox_keywords_create(t, keywords_list);
+		if (mailbox_copy(t, mail, mail_get_flags(mail),
+				 keywords, NULL) < 0)
 			ret = -1;
-			break;
-		}
+		mailbox_keywords_free(t, keywords);
 	}
 	mail_free(mail);
 
--- a/src/lib-storage/index/maildir/maildir-copy.c	Wed Oct 05 22:44:05 2005 +0300
+++ b/src/lib-storage/index/maildir/maildir-copy.c	Fri Oct 07 12:34:04 2005 +0300
@@ -55,31 +55,28 @@
 	return 1;
 }
 
-static int maildir_copy_hardlink(struct mail *mail,
-				 struct maildir_copy_context *ctx)
+static int
+maildir_copy_hardlink(struct mail *mail,
+		      enum mail_flags flags, struct mail_keywords *keywords,
+		      struct maildir_copy_context *ctx)
 {
 	struct index_mail *imail = (struct index_mail *)mail;
 	struct maildir_mailbox *mbox = (struct maildir_mailbox *)imail->ibox;
 	struct hardlink_ctx do_ctx;
 	struct rollback *rb;
-	enum mail_flags flags;
-	const char *const *keywords;
 	const char *dest_fname;
-	array_t ARRAY_DEFINE(keywords_arr, const char *);
-	unsigned int count;
+	array_t ARRAY_DEFINE(keywords_arr, unsigned int);
 
-        flags = mail_get_flags(mail);
-        keywords = mail_get_keywords(mail);
 	dest_fname = maildir_generate_tmp_filename(&ioloop_timeval);
 
-	count = strarray_length(keywords);
-	if (count > 0) {
+	if (keywords->count > 0) {
 		ARRAY_CREATE(&keywords_arr, pool_datastack_create(),
-			     const char *, count);
-		array_append(&keywords_arr, keywords, count);
+			     unsigned int, keywords->count);
+		array_append(&keywords_arr, keywords->idx, keywords->count);
 	}
 	dest_fname = maildir_filename_set_flags(NULL, // FIXME: !!!
-						dest_fname, flags, count != 0 ?
+						dest_fname, flags,
+						keywords->count != 0 ?
 						&keywords_arr : NULL);
 
 	memset(&do_ctx, 0, sizeof(do_ctx));
@@ -137,6 +134,7 @@
 }
 
 int maildir_copy(struct mailbox_transaction_context *_t, struct mail *mail,
+		 enum mail_flags flags, struct mail_keywords *keywords,
 		 struct mail *dest_mail)
 {
 	struct maildir_transaction_context *t =
@@ -153,7 +151,7 @@
 	    mail->box->storage == STORAGE(ctx->mbox->storage)) {
 		// FIXME: handle dest_mail
 		t_push();
-		ret = maildir_copy_hardlink(mail, ctx);
+		ret = maildir_copy_hardlink(mail, flags, keywords, ctx);
 		t_pop();
 
 		if (ret > 0)
@@ -164,5 +162,5 @@
 		/* non-fatal hardlinking failure, try the slow way */
 	}
 
-	return mail_storage_copy(_t, mail, dest_mail);
+	return mail_storage_copy(_t, mail, flags, keywords, dest_mail);
 }
--- a/src/lib-storage/index/maildir/maildir-storage.h	Wed Oct 05 22:44:05 2005 +0300
+++ b/src/lib-storage/index/maildir/maildir-storage.h	Fri Oct 07 12:34:04 2005 +0300
@@ -126,6 +126,7 @@
 void maildir_transaction_save_rollback(struct maildir_save_context *ctx);
 
 int maildir_copy(struct mailbox_transaction_context *t, struct mail *mail,
+		 enum mail_flags flags, struct mail_keywords *keywords,
 		 struct mail *dest_mail);
 int maildir_transaction_copy_commit(struct maildir_copy_context *ctx);
 void maildir_transaction_copy_rollback(struct maildir_copy_context *ctx);
--- a/src/lib-storage/mail-copy.c	Wed Oct 05 22:44:05 2005 +0300
+++ b/src/lib-storage/mail-copy.c	Fri Oct 07 12:34:04 2005 +0300
@@ -6,12 +6,12 @@
 #include "mail-copy.h"
 
 int mail_storage_copy(struct mailbox_transaction_context *t, struct mail *mail,
+		      enum mail_flags flags, struct mail_keywords *keywords,
 		      struct mail *dest_mail)
 {
 	struct mail_save_context *ctx;
 	struct istream *input;
-	struct mail_keywords *keywords;
-	const char *from_envelope, *const *keywords_list;
+	const char *from_envelope;
 
 	input = mail_get_stream(mail, NULL, NULL);
 	if (input == NULL)
@@ -19,14 +19,9 @@
 
 	from_envelope = mail_get_special(mail, MAIL_FETCH_FROM_ENVELOPE);
 
-	keywords_list = mail_get_keywords(mail);
-	keywords = keywords_list == NULL ? NULL :
-		mailbox_keywords_create(t, keywords_list);
-	ctx = mailbox_save_init(t, mail_get_flags(mail), keywords,
+	ctx = mailbox_save_init(t, flags, keywords,
 				mail_get_received_date(mail),
 				0, from_envelope, input, dest_mail != NULL);
-	if (keywords != NULL)
-		mailbox_keywords_free(t, keywords);
 
 	while (i_stream_read(input) != -1) {
 		if (mailbox_save_continue(ctx) < 0)
--- a/src/lib-storage/mail-copy.h	Wed Oct 05 22:44:05 2005 +0300
+++ b/src/lib-storage/mail-copy.h	Fri Oct 07 12:34:04 2005 +0300
@@ -2,6 +2,7 @@
 #define __MAIL_COPY_H
 
 int mail_storage_copy(struct mailbox_transaction_context *t, struct mail *mail,
+		      enum mail_flags flags, struct mail_keywords *keywords,
 		      struct mail *dest_mail);
 
 #endif
--- a/src/lib-storage/mail-storage-private.h	Wed Oct 05 22:44:05 2005 +0300
+++ b/src/lib-storage/mail-storage-private.h	Fri Oct 07 12:34:04 2005 +0300
@@ -143,6 +143,7 @@
 	void (*save_cancel)(struct mail_save_context *ctx);
 
 	int (*copy)(struct mailbox_transaction_context *t, struct mail *mail,
+		    enum mail_flags flags, struct mail_keywords *keywords,
 		    struct mail *dest_mail);
 
 	int (*is_inconsistent)(struct mailbox *box);
--- a/src/lib-storage/mail-storage.c	Wed Oct 05 22:44:05 2005 +0300
+++ b/src/lib-storage/mail-storage.c	Fri Oct 07 12:34:04 2005 +0300
@@ -454,9 +454,10 @@
 }
 
 int mailbox_copy(struct mailbox_transaction_context *t, struct mail *mail,
+		 enum mail_flags flags, struct mail_keywords *keywords,
 		 struct mail *dest_mail)
 {
-	return t->box->v.copy(t, mail, dest_mail);
+	return t->box->v.copy(t, mail, flags, keywords, dest_mail);
 }
 
 int mailbox_is_inconsistent(struct mailbox *box)
--- a/src/lib-storage/mail-storage.h	Wed Oct 05 22:44:05 2005 +0300
+++ b/src/lib-storage/mail-storage.h	Fri Oct 07 12:34:04 2005 +0300
@@ -395,6 +395,7 @@
    accessed using it. Note that setting it non-NULL may require mailbox
    syncing, so don't give give it unless you need it. */
 int mailbox_copy(struct mailbox_transaction_context *t, struct mail *mail,
+		 enum mail_flags flags, struct mail_keywords *keywords,
 		 struct mail *dest_mail);
 
 /* Returns TRUE if mailbox is now in inconsistent state, meaning that