# HG changeset patch # User Timo Sirainen # Date 1147175704 -10800 # Node ID bd99e8f5e3ac0bf832be440371fef6a2cbdef17f # Parent 662578b5ae22cbb0020a72a83e2c32faa29c2370 Some fixes and added message_parser_set_crlfs(). diff -r 662578b5ae22 -r bd99e8f5e3ac src/lib-mail/message-parser.c --- 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); +} diff -r 662578b5ae22 -r bd99e8f5e3ac src/lib-mail/message-parser.h --- 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