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;