changeset 7030:1a89a1509e81 HEAD

Use istream_private->parent pointer globally instead of each filter stream having its own.
author Timo Sirainen <tss@iki.fi>
date Sat, 22 Dec 2007 04:48:33 +0200
parents 595b600ddf8b
children 4b51ee73ed51
files src/lib-mail/istream-header-filter.c src/lib-storage/index/mbox/istream-raw-mbox.c src/lib/istream-crlf.c src/lib/istream-internal.h src/lib/istream-limit.c
diffstat 5 files changed, 72 insertions(+), 73 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-mail/istream-header-filter.c	Sat Dec 22 03:52:30 2007 +0200
+++ b/src/lib-mail/istream-header-filter.c	Sat Dec 22 04:48:33 2007 +0200
@@ -12,7 +12,6 @@
 	struct istream_private istream;
 	pool_t pool;
 
-	struct istream *input;
 	struct message_header_parser_ctx *hdr_ctx;
 	uoff_t start_offset;
 
@@ -45,7 +44,7 @@
 
 	if (mstream->hdr_ctx != NULL)
 		message_parse_header_deinit(&mstream->hdr_ctx);
-	i_stream_unref(&mstream->input);
+	i_stream_unref(&mstream->istream.parent);
 	if (array_is_created(&mstream->match_change_lines))
 		array_free(&mstream->match_change_lines);
 	pool_unref(&mstream->pool);
@@ -59,7 +58,7 @@
 		(struct header_filter_istream *)stream;
 
 	mstream->istream.max_buffer_size = max_size;
-	i_stream_set_max_buffer_size(mstream->input, max_size);
+	i_stream_set_max_buffer_size(mstream->istream.parent, max_size);
 }
 
 static ssize_t
@@ -74,17 +73,17 @@
 		return -1;
 	}
 
-	data = i_stream_get_data(mstream->input, &pos);
+	data = i_stream_get_data(mstream->istream.parent, &pos);
 	if (pos == body_highwater_size) {
-		ret = i_stream_read(mstream->input);
+		ret = i_stream_read(mstream->istream.parent);
 		mstream->istream.istream.stream_errno =
-			mstream->input->stream_errno;
-		mstream->istream.istream.eof = mstream->input->eof;
+			mstream->istream.parent->stream_errno;
+		mstream->istream.istream.eof = mstream->istream.parent->eof;
 
 		if (ret <= 0)
 			return ret;
 
-		data = i_stream_get_data(mstream->input, &pos);
+		data = i_stream_get_data(mstream->istream.parent, &pos);
 	}
 	i_assert(pos > body_highwater_size);
 	buffer_append(mstream->hdr_buf, data + body_highwater_size,
@@ -128,7 +127,8 @@
 
 	if (mstream->hdr_ctx == NULL) {
 		mstream->hdr_ctx =
-			message_parse_header_init(mstream->input, NULL, 0);
+			message_parse_header_init(mstream->istream.parent,
+						  NULL, 0);
 	}
 
 	/* remove skipped data from hdr_buf */
@@ -250,7 +250,8 @@
 		mstream->header_parsed = TRUE;
 		mstream->header_read = TRUE;
 
-		mstream->header_size.physical_size = mstream->input->v_offset;
+		mstream->header_size.physical_size =
+			mstream->istream.parent->v_offset;
 		mstream->header_size.virtual_size =
 			mstream->istream.istream.v_offset + pos;
 	}
@@ -287,7 +288,7 @@
 		return -1;
 	}
 
