changeset 7032:85cf52f0bc64 HEAD

i_stream_create() now takes parent stream as parameter and internally sets abs_start_offset correctly. Added parent_start_offset which is used by filters instead of their own internal start_offset.
author Timo Sirainen <tss@iki.fi>
date Sat, 22 Dec 2007 05:15:51 +0200
parents 4b51ee73ed51
children 5b40343e96c7
files src/lib-mail/istream-header-filter.c src/lib-storage/index/mbox/istream-raw-mbox.c src/lib/istream-concat.c src/lib/istream-crlf.c src/lib/istream-data.c src/lib/istream-file.c src/lib/istream-internal.h src/lib/istream-limit.c src/lib/istream-mmap.c src/lib/istream-seekable.c src/lib/istream-tee.c src/lib/istream.c src/plugins/zlib/istream-zlib.c
diffstat 13 files changed, 39 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-mail/istream-header-filter.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib-mail/istream-header-filter.c	Sat Dec 22 05:15:51 2007 +0200
@@ -13,7 +13,6 @@
 	pool_t pool;
 
 	struct message_header_parser_ctx *hdr_ctx;
-	uoff_t start_offset;
 
 	const char **headers;
 	unsigned int headers_count;
@@ -288,7 +287,7 @@
 		return -1;
 	}
 
-	i_stream_seek(stream->parent, mstream->start_offset +
+	i_stream_seek(stream->parent, mstream->istream.parent_start_offset +
 		      stream->istream.v_offset -
 		      mstream->header_size.virtual_size +
 		      mstream->header_size.physical_size);
@@ -346,7 +345,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(stream->parent, mstream->start_offset);
+		i_stream_seek(stream->parent, stream->parent_start_offset);
 		mstream->skip_count = v_offset;
 		mstream->cur_line = 0;
 		mstream->header_read = FALSE;
@@ -354,7 +353,8 @@
 		/* body */
 		v_offset += mstream->header_size.physical_size -
 			mstream->header_size.virtual_size;
-		i_stream_seek(stream->parent, mstream->start_offset + v_offset);
+		i_stream_seek(stream->parent,
+			      stream->parent_start_offset + v_offset);
 	}
 }
 
@@ -401,9 +401,6 @@
 	mstream->pool = pool_alloconly_create("header filter stream", 4096);
 	mstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
 
-	mstream->istream.parent = input;
-	i_stream_ref(mstream->istream.parent);
-
 	mstream->headers = headers_count == 0 ? NULL :
 		p_new(mstream->pool, const char *, headers_count);
 	for (i = 0; i < headers_count; i++) 
@@ -416,7 +413,6 @@
 	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->start_offset = input->v_offset;
 
 	mstream->istream.iostream.destroy = i_stream_header_filter_destroy;
 	mstream->istream.iostream.set_max_buffer_size =
@@ -429,5 +425,7 @@
 
 	mstream->istream.istream.blocking = input->blocking;
 	mstream->istream.istream.seekable = input->seekable;
-	return i_stream_create(&mstream->istream, -1, 0);
+
+	i_stream_ref(input);
+	return i_stream_create(&mstream->istream, input, -1);
 }
--- a/src/lib-storage/index/mbox/istream-raw-mbox.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib-storage/index/mbox/istream-raw-mbox.c	Sat Dec 22 05:15:51 2007 +0200
@@ -345,7 +345,7 @@
 {
 	struct raw_mbox_istream *rstream;
 
-	i_stream_ref(input);
+	i_assert(input->v_offset == 0);
 
 	rstream = i_new(struct raw_mbox_istream, 1);
 
@@ -358,7 +358,6 @@
 	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;
@@ -367,8 +366,9 @@
 
 	rstream->istream.istream.blocking = input->blocking;
 	rstream->istream.istream.seekable = input->seekable;
-	return i_stream_create(&rstream->istream, -1,
-			       input->real_stream->abs_start_offset);
+
+	i_stream_ref(input);
+	return i_stream_create(&rstream->istream, input, -1);
 }
 
 static int istream_raw_mbox_is_valid_from(struct raw_mbox_istream *rstream)
--- a/src/lib/istream-concat.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib/istream-concat.c	Sat Dec 22 05:15:51 2007 +0200
@@ -271,5 +271,5 @@
 
 	cstream->istream.istream.blocking = blocking;
 	cstream->istream.istream.seekable = seekable;
-	return i_stream_create(&cstream->istream, -1, 0);
+	return i_stream_create(&cstream->istream, NULL, -1);
 }
--- a/src/lib/istream-crlf.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib/istream-crlf.c	Sat Dec 22 05:15:51 2007 +0200
@@ -178,7 +178,6 @@
 	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;
@@ -186,7 +185,8 @@
 
 	cstream->istream.istream.blocking = input->blocking;
 	cstream->istream.istream.seekable = input->seekable;
-	return i_stream_create(&cstream->istream, i_stream_get_fd(input), 0);
+	return i_stream_create(&cstream->istream, input,
+			       i_stream_get_fd(input));
 }
 
 struct istream *i_stream_create_crlf(struct istream *input)
--- a/src/lib/istream-data.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib/istream-data.c	Sat Dec 22 05:15:51 2007 +0200
@@ -29,7 +29,7 @@
 
 	stream->istream.blocking = TRUE;
 	stream->istream.seekable = TRUE;
-	(void)i_stream_create(stream, -1, 0);
+	(void)i_stream_create(stream, NULL, -1);
 	stream->statbuf.st_size = size;
 	return &stream->istream;
 }
