]> granicus.if.org Git - mutt/commitdiff
Add open_msg to struct mx_ops
authorDamien Riegel <damien.riegel@gmail.com>
Sat, 18 Jun 2016 02:01:31 +0000 (19:01 -0700)
committerDamien Riegel <damien.riegel@gmail.com>
Sat, 18 Jun 2016 02:01:31 +0000 (19:01 -0700)
Add the callback to open an existing message to struct mx_ops. For mbox,
mmdf, maildir, and mh, the code was implemented directly into
mx_open_message, so it is moved in their respective source files. For
imap and pop, there were already <mailbox>_fetch_message functions, but
their argument order has been changed to pass the context as a first
argument.

imap/imap.c
imap/imap.h
imap/imap_private.h
imap/message.c
mbox.c
mh.c
mutt.h
mx.c
pop.c
pop.h

index 8d04012c3f88288cf22bcac29b1e5e6bdeb8a520..87a9ed59e1b51840c2c3937889753e2bb9cca6f6 100644 (file)
@@ -2074,6 +2074,7 @@ int imap_complete(char* dest, size_t dlen, char* path) {
 struct mx_ops mx_imap_ops = {
   .open = imap_open_mailbox,
   .close = imap_close_mailbox,
+  .open_msg = imap_fetch_message,
   .open_new_msg = imap_open_new_message,
   .check = imap_check_mailbox_reopen,
 };
index 693008b109fcb9f2e207adcb209c06a3d018e96e..ff0a1ba01f5d8cc7226a68f6249d2d08209c8bf6 100644 (file)
@@ -58,7 +58,6 @@ int imap_mailbox_rename (const char* mailbox);
 /* message.c */
 int imap_append_message (CONTEXT* ctx, MESSAGE* msg);
 int imap_copy_messages (CONTEXT* ctx, HEADER* h, char* dest, int delete);
-int imap_fetch_message (MESSAGE* msg, CONTEXT* ctx, int msgno);
 
 /* socket.c */
 void imap_logout_all (void);
index b55797443073edbb6a2214f334e69fd06915e9c8..f5dd83f301c898164ac19c192077b31e9498115a 100644 (file)
@@ -268,6 +268,8 @@ 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);
 
+int imap_fetch_message (CONTEXT *ctx, MESSAGE *msg, int msgno);
+
 /* util.c */
 #ifdef USE_HCACHE
 header_cache_t* imap_hcache_open (IMAP_DATA* idata, const char* path);
index 5e66b1db3b81fa7e62194b06b118997c8ff01cfc..f6316171525e120d3ad9c29bd5e378b9b7a028a3 100644 (file)
@@ -391,7 +391,7 @@ error_out_0:
   return retval;
 }
 
-int imap_fetch_message (MESSAGE *msg, CONTEXT *ctx, int msgno)
+int imap_fetch_message (CONTEXT *ctx, MESSAGE *msg, int msgno)
 {
   IMAP_DATA* idata;
   HEADER* h;
diff --git a/mbox.c b/mbox.c
index b3ee560b2434474462e422eb67e0a8e1af04073c..5d9235fb25baf0f5aea48e39819a486d9d746055 100644 (file)
--- a/mbox.c
+++ b/mbox.c
@@ -447,6 +447,13 @@ static int mbox_close_mailbox (CONTEXT *ctx)
   return 0;
 }
 
