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
 };