]> granicus.if.org Git - mutt/commitdiff
Add mx operation save_to_header_cache.
authorKevin McCarthy <kevin@8t8.us>
Sat, 15 Dec 2018 22:49:55 +0000 (14:49 -0800)
committerKevin McCarthy <kevin@8t8.us>
Mon, 17 Dec 2018 21:29:58 +0000 (13:29 -0800)
This will be used when reading protected headers, to store the
encrypted subject in the header cache so it can be searched with.

compress.c
imap/imap.c
mailbox.h
mbox.c
mh.c
mutt.h
mx.c
pop.c

index a09295d87517368726f92b0a816a1d95abd9b4c4..9b8095070ead046e8f08bf691fe84a8e93feb177 100644 (file)
@@ -981,5 +981,6 @@ struct mx_ops mx_comp_ops =
   .commit_msg   = commit_message,
   .open_new_msg = open_new_message,
   .msg_padding_size = compress_msg_padding_size,
+  .save_to_header_cache = NULL,  /* compressed doesn't support maildir/mh */
 };
 
index 696689ba512189e82d9fab3d0dae3a59cfa3ff9f..c7ff117a12664dc005a7f3f3376adda82027615e 100644 (file)
@@ -1605,6 +1605,25 @@ static int imap_check_mailbox_reopen (CONTEXT *ctx, int *index_hint)
   return rc;
 }
 
