[dovecot-cvs] dovecot/src/lib-mail istream-header-filter.c, 1.13, 1.14 istream-header-filter.h, 1.5, 1.6

cras at dovecot.org cras at dovecot.org
Sun Aug 22 13:32:57 EEST 2004


Update of /home/cvs/dovecot/src/lib-mail
In directory talvi:/tmp/cvs-serv4052/lib-mail

Modified Files:
	istream-header-filter.c istream-header-filter.h 
Log Message:
Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
mail.get_headers().



Index: istream-header-filter.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-mail/istream-header-filter.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- istream-header-filter.c	22 Aug 2004 09:13:50 -0000	1.13
+++ istream-header-filter.c	22 Aug 2004 10:32:55 -0000	1.14
@@ -28,8 +28,9 @@
 	unsigned int cur_line, parsed_lines;
 
 	unsigned int header_read:1;
-	unsigned int filter:1;
+	unsigned int exclude:1;
 	unsigned int crlf:1;
+	unsigned int hide_body:1;
 };
 
 static void _close(struct _iostream *stream __attr_unused__)
@@ -88,18 +89,21 @@
 		mstream->cur_line++;
 
 		if (hdr->eoh) {
+			matched = TRUE;
 			if (!mstream->header_read &&
 			    mstream->callback != NULL) {
-				matched = TRUE;
 				mstream->callback(hdr, &matched,
 						  mstream->context);
 			}
 
+			if (!matched)
+				continue;
+
 			if (mstream->crlf)
 				buffer_append(mstream->hdr_buf, "\r\n", 2);
 			else
 				buffer_append_c(mstream->hdr_buf, '\n');
-			break;
+			continue;
 		}
 
 		matched = bsearch(hdr->name, mstream->headers,
@@ -112,7 +116,7 @@
 			mstream->callback(hdr, &matched, mstream->context);
 		}
 
-		if (matched == mstream->filter) {
+		if (matched == mstream->exclude) {
 			/* ignore */
 		} else {
 			if (!hdr->continued) {
@@ -193,6 +197,11 @@
 			return ret;
 	}
 
+	if (mstream->hide_body) {
+		stream->istream.eof = TRUE;
+		return -1;
+	}
+
 	if (mstream->input->v_offset - mstream->header_size.physical_size !=
 	    stream->istream.v_offset - mstream->header_size.virtual_size) {
 		i_stream_seek(mstream->input, stream->istream.v_offset -
@@ -250,7 +259,8 @@
 }
 
 struct istream *
-i_stream_create_header_filter(struct istream *input, int filter, int crlf,
+i_stream_create_header_filter(struct istream *input,
+                              enum header_filter_flags flags,
 			      const char *const *headers, size_t headers_count,
 			      header_filter_callback *callback, void *context)
 {
@@ -258,6 +268,8 @@
 	pool_t pool;
 	size_t i;
 
+	i_assert((flags & (HEADER_FILTER_INCLUDE|HEADER_FILTER_EXCLUDE)) != 0);
+
 	pool = pool_alloconly_create("header filter stream", 1024);
 	mstream = p_new(pool, struct header_filter_istream, 1);
 	mstream->pool = pool;
@@ -273,8 +285,9 @@
 
 	mstream->callback = callback;
 	mstream->context = context;
-	mstream->filter = filter;
-	mstream->crlf = crlf;
+	mstream->exclude = (flags & HEADER_FILTER_EXCLUDE) != 0;
+	mstream->crlf = (flags & HEADER_FILTER_NO_CR) == 0;
+	mstream->hide_body = (flags & HEADER_FILTER_HIDE_BODY) != 0;
 
 	mstream->istream.iostream.close = _close;
 	mstream->istream.iostream.destroy = _destroy;

Index: istream-header-filter.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-mail/istream-header-filter.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- istream-header-filter.h	22 Aug 2004 05:54:54 -0000	1.5
+++ istream-header-filter.h	22 Aug 2004 10:32:55 -0000	1.6
@@ -1,15 +1,27 @@
 #ifndef __ISTREAM_HEADER_FILTER_H
 #define __ISTREAM_HEADER_FILTER_H
 
+enum header_filter_flags {
+	/* Include only specified headers in output.*/
+	HEADER_FILTER_INCLUDE	= 0x01,
+	/* Exclude specified headers from output. */
+	HEADER_FILTER_EXCLUDE	= 0x02,
+
+	/* Use LF linefeeds instead of CRLF. */
+	HEADER_FILTER_NO_CR	= 0x04,
+	/* Return EOF at the beginning of message body. */
+	HEADER_FILTER_HIDE_BODY	= 0x08
+};
+
 struct message_header_line;
 
 typedef void header_filter_callback(struct message_header_line *hdr,
 				    int *matched, void *context);
 
-/* NOTE: headers list must be sorted. If filter is TRUE, given headers are
-   removed from output, otherwise only given headers are included in output. */
+/* NOTE: headers list must be sorted. */
 struct istream *
-i_stream_create_header_filter(struct istream *input, int filter, int crlf,
+i_stream_create_header_filter(struct istream *input,
+			      enum header_filter_flags flags,
 			      const char *const *headers, size_t headers_count,
 			      header_filter_callback *callback, void *context);
 



More information about the dovecot-cvs mailing list