dovecot-2.2: istream-callback: Added i_stream_callback_get_buffe...

dovecot at dovecot.org dovecot at dovecot.org
Mon Aug 11 16:21:47 UTC 2014


details:   http://hg.dovecot.org/dovecot-2.2/rev/4cca68644428
changeset: 17702:4cca68644428
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Aug 11 19:19:45 2014 +0300
description:
istream-callback: Added i_stream_callback_get_buffer().

diffstat:

 src/lib/istream-callback.c |  23 +++++++++++++++--------
 src/lib/istream-callback.h |   4 ++++
 2 files changed, 19 insertions(+), 8 deletions(-)

diffs (77 lines):

diff -r 1b76af8a8ded -r 4cca68644428 src/lib/istream-callback.c
--- a/src/lib/istream-callback.c	Mon Aug 11 17:43:25 2014 +0300
+++ b/src/lib/istream-callback.c	Mon Aug 11 19:19:45 2014 +0300
@@ -11,7 +11,7 @@
 	void *context;
 
 	buffer_t *buf;
-	size_t pending_size;
+	size_t prev_pos;
 };
 
 static void i_stream_callback_destroy(struct iostream_private *stream)
@@ -35,13 +35,13 @@
 	if (stream->skip > 0) {
 		buffer_delete(cstream->buf, 0, stream->skip);
 		stream->pos -= stream->skip;
+		cstream->prev_pos -= stream->skip;
 		stream->skip = 0;
 	}
-	pos = cstream->buf->used;
-	if (cstream->pending_size > 0) {
-		i_assert(pos >= cstream->pending_size);
-		pos -= cstream->pending_size;
-		cstream->pending_size = 0;
+	i_assert(cstream->buf->used >= cstream->prev_pos);
+	pos = cstream->prev_pos;
+	if (cstream->buf->used > pos) {
+		/* data was added outside the callback */
 	} else if (!cstream->callback(cstream->buf, cstream->context)) {
 		/* EOF / error */
 		stream->istream.eof = TRUE;
@@ -58,7 +58,7 @@
 	}
 	i_assert(cstream->buf->used > pos);
 	stream->buffer = cstream->buf->data;
-	stream->pos = cstream->buf->used;
+	cstream->prev_pos = stream->pos = cstream->buf->used;
 	return cstream->buf->used - pos;
 }
 
@@ -91,7 +91,6 @@
 		(struct callback_istream *)input->real_stream;
 
 	buffer_append(cstream->buf, data, size);
-	cstream->pending_size += size;
 }
 
 void i_stream_callback_append_str(struct istream *input, const char *str)
@@ -99,6 +98,14 @@
 	i_stream_callback_append(input, str, strlen(str));
 }
 
+buffer_t *i_stream_callback_get_buffer(struct istream *input)
+{
+	struct callback_istream *cstream =
+		(struct callback_istream *)input->real_stream;
+
+	return cstream->buf;
+}
+
 void i_stream_callback_set_error(struct istream *input, int stream_errno,
 				 const char *error)
 {
diff -r 1b76af8a8ded -r 4cca68644428 src/lib/istream-callback.h
--- a/src/lib/istream-callback.h	Mon Aug 11 17:43:25 2014 +0300
+++ b/src/lib/istream-callback.h	Mon Aug 11 19:19:45 2014 +0300
@@ -29,6 +29,10 @@
 			      const void *data, size_t size);
 void i_stream_callback_append_str(struct istream *input, const char *str);
 
+/* Returns the istream-callback's internal buffer. This buffer can be used to
+   append data to the stream. */
+buffer_t *i_stream_callback_get_buffer(struct istream *input);
+
 void i_stream_callback_set_error(struct istream *input, int stream_errno,
 				 const char *error);
 


More information about the dovecot-cvs mailing list