dovecot-2.2: imap: More fixes to fetching messages.

dovecot at dovecot.org dovecot at dovecot.org
Sun Aug 12 04:55:00 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/9f20f7bd992d
changeset: 14872:9f20f7bd992d
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Aug 12 04:54:54 2012 +0300
description:
imap: More fixes to fetching messages.

diffstat:

 src/lib-imap-storage/imap-msgpart.c |  34 ++++++++++++++++++++++------------
 1 files changed, 22 insertions(+), 12 deletions(-)

diffs (61 lines):

diff -r f66e1508dc19 -r 9f20f7bd992d src/lib-imap-storage/imap-msgpart.c
--- a/src/lib-imap-storage/imap-msgpart.c	Sun Aug 12 03:28:26 2012 +0300
+++ b/src/lib-imap-storage/imap-msgpart.c	Sun Aug 12 04:54:54 2012 +0300
@@ -236,12 +236,13 @@
 	}
 
 	if (*section == '\0') {
-		/* full message/MIME part */
 		msgpart->wanted_fields |= MAIL_FETCH_STREAM_BODY;
 		if (*msgpart->section_number == '\0') {
+			/* BODY[] - header+body */
 			msgpart->fetch_type = FETCH_FULL;
 			msgpart->wanted_fields |= MAIL_FETCH_STREAM_HEADER;
 		} else {
+			/* BODY[1] - body only */
 			msgpart->fetch_type = FETCH_MIME_BODY;
 		}
 		return 0;
@@ -516,22 +517,31 @@
 	if (mail_get_parts(mail, &parts) < 0)
 		return -1;
 	part = imap_msgpart_find(parts, msgpart->section_number);
-	if (part != NULL && (msgpart->fetch_type == FETCH_HEADER ||
-			     msgpart->fetch_type == FETCH_BODY)) {
-		/* fetching message/rfc822 part's header/body */
-		if ((part->flags & MESSAGE_PART_FLAG_MESSAGE_RFC822) == 0)
-			part = NULL;
-		else {
-			i_assert(part->children != NULL &&
-				 part->children->next == NULL);
-			part = part->children;
-		}
-	}
 	if (part == NULL) {
 		/* MIME part not found. */
 		*part_r = NULL;
 		return 0;
 	}
+
+	switch (msgpart->fetch_type) {
+	case FETCH_FULL:
+	case FETCH_MIME:
+	case FETCH_MIME_BODY:
+		break;
+	case FETCH_HEADER:
+	case FETCH_HEADER_FIELDS:
+	case FETCH_HEADER_FIELDS_NOT:
+	case FETCH_BODY:
+		/* fetching message/rfc822 part's header/body */
+		if ((part->flags & MESSAGE_PART_FLAG_MESSAGE_RFC822) == 0) {
+			*part_r = NULL;
+			return 0;
+		}
+		i_assert(part->children != NULL &&
+			 part->children->next == NULL);
+		part = part->children;
+		break;
+	}
 	*part_r = part;
 	return 1;
 }


More information about the dovecot-cvs mailing list