summaryrefslogtreecommitdiffstats
path: root/imap
diff options
context:
space:
mode:
authorBrendan Cully <brendan@kublai.com>2007-04-10 20:22:06 -0700
committerBrendan Cully <brendan@kublai.com>2007-04-10 20:22:06 -0700
commitbe1cd098cd6d304ce60afeda3af4ebd29fc4bc3f (patch)
tree435b98ac7047c8a5bd3a6bfbc2243fe886fdcbfa /imap
parent99d61db9a0e00c3df767a97b16d6977d59e50fa4 (diff)
Add $message_cache_clean option to prune message cache on sync
Diffstat (limited to 'imap')
-rw-r--r--imap/imap.c4
-rw-r--r--imap/imap_private.h1
-rw-r--r--imap/message.c31
3 files changed, 36 insertions, 0 deletions
diff --git a/imap/imap.c b/imap/imap.c
index 4030c913..29c5f8f1 100644
--- a/imap/imap.c
+++ b/imap/imap.c
@@ -1261,7 +1261,11 @@ int imap_sync_mailbox (CONTEXT* ctx, int expunge, int* index_hint)
idata->state = IMAP_AUTHENTICATED;
}
+ if (option (OPTMESSAGECACHECLEAN))
+ imap_cache_clean (idata);
+
rc = 0;
+
out:
if (cmd.data)
FREE (&cmd.data);
diff --git a/imap/imap_private.h b/imap/imap_private.h
index 98adc8b2..75f1429f 100644
--- a/imap/imap_private.h
+++ b/imap/imap_private.h
@@ -256,6 +256,7 @@ void imap_free_header_data (void** data);
int imap_read_headers (IMAP_DATA* idata, int msgbegin, int msgend);
char* imap_set_flags (IMAP_DATA* idata, HEADER* h, char* s);
int imap_cache_del (IMAP_DATA* idata, HEADER* h);
+int imap_cache_clean (IMAP_DATA* idata);
/* util.c */
#ifdef USE_HCACHE
diff --git a/imap/message.c b/imap/message.c
index 0cd3e50e..10ebd0fb 100644
--- a/imap/message.c
+++ b/imap/message.c
@@ -906,6 +906,37 @@ int imap_cache_del (IMAP_DATA* idata, HEADER* h)
return mutt_bcache_del (idata->bcache, id);
}
+static int msg_cache_clean_cb (const char* id, body_cache_t* bcache, void* data)
+{
+ unsigned int uv, uid, n;
+ IMAP_DATA* idata = (IMAP_DATA*)data;
+
+ if (sscanf (id, "%u-%u", &uv, &uid) != 2)
+ return 0;
+
+ /* bad UID */
+ if (uv != idata->uid_validity)
+ mutt_bcache_del (bcache, id);
+
+ /* TODO: presort UIDs, walk in order */
+ for (n = 0; n < idata->ctx->msgcount; n++)
+ {
+ if (uid == HEADER_DATA(idata->ctx->hdrs[n])->uid)
+ return 0;
+ }
+ mutt_bcache_del (bcache, id);
+
+ return 0;
+}
+
+int imap_cache_clean (IMAP_DATA* idata)
+{
+ idata->bcache = msg_cache_open (idata);
+ mutt_bcache_list (idata->bcache, msg_cache_clean_cb, idata);
+
+ return 0;
+}
+
/* imap_add_keywords: concatenate custom IMAP tags to list, if they
* appear in the folder flags list. Why wouldn't they? */
void imap_add_keywords (char* s, HEADER* h, LIST* mailbox_flags, size_t slen)