]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Send recent counter changes when it actually changes.
authorTimo Sirainen <tss@iki.fi>
Tue, 25 May 2004 17:50:36 +0000 (20:50 +0300)
committerTimo Sirainen <tss@iki.fi>
Tue, 25 May 2004 17:50:36 +0000 (20:50 +0300)
--HG--
branch : HEAD

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

index e2001df65bbbba2f8f75ce511abb86a6fcc707fa..ddb68289dfb0adda7e997c8d075ff26ca8ecb497 100644 (file)
@@ -61,8 +61,8 @@ static void update_flags(struct mailbox *mailbox, unsigned int seq,
        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 @@ static void new_messages(struct mailbox *mailbox, unsigned int messages_count,
        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);
+}
+
+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", recent_count);
+       i_snprintf(str, sizeof(str), "* %u RECENT", count);
        client_send_line(client, str);
 }
 
@@ -95,6 +105,7 @@ struct mail_storage_callbacks mail_storage_callbacks = {
        notify_no,
        expunge,
        update_flags,
-       new_messages,
+       message_count_changed,
+       recent_count_changed,
        new_keywords
 };
index 2724f4971ca0722ea6d9ae2e22e5a51ddfe9126a..62645f29211ed7f5ec59e347533869d85c53e497 100644 (file)
@@ -55,8 +55,10 @@ int index_storage_get_status(struct mailbox *box,
                }
        }
 
-       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);*/
index 6ff80f3f0527334d465269d61d2dd4d57cc8149c..c3ea5a30ad8d863bd0cad168118264c04a555fd5 100644 (file)
@@ -62,6 +62,7 @@ struct index_mailbox {
        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 @@ struct index_mailbox {
        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 {
index c6d2a23fa2c04f36d8bc16e6ed28802af57b4fa7..f345f1cd79768f12d15c57ae86d4e0f586340e3c 100644 (file)
@@ -16,7 +16,7 @@ int index_storage_sync(struct mailbox *box, enum mailbox_sync_flags flags)
        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 @@ int index_storage_sync(struct mailbox *box, enum mailbox_sync_flags flags)
                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 @@ int index_storage_sync(struct mailbox *box, enum mailbox_sync_flags flags)
        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 @@ int index_storage_sync(struct mailbox *box, enum mailbox_sync_flags flags)
        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);
-               sc->new_messages(&ibox->box, messages_count, recent_count,
-                                sc_context);
+       } else if (expunges_count != 0)
+               recent_count = ibox->get_recent_count(ibox);
+       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);
index 15ddba35ac11054d4dc924093de501b8a8b4b829..66c018fb3f196181e74d8361283e589aa6829567 100644 (file)
@@ -151,15 +151,16 @@ struct mail_storage_callbacks {
                             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);
 
 };
 
index 8b13efff4b74c05acd86fd3e4837b63a4da7058e..1b054843a2bdc7763cc672508ce1b5fc8e091dc0 100644 (file)
@@ -59,13 +59,19 @@ static void update_flags(struct mailbox *mailbox __attr_unused__,
 {
 }
 
-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 @@ struct mail_storage_callbacks mail_storage_callbacks = {
        notify_no,
        expunge,
        update_flags,
-       new_messages,
+       message_count_changed,
+       recent_count_changed,
        new_keywords
 };