Mercurial > dovecot > core-2.2
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);