Mercurial > dovecot > core-2.2
changeset 18915:012a355f9f8a
lib-mail: Fixed message_part_to_idx()
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 19 Jul 2015 16:45:23 +0300 |
parents | a83cc1411205 |
children | 32d72cb26f9e |
files | src/lib-mail/message-part.c src/lib-mail/test-message-part.c |
diffstat | 2 files changed, 55 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-mail/message-part.c Sun Jul 19 16:21:04 2015 +0300 +++ b/src/lib-mail/message-part.c Sun Jul 19 16:45:23 2015 +0300 @@ -3,18 +3,39 @@ #include "lib.h" #include "message-part.h" -unsigned int message_part_to_idx(const struct message_part *part) +static const struct message_part * +message_part_root(const struct message_part *part) +{ + while (part->parent != NULL) + part = part->parent; + return part; +} + +static bool message_part_find(const struct message_part *siblings, + const struct message_part *part, + unsigned int *n) { const struct message_part *p; - unsigned int n; - if (part->parent == NULL) { - /* root */ - return 0; + for (p = siblings; p != NULL; p = p->next) { + if (p == part) + return TRUE; + *n += 1; + if (message_part_find(p->children, part, n)) + return TRUE; } - for (n = 0, p = part->parent->children; p != part; p = p->next, n++) - ; - return n + 1 + message_part_to_idx(part->parent); + return FALSE; +} + +unsigned int message_part_to_idx(const struct message_part *part) +{ + const struct message_part *root; + unsigned int n = 0; + + root = message_part_root(part); + if (!message_part_find(root, part, &n)) + i_unreached(); + return n; } static struct message_part *
--- a/src/lib-mail/test-message-part.c Sun Jul 19 16:21:04 2015 +0300 +++ b/src/lib-mail/test-message-part.c Sun Jul 19 16:45:23 2015 +0300 @@ -34,13 +34,30 @@ "<p>Hello world</p>\n" "\n" "--sub1\n" -"Content-Type: text/plain\n" +"Content-Type: multipart/alternative; boundary=\"sub2\"\n" +"\n" +"--sub2\n" +"Content-Type: multipart/alternative; boundary=\"sub3\"\n" +"\n" +"--sub3\n" "\n" -"Hello another world\n" +"sub3 text\n" +"--sub3\n" "\n" +"sub3 text2\n" +"--sub3--\n" +"\n" +"sub2 text\n" +"--sub2\n" +"\n" +"sub2 text2\n" "--sub1--\n" "Sub MIME epilogue\n" "\n" +"--foo bar\n" +"Content-Type: text/plain\n" +"\n" +"Another part\n" "--foo bar--\n" "Root MIME epilogue\n" "\n"; @@ -52,7 +69,7 @@ struct istream *input; struct message_part *parts, *part, *prev_part; struct message_block block; - unsigned int i; + unsigned int i, prev_idx = 0, part_idx; pool_t pool; int ret; @@ -61,7 +78,11 @@ input = i_stream_create_from_data(test_msg, TEST_MSG_LEN); parser = message_parser_init(pool, input, 0, 0); - while ((ret = message_parser_parse_next_block(parser, &block)) > 0) ; + while ((ret = message_parser_parse_next_block(parser, &block)) > 0) { + part_idx = message_part_to_idx(block.part); + test_assert(part_idx >= prev_idx); + prev_idx = part_idx; + } test_assert(ret < 0); test_assert(message_parser_deinit(&parser, &parts) == 0); @@ -69,7 +90,7 @@ test_assert(part == parts); test_assert(message_part_by_idx(parts, 1) == parts->children); - for (i = 1; i < 6; i++) { + for (i = 1; i < 11; i++) { prev_part = part; part = message_part_by_idx(parts, i); test_assert(part != NULL);