+static int mbox_open_message (CONTEXT *ctx,  MESSAGE *msg, int msgno)
+{
+  msg->fp = ctx->fp;
+
+  return 0;
+}
+
 static int mbox_open_new_message (MESSAGE *msg, CONTEXT *dest, HEADER *hdr)
 {
   msg->fp = dest->fp;
@@ -1274,6 +1281,7 @@ int mbox_check_empty (const char *path)
 struct mx_ops mx_mbox_ops = {
   .open = mbox_open_mailbox,
   .close = mbox_close_mailbox,
+  .open_msg = mbox_open_message,
   .open_new_msg = mbox_open_new_message,
   .check = mbox_check_mailbox,
 };
@@ -1281,6 +1289,7 @@ struct mx_ops mx_mbox_ops = {
 struct mx_ops mx_mmdf_ops = {
   .open = mbox_open_mailbox,
   .close = mbox_close_mailbox,
+  .open_msg = mbox_open_message,
   .open_new_msg = mbox_open_new_message,
   .check = mbox_check_mailbox,
 };
diff --git a/mh.c b/mh.c
index d15b85134bf9d8a036f5d78d4b8ad0b524c2ebeb..3a0adcc1331429e1fedac14cdf6bcd3905a2db4e 100644 (file)
--- a/mh.c
+++ b/mh.c
@@ -1336,6 +1336,38 @@ static void maildir_flags (char *dest, size_t destlen, HEADER * hdr)
   }
 }
 
+static int maildir_mh_open_message (CONTEXT *ctx, MESSAGE *msg, int msgno,
+                                    int is_maildir)
+{
+  HEADER *cur = ctx->hdrs[msgno];
+  char path[_POSIX_PATH_MAX];
+
+  snprintf (path, sizeof (path), "%s/%s", ctx->path, cur->path);
+
+  msg->fp = fopen (path, "r");
+  if (msg->fp == NULL && errno == ENOENT && is_maildir)
+    msg->fp = maildir_open_find_message (ctx->path, cur->path);
+
+  if (!msg->fp)
+  {
+    mutt_perror (path);
+    dprint (1, (debugfile, "maildir_mh_open_message: fopen: %s: %s (errno %d).\n",
+            path, strerror (errno), errno));
+    return -1;
+  }
+
+  return 0;
+}
+
+static int maildir_open_message (CONTEXT *ctx, MESSAGE *msg, int msgno)
+{
+  return maildir_mh_open_message (ctx, msg, msgno, 1);
+}
+
+static int mh_open_message (CONTEXT *ctx, MESSAGE *msg, int msgno)
+{
+  return maildir_mh_open_message (ctx, msg, msgno, 0);
+}
 
 /*
  * Open a new (temporary) message in a maildir folder.
@@ -2412,6 +2444,7 @@ int mx_is_mh (const char *path)
 struct mx_ops mx_maildir_ops = {
   .open = maildir_open_mailbox,
   .close = mh_close_mailbox,
+  .open_msg = maildir_open_message,
   .open_new_msg = maildir_open_new_message,
   .check = maildir_check_mailbox,
 };
@@ -2419,6 +2452,7 @@ struct mx_ops mx_maildir_ops = {
 struct mx_ops mx_mh_ops = {
   .open = mh_open_mailbox,
   .close = mh_close_mailbox,
+  .open_msg = mh_open_message,
   .open_new_msg = mh_open_new_message,
   .check = mh_check_mailbox,
 };
diff --git a/mutt.h b/mutt.h
index aa18241ea3b034e912dbb6653c0e74f25677f590..74cede3254bc3a3ea634bcf446c140714f323c35 100644 (file)
--- a/mutt.h
+++ b/mutt.h
@@ -894,6 +894,7 @@ struct mx_ops
   int (*open)(struct _context *);
   int (*close)(struct _context *);
   int (*check) (struct _context *ctx, int *index_hint);
+  int (*open_msg) (struct _context *, struct _message *, int msgno);
   int (*open_new_msg) (struct _message *, struct _context *, HEADER *);
 };
 
diff --git a/mx.c b/mx.c
index b2397740a3f9e5b581fbf67a68395f8bb40ab7cc..8e5b57e7845a45a21682bea055fc0451777cba93 100644 (file)
--- a/mx.c
+++ b/mx.c
@@ -1308,62 +1308,23 @@ int mx_check_mailbox (CONTEXT *ctx, int *index_hint)
 /* return a stream pointer for a message */
 MESSAGE *mx_open_message (CONTEXT *ctx, int msgno)
 {
+  struct mx_ops *ops = mx_get_ops (ctx->magic);
   MESSAGE *msg;
-  
-  msg = safe_calloc (1, sizeof (MESSAGE));
-  switch (msg->magic = ctx->magic)
-  {
-    case MUTT_MBOX:
-    case MUTT_MMDF:
-      msg->fp = ctx->fp;
-      break;
+  int ret;
 
-    case MUTT_MH:
-    case MUTT_MAILDIR:
-    {
-      HEADER *cur = ctx->hdrs[msgno];
-      char path[_POSIX_PATH_MAX];
-      
-      snprintf (path, sizeof (path), "%s/%s", ctx->path, cur->path);
-      
-      if ((msg->fp = fopen (path, "r")) == NULL && errno == ENOENT &&
-         ctx->magic == MUTT_MAILDIR)
-       msg->fp = maildir_open_find_message (ctx->path, cur->path);
-      
-      if (msg->fp == NULL)
-      {
-       mutt_perror (path);
-       dprint (1, (debugfile, "mx_open_message: fopen: %s: %s (errno %d).\n",
-                   path, strerror (errno), errno));
-       FREE (&msg);
-      }
-    }
-    break;
-    
-#ifdef USE_IMAP
-    case MUTT_IMAP:
-    {
-      if (imap_fetch_message (msg, ctx, msgno) != 0)
-       FREE (&msg);
-      break;
-    }
-#endif /* USE_IMAP */
+  if (!ops || !ops->open_msg)
+  {
+    dprint (1, (debugfile, "mx_open_message(): function not implemented for mailbox type %d.\n", ctx->magic));
+    return NULL;
+  }
 
-#ifdef USE_POP
-    case MUTT_POP:
-    {
-      if (pop_fetch_message (msg, ctx, msgno) != 0)
-       FREE (&msg);
-      break;
-    }
-#endif /* USE_POP */
+  msg = safe_calloc (1, sizeof (MESSAGE));
+  msg->magic = ctx->magic;
+  ret = ops->open_msg (ctx, msg, msgno);
+  if (ret)
+    FREE (&msg);
 
-    default:
-      dprint (1, (debugfile, "mx_open_message(): function not implemented for mailbox type %d.\n", ctx->magic));
-      FREE (&msg);
-      break;
-  }
-  return (msg);
+  return msg;
 }
 
 /* commit a message to a folder */