-	i_stream_seek(mstream->input, mstream->start_offset +
+	i_stream_seek(stream->parent, mstream->start_offset +
 		      stream->istream.v_offset -
 		      mstream->header_size.virtual_size +
 		      mstream->header_size.physical_size);
@@ -295,13 +296,13 @@
 	stream->pos -= stream->skip;
 	stream->skip = 0;
 
-	stream->buffer = i_stream_get_data(mstream->input, &pos);
+	stream->buffer = i_stream_get_data(stream->parent, &pos);
 	if (pos <= stream->pos) {
-		if ((ret = i_stream_read(mstream->input)) == -2)
+		if ((ret = i_stream_read(stream->parent)) == -2)
 			return -2;
-		stream->istream.stream_errno = mstream->input->stream_errno;
-		stream->istream.eof = mstream->input->eof;
-		stream->buffer = i_stream_get_data(mstream->input, &pos);
+		stream->istream.stream_errno = stream->parent->stream_errno;
+		stream->istream.eof = stream->parent->eof;
+		stream->buffer = i_stream_get_data(stream->parent, &pos);
 	} else {
 		ret = 0;
 	}
@@ -345,7 +346,7 @@
 	if (v_offset < mstream->header_size.virtual_size) {
 		/* seek into headers. we'll have to re-parse them, use
 		   skip_count to set the wanted position */
-		i_stream_seek(mstream->input, mstream->start_offset);
+		i_stream_seek(stream->parent, mstream->start_offset);
 		mstream->skip_count = v_offset;
 		mstream->cur_line = 0;
 		mstream->header_read = FALSE;
@@ -353,7 +354,7 @@
 		/* body */
 		v_offset += mstream->header_size.physical_size -
 			mstream->header_size.virtual_size;
-		i_stream_seek(mstream->input, mstream->start_offset + v_offset);
+		i_stream_seek(stream->parent, mstream->start_offset + v_offset);
 	}
 }
 
@@ -370,7 +371,7 @@
 		(struct header_filter_istream *)stream;
 	const struct stat *st;
 
-	st = i_stream_stat(mstream->input, exact);
+	st = i_stream_stat(stream->parent, exact);
 	if (st == NULL || st->st_size == -1 || !exact)
 		return st;
 
@@ -400,8 +401,8 @@
 	mstream->pool = pool_alloconly_create("header filter stream", 4096);
 	mstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
 
-	mstream->input = input;
-	i_stream_ref(mstream->input);
+	mstream->istream.parent = input;
+	i_stream_ref(mstream->istream.parent);
 
 	mstream->headers = headers_count == 0 ? NULL :
 		p_new(mstream->pool, const char *, headers_count);
--- a/src/lib-storage/index/mbox/istream-raw-mbox.c	Sat Dec 22 03:52:30 2007 +0200
+++ b/src/lib-storage/index/mbox/istream-raw-mbox.c	Sat Dec 22 04:48:33 2007 +0200
@@ -13,7 +13,6 @@
 	char *sender, *next_sender;
 
 	uoff_t from_offset, hdr_offset, body_offset, mail_size;
-	struct istream *input;
 	uoff_t input_peak_offset;
 
 	unsigned int crlf_ending:1;
@@ -28,8 +27,9 @@
 	i_free(rstream->sender);
 	i_free(rstream->next_sender);
 
-	i_stream_seek(rstream->input, rstream->istream.istream.v_offset);
-	i_stream_unref(&rstream->input);
+	i_stream_seek(rstream->istream.parent,
+		      rstream->istream.istream.v_offset);
+	i_stream_unref(&rstream->istream.parent);
 }
 
 static void
@@ -39,7 +39,7 @@
 	struct raw_mbox_istream *rstream = (struct raw_mbox_istream *)stream;
 
 	rstream->istream.max_buffer_size = max_size;
-	i_stream_set_max_buffer_size(rstream->input, max_size);
+	i_stream_set_max_buffer_size(rstream->istream.parent, max_size);
 }
 
 static int mbox_read_from_line(struct raw_mbox_istream *rstream)
@@ -50,7 +50,7 @@
 	size_t pos, line_pos;
 	int skip;
 
-	buf = i_stream_get_data(rstream->input, &pos);
+	buf = i_stream_get_data(rstream->istream.parent, &pos);
 	i_assert(pos > 0);
 
 	/* from_offset points to "\nFrom ", so unless we're at the beginning
@@ -60,11 +60,11 @@
 		skip++;
 
 	while ((p = memchr(buf+skip, '\n', pos-skip)) == NULL) {
-		if (i_stream_read(rstream->input) < 0) {
+		if (i_stream_read(rstream->istream.parent) < 0) {
 			/* EOF - shouldn't happen */
 			return -1;
 		}
-		buf = i_stream_get_data(rstream->input, &pos);
+		buf = i_stream_get_data(rstream->istream.parent, &pos);
 		i_assert(pos > 0);
 	}
 	line_pos = (size_t)(p - buf);
@@ -94,7 +94,7 @@
 
 	/* we'll skip over From-line */
 	rstream->istream.istream.v_offset += line_pos+1;
-	i_stream_skip(rstream->input, line_pos+1);
+	i_stream_skip(rstream->istream.parent, line_pos+1);
 	rstream->hdr_offset = rstream->istream.istream.v_offset;
 	return 0;
 }
