Mercurial > dovecot > original-hg > dovecot-1.2
changeset 7284:346d4a44c2f4 HEAD
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 21 Feb 2008 22:52:38 +0200 |
parents | f70c4d501251 |
children | 958e377fc1dc |
files | src/imap/imap-search.c src/lib-storage/index/index-search.c src/lib-storage/mail-search.c src/lib-storage/mail-search.h |
diffstat | 4 files changed, 48 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/src/imap/imap-search.c Thu Feb 21 22:44:19 2008 +0200 +++ b/src/imap/imap-search.c Thu Feb 21 22:52:38 2008 +0200 @@ -408,7 +408,7 @@ return ARG_NEW_FLAGS(MAIL_SEEN); else if (strcmp(str, "SUBJECT") == 0) { /* <string> */ - return ARG_NEW_HEADER(SEARCH_HEADER, str); + return ARG_NEW_HEADER(SEARCH_HEADER_COMPRESS_LWSP, str); } else if (strcmp(str, "SENTBEFORE") == 0) { /* <date> */ return ARG_NEW_DATE(SEARCH_SENTBEFORE);
--- a/src/lib-storage/index/index-search.c Thu Feb 21 22:44:19 2008 +0200 +++ b/src/lib-storage/index/index-search.c Thu Feb 21 22:52:38 2008 +0200 @@ -328,6 +328,25 @@ return NULL; } +static void compress_lwsp(string_t *dest, const unsigned char *src, + unsigned int src_len) +{ + unsigned int i; + bool prev_lwsp = TRUE; + + for (i = 0; i < src_len; i++) { + if (IS_LWSP(src[i])) { + if (!prev_lwsp) { + prev_lwsp = TRUE; + str_append_c(dest, ' '); + } + } else { + prev_lwsp = FALSE; + str_append_c(dest, src[i]); + } + } +} + static void search_header_arg(struct mail_search_arg *arg, struct search_header_context *ctx) { @@ -335,7 +354,6 @@ struct message_block block; struct message_header_line hdr; int ret; - bool match; /* first check that the field name matches to argument. */ switch (arg->type) { @@ -357,6 +375,7 @@ case SEARCH_HEADER: case SEARCH_HEADER_ADDRESS: + case SEARCH_HEADER_COMPRESS_LWSP: ctx->custom_header = TRUE; if (strcasecmp(ctx->hdr->name, arg->hdr_field_name) != 0) @@ -388,13 +407,18 @@ msg_search_ctx = msg_search_arg_context(ctx->index_context, arg); if (msg_search_ctx == NULL) - match = FALSE; - else if (arg->type == SEARCH_HEADER_ADDRESS) { - /* we have to match against normalized address */ - T_BEGIN { - struct message_address *addr; - string_t *str; + return; + + T_BEGIN { + struct message_address *addr; + string_t *str; + switch (arg->type) { + case SEARCH_HEADER: + /* simple match */ + break; + case SEARCH_HEADER_ADDRESS: + /* we have to match against normalized address */ addr = message_address_parse(pool_datastack_create(), ctx->hdr->full_value, ctx->hdr->full_value_len, @@ -403,19 +427,21 @@ message_address_write(str, addr); hdr.value = hdr.full_value = str_data(str); hdr.value_len = hdr.full_value_len = str_len(str); - match = message_search_more(msg_search_ctx, &block); - } T_END; - } else { - match = message_search_more(msg_search_ctx, &block); - } + break; + case SEARCH_HEADER_COMPRESS_LWSP: + /* convert LWSP to single spaces */ + str = t_str_new(hdr.full_value_len); + compress_lwsp(str, hdr.full_value, hdr.full_value_len); + hdr.value = hdr.full_value = str_data(str); + hdr.value_len = hdr.full_value_len = str_len(str); + break; + default: + i_unreached(); + } + ret = message_search_more(msg_search_ctx, &block) ? 1 : 0; + } T_END; - if (match || - (arg->type != SEARCH_HEADER && - arg->type != SEARCH_HEADER_ADDRESS)) { - /* set only when we definitely know if it's a match */ - ret = match ? 1 : 0; - ARG_SET_RESULT(arg, ret); - } + ARG_SET_RESULT(arg, ret); } static void search_header_unmatch(struct mail_search_arg *arg,
--- a/src/lib-storage/mail-search.c Thu Feb 21 22:44:19 2008 +0200 +++ b/src/lib-storage/mail-search.c Thu Feb 21 22:52:38 2008 +0200 @@ -139,6 +139,7 @@ break; case SEARCH_HEADER: case SEARCH_HEADER_ADDRESS: + case SEARCH_HEADER_COMPRESS_LWSP: buffer_append(headers, &arg->hdr_field_name, sizeof(const char *)); break;