[dovecot-cvs] dovecot/src/pop3 client.c, 1.17, 1.18 client.h, 1.3, 1.4 commands.c, 1.13, 1.14

cras at procontrol.fi cras at procontrol.fi
Mon May 10 04:28:22 EEST 2004


Update of /home/cvs/dovecot/src/pop3
In directory talvi:/tmp/cvs-serv31294

Modified Files:
	client.c client.h commands.c 
Log Message:
Fixes to commands after mails have been deleted. Patch by Nic Bellamy.



Index: client.c
===================================================================
RCS file: /home/cvs/dovecot/src/pop3/client.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- client.c	28 Apr 2004 00:21:01 -0000	1.17
+++ client.c	10 May 2004 01:28:19 -0000	1.18
@@ -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);

Index: client.h
===================================================================
RCS file: /home/cvs/dovecot/src/pop3/client.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- client.h	16 Apr 2003 14:24:12 -0000	1.3
+++ client.h	10 May 2004 01:28:19 -0000	1.4
@@ -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;
 

Index: commands.c
===================================================================
RCS file: /home/cvs/dovecot/src/pop3/commands.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- commands.c	1 May 2004 23:15:51 -0000	1.13
+++ commands.c	10 May 2004 01:28:19 -0000	1.14
@@ -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);



More information about the dovecot-cvs mailing list