changeset 12650:0cadba9597cb

lib-storage: Use RECENT count in mailbox list index to set \Marked and \UnMarked LIST flag.
author Timo Sirainen <tss@iki.fi>
date Wed, 09 Feb 2011 02:26:44 +0200
parents c296f95b856c
children 238bafcca676
files src/lib-storage/list/index-mailbox-list-status.c src/lib-storage/list/index-mailbox-list.c src/lib-storage/list/index-mailbox-list.h
diffstat 3 files changed, 47 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/list/index-mailbox-list-status.c	Wed Feb 09 02:25:47 2011 +0200
+++ b/src/lib-storage/list/index-mailbox-list-status.c	Wed Feb 09 02:26:44 2011 +0200
@@ -316,6 +316,41 @@
 	return 0;
 }
 
+void index_mailbox_list_status_set_info_flags(struct mailbox *box, uint32_t uid,
+					      enum mailbox_info_flags *flags)
+{
+	struct index_mailbox_list *ilist = INDEX_LIST_CONTEXT(box->list);
+	struct mail_index_view *view;
+	struct mailbox_status status;
+	uint32_t seq;
+	int ret;
+
+	view = mail_index_view_open(ilist->index);
+	if (!mail_index_lookup_seq(view, uid, &seq)) {
+		/* our in-memory tree is out of sync */
+		ret = 0;
+	} else T_BEGIN {
+		ret = box->v.list_index_has_changed == NULL ? 0 :
+			box->v.list_index_has_changed(box, view, seq);
+	} T_END;
+
+	if (ret != 0) {
+		/* error / not up to date. don't waste time with it. */
+		mail_index_view_close(&view);
+		return;
+	}
+
+	status.recent = 0;
+	(void)index_list_get_view_status(box, view, seq, STATUS_RECENT,
+					 &status, NULL);
+	mail_index_view_close(&view);
+
+	if (status.recent != 0)
+		*flags |= MAILBOX_MARKED;
+	else
+		*flags |= MAILBOX_UNMARKED;
+}
+
 static void index_list_mail_mailbox_allocated(struct mailbox *box)
 {
 	struct index_mailbox_list *ilist = INDEX_LIST_CONTEXT(box->list);
--- a/src/lib-storage/list/index-mailbox-list.c	Wed Feb 09 02:25:47 2011 +0200
+++ b/src/lib-storage/list/index-mailbox-list.c	Wed Feb 09 02:26:44 2011 +0200
@@ -6,6 +6,7 @@
 #include "hash.h"
 #include "imap-match.h"
 #include "mail-index.h"
+#include "mail-storage.h"
 #include "mail-storage-hooks.h"
 #include "mailbox-list-subscriptions.h"
 #include "index-mailbox-list.h"
@@ -110,6 +111,8 @@
 	struct index_mailbox_list *ilist = INDEX_LIST_CONTEXT(list);
 	struct index_mailbox_node *node;
 
+	(void)index_mailbox_list_refresh(list);
+
 	T_BEGIN {
 		const char *const *path;
 		unsigned int i;
@@ -575,6 +578,7 @@
 index_mailbox_list_update_info(struct index_mailbox_list_iterate_context *ctx)
 {
 	struct index_mailbox_node *node = ctx->next_node;
+	struct mailbox *box;
 
 	str_truncate(ctx->path, ctx->parent_len);
 	if (str_len(ctx->path) > 0)
@@ -599,7 +603,11 @@
 						    &ctx->info.flags);
 	}
 
-	/* FIXME: set marked, unmarked flags based on recent counter */
+	box = mailbox_alloc(ctx->ctx.list, ctx->info.name,
+			    MAILBOX_FLAG_KEEP_RECENT);
+	index_mailbox_list_status_set_info_flags(box, node->uid,
+						 &ctx->info.flags);
+	mailbox_free(&box);
 }
 
 static void
--- a/src/lib-storage/list/index-mailbox-list.h	Wed Feb 09 02:25:47 2011 +0200
+++ b/src/lib-storage/list/index-mailbox-list.h	Wed Feb 09 02:26:44 2011 +0200
@@ -102,6 +102,9 @@
 int index_mailbox_list_refresh(struct mailbox_list *list);
 void index_mailbox_list_refresh_later(struct mailbox_list *list);
 
+void index_mailbox_list_status_set_info_flags(struct mailbox *box, uint32_t uid,
+					      enum mailbox_info_flags *flags);
+
 void index_mailbox_list_status_init(void);
 void index_mailbox_list_status_init_list(struct mailbox_list *list);