@@ -137,7 +137,7 @@
 	if (stream->istream.eof)
 		return -1;
 
-	i_stream_seek(rstream->input, stream->istream.v_offset);
+	i_stream_seek(stream->parent, stream->istream.v_offset);
 
 	stream->pos -= stream->skip;
 	stream->skip = 0;
@@ -145,7 +145,7 @@
 
 	ret = 0;
 	do {
-		buf = i_stream_get_data(rstream->input, &pos);
+		buf = i_stream_get_data(stream->parent, &pos);
 		if (pos > 1 && stream->istream.v_offset + pos >
 		    rstream->input_peak_offset) {
 			/* fake our read count. needed because if in the end
@@ -155,9 +155,9 @@
 			ret = pos;
 			break;
 		}
-		ret = i_stream_read(rstream->input);
+		ret = i_stream_read(stream->parent);
 	} while (ret > 0);
-	stream->istream.stream_errno = rstream->input->stream_errno;
+	stream->istream.stream_errno = stream->parent->stream_errno;
 
 	if (ret < 0) {
 		if (ret == -2) {
@@ -214,7 +214,7 @@
 
 		/* got it. we don't want to return it however,
 		   so start again from headers */
-		buf = i_stream_get_data(rstream->input, &pos);
+		buf = i_stream_get_data(stream->parent, &pos);
 		if (pos == 0)
 			return i_stream_raw_mbox_read(stream);
 	}
@@ -321,7 +321,7 @@
 {
 	struct raw_mbox_istream *rstream = (struct raw_mbox_istream *)stream;
 
-	i_stream_sync(rstream->input);
+	i_stream_sync(stream->parent);
 
 	rstream->istream.skip = 0;
 	rstream->istream.pos = 0;
@@ -330,10 +330,9 @@
 static const struct stat *
 i_stream_raw_mbox_stat(struct istream_private *stream, bool exact)
 {
-	struct raw_mbox_istream *rstream = (struct raw_mbox_istream *)stream;
 	const struct stat *st;
 
-	st = i_stream_stat(rstream->input, exact);
+	st = i_stream_stat(stream->parent, exact);
 	if (st == NULL)
 		return NULL;
 
@@ -350,17 +349,17 @@
 
 	rstream = i_new(struct raw_mbox_istream, 1);
 
-	rstream->input = input;
 	rstream->body_offset = (uoff_t)-1;
 	rstream->mail_size = (uoff_t)-1;
 	rstream->received_time = (time_t)-1;
 	rstream->next_received_time = (time_t)-1;
 
-	rstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
 	rstream->istream.iostream.destroy = i_stream_raw_mbox_destroy;
 	rstream->istream.iostream.set_max_buffer_size =
 		i_stream_raw_mbox_set_max_buffer_size;
 
+	rstream->istream.parent = input;
+	rstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
 	rstream->istream.read = i_stream_raw_mbox_read;
 	rstream->istream.seek = i_stream_raw_mbox_seek;
 	rstream->istream.sync = i_stream_raw_mbox_sync;
@@ -380,7 +379,7 @@
 	char *sender;
 
 	/* minimal: "From x Thu Nov 29 22:33:52 2001" = 31 chars */
-	if (i_stream_read_data(rstream->input, &data, &size, 30) == -1)
+	if (i_stream_read_data(rstream->istream.parent, &data, &size, 30) == -1)
 		return -1;
 
 	if ((size == 1 && data[0] == '\n') ||
@@ -400,7 +399,8 @@
 	}
 
 	while (memchr(data, '\n', size) == NULL) {
-		if (i_stream_read_data(rstream->input, &data, &size, size) < 0)
+		if (i_stream_read_data(rstream->istream.parent,
+				       &data, &size, size) < 0)
 			break;
 	}
 
@@ -485,7 +485,8 @@
 	}
 
 	if (body_size != (uoff_t)-1) {
-		i_stream_seek(rstream->input, rstream->body_offset + body_size);
+		i_stream_seek(rstream->istream.parent,
+			      rstream->body_offset + body_size);
 		if (istream_raw_mbox_is_valid_from(rstream) > 0) {
 			rstream->mail_size = body_size +
 				(rstream->body_offset - rstream->hdr_offset);
@@ -551,7 +552,7 @@
 
 	if (stream->v_offset != rstream->from_offset)
 		i_stream_seek_mark(stream, rstream->from_offset);
-	i_stream_seek_mark(rstream->input, rstream->from_offset);
+	i_stream_seek_mark(rstream->istream.parent, rstream->from_offset);
 
 	rstream->eof = FALSE;
 	rstream->istream.istream.eof = FALSE;
@@ -594,7 +595,7 @@
 	}
 
 	i_stream_seek_mark(stream, offset);
-	i_stream_seek_mark(rstream->input, offset);
+	i_stream_seek_mark(rstream->istream.parent, offset);
 
 	if (check)
 		(void)i_stream_raw_mbox_read(&rstream->istream);
--- a/src/lib/istream-crlf.c	Sat Dec 22 03:52:30 2007 +0200
+++ b/src/lib/istream-crlf.c	Sat Dec 22 04:48:33 2007 +0200
@@ -7,7 +7,6 @@
 struct crlf_istream {
 	struct istream_private istream;
 
-	struct istream *input;
 	unsigned int pending_cr:1;
 	unsigned int last_cr:1;
 };
@@ -17,7 +16,7 @@
 	struct crlf_istream *cstream = (struct crlf_istream *)stream;
 
 	i_free(cstream->istream.w_buffer);
-	i_stream_unref(&cstream->input);
+	i_stream_unref(&cstream->istream.parent);
 }
 
 static void
@@ -27,7 +26,7 @@
 	struct crlf_istream *cstream = (struct crlf_istream *)stream;
 
 	cstream->istream.max_buffer_size = max_size;
-	i_stream_set_max_buffer_size(cstream->input, max_size);
+	i_stream_set_max_buffer_size(cstream->istream.parent, max_size);
 }
 
 static int i_stream_crlf_read_common(struct crlf_istream *cstream)
@@ -37,16 +36,16 @@
 	size_t size;
 	ssize_t ret;
 
-	data = i_stream_get_data(cstream->input, &size);
+	data = i_stream_get_data(stream->parent, &size);
 	if (size == 0) {
-		ret = i_stream_read(cstream->input);
+		ret = i_stream_read(stream->parent);
 		if (ret <= 0 && (ret != -2 || stream->skip == 0)) {
 			stream->istream.stream_errno =
-				cstream->input->stream_errno;
-			stream->istream.eof = cstream->input->eof;
+				stream->parent->stream_errno;
+			stream->istream.eof = stream->parent->eof;
 			return ret;
 		}
-		data = i_stream_get_data(cstream->input, &size);
+		data = i_stream_get_data(stream->parent, &size);
 		i_assert(size != 0);
 	}
 
@@ -66,7 +65,7 @@
 	if (ret <= 0)
 		return ret;
 
-	data = i_stream_get_data(cstream->input, &size);
+	data = i_stream_get_data(stream->parent, &size);
 
 	/* @UNSAFE: add missing CRs */
 	dest = stream->pos;
@@ -85,7 +84,7 @@
 		stream->w_buffer[dest++] = data[i];
 	}
 	cstream->last_cr = stream->w_buffer[dest-1] == '\r';
