[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