dovecot-2.2: lib-mail: Added message_decoder_parse_cte()

dovecot at dovecot.org dovecot at dovecot.org
Sat Aug 11 05:20:05 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/624107158354
changeset: 14857:624107158354
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Aug 11 05:19:58 2012 +0300
description:
lib-mail: Added message_decoder_parse_cte()

diffstat:

 src/lib-mail/message-decoder.c |  40 +++++++++++++++++-----------------------
 src/lib-mail/message-decoder.h |  13 +++++++++++++
 2 files changed, 30 insertions(+), 23 deletions(-)

diffs (148 lines):

diff -r 39f23dcb9e18 -r 624107158354 src/lib-mail/message-decoder.c
--- a/src/lib-mail/message-decoder.c	Sat Aug 11 05:17:58 2012 +0300
+++ b/src/lib-mail/message-decoder.c	Sat Aug 11 05:19:58 2012 +0300
@@ -13,13 +13,6 @@
 #include "message-header-decode.h"
 #include "message-decoder.h"
 
-enum content_type {
-	CONTENT_TYPE_UNKNOWN = 0,
-	CONTENT_TYPE_BINARY,
-	CONTENT_TYPE_QP,
-	CONTENT_TYPE_BASE64
-};
-
 /* base64 takes max 4 bytes per character, q-p takes max 3. */
 #define MAX_ENCODING_BUF_SIZE 3
 
@@ -42,7 +35,7 @@
 	buffer_t *encoding_buf;
 
 	char *content_charset;
-	enum content_type content_type;
+	enum message_cte message_cte;
 
 	unsigned int charset_utf8:1;
 	unsigned int binary_input:1;
@@ -92,11 +85,10 @@
 	message_decode_body_init_charset(ctx, ctx->prev_part);
 }
 
-static void
-parse_content_transfer_encoding(struct message_decoder_context *ctx,
-				struct message_header_line *hdr)
+enum message_cte message_decoder_parse_cte(struct message_header_line *hdr)
 {
 	struct rfc822_parser_context parser;
+	enum message_cte message_cte;
 	string_t *value;
 
 	value = t_str_new(64);
@@ -105,24 +97,25 @@
 	rfc822_skip_lwsp(&parser);
 	(void)rfc822_parse_mime_token(&parser, value);
 
-	ctx->content_type = CONTENT_TYPE_UNKNOWN;
+	message_cte = MESSAGE_CTE_UNKNOWN;
 	switch (str_len(value)) {
 	case 4:
 		if (i_memcasecmp(str_data(value), "7bit", 4) == 0 ||
 		    i_memcasecmp(str_data(value), "8bit", 4) == 0)
-			ctx->content_type = CONTENT_TYPE_BINARY;
+			message_cte = MESSAGE_CTE_78BIT;
 		break;
 	case 6:
 		if (i_memcasecmp(str_data(value), "base64", 6) == 0)
-			ctx->content_type = CONTENT_TYPE_BASE64;
+			message_cte = MESSAGE_CTE_BASE64;
 		else if (i_memcasecmp(str_data(value), "binary", 6) == 0)
-			ctx->content_type = CONTENT_TYPE_BINARY;
+			message_cte = MESSAGE_CTE_BINARY;
 		break;
 	case 16:
 		if (i_memcasecmp(str_data(value), "quoted-printable", 16) == 0)
-			ctx->content_type = CONTENT_TYPE_QP;
+			message_cte = MESSAGE_CTE_QP;
 		break;
 	}
+	return message_cte;
 }
 
 static void
@@ -170,7 +163,7 @@
 			parse_content_type(ctx, hdr);
 		if (hdr->name_len == 25 &&
 		    strcasecmp(hdr->name, "Content-Transfer-Encoding") == 0)
-			parse_content_transfer_encoding(ctx, hdr);
+			ctx->message_cte = message_decoder_parse_cte(hdr);
 	} T_END;
 
 	buffer_set_used_size(ctx->buf, 0);
@@ -278,16 +271,17 @@
 		buffer_append(ctx->encoding_buf, input->data, input->size);
 	}
 
-	switch (ctx->content_type) {
-	case CONTENT_TYPE_UNKNOWN:
+	switch (ctx->message_cte) {
+	case MESSAGE_CTE_UNKNOWN:
 		/* just skip this body */
 		return FALSE;
 
-	case CONTENT_TYPE_BINARY:
+	case MESSAGE_CTE_78BIT:
+	case MESSAGE_CTE_BINARY:
 		data = input->data;
 		size = pos = input->size;
 		break;
-	case CONTENT_TYPE_QP:
+	case MESSAGE_CTE_QP:
 		buffer_set_used_size(ctx->buf, 0);
 		if (ctx->encoding_buf->used != 0) {
 			quoted_printable_decode(ctx->encoding_buf->data,
@@ -300,7 +294,7 @@
 		data = ctx->buf->data;
 		size = ctx->buf->used;
 		break;
-	case CONTENT_TYPE_BASE64:
+	case MESSAGE_CTE_BASE64:
 		buffer_set_used_size(ctx->buf, 0);
 		if (ctx->encoding_buf->used != 0) {
 			ret = base64_decode(ctx->encoding_buf->data,
@@ -409,7 +403,7 @@
 void message_decoder_decode_reset(struct message_decoder_context *ctx)
 {
 	i_free_and_null(ctx->content_charset);
-	ctx->content_type = CONTENT_TYPE_BINARY;
+	ctx->message_cte = MESSAGE_CTE_78BIT;
 	ctx->charset_utf8 = TRUE;
 	buffer_set_used_size(ctx->encoding_buf, 0);
 }
diff -r 39f23dcb9e18 -r 624107158354 src/lib-mail/message-decoder.h
--- a/src/lib-mail/message-decoder.h	Sat Aug 11 05:17:58 2012 +0300
+++ b/src/lib-mail/message-decoder.h	Sat Aug 11 05:19:58 2012 +0300
@@ -1,6 +1,16 @@
 #ifndef MESSAGE_DECODER_H
 #define MESSAGE_DECODER_H
 
+struct message_header_line;
+
+enum message_cte {
+	MESSAGE_CTE_UNKNOWN = 0,
+	MESSAGE_CTE_78BIT,
+	MESSAGE_CTE_BINARY,
+	MESSAGE_CTE_QP,
+	MESSAGE_CTE_BASE64
+};
+
 enum message_decoder_flags {
 	/* Return all headers and parts through
 	   uni_utf8_to_decomposed_titlecase() */
@@ -33,4 +43,7 @@
 /* Call whenever message changes */
 void message_decoder_decode_reset(struct message_decoder_context *ctx);
 
+/* Decode Content-Transfer-Encoding header. */
+enum message_cte message_decoder_parse_cte(struct message_header_line *hdr);
+
 #endif


More information about the dovecot-cvs mailing list