[dovecot-cvs] dovecot/src/lib-storage Makefile.am, 1.10, 1.11 mail-copy.c, NONE, 1.1 mail-copy.h, NONE, 1.1 mail-save.c, 1.12, NONE mail-save.h, 1.3, NONE mail-storage-private.h, 1.7, 1.8 mail-storage.c, 1.28, 1.29 mail-storage.h, 1.76, 1.77 proxy-mailbox.c, 1.9, 1.10

cras at dovecot.org cras at dovecot.org
Sun Aug 22 12:17:11 EEST 2004


Update of /home/cvs/dovecot/src/lib-storage
In directory talvi:/tmp/cvs-serv2400/lib-storage

Modified Files:
	Makefile.am mail-storage-private.h mail-storage.c 
	mail-storage.h proxy-mailbox.c 
Added Files:
	mail-copy.c mail-copy.h 
Removed Files:
	mail-save.c mail-save.h 
Log Message:
Changed mail saving API to be nonblocking.



Index: Makefile.am
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/Makefile.am,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- Makefile.am	27 Apr 2004 20:25:54 -0000	1.10
+++ Makefile.am	22 Aug 2004 09:17:08 -0000	1.11
@@ -8,7 +8,7 @@
 	-I$(top_srcdir)/src/lib-imap
 
 libstorage_a_SOURCES = \
-	mail-save.c \
+	mail-copy.c \
 	mail-search.c \
 	mail-storage.c \
 	mailbox-tree.c \
@@ -17,7 +17,7 @@
 	proxy-mailbox.c
 
 noinst_HEADERS = \
-	mail-save.h \
+	mail-copy.h \
 	mail-search.h \
 	mail-storage.h \
 	mail-storage-private.h \

--- NEW FILE: mail-copy.c ---
/* Copyright (C) 2004 Timo Sirainen */

#include "lib.h"
#include "istream.h"
#include "mail-storage.h"
#include "mail-copy.h"

int mail_storage_copy(struct mailbox_transaction_context *t, struct mail *mail,
		      struct mail **dest_mail_r)
{
	struct mail_save_context *ctx;
	struct istream *input;
	const char *from_envelope;

	input = mail->get_stream(mail, NULL, NULL);
	if (input == NULL)
		return -1;

	from_envelope = mail->get_special(mail, MAIL_FETCH_FROM_ENVELOPE);

	ctx = mailbox_save_init(t, mail->get_flags(mail),
				mail->get_received_date(mail),
				0, from_envelope, input, dest_mail_r != NULL);
	while (i_stream_read(input) != -1) {
		if (mailbox_save_continue(ctx) < 0)
			break;
	}

	if (input->stream_errno != 0) {
		mailbox_save_cancel(ctx);
		return -1;
	}

	return mailbox_save_finish(ctx, dest_mail_r);
}

--- NEW FILE: mail-copy.h ---
#ifndef __MAIL_COPY_H
#define __MAIL_COPY_H

int mail_storage_copy(struct mailbox_transaction_context *t, struct mail *mail,
		      struct mail **dest_mail_r);

#endif

--- mail-save.c DELETED ---

--- mail-save.h DELETED ---

Index: mail-storage-private.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/mail-storage-private.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- mail-storage-private.h	22 Jul 2004 21:20:00 -0000	1.7
+++ mail-storage-private.h	22 Aug 2004 09:17:08 -0000	1.8
@@ -102,11 +102,16 @@
 	int (*search_deinit)(struct mail_search_context *ctx);
 	struct mail *(*search_next)(struct mail_search_context *ctx);
 
-	int (*save)(struct mailbox_transaction_context *t,
-		    const struct mail_full_flags *flags,
-		    time_t received_date, int timezone_offset,
-		    const char *from_envelope, struct istream *data,
-		    struct mail **dest_mail_r);
+	struct mail_save_context *
+		(*save_init)(struct mailbox_transaction_context *t,
+			     const struct mail_full_flags *flags,
+			     time_t received_date, int timezone_offset,
+			     const char *from_envelope, struct istream *input,
+			     int want_mail);
+	int (*save_continue)(struct mail_save_context *ctx);
+	int (*save_finish)(struct mail_save_context *ctx, struct mail **mail_r);
+	void (*save_cancel)(struct mail_save_context *ctx);
+
 	int (*copy)(struct mailbox_transaction_context *t, struct mail *mail,
 		    struct mail **dest_mail_r);
 
@@ -125,6 +130,10 @@
 	struct mailbox *box;
 };
 
+struct mail_save_context {
+	struct mailbox *box;
+};
+
 struct mailbox_sync_context {
 	struct mailbox *box;
 };

Index: mail-storage.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/mail-storage.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -d -r1.28 -r1.29
--- mail-storage.c	22 Jul 2004 21:20:00 -0000	1.28
+++ mail-storage.c	22 Aug 2004 09:17:08 -0000	1.29
@@ -413,14 +413,30 @@
 	t->box->transaction_rollback(t);
 }
 
