changeset 4267:bd99e8f5e3ac HEAD

Some fixes and added message_parser_set_crlfs().
author Timo Sirainen <timo.sirainen@movial.fi>
date Tue, 09 May 2006 14:55:04 +0300
parents 662578b5ae22
children 7112aad504ae
files src/lib-mail/message-parser.c src/lib-mail/message-parser.h
diffstat 2 files changed, 50 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-mail/message-parser.c	Tue May 09 12:39:00 2006 +0300
+++ b/src/lib-mail/message-parser.c	Tue May 09 14:55:04 2006 +0300
@@ -244,6 +244,8 @@
 	while (boundary->part != ctx->part) {
 		message_size_add(&ctx->part->parent->body_size,
 				 &ctx->part->body_size);
+		message_size_add(&ctx->part->parent->body_size,
+				 &ctx->part->header_size);
 		ctx->part = ctx->part->parent;
 	}
 
@@ -556,6 +558,8 @@
 		while (ctx->part->parent != NULL) {
 			message_size_add(&ctx->part->parent->body_size,
 					 &ctx->part->body_size);
+			message_size_add(&ctx->part->parent->body_size,
+					 &ctx->part->header_size);
 			ctx->part = ctx->part->parent;
 		}
 	}
@@ -639,3 +643,44 @@
 {
 	part_parse_headers(part, input, callback, context);
 }
+
+static void
+message_parser_set_crlfs_diff(struct message_part *parts, bool use_crlf,
+			      off_t diff)
+{
+	while (parts != NULL) {
+		uoff_t old_size = parts->header_size.physical_size +
+			parts->body_size.physical_size;
+
+		if (use_crlf) {
+			parts->header_size.physical_size =
+				parts->header_size.virtual_size;
+			parts->body_size.physical_size =
+				parts->body_size.virtual_size;
+		} else {
+			parts->header_size.physical_size =
+				parts->header_size.virtual_size -
+				parts->header_size.lines;
+			parts->body_size.physical_size =
+				parts->body_size.virtual_size -
+				parts->body_size.lines;
+		}
+		parts->physical_pos += diff;
+
+		diff += (off_t)(parts->header_size.physical_size +
+				parts->body_size.physical_size) -
+			(off_t)old_size;
+
+		if (parts->children != NULL) {
+			message_parser_set_crlfs_diff(parts->children,
+						      use_crlf, diff);
+		}
+
+		parts = parts->next;
+	}
+}
+
+void message_parser_set_crlfs(struct message_part *parts, bool use_crlf)
+{
+	message_parser_set_crlfs_diff(parts, use_crlf, 0);
+}
--- a/src/lib-mail/message-parser.h	Tue May 09 12:39:00 2006 +0300
+++ b/src/lib-mail/message-parser.h	Tue May 09 14:55:04 2006 +0300
@@ -83,4 +83,9 @@
 			      message_part_header_callback_t *callback,
 			      void *context);
 
+/* Update the physical_size of all parts. If use_crlf is TRUE, they're set
+   to same as virtual_size. If use_crlf is FALSE, they're set to
+   virtual_size - lines. physical_pos fields are also updated. */
+void message_parser_set_crlfs(struct message_part *parts, bool use_crlf);
+
 #endif