changeset 1994:77f3111f7976 HEAD

Fixes to commands after mails have been deleted. Patch by Nic Bellamy.
author Timo Sirainen <tss@iki.fi>
date Mon, 10 May 2004 04:28:19 +0300
parents 719228a4df3f
children cc64f8bb4716
files src/pop3/client.c src/pop3/client.h src/pop3/commands.c
diffstat 3 files changed, 23 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/pop3/client.c	Mon May 10 04:20:49 2004 +0300
+++ b/src/pop3/client.c	Mon May 10 04:28:19 2004 +0300
@@ -55,6 +55,7 @@
 	}
 
 	client->messages_count = status.messages;
+	client->deleted_size = 0;
 	client->uidvalidity = status.uidvalidity;
 
 	if (client->messages_count == 0)
@@ -76,6 +77,7 @@
 		}
 
 		client->total_size = 0;
+		client->deleted_size = 0;
 		failed = FALSE;
 		while ((mail = mailbox_search_next(ctx)) != NULL) {
 			uoff_t size = mail->get_size(mail);
--- a/src/pop3/client.h	Mon May 10 04:20:49 2004 +0300
+++ b/src/pop3/client.h	Mon May 10 04:28:19 2004 +0300
@@ -16,9 +16,11 @@
 	unsigned int bad_counter;
 
 	unsigned int messages_count;
+	unsigned int deleted_count;
 	unsigned int uidvalidity;
 	uoff_t *message_sizes;
 	uoff_t total_size;
+	uoff_t deleted_size;
 
 	unsigned char *deleted_bitmask;
 
--- a/src/pop3/commands.c	Mon May 10 04:20:49 2004 +0300
+++ b/src/pop3/commands.c	Mon May 10 04:28:19 2004 +0300
@@ -105,6 +105,8 @@
 	}
 
 	client->deleted_bitmask[msgnum / CHAR_BIT] |= 1 << (msgnum % CHAR_BIT);
+	client->deleted_count++;
+	client->deleted_size += client->message_sizes[msgnum];
 	client_send_line(client, "+OK Marked to be deleted.");
 	return TRUE;
 }
@@ -115,8 +117,13 @@
 
 	if (*args == '\0') {
 		client_send_line(client, "+OK %u messages:",
-				 client->messages_count);
+				 client->messages_count - client->deleted_count);
 		for (i = 0; i < client->messages_count; i++) {
+			if (client->deleted) {
+				if (client->deleted_bitmask[i / CHAR_BIT] &
+				    (1 << (i % CHAR_BIT)))
+					continue;
+			}
 			client_send_line(client, "%u %"PRIuUOFF_T,
 					 i+1, client->message_sizes[i]);
 		}
@@ -321,6 +328,8 @@
 	if (client->deleted) {
 		client->deleted = FALSE;
 		memset(client->deleted_bitmask, 0, MSGS_BITMASK_SIZE(client));
+		client->deleted_count = 0;
+		client->deleted_size = 0;
 	}
 
 	client_send_line(client, "+OK");
@@ -330,7 +339,8 @@
 static int cmd_stat(struct client *client, const char *args __attr_unused__)
 {
 	client_send_line(client, "+OK %u %"PRIuUOFF_T, client->
-			 messages_count, client->total_size);
+			 messages_count - client->deleted_count,
+			 client->total_size - client->deleted_size);
 	return TRUE;
 }
 
@@ -379,6 +389,13 @@
 	}
 
 	while ((mail = mailbox_search_next(ctx)) != NULL) {
+		if (client->deleted) {
+			uint32_t idx = mail->seq - 1;
+			if (client->deleted_bitmask[idx / CHAR_BIT] &
+			    (1 << (idx % CHAR_BIT)))
+				continue;
+		}
+
 		client_send_line(client, message == 0 ?
 				 "%u %u.%u" : "+OK %u %u.%u",
 				 mail->seq, client->uidvalidity, mail->uid);