diff --git a/pop.c b/pop.c
index 4f0124abce2096747dd94a8138ed041da0dd0474..15c997926fd2d8600500a2c9153c22b1d1643196 100644 (file)
--- a/pop.c
+++ b/pop.c
@@ -512,7 +512,7 @@ int pop_close_mailbox (CONTEXT *ctx)
 }
 
 /* fetch message from POP server */
-int pop_fetch_message (MESSAGE* msg, CONTEXT* ctx, int msgno)
+static int pop_fetch_message (CONTEXT* ctx, MESSAGE* msg, int msgno)
 {
   int ret;
   void *uidl;
@@ -931,5 +931,6 @@ fail:
 struct mx_ops mx_pop_ops = {
   .open = pop_open_mailbox,
   .close = pop_close_mailbox,
+  .open_msg = pop_fetch_message,
   .check = pop_check_mailbox,
 };
diff --git a/pop.h b/pop.h
index edc1ed19cee7982ca5a0f81f469731079e046afb..53454c67861048fdaf92b98ffd17d35f6c68c857 100644 (file)
--- a/pop.h
+++ b/pop.h
@@ -106,7 +106,6 @@ void pop_error (POP_DATA *, char *);
 
 /* pop.c */
 int pop_sync_mailbox (CONTEXT *, int *);
-int pop_fetch_message (MESSAGE *, CONTEXT *, int);
 int pop_close_mailbox (CONTEXT *);
 void pop_fetch_mail (void);