Mercurial > dovecot > core-2.2
diff src/lib-mail/istream-header-filter.c @ 2327:7d02e2a7672d HEAD
Header caching redesigned. New design allows caching decisions per field, so
they can be divided to temporary/permanent. Cached headers are now always
returned in original order, old code didn't guarantee it. Some other caching
changes. (still missing code to store changes in caching decisions)
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 18 Jul 2004 05:25:06 +0300 |
parents | 545c1d3ead54 |
children | 8ef002a26f1c |
line wrap: on
line diff
--- a/src/lib-mail/istream-header-filter.c Sun Jul 18 04:44:59 2004 +0300 +++ b/src/lib-mail/istream-header-filter.c Sun Jul 18 05:25:06 2004 +0300 @@ -112,14 +112,16 @@ } } -static void read_and_hide_headers(struct istream *input, - const char *const *headers, - size_t headers_count, buffer_t *dest, - struct message_size *hdr_size) +static void +read_and_hide_headers(struct istream *input, int filter, + const char *const *headers, size_t headers_count, + buffer_t *dest, struct message_size *hdr_size, + header_filter_callback *callback, void *context) { struct message_header_parser_ctx *hdr_ctx; struct message_header_line *hdr; uoff_t virtual_size = 0; + int matched; hdr_ctx = message_parse_header_init(input, hdr_size, FALSE); while ((hdr = message_parse_header_next(hdr_ctx)) != NULL) { @@ -131,8 +133,12 @@ break; } - if (bsearch(hdr->name, headers, headers_count, - sizeof(*headers), bsearch_strcasecmp) != NULL) { + matched = bsearch(hdr->name, headers, headers_count, + sizeof(*headers), bsearch_strcasecmp) != NULL; + if (callback != NULL) + callback(hdr, matched, context); + + if (matched == filter) { /* ignore */ } else if (dest != NULL) { if (!hdr->continued) { @@ -157,8 +163,9 @@ } struct istream * -i_stream_create_header_filter(pool_t pool, struct istream *input, - const char *const *headers, size_t headers_count) +i_stream_create_header_filter(pool_t pool, struct istream *input, int filter, + const char *const *headers, size_t headers_count, + header_filter_callback *callback, void *context) { struct header_filter_istream *mstream; @@ -168,8 +175,11 @@ mstream->headers = buffer_create_dynamic(default_pool, 8192, (size_t)-1); - read_and_hide_headers(input, headers, headers_count, mstream->headers, - &mstream->header_size); + read_and_hide_headers(input, filter, headers, headers_count, + mstream->headers, &mstream->header_size, + callback, context); + if (callback != NULL) + callback(NULL, FALSE, context); mstream->istream.buffer = buffer_get_data(mstream->headers, NULL); mstream->istream.pos = mstream->header_size.virtual_size;