# HG changeset patch # User Timo Sirainen # Date 1297211204 -7200 # Node ID 0cadba9597cb4bfb19308fc4d258f4692c7869f9 # Parent c296f95b856c948427d79854f0aeed82a35a51b6 lib-storage: Use RECENT count in mailbox list index to set \Marked and \UnMarked LIST flag. diff -r c296f95b856c -r 0cadba9597cb src/lib-storage/list/index-mailbox-list-status.c --- 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); diff -r c296f95b856c -r 0cadba9597cb src/lib-storage/list/index-mailbox-list.c --- 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 diff -r c296f95b856c -r 0cadba9597cb src/lib-storage/list/index-mailbox-list.h --- 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);