changeset 12605:d675c0264190

imapc: If mail's input stream is changed, don't assume virtual size = physical size.
author Timo Sirainen <tss@iki.fi>
date Fri, 28 Jan 2011 19:39:00 +0200
parents 0e5c36a54ce8
children 54bcc1728a43
files src/lib-storage/index/imapc/imapc-mail.c src/lib-storage/index/imapc/imapc-search.c
diffstat 2 files changed, 36 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/imapc/imapc-mail.c	Fri Jan 28 17:57:21 2011 +0200
+++ b/src/lib-storage/index/imapc/imapc-mail.c	Fri Jan 28 19:39:00 2011 +0200
@@ -43,13 +43,43 @@
 	return 0;
 }
 
+static int imapc_mail_get_sizes(struct index_mail *mail)
+{
+	struct message_size hdr_size, body_size;
+	struct istream *input;
+	uoff_t old_offset;
+
+	/* fallback to reading the file */
+	old_offset = mail->data.stream->v_offset;
+	if (mail_get_stream(&mail->mail.mail,
+			    &hdr_size, &body_size, &input) < 0)
+		return -1;
+	i_stream_seek(mail->data.stream, old_offset);
+	return 0;
+}
+
+static int imapc_mail_get_virtual_size(struct mail *_mail, uoff_t *size_r)
+{
+	struct index_mail *mail = (struct index_mail *)_mail;
+	struct index_mail_data *data = &mail->data;
+
+	if (data->virtual_size == (uoff_t)-1) {
+		if (imapc_mail_get_sizes(mail) < 0)
+			return -1;
+	}
+	*size_r = data->virtual_size;
+	return 0;
+}
+
 static int imapc_mail_get_physical_size(struct mail *_mail, uoff_t *size_r)
 {
 	struct index_mail *mail = (struct index_mail *)_mail;
 	struct index_mail_data *data = &mail->data;
 
-	if (data->physical_size == (uoff_t)-1)
-		return -1;
+	if (data->physical_size == (uoff_t)-1) {
+		if (imapc_mail_get_sizes(mail) < 0)
+			return -1;
+	}
 	*size_r = data->physical_size;
 	return 0;
 }
@@ -82,7 +112,7 @@
 	index_mail_get_date,
 	imapc_mail_get_received_date,
 	imapc_mail_get_save_date,
-	imapc_mail_get_physical_size, /* physical = virtual in our case */
+	imapc_mail_get_virtual_size,
 	imapc_mail_get_physical_size,
 	index_mail_get_first_header,
 	index_mail_get_headers,
--- a/src/lib-storage/index/imapc/imapc-search.c	Fri Jan 28 17:57:21 2011 +0200
+++ b/src/lib-storage/index/imapc/imapc-search.c	Fri Jan 28 19:39:00 2011 +0200
@@ -104,9 +104,7 @@
 			i_stream_unref(&imail->data.stream);
 			return;
 		}
-	}
-
-	if (body) {
+	} else if (body) {
 		ret = i_stream_get_size(imail->data.stream, TRUE, &size);
 		if (ret < 0) {
 			i_stream_unref(&imail->data.stream);
@@ -114,6 +112,8 @@
 		}
 		i_assert(ret != 0);
 		imail->data.physical_size = size;
+		/* we'll assume that the remote server is working properly and
+		   sending CRLF linefeeds */
 		imail->data.virtual_size = size;
 	}