Mercurial > dovecot > original-hg > dovecot-1.1
changeset 8299:b53614de6483 HEAD
Threading code was using a copy of message_id_get_next() code.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 01 Jun 2009 01:45:53 -0400 |
parents | 553dce8f6185 |
children | 7f6aaca52639 |
files | src/imap/imap-thread.c |
diffstat | 1 files changed, 5 insertions(+), 124 deletions(-) [+] |
line wrap: on
line diff
--- a/src/imap/imap-thread.c Mon Jun 01 00:41:52 2009 -0400 +++ b/src/imap/imap-thread.c Mon Jun 01 01:45:53 2009 -0400 @@ -31,6 +31,7 @@ #include "hash.h" #include "ostream.h" #include "str.h" +#include "message-id.h" #include "rfc822-parser.h" #include "imap-base-subject.h" #include "mail-storage.h" @@ -223,126 +224,6 @@ return node; } -static bool get_untokenized_msgid(const char **msgid_p, string_t *msgid) -{ - struct rfc822_parser_context parser; - - rfc822_parser_init(&parser, (const unsigned char *)*msgid_p, - strlen(*msgid_p), NULL); - - /* - msg-id = [CFWS] "<" id-left "@" id-right ">" [CFWS] - id-left = dot-atom-text / no-fold-quote / obs-id-left - id-right = dot-atom-text / no-fold-literal / obs-id-right - no-fold-quote = DQUOTE *(qtext / quoted-pair) DQUOTE - no-fold-literal = "[" *(dtext / quoted-pair) "]" - */ - - (void)rfc822_skip_lwsp(&parser); - - if (rfc822_parse_dot_atom(&parser, msgid) <= 0) - return FALSE; - - if (*parser.data != '@') - return FALSE; - parser.data++; - (void)rfc822_skip_lwsp(&parser); - - if (rfc822_parse_dot_atom(&parser, msgid) <= 0) - return FALSE; - - if (*parser.data != '>') - return FALSE; - - *msgid_p = (const char *)parser.data + 1; - return TRUE; -} - -static void strip_lwsp(char *str) -{ - /* @UNSAFE */ - char *dest; - - /* find the first lwsp */ - while (*str != ' ' && *str != '\t' && *str != '\r' && *str != '\n') { - if (*str == '\0') - return; - str++; - } - - for (dest = str; *str != '\0'; str++) { - if (*str != ' ' && *str != '\t' && *str != '\r' && *str != '\n') - *dest++ = *str; - } - *dest = '\0'; -} - -static const char *get_msgid(const char **msgid_p) -{ - const char *msgid = *msgid_p; - const char *p; - string_t *str = NULL; - bool found_at; - - if (*msgid_p == NULL) - return NULL; - - for (;;) { - /* skip until '<' */ - while (*msgid != '<') { - if (*msgid == '\0') { - *msgid_p = msgid; - return NULL; - } - msgid++; - } - msgid++; - - /* check it through quickly to see if it's already normalized */ - p = msgid; found_at = FALSE; - for (;; p++) { - if ((unsigned char)*p >= 'A') /* matches most */ - continue; - - if (*p == '@') - found_at = TRUE; - if (*p == '>' || *p == '"' || *p == '(' || *p == '[') - break; - - if (*p == '\0') { - *msgid_p = p; - return NULL; - } - } - - if (*p == '>') { - *msgid_p = p+1; - if (found_at) { - char *s; - - s = p_strdup_until(unsafe_data_stack_pool, - msgid, p); - strip_lwsp(s); - return s; - } - } else { - /* ok, do it the slow way */ - *msgid_p = msgid; - - if (str == NULL) { - /* allocate only once, so we don't leak - with multiple invalid message IDs */ - str = t_str_new(256); - } - if (get_untokenized_msgid(msgid_p, str)) - return str_c(str); - } - - /* invalid message id, see if there's another valid one */ - msgid = *msgid_p; - } -} - static void unlink_child(struct thread_context *ctx, struct node *child, bool add_to_root) { @@ -427,11 +308,11 @@ { const char *parent_id, *child_id; - parent_id = get_msgid(&references); + parent_id = message_id_get_next(&references); if (parent_id == NULL) return FALSE; - while ((child_id = get_msgid(&references)) != NULL) { + while ((child_id = message_id_get_next(&references)) != NULL) { link_message(ctx, parent_id, child_id, FALSE); parent_id = child_id; } @@ -456,7 +337,7 @@ if (mail_get_first_header(mail, "message-id", &message_id) < 0) message_id = NULL; - node = update_message(ctx, get_msgid(&message_id), sent_date, + node = update_message(ctx, message_id_get_next(&message_id), sent_date, ctx->id_is_uid ? mail->uid : mail->seq); /* link references */ @@ -468,7 +349,7 @@ &in_reply_to) <= 0) refid = NULL; else - refid = get_msgid(&in_reply_to); + refid = message_id_get_next(&in_reply_to); if (refid != NULL) link_node(ctx, refid, node, TRUE);