--- a/src/lib/istream-file.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib/istream-file.c	Sat Dec 22 05:15:51 2007 +0200
@@ -166,5 +166,5 @@
 		fstream->istream.istream.seekable = TRUE;
 	}
 
-	return i_stream_create(&fstream->istream, fd, 0);
+	return i_stream_create(&fstream->istream, NULL, fd);
 }
--- a/src/lib/istream-internal.h	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib/istream-internal.h	Sat Dec 22 05:15:51 2007 +0200
@@ -31,12 +31,13 @@
 	size_t skip, pos;
 
 	struct istream *parent; /* for filter streams */
+	uoff_t parent_start_offset;
+
 	string_t *line_str; /* for i_stream_next_line() if w_buffer == NULL */
 };
 
 struct istream *
-i_stream_create(struct istream_private *stream,
-		int fd, uoff_t abs_start_offset);
+i_stream_create(struct istream_private *stream, struct istream *parent, int fd);
 
 void i_stream_compress(struct istream_private *stream);
 void i_stream_grow_buffer(struct istream_private *stream, size_t bytes);
--- a/src/lib/istream-limit.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib/istream-limit.c	Sat Dec 22 05:15:51 2007 +0200
@@ -6,7 +6,7 @@
 struct limit_istream {
 	struct istream_private istream;
 
-	uoff_t v_start_offset, v_size;
+	uoff_t v_size;
 };
 
 static void i_stream_limit_destroy(struct iostream_private *stream)
@@ -14,7 +14,8 @@
 	struct limit_istream *lstream = (struct limit_istream *) stream;
 
 	/* get to same position in parent stream */
-	i_stream_seek(lstream->istream.parent, lstream->v_start_offset +
+	i_stream_seek(lstream->istream.parent,
+		      lstream->istream.parent_start_offset +
 		      lstream->istream.istream.v_offset);
 	i_stream_unref(&lstream->istream.parent);
 }
@@ -43,9 +44,9 @@
 	}
 
 	if (stream->parent->v_offset !=
-	    lstream->v_start_offset + stream->istream.v_offset) {
+	    lstream->istream.parent_start_offset + stream->istream.v_offset) {
 		i_stream_seek(stream->parent,
-			      lstream->v_start_offset +
+			      lstream->istream.parent_start_offset +
 			      stream->istream.v_offset);
 	}
 
@@ -113,7 +114,6 @@
 	i_stream_ref(input);
 
 	lstream = i_new(struct limit_istream, 1);
-	lstream->v_start_offset = input->v_offset;
 	lstream->v_size = v_size;
 	lstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
 
@@ -128,7 +128,6 @@
 
 	lstream->istream.istream.blocking = input->blocking;
 	lstream->istream.istream.seekable = input->seekable;
-	return i_stream_create(&lstream->istream, i_stream_get_fd(input),
-			       input->real_stream->abs_start_offset +
-			       input->v_offset);
+	return i_stream_create(&lstream->istream, input,
+			       i_stream_get_fd(input));
 }
--- a/src/lib/istream-mmap.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib/istream-mmap.c	Sat Dec 22 05:15:51 2007 +0200
@@ -220,7 +220,8 @@
 	mstream->istream.sync = i_stream_mmap_sync;
 	mstream->istream.stat = i_stream_mmap_stat;
 
-	istream = i_stream_create(&mstream->istream, fd, start_offset);
+	mstream->istream.abs_start_offset = start_offset;
+	istream = i_stream_create(&mstream->istream, NULL, fd);
 	istream->mmaped = TRUE;
 	istream->blocking = TRUE;
 	istream->seekable = TRUE;
--- a/src/lib/istream-seekable.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib/istream-seekable.c	Sat Dec 22 05:15:51 2007 +0200
@@ -347,5 +347,5 @@
 
 	sstream->istream.istream.blocking = blocking;
 	sstream->istream.istream.seekable = TRUE;
-	return i_stream_create(&sstream->istream, -1, 0);
+	return i_stream_create(&sstream->istream, NULL, -1);
 }
--- a/src/lib/istream-tee.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib/istream-tee.c	Sat Dec 22 05:15:51 2007 +0200
@@ -206,6 +206,6 @@
 	tstream->next = tee->children;
 	tee->children = tstream;
 
-	return i_stream_create(&tstream->istream,
-			       i_stream_get_fd(tee->input), 0);
+	return i_stream_create(&tstream->istream, NULL,
+			       i_stream_get_fd(tee->input));
 }
--- a/src/lib/istream.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/lib/istream.c	Sat Dec 22 05:15:51 2007 +0200
@@ -341,11 +341,15 @@
 }
 
 struct istream *
-i_stream_create(struct istream_private *_stream,
-		int fd, uoff_t abs_start_offset)
+i_stream_create(struct istream_private *_stream, struct istream *parent, int fd)
 {
 	_stream->fd = fd;
-	_stream->abs_start_offset = abs_start_offset;
+	if (parent != NULL) {
+		_stream->parent = parent;
+		_stream->parent_start_offset = parent->v_offset;
+		_stream->abs_start_offset = parent->v_offset +
+			parent->real_stream->abs_start_offset;
+	}
 	_stream->istream.real_stream = _stream;
 
 	if (_stream->stat == NULL)
--- a/src/plugins/zlib/istream-zlib.c	Sat Dec 22 05:04:46 2007 +0200
+++ b/src/plugins/zlib/istream-zlib.c	Sat Dec 22 05:15:51 2007 +0200
@@ -220,5 +220,5 @@
 		zstream->istream.istream.seekable = TRUE;
 	}
 
-	return i_stream_create(&zstream->istream, fd, 0);
+	return i_stream_create(&zstream->istream, NULL, fd);
 }