More modular way to open messages.
[apps/madmutt.git] / lib-mx / mx.c
index 609b047..1d0e8d7 100644 (file)
@@ -35,7 +35,6 @@
 
 #define MAXLOCKATTEMPT 5
 
-
 static mx_t const *mxfmts[] = {
     &mbox_mx,
     &mh_mx,
@@ -817,6 +816,7 @@ int mx_sync_mailbox (CONTEXT* ctx, int* index_hint) {
  */
 MESSAGE *mx_open_new_message (CONTEXT * dest, HEADER * hdr, int flags)
 {
+
   MESSAGE *msg;
   address_t *p = NULL;
 
@@ -877,52 +877,16 @@ int mx_check_mailbox (CONTEXT * ctx, int *index_hint, int lock) {
 /* return a stream pointer for a message */
 MESSAGE *mx_open_message (CONTEXT * ctx, int msgno)
 {
-  MESSAGE *msg;
-
-  msg = p_new(MESSAGE, 1);
-  switch (msg->magic = ctx->magic) {
-  case M_MBOX:
-    msg->fp = ctx->fp;
-    break;
-
-  case M_MH:
-  case M_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 == M_MAILDIR)
-        msg->fp = maildir_open_find_message (ctx->path, cur->path);
-
-      if (msg->fp == NULL) {
-        mutt_perror (path);
-        p_delete(&msg);
-      }
-    }
-    break;
+    MESSAGE *msg;
 
-  case M_IMAP:
-    {
-      if (imap_fetch_message (msg, ctx, msgno) != 0)
-        p_delete(&msg);
-      break;
-    }
+    if (!MX_IDX(ctx->magic) || !mxfmts[ctx->magic - 1]->mx_open_message)
+        return NULL;
 
-  case M_POP:
-    {
-      if (pop_fetch_message (msg, ctx, msgno) != 0)
+    msg = p_new(MESSAGE, 1);
+    msg->magic = ctx->magic;
+    if (mxfmts[ctx->magic - 1]->mx_open_message(msg, ctx, msgno))
         p_delete(&msg);
-      break;
-    }
-
-  default:
-    p_delete(&msg);
-    break;
-  }
-  return msg;
+    return msg;
 }
 
 /* commit a message to a folder */