Mercurial > dovecot > original-hg > dovecot-1.2
changeset 2062:397ce1dbc593 HEAD
Send recent counter changes when it actually changes.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 25 May 2004 20:50:36 +0300 |
parents | ad296f17c100 |
children | 21a3e5d08290 |
files | src/imap/mail-storage-callbacks.c src/lib-storage/index/index-status.c src/lib-storage/index/index-storage.h src/lib-storage/index/index-sync.c src/lib-storage/mail-storage.h src/pop3/mail-storage-callbacks.c |
diffstat | 6 files changed, 63 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- a/src/imap/mail-storage-callbacks.c Tue May 25 17:16:55 2004 +0300 +++ b/src/imap/mail-storage-callbacks.c Tue May 25 20:50:36 2004 +0300 @@ -61,8 +61,8 @@ t_pop(); } -static void new_messages(struct mailbox *mailbox, unsigned int messages_count, - unsigned int recent_count, void *context) +static void message_count_changed(struct mailbox *mailbox, unsigned int count, + void *context) { struct client *client = context; char str[MAX_INT_STRLEN+20]; @@ -70,10 +70,20 @@ if (client->mailbox != mailbox) return; - i_snprintf(str, sizeof(str), "* %u EXISTS", messages_count); + i_snprintf(str, sizeof(str), "* %u EXISTS", count); client_send_line(client, str); +} - i_snprintf(str, sizeof(str), "* %u RECENT", recent_count); +static void recent_count_changed(struct mailbox *mailbox, unsigned int count, + void *context) +{ + struct client *client = context; + char str[MAX_INT_STRLEN+20]; + + if (client->mailbox != mailbox) + return; + + i_snprintf(str, sizeof(str), "* %u RECENT", count); client_send_line(client, str); } @@ -95,6 +105,7 @@ notify_no, expunge, update_flags, - new_messages, + message_count_changed, + recent_count_changed, new_keywords };
--- a/src/lib-storage/index/index-status.c Tue May 25 17:16:55 2004 +0300 +++ b/src/lib-storage/index/index-status.c Tue May 25 20:50:36 2004 +0300 @@ -55,8 +55,10 @@ } } - if ((items & STATUS_RECENT) != 0) - status->recent = ibox->get_recent_count(ibox); + if ((items & STATUS_RECENT) != 0) { + i_assert(ibox->last_recent_count_initialized); + status->recent = ibox->last_recent_count; + } /*FIXME:if (items & STATUS_KEYWORDS) get_keywords(ibox, status);*/
--- a/src/lib-storage/index/index-storage.h Tue May 25 17:16:55 2004 +0300 +++ b/src/lib-storage/index/index-storage.h Tue May 25 20:50:36 2004 +0300 @@ -62,6 +62,7 @@ struct mail *mail_interface; uint32_t (*get_recent_count)(struct index_mailbox *ibox); + unsigned int last_recent_count; struct timeout *autosync_to; struct index_autosync_file *autosync_files; @@ -104,6 +105,7 @@ unsigned int sent_readonly_flags_warning:1; unsigned int autosync_pending:1; unsigned int mail_read_mmaped:1; + unsigned int last_recent_count_initialized:1; }; struct index_transaction_context {
--- a/src/lib-storage/index/index-sync.c Tue May 25 17:16:55 2004 +0300 +++ b/src/lib-storage/index/index-sync.c Tue May 25 20:50:36 2004 +0300 @@ -16,7 +16,7 @@ void *sc_context; enum mail_index_sync_type sync_mask; uint32_t seq, seq1, seq2; - uint32_t messages_count, new_messages_count, recent_count; + uint32_t messages_count, last_messages_count, recent_count; int ret; sync_mask = MAIL_INDEX_SYNC_MASK_ALL; @@ -28,6 +28,12 @@ return -1; } + if (!ibox->last_recent_count_initialized) { + ibox->last_recent_count_initialized = TRUE; + ibox->last_recent_count = ibox->get_recent_count(ibox); + } + last_messages_count = mail_index_view_get_message_count(ibox->view); + if ((flags & MAILBOX_SYNC_FLAG_NO_EXPUNGES) != 0) { expunges_count = 0; expunges = NULL; @@ -80,17 +86,17 @@ if (ret < 0) mail_storage_set_index_error(ibox); - messages_count = new_messages_count = - mail_index_view_get_message_count(ibox->view); - if (sc->expunge != NULL) { + /* expunges[] is a sorted array of sequences. it's easiest for + us to print them from end to beginning. */ + messages_count = mail_index_view_get_message_count(ibox->view); for (i = expunges_count*2; i > 0; i -= 2) { seq = expunges[i-1]; if (seq > messages_count) seq = messages_count; for (; seq >= expunges[i-2]; seq--) { sc->expunge(&ibox->box, seq, sc_context); - new_messages_count--; + last_messages_count--; } } } @@ -98,10 +104,18 @@ mail_index_view_sync_end(ctx); messages_count = mail_index_view_get_message_count(ibox->view); - if (messages_count != new_messages_count) { + if (messages_count != last_messages_count) { + sc->message_count_changed(&ibox->box, messages_count, + sc_context); + recent_count = ibox->get_recent_count(ibox); + } else if (expunges_count != 0) recent_count = ibox->get_recent_count(ibox); - sc->new_messages(&ibox->box, messages_count, recent_count, - sc_context); + else + recent_count = ibox->last_recent_count; + + if (recent_count != ibox->last_recent_count) { + ibox->last_recent_count = recent_count; + sc->recent_count_changed(&ibox->box, recent_count, sc_context); } mail_index_view_unlock(ibox->view);
--- a/src/lib-storage/mail-storage.h Tue May 25 17:16:55 2004 +0300 +++ b/src/lib-storage/mail-storage.h Tue May 25 20:50:36 2004 +0300 @@ -151,15 +151,16 @@ const struct mail_full_flags *flags, void *context); - /* EXISTS, RECENT */ - void (*new_messages)(struct mailbox *mailbox, - unsigned int messages_count, - unsigned int recent_count, void *context); + /* EXISTS */ + void (*message_count_changed)(struct mailbox *mailbox, + unsigned int count, void *context); + /* RECENT */ + void (*recent_count_changed)(struct mailbox *mailbox, + unsigned int count, void *context); /* FLAGS, PERMANENTFLAGS */ void (*new_keywords)(struct mailbox *mailbox, const char *keywords[], - unsigned int keywords_count, - void *context); + unsigned int keywords_count, void *context); };
--- a/src/pop3/mail-storage-callbacks.c Tue May 25 17:16:55 2004 +0300 +++ b/src/pop3/mail-storage-callbacks.c Tue May 25 20:50:36 2004 +0300 @@ -59,13 +59,19 @@ { } -static void new_messages(struct mailbox *mailbox __attr_unused__, - unsigned int messages_count __attr_unused__, - unsigned int recent_count __attr_unused__, - void *context __attr_unused__) +static void message_count_changed(struct mailbox *mailbox __attr_unused__, + unsigned int count __attr_unused__, + void *context __attr_unused__) { } +static void recent_count_changed(struct mailbox *mailbox __attr_unused__, + unsigned int count __attr_unused__, + void *context __attr_unused__) +{ +} + + static void new_keywords(struct mailbox *mailbox __attr_unused__, const char *keywords[] __attr_unused__, unsigned int keywords_count __attr_unused__, @@ -79,6 +85,7 @@ notify_no, expunge, update_flags, - new_messages, + message_count_changed, + recent_count_changed, new_keywords };