-	i_stream_skip(cstream->input, i);
+	i_stream_skip(stream->parent, i);
 
 	ret = dest - stream->pos;
 	i_assert(ret != 0);
@@ -105,7 +104,7 @@
 	if (ret <= 0)
 		return ret;
 
-	data = i_stream_get_data(cstream->input, &size);
+	data = i_stream_get_data(stream->parent, &size);
 
 	/* @UNSAFE */
 	dest = stream->pos;
@@ -141,7 +140,7 @@
 		stream->w_buffer[dest++] = data[i];
 	}
 	cstream->pending_cr = data[i+diff] == '\r';
-	i_stream_skip(cstream->input, i);
+	i_stream_skip(stream->parent, i);
 
 	ret = dest - stream->pos;
 	if (ret == 0) {
@@ -162,9 +161,7 @@
 static const struct stat *
 i_stream_crlf_stat(struct istream_private *stream, bool exact)
 {
-	struct crlf_istream *cstream = (struct crlf_istream *)stream;
-
-	return i_stream_stat(cstream->input, exact);
+	return i_stream_stat(stream->parent, exact);
 }
 
 static struct istream *
@@ -175,13 +172,13 @@
 	i_stream_ref(input);
 
 	cstream = i_new(struct crlf_istream, 1);
-	cstream->input = input;
 	cstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
 
 	cstream->istream.iostream.destroy = i_stream_crlf_destroy;
 	cstream->istream.iostream.set_max_buffer_size =
 		i_stream_crlf_set_max_buffer_size;
 
+	cstream->istream.parent = input;
 	cstream->istream.read = crlf ? i_stream_crlf_read_crlf :
 		i_stream_crlf_read_lf;
 	cstream->istream.seek = i_stream_crlf_seek;
--- a/src/lib/istream-internal.h	Sat Dec 22 03:52:30 2007 +0200
+++ b/src/lib/istream-internal.h	Sat Dec 22 04:48:33 2007 +0200
@@ -30,6 +30,7 @@
 	size_t buffer_size, max_buffer_size;
 	size_t skip, pos;
 
+	struct istream *parent; /* for filter streams */
 	string_t *line_str; /* for i_stream_next_line() if w_buffer == NULL */
 };
 