+static int imap_save_to_header_cache (CONTEXT *ctx, HEADER *h)
+{
+  int rc = 0;
+#ifdef USE_HCACHE
+  int close_hc = 1;
+  IMAP_DATA* idata;
+
+  idata = (IMAP_DATA *)ctx->data;
+  if (idata->hcache)
+    close_hc = 0;
+  else
+    idata->hcache = imap_hcache_open (idata, NULL);
+  rc = imap_hcache_put (idata, h);
+  if (close_hc)
+    imap_hcache_close (idata);
+#endif
+  return rc;
+}
+
 /* split path into (idata,mailbox name) */
 static int imap_get_mailbox (const char* path, IMAP_DATA** hidata, char* buf, size_t blen)
 {
@@ -2336,4 +2355,5 @@ struct mx_ops mx_imap_ops = {
   .open_new_msg = imap_open_new_message,
   .check = imap_check_mailbox_reopen,
   .sync = NULL,      /* imap syncing is handled by imap_sync_mailbox */
+  .save_to_header_cache = imap_save_to_header_cache,
 };
index 6ae29e23631477e21eb06f21bc4c2eda3414d71a..602850edf3a46e5023122b76bdf1b200b82c9eb9 100644 (file)
--- a/mailbox.h
+++ b/mailbox.h
@@ -82,6 +82,7 @@ int mx_is_pop (const char *);
 int mx_access (const char*, int);
 int mx_check_empty (const char *);
 int mx_msg_padding_size (CONTEXT *);
+int mx_save_to_header_cache (CONTEXT *, HEADER *);
 
 int mx_is_maildir (const char *);
 int mx_is_mh (const char *);
diff --git a/mbox.c b/mbox.c
index 0f07cc496fa78ddb619eb8732a7508d6ba7ce865..254db45221a1504a53e47edb27f229512312cd9d 100644 (file)
--- a/mbox.c
+++ b/mbox.c
@@ -1406,6 +1406,7 @@ struct mx_ops mx_mbox_ops = {
   .check = mbox_check_mailbox,
   .sync = mbox_sync_mailbox,
   .msg_padding_size = mbox_msg_padding_size,
+  .save_to_header_cache = NULL,
 };
 
 struct mx_ops mx_mmdf_ops = {
@@ -1419,4 +1420,5 @@ struct mx_ops mx_mmdf_ops = {
   .check = mbox_check_mailbox,
   .sync = mbox_sync_mailbox,
   .msg_padding_size = mmdf_msg_padding_size,
+  .save_to_header_cache = NULL,
 };
diff --git a/mh.c b/mh.c
index 024726018fa58a5d5e8cdb747e7a9ce9156def1d..1dc10893def0b4761b717eb0a06f0fe545b1398a 100644 (file)
--- a/mh.c
+++ b/mh.c
@@ -2508,6 +2508,33 @@ static int mh_check_mailbox (CONTEXT * ctx, int *index_hint)
 }
 
 
+static int maildir_save_to_header_cache (CONTEXT *ctx, HEADER *h)
+{
+  int rc = 0;
+#if USE_HCACHE
+  header_cache_t *hc;
+
+  hc = mutt_hcache_open (HeaderCache, ctx->path, NULL);
+  rc = mutt_hcache_store (hc, h->path + 3, h, 0, &maildir_hcache_keylen,
+                          MUTT_GENERATE_UIDVALIDITY);
+  mutt_hcache_close (hc);
+#endif
+  return rc;
+}
+
+
+static int mh_save_to_header_cache (CONTEXT *ctx, HEADER *h)
+{
+  int rc = 0;
+#if USE_HCACHE
+  header_cache_t *hc;
+
+  hc = mutt_hcache_open (HeaderCache, ctx->path, NULL);
+  rc = mutt_hcache_store (hc, h->path, h, 0, strlen, MUTT_GENERATE_UIDVALIDITY);
+  mutt_hcache_close (hc);
+#endif
+  return rc;
+}
 
 
 /*
@@ -2754,6 +2781,7 @@ struct mx_ops mx_maildir_ops = {
   .open_new_msg = maildir_open_new_message,
   .check = maildir_check_mailbox,
   .sync = mh_sync_mailbox,
+  .save_to_header_cache = maildir_save_to_header_cache,
 };
 
 struct mx_ops mx_mh_ops = {
@@ -2766,4 +2794,5 @@ struct mx_ops mx_mh_ops = {
   .open_new_msg = mh_open_new_message,
   .check = mh_check_mailbox,
   .sync = mh_sync_mailbox,
+  .save_to_header_cache = mh_save_to_header_cache,
 };
diff --git a/mutt.h b/mutt.h
index 90d63f7ae67c03eff5d4464f7e99d1205770b4ce..11eb51636c56f414ea25e14a08a406f9b4a9c56d 100644 (file)
--- a/mutt.h
+++ b/mutt.h
@@ -981,6 +981,7 @@ struct mx_ops
   int (*commit_msg) (struct _context *, struct _message *);
   int (*open_new_msg) (struct _message *, struct _context *, HEADER *);
   int (*msg_padding_size) (struct _context *);
+  int (*save_to_header_cache) (struct _context *, struct header *);
 };
 
 typedef struct _context
diff --git a/mx.c b/mx.c
index 9d311ef81277b39d95a5ac161a77073be3f4cbf3..ff3a1a335f0036fbe1802e4efff35e3805d8cd94 100644 (file)
--- a/mx.c
+++ b/mx.c
@@ -1545,4 +1545,13 @@ int mx_msg_padding_size (CONTEXT *ctx)
   return ctx->mx_ops->msg_padding_size (ctx);
 }
 
+/* Writes a single header out to the header cache. */
+int mx_save_to_header_cache (CONTEXT *ctx, HEADER *h)
+{
+  if (!ctx->mx_ops || !ctx->mx_ops->save_to_header_cache)
+    return 0;
+
+  return ctx->mx_ops->save_to_header_cache (ctx, h);
+}
+
 /* vim: set sw=2: */
diff --git a/pop.c b/pop.c
index 288166def5501639d220d777898accf9df182670..996051953e1f54574a8f5ce58e2afb3151c8719d 100644 (file)
--- a/pop.c
+++ b/pop.c
@@ -798,6 +798,22 @@ static int pop_check_mailbox (CONTEXT *ctx, int *index_hint)
   return 0;
 }
 
+static int pop_save_to_header_cache (CONTEXT *ctx, HEADER *h)
+{
+  int rc = 0;
+#ifdef USE_HCACHE
+  POP_DATA *pop_data;
+  header_cache_t *hc;
+
+  pop_data = (POP_DATA *)ctx->data;
+  hc = pop_hcache_open (pop_data, ctx->path);
+  rc = mutt_hcache_store (hc, h->data, h, 0, strlen, MUTT_GENERATE_UIDVALIDITY);
+  mutt_hcache_close (hc);
+#endif
+
+  return rc;
+}
+
 /* Fetch messages and save them in $spoolfile */
 void pop_fetch_mail (void)
 {
@@ -970,4 +986,5 @@ struct mx_ops mx_pop_ops = {
   .commit_msg = NULL,
   .open_new_msg = NULL,
   .sync = pop_sync_mailbox,
+  .save_to_header_cache = pop_save_to_header_cache,
 };