[dovecot-cvs] dovecot-lda/src common.h, 1.2, 1.3 deliver.c, 1.27, 1.28 sieve-cmu.c, 1.9, 1.10

cras at dovecot.org cras at dovecot.org
Fri Oct 7 12:34:46 EEST 2005


Update of /var/lib/cvs/dovecot-lda/src
In directory talvi:/tmp/cvs-serv4443

Modified Files:
	common.h deliver.c sieve-cmu.c 
Log Message:
Support setting flags to mails



Index: common.h
===================================================================
RCS file: /var/lib/cvs/dovecot-lda/src/common.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- common.h	15 Aug 2005 10:23:50 -0000	1.2
+++ common.h	7 Oct 2005 09:34:43 -0000	1.3
@@ -15,7 +15,8 @@
 		      const char *script_path, const char *username);
 
 int save_mail(struct mail_storage *storage, const char *mailbox,
-	      struct mail *mail);
+	      struct mail *mail, enum mail_flags flags,
+	      const char *const *keywords);
 
 const char *get_return_path(struct mail *mail);
 

Index: deliver.c
===================================================================
RCS file: /var/lib/cvs/dovecot-lda/src/deliver.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -d -r1.27 -r1.28
--- deliver.c	3 Oct 2005 21:24:53 -0000	1.27
+++ deliver.c	7 Oct 2005 09:34:43 -0000	1.28
@@ -82,10 +82,12 @@
 }
 
 int save_mail(struct mail_storage *storage, const char *mailbox,
-	      struct mail *mail)
+	      struct mail *mail, enum mail_flags flags,
+	      const char *const *keywords)
 {
 	struct mailbox *box;
 	struct mailbox_transaction_context *t;
+	struct mail_keywords *kw;
 	int ret = 0;
 
 	box = mailbox_open(storage, mailbox, NULL, MAILBOX_OPEN_FAST |
@@ -115,8 +117,11 @@
 
 	t = mailbox_transaction_begin(box, MAILBOX_TRANSACTION_FLAG_EXTERNAL);
 
-	if (mailbox_copy(t, mail, NULL) < 0)
+	kw = strarray_length(keywords) == 0 ? NULL :
+		mailbox_keywords_create(t, keywords);
+	if (mailbox_copy(t, mail, flags, kw, NULL) < 0)
 		ret = -1;
+	mailbox_keywords_free(t, kw);
 
 	if (ret < 0)
 		mailbox_transaction_rollback(t);
@@ -577,7 +582,7 @@
 	if (ret <= 0) {
 		/* sieve script didn't handle this. store into inbox. */
 		i_stream_seek(input, 0);
-		if (save_mail(storage, "INBOX", mail) < 0) {
+		if (save_mail(storage, "INBOX", mail, 0, NULL) < 0) {
 			const char *error;
 			int ret, syntax, temporary_error;
 

Index: sieve-cmu.c
===================================================================
RCS file: /var/lib/cvs/dovecot-lda/src/sieve-cmu.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- sieve-cmu.c	24 Sep 2005 10:58:13 -0000	1.9
+++ sieve-cmu.c	7 Oct 2005 09:34:43 -0000	1.10
@@ -2,6 +2,7 @@
 
 #include "common.h"
 #include "ioloop.h"
+#include "array.h"
 #include "hostpid.h"
 #include "str.h"
 #include "str-sanitize.h"
@@ -182,6 +183,44 @@
     return SIEVE_FAIL;
 }
 
+static void get_flags(const sieve_imapflags_t *sieve_flags,
+		      enum mail_flags *flags_r, const char *const **keywords_r)
+{
+	array_t ARRAY_DEFINE(keywords, const char *);
+        const char *name;
+	int i;
+
+	*flags_r = 0;
+
+	ARRAY_CREATE(&keywords, default_pool, const char *, 16);
+	for (i = 0; i < sieve_flags->nflags; i++) {
+		name = sieve_flags->flag[i];
+
+		if (name != NULL && *name != '\\') {
+			/* keyword */
+			array_append(&keywords, &name, 1);
+		} else {
+			/* system flag */
+			if (name == NULL || strcasecmp(name, "\\flagged") == 0)
+				*flags_r |= MAIL_FLAGGED;
+			else if (strcasecmp(name, "\\answered") == 0)
+				*flags_r |= MAIL_ANSWERED;
+			else if (strcasecmp(name, "\\deleted") == 0)
+				*flags_r |= MAIL_DELETED;
+			else if (strcasecmp(name, "\\seen") == 0)
+				*flags_r |= MAIL_SEEN;
+			else if (strcasecmp(name, "\\draft") == 0)
+				*flags_r |= MAIL_DRAFT;
+		}
+	}
+
+	name = NULL;
+	array_append(&keywords, &name, 1);
+
+	*keywords_r = array_count(&keywords) == 1 ? NULL :
+		array_get(&keywords, 0);
+}
+
 static int sieve_fileinto(void *ac, 
 			  void *ic __attr_unused__,
 			  void *sc, 
@@ -191,9 +230,12 @@
     sieve_fileinto_context_t *fc = (sieve_fileinto_context_t *) ac;
     script_data_t *sd = (script_data_t *) sc;
     sieve_msgdata_t *md = (sieve_msgdata_t *) mc;
+    enum mail_flags flags;
+    const char *const *keywords;
 
-    /* FIXME: flags */
-    if (save_mail(sd->storage, fc->mailbox, md->mail) < 0)
+    get_flags(fc->imapflags, &flags, &keywords);
+
+    if (save_mail(sd->storage, fc->mailbox, md->mail, flags, keywords) < 0)
 	    return SIEVE_FAIL;
     return SIEVE_OK;
 }
@@ -205,9 +247,12 @@
     sieve_keep_context_t *kc = (sieve_keep_context_t *) ac;
     script_data_t *sd = (script_data_t *) sc;
     sieve_msgdata_t *md = (sieve_msgdata_t *) mc;
+    enum mail_flags flags;
+    const char *const *keywords;
 
-    /* FIXME: flags */
-    if (save_mail(sd->storage, "INBOX", md->mail) < 0)
+    get_flags(kc->imapflags, &flags, &keywords);
+
+    if (save_mail(sd->storage, "INBOX", md->mail, flags, keywords) < 0)
 	    return SIEVE_FAIL;
 
     return SIEVE_OK;



More information about the dovecot-cvs mailing list