From: Timo Sirainen Date: Wed, 9 Feb 2011 00:26:44 +0000 (+0200) Subject: lib-storage: Use RECENT count in mailbox list index to set \Marked and \UnMarked... X-Git-Tag: 2.1.alpha1~355 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=461fecc688efddbe8d2d462657f96c91ee574d2e;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Use RECENT count in mailbox list index to set \Marked and \UnMarked LIST flag. --- diff --git a/src/lib-storage/list/index-mailbox-list-status.c b/src/lib-storage/list/index-mailbox-list-status.c index 84b5cb773e..fef357ee02 100644 --- a/src/lib-storage/list/index-mailbox-list-status.c +++ b/src/lib-storage/list/index-mailbox-list-status.c @@ -316,6 +316,41 @@ index_list_transaction_commit(struct mailbox_transaction_context *t, 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); diff --git a/src/lib-storage/list/index-mailbox-list.c b/src/lib-storage/list/index-mailbox-list.c index eb9b5d381d..a4f88890fa 100644 --- a/src/lib-storage/list/index-mailbox-list.c +++ b/src/lib-storage/list/index-mailbox-list.c @@ -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 @@ index_mailbox_list_lookup(struct mailbox_list *list, const char *vname) 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 @@ static void 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 @@ index_mailbox_list_update_info(struct index_mailbox_list_iterate_context *ctx) &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 diff --git a/src/lib-storage/list/index-mailbox-list.h b/src/lib-storage/list/index-mailbox-list.h index 69437c562c..a8456e2c2f 100644 --- a/src/lib-storage/list/index-mailbox-list.h +++ b/src/lib-storage/list/index-mailbox-list.h @@ -102,6 +102,9 @@ index_mailbox_list_lookup(struct mailbox_list *list, const char *vname); 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);