-int mailbox_save(struct mailbox_transaction_context *t,
-		 const struct mail_full_flags *flags,
-		 time_t received_date, int timezone_offset,
-		 const char *from_envelope, struct istream *data,
-		 struct mail **mail_r)
+struct mail_save_context *
+mailbox_save_init(struct mailbox_transaction_context *t,
+		  const struct mail_full_flags *flags,
+		  time_t received_date, int timezone_offset,
+		  const char *from_envelope, struct istream *input,
+		  int want_mail)
 {
-	return t->box->save(t, flags, received_date, timezone_offset,
-			    from_envelope, data, mail_r);
+	return t->box->save_init(t, flags, received_date, timezone_offset,
+				 from_envelope, input, want_mail);
+}
+
+int mailbox_save_continue(struct mail_save_context *ctx)
+{
+	return ctx->box->save_continue(ctx);
+}
+
+int mailbox_save_finish(struct mail_save_context *ctx, struct mail **mail_r)
+{
+	return ctx->box->save_finish(ctx, mail_r);
+}
+
+void mailbox_save_cancel(struct mail_save_context *ctx)
+{
+	ctx->box->save_cancel(ctx);
 }
 
 int mailbox_copy(struct mailbox_transaction_context *t, struct mail *mail,

Index: mail-storage.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/mail-storage.h,v
retrieving revision 1.76
retrieving revision 1.77
diff -u -d -r1.76 -r1.77
--- mail-storage.h	15 Aug 2004 03:52:09 -0000	1.76
+++ mail-storage.h	22 Aug 2004 09:17:08 -0000	1.77
@@ -319,14 +319,19 @@
    minutes in which received_date was originally given with. To use
    current time, set received_date to (time_t)-1.
 
-   If mail_r is non-NULL, the saved message can be 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_save(struct mailbox_transaction_context *t,
-		 const struct mail_full_flags *flags,
-		 time_t received_date, int timezone_offset,
-		 const char *from_envelope, struct istream *data,
-		 struct mail **mail_r);
+   If want_mail is TRUE, mail_r will be set in mailbox_save_finish() and
+   the saved message can be accessed using it. Note that setting it may
+   require mailbox syncing, so don't set it unless you need it. */
+struct mail_save_context *
+mailbox_save_init(struct mailbox_transaction_context *t,
+		  const struct mail_full_flags *flags,
+		  time_t received_date, int timezone_offset,
+		  const char *from_envelope, struct istream *input,
+		  int want_mail);
+int mailbox_save_continue(struct mail_save_context *ctx);
+int mailbox_save_finish(struct mail_save_context *ctx, struct mail **mail_r);
+void mailbox_save_cancel(struct mail_save_context *ctx);
+
 /* Copy given message. If dest_mail_r is non-NULL, the copied message can be
    accessed using it. Note that setting it non-NULL may require mailbox
    syncing, so don't give give it unless you need it. */

Index: proxy-mailbox.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/proxy-mailbox.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- proxy-mailbox.c	18 Jul 2004 02:25:07 -0000	1.9
+++ proxy-mailbox.c	22 Aug 2004 09:17:08 -0000	1.10
@@ -115,18 +115,19 @@
 	pbox->box->transaction_rollback(pt->ctx);
 }
 
-static int _save(struct mailbox_transaction_context *t,
-		 const struct mail_full_flags *flags,
-		 time_t received_date, int timezone_offset,
-		 const char *from_envelope, struct istream *data,
-		 struct mail **mail_r)
+static struct mail_save_context *
+_save_init(struct mailbox_transaction_context *t,
+	   const struct mail_full_flags *flags,
+	   time_t received_date, int timezone_offset,
+	   const char *from_envelope, struct istream *input, int want_mail)
 {
 	struct proxy_mailbox_transaction_context *pt =
 		(struct proxy_mailbox_transaction_context *)t;
 	struct proxy_mailbox *pbox = (struct proxy_mailbox *)t->box;
 
-	return pbox->box->save(pt->ctx, flags, received_date, timezone_offset,
-			       from_envelope, data, mail_r);
+	return pbox->box->save_init(pt->ctx, flags, received_date,
+				    timezone_offset, from_envelope, input,
+				    want_mail);
 }
 
 static int _copy(struct mailbox_transaction_context *t, struct mail *mail,
@@ -176,7 +177,10 @@
 	pb->transaction_commit = _transaction_commit;
 	pb->transaction_rollback = _transaction_rollback;
 
-	pb->save = _save;
+	pb->save_init = _save_init;
+	pb->save_continue = box->save_continue;
+	pb->save_finish = box->save_finish;
+	pb->save_cancel = box->save_cancel;
 	pb->copy = _copy;
 
 	pb->is_inconsistent = _is_inconsistent;



More information about the dovecot-cvs mailing list