[dovecot-cvs] dovecot/src/lib-imap imap-message-cache.c,1.29,1.30

cras at procontrol.fi cras at procontrol.fi
Fri Dec 27 15:05:55 EET 2002


Update of /home/cvs/dovecot/src/lib-imap
In directory danu:/tmp/cvs-serv6080/lib-imap

Modified Files:
	imap-message-cache.c 
Log Message:
Some bugfixes and speedups for partial fetch handling.



Index: imap-message-cache.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-imap/imap-message-cache.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -d -r1.29 -r1.30
--- imap-message-cache.c	27 Dec 2002 10:34:14 -0000	1.29
+++ imap-message-cache.c	27 Dec 2002 13:05:53 -0000	1.30
@@ -507,11 +507,14 @@
 	return TRUE;
 }
 
-static void get_partial_size(IStream *stream,
-			     uoff_t virtual_skip, uoff_t max_virtual_size,
-			     MessageSize *partial, MessageSize *dest,
-			     int *cr_skipped)
+static uoff_t get_partial_size(IStream *stream,
+			       uoff_t virtual_skip, uoff_t max_virtual_size,
+			       MessageSize *partial, MessageSize *dest,
+			       int *cr_skipped)
 {
+	uoff_t physical_skip;
+	int last_cr;
+
 	/* see if we can use the existing partial */
 	if (partial->virtual_size > virtual_skip)
 		memset(partial, 0, sizeof(MessageSize));
@@ -521,23 +524,31 @@
 	}
 
 	message_skip_virtual(stream, virtual_skip, partial, cr_skipped);
+        physical_skip = partial->physical_size;
 
 	if (*cr_skipped && max_virtual_size != (uoff_t)-1) {
 		/* get_body_size() sees \n first, counting it as \r\n */
 		max_virtual_size++;
 	}
 
-	message_get_body_size(stream, dest, max_virtual_size);
+	message_get_body_size(stream, dest, max_virtual_size, &last_cr);
 
 	if (*cr_skipped) {
 		/* extra virtual \r counted, drop it */
 		dest->virtual_size--;
+	}
+
+	message_size_add(partial, dest);
+	if (last_cr != 0) {
 		/* we'll see \n as first character next time, so make sure
 		   we don't count the (virtual) \r twice. */
+		i_assert(partial->physical_size > 0);
+
+		if (last_cr == 1)
+			partial->physical_size--;
 		partial->virtual_size--;
 	}
-
-	// FIXME: add dest to partial
+	return physical_skip;
 }
 
 int imap_msgcache_get_rfc822_partial(ImapMessageCache *cache,
@@ -596,11 +607,10 @@
 		if (!get_header)
 			virtual_skip += msg->hdr_size->virtual_size;
 
-		get_partial_size(cache->open_stream, virtual_skip,
-				 max_virtual_size, msg->partial_size, size,
-				 cr_skipped);
-
-		physical_skip = msg->partial_size->physical_size;
+		physical_skip =
+			get_partial_size(cache->open_stream, virtual_skip,
+					 max_virtual_size, msg->partial_size,
+					 size, cr_skipped);
 	}
 
 	/* seek to wanted position */




More information about the dovecot-cvs mailing list