--- a/src/lib/istream-limit.c	Sat Dec 22 03:52:30 2007 +0200
+++ b/src/lib/istream-limit.c	Sat Dec 22 04:48:33 2007 +0200
@@ -6,7 +6,6 @@
 struct limit_istream {
 	struct istream_private istream;
 
-	struct istream *input;
 	uoff_t v_start_offset, v_size;
 };
 
@@ -15,9 +14,9 @@
 	struct limit_istream *lstream = (struct limit_istream *) stream;
 
 	/* get to same position in parent stream */
-	i_stream_seek(lstream->input, lstream->v_start_offset +
+	i_stream_seek(lstream->istream.parent, lstream->v_start_offset +
 		      lstream->istream.istream.v_offset);
-	i_stream_unref(&lstream->input);
+	i_stream_unref(&lstream->istream.parent);
 }
 
 static void
@@ -27,7 +26,7 @@
 	struct limit_istream *lstream = (struct limit_istream *) stream;
 
 	lstream->istream.max_buffer_size = max_size;
-	i_stream_set_max_buffer_size(lstream->input, max_size);
+	i_stream_set_max_buffer_size(lstream->istream.parent, max_size);
 }
 
 static ssize_t i_stream_limit_read(struct istream_private *stream)
@@ -43,21 +42,21 @@
 		return -1;
 	}
 
-	if (lstream->input->v_offset !=
+	if (stream->parent->v_offset !=
 	    lstream->v_start_offset + stream->istream.v_offset) {
-		i_stream_seek(lstream->input,
+		i_stream_seek(stream->parent,
 			      lstream->v_start_offset +
 			      stream->istream.v_offset);
 	}
 
-	stream->buffer = i_stream_get_data(lstream->input, &pos);
+	stream->buffer = i_stream_get_data(stream->parent, &pos);
 	if (pos <= stream->pos) {
-		if ((ret = i_stream_read(lstream->input)) == -2)
+		if ((ret = i_stream_read(stream->parent)) == -2)
 			return -2;
 
-		stream->istream.stream_errno = lstream->input->stream_errno;
-		stream->istream.eof = lstream->input->eof;
-		stream->buffer = i_stream_get_data(lstream->input, &pos);
+		stream->istream.stream_errno = stream->parent->stream_errno;
+		stream->istream.eof = stream->parent->eof;
+		stream->buffer = i_stream_get_data(stream->parent, &pos);
 	} else {
 		ret = 0;
 	}
@@ -97,7 +96,7 @@
 	struct limit_istream *lstream = (struct limit_istream *) stream;
 	const struct stat *st;
 
-	st = i_stream_stat(lstream->input, exact);
+	st = i_stream_stat(stream->parent, exact);
 	if (st == NULL)
 		return NULL;
 
@@ -115,7 +114,6 @@
 	i_stream_ref(input);
 
 	lstream = i_new(struct limit_istream, 1);
-	lstream->input = input;
 	lstream->v_start_offset = v_start_offset;
 	lstream->v_size = v_size;
 	lstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
@@ -129,6 +127,7 @@
 	lstream->istream.iostream.set_max_buffer_size =
 		i_stream_limit_set_max_buffer_size;
 
+	lstream->istream.parent = input;
 	lstream->istream.read = i_stream_limit_read;
 	lstream->istream.seek = i_stream_limit_seek;
 	lstream->istream.stat = i_stream_limit_stat;