simplifications
[apps/madmutt.git] / recvattach.c
index b76c43a..90ed28b 100644 (file)
 #include <lib-lib/lib-lib.h>
 
 #include <lib-mime/mime.h>
 #include <lib-lib/lib-lib.h>
 
 #include <lib-mime/mime.h>
+#include <lib-sys/unix.h>
 
 #include <lib-ui/curses.h>
 #include <lib-ui/enter.h>
 #include <lib-ui/menu.h>
 #include <lib-mx/mx.h>
 
 #include <lib-ui/curses.h>
 #include <lib-ui/enter.h>
 #include <lib-ui/menu.h>
 #include <lib-mx/mx.h>
-
-#include <lib-sys/unix.h>
+#include <lib-crypt/crypt.h>
 
 #include "mutt.h"
 #include "handler.h"
 #include "recvattach.h"
 #include "attach.h"
 #include "copy.h"
 
 #include "mutt.h"
 #include "handler.h"
 #include "recvattach.h"
 #include "attach.h"
 #include "copy.h"
-#include <lib-crypt/crypt.h>
-
 
 
-static const char *Mailbox_is_read_only = N_("Mailbox is read-only.");
-static char LastSaveFolder[_POSIX_PATH_MAX] = "";
-
-#define CHECK_READONLY if (Context->readonly) \
-{\
-    mutt_flushinp (); \
-    mutt_error _(Mailbox_is_read_only); \
-    break; \
-}
-
-#define SW              (option(OPTMBOXPANE)?SidebarWidth:0)
+#define SW    (option(OPTMBOXPANE)?SidebarWidth:0)
 
 static struct mapping_t AttachHelp[] = {
   {N_("Exit"), OP_EXIT},
 
 static struct mapping_t AttachHelp[] = {
   {N_("Exit"), OP_EXIT},
@@ -48,26 +36,6 @@ static struct mapping_t AttachHelp[] = {
   {NULL, OP_NULL}
 };
 
   {NULL, OP_NULL}
 };
 
-static int mutt_extract_path (char *filename, char *path, ssize_t pathlen)
-{
-  char *tmp = p_new(char, _POSIX_PATH_MAX);
-  char *help_ptr;
-
-  help_ptr = tmp;
-
-  while (*filename != '\0') {
-    if (*filename == '/') {
-      *help_ptr++ = *filename++;
-      *help_ptr++ = '\0';
-      m_strcat(path, pathlen, tmp);
-      help_ptr = tmp;
-    }
-    *help_ptr++ = *filename++;
-  }
-  p_delete(&tmp);
-  return 0;
-}
-
 void mutt_update_tree (ATTACHPTR ** idx, short idxlen)
 {
   char buf[STRING];
 void mutt_update_tree (ATTACHPTR ** idx, short idxlen)
 {
   char buf[STRING];
@@ -373,7 +341,6 @@ static int mutt_query_save_attachment (FILE * fp, BODY * body, HEADER * hdr,
 {
   char *prompt;
   char buf[_POSIX_PATH_MAX], tfile[_POSIX_PATH_MAX];
 {
   char *prompt;
   char buf[_POSIX_PATH_MAX], tfile[_POSIX_PATH_MAX];
-  char path[_POSIX_PATH_MAX] = "";
   int is_message;
   int append = 0;
   int rc;
   int is_message;
   int append = 0;
   int rc;
@@ -396,32 +363,28 @@ static int mutt_query_save_attachment (FILE * fp, BODY * body, HEADER * hdr,
 
   prompt = _("Save to file ('#' for last used folder): ");
   while (prompt) {
 
   prompt = _("Save to file ('#' for last used folder): ");
   while (prompt) {
-    ret =
-      mutt_get_field (prompt, buf, sizeof (buf),
-                      M_FILE | M_CLEAR | M_LASTFOLDER);
+    static char LastSaveFolder[_POSIX_PATH_MAX] = ".";
+
+    ret = mutt_get_field(prompt, buf, sizeof (buf),
+                         M_FILE | M_CLEAR | M_LASTFOLDER);
     if (((ret != 0) && (ret != 2)) || (!buf[0] && ret != 2))
       return -1;
 
     if (ret == 2) {
       char tmpbuf[_POSIX_PATH_MAX];
 
     if (((ret != 0) && (ret != 2)) || (!buf[0] && ret != 2))
       return -1;
 
     if (ret == 2) {
       char tmpbuf[_POSIX_PATH_MAX];
 
-      snprintf (tmpbuf, sizeof (tmpbuf), "%s%s", LastSaveFolder, buf);
+      snprintf (tmpbuf, sizeof (tmpbuf), "%s/%s", LastSaveFolder, buf);
       m_strcpy(buf, sizeof(buf), tmpbuf);
       m_strcpy(buf, sizeof(buf), tmpbuf);
-      ret = mutt_get_field (_("Save to file: ")
-                            , buf, sizeof (buf), M_FILE);
+      ret = mutt_get_field(_("Save to file: "), buf, sizeof (buf), M_FILE);
       if ((ret != 0) || (!buf[0]))
         return -1;
     }
       if ((ret != 0) || (!buf[0]))
         return -1;
     }
-    else {
-      mutt_extract_path (buf, path, sizeof(path));
-      m_strcpy(LastSaveFolder, sizeof(LastSaveFolder), path);
-    }
+    m_dirname(LastSaveFolder, sizeof(LastSaveFolder), buf);
 
     prompt = NULL;
 
     prompt = NULL;
-    mutt_expand_path (buf, sizeof (buf));
+    mutt_expand_path(buf, sizeof(buf));
 
 
-    is_message = (fp &&
-                  body->hdr &&
+    is_message = (fp && body->hdr &&
                   body->encoding != ENCBASE64 &&
                   body->encoding != ENCQUOTEDPRINTABLE &&
                   mutt_is_message_type(body));
                   body->encoding != ENCBASE64 &&
                   body->encoding != ENCQUOTEDPRINTABLE &&
                   mutt_is_message_type(body));
@@ -430,35 +393,27 @@ static int mutt_query_save_attachment (FILE * fp, BODY * body, HEADER * hdr,
       struct stat st;
 
       /* check to make sure that this file is really the one the user wants */
       struct stat st;
 
       /* check to make sure that this file is really the one the user wants */
-      if ((rc = mutt_save_confirm (buf, &st)) == 1) {
-        prompt = _("Save to file: ");
-        continue;
-      }
-      else if (rc == -1)
-        return -1;
+      rc = mutt_save_confirm(buf, &st);
       m_strcpy(tfile, sizeof(tfile), buf);
       m_strcpy(tfile, sizeof(tfile), buf);
+    } else {
+      rc = mutt_check_overwrite(body->filename, buf, tfile, sizeof(tfile),
+                                &append, directory);
     }
     }
-    else {
-      if ((rc =
-           mutt_check_overwrite (body->filename, buf, tfile, sizeof (tfile),
-                                 &append, directory)) == -1)
-        return -1;
-      else if (rc == 1) {
-        prompt = _("Save to file: ");
-        continue;
-      }
+    if (rc == -1)
+      return -1;
+    if (rc == 1) {
+      prompt = _("Save to file: ");
+      continue;
     }
 
     mutt_message _("Saving...");
 
     }
 
     mutt_message _("Saving...");
 
-    if (mutt_save_attachment
-        (fp, body, tfile, append,
-         (hdr || !is_message) ? hdr : body->hdr) == 0) {
+    if (mutt_save_attachment(fp, body, tfile, append,
+                             (hdr || !is_message) ?  hdr : body->hdr) == 0)
+    {
       mutt_message _("Attachment saved.");
       mutt_message _("Attachment saved.");
-
       return 0;
       return 0;
-    }
-    else {
+    } else {
       prompt = _("Save to file: ");
       continue;
     }
       prompt = _("Save to file: ");
       continue;
     }
@@ -504,8 +459,7 @@ void mutt_save_attachment_list (FILE * fp, int tag, BODY * top, HEADER * hdr,
             m_fclose(&fpout);
           }
         }
             m_fclose(&fpout);
           }
         }
-      }
-      else {
+      } else {
         if (tag && menu && top->aptr) {
           menu->oldcurrent = menu->current;
           menu->current = top->aptr->num;
         if (tag && menu && top->aptr) {
           menu->oldcurrent = menu->current;
           menu->current = top->aptr->num;
@@ -552,9 +506,9 @@ mutt_query_pipe_attachment (char *command, FILE * fp, BODY * body, int afilter)
       return;
     }
     mutt_mktemp (tfile);
       return;
     }
     mutt_mktemp (tfile);
+  } else {
+    tfile[0] = '\0';
   }
   }
-  else
-    tfile[0] = 0;
 
   if (mutt_pipe_attachment (fp, body, command, tfile)) {
     if (afilter) {
 
   if (mutt_pipe_attachment (fp, body, command, tfile)) {
     if (afilter) {
@@ -563,8 +517,7 @@ mutt_query_pipe_attachment (char *command, FILE * fp, BODY * body, int afilter)
       mutt_update_encoding (body);
       mutt_message _("Attachment filtered.");
     }
       mutt_update_encoding (body);
       mutt_message _("Attachment filtered.");
     }
-  }
-  else {
+  } else {
     if (afilter && tfile[0])
       mutt_unlink (tfile);
   }
     if (afilter && tfile[0])
       mutt_unlink (tfile);
   }
@@ -579,8 +532,7 @@ static void pipe_attachment (FILE * fp, BODY * b, STATE * state)
     mutt_decode_attachment (b, state);
     if (AttachSep)
       state_puts (AttachSep, state);
     mutt_decode_attachment (b, state);
     if (AttachSep)
       state_puts (AttachSep, state);
-  }
-  else {
+  } else {
     if ((ifp = fopen (b->filename, "r")) == NULL) {
       mutt_perror ("fopen");
       return;
     if ((ifp = fopen (b->filename, "r")) == NULL) {
       mutt_perror ("fopen");
       return;
@@ -619,7 +571,7 @@ void mutt_pipe_attachment_list (FILE * fp, int tag, BODY * top, int afilter)
   if (fp)
     afilter = 0;                 /* sanity check: we can't filter in the recv case yet */
 
   if (fp)
     afilter = 0;                 /* sanity check: we can't filter in the recv case yet */
 
-  buf[0] = 0;
+  buf[0] = '\0';
   p_clear(&state, 1);
 
   if (mutt_get_field ((afilter ? _("Filter through: ") : _("Pipe to: ")),
   p_clear(&state, 1);
 
   if (mutt_get_field ((afilter ? _("Filter through: ") : _("Pipe to: ")),
@@ -635,34 +587,35 @@ void mutt_pipe_attachment_list (FILE * fp, int tag, BODY * top, int afilter)
     m_fclose(&state.fpout);
     if (mutt_wait_filter (thepid) != 0 || option (OPTWAITKEY))
       mutt_any_key_to_continue (NULL);
     m_fclose(&state.fpout);
     if (mutt_wait_filter (thepid) != 0 || option (OPTWAITKEY))
       mutt_any_key_to_continue (NULL);
-  }
-  else
+  } else {
     pipe_attachment_list (buf, fp, tag, top, afilter, &state);
     pipe_attachment_list (buf, fp, tag, top, afilter, &state);
+  }
 }
 
 }
 
-static int can_print (BODY * top, int tag)
+static int can_print(BODY * top, int tag)
 {
 {
-  char type[STRING];
-
   for (; top; top = top->next) {
   for (; top; top = top->next) {
-    snprintf (type, sizeof (type), "%s/%s", TYPE (top), top->subtype);
+    char type[STRING];
+    int tok = mime_which_token(top->subtype, -1);
+
+    snprintf(type, sizeof(type), "%s/%s", TYPE(top), top->subtype);
+
     if (!tag || top->tagged) {
     if (!tag || top->tagged) {
-      if (!rfc1524_mailcap_lookup (top, type, NULL, M_PRINT)) {
-        if (ascii_strcasecmp ("text/plain", top->subtype) &&
-            ascii_strcasecmp ("application/postscript", top->subtype)) {
-          if (!mutt_can_decode (top)) {
-            mutt_error (_("I dont know how to print %s attachments!"), type);
-            return (0);
-          }
-        }
+      if (!rfc1524_mailcap_lookup(top, type, NULL, M_PRINT)
+      && !(top->type == TYPETEXT && tok == MIME_PLAIN)
+      && !(top->type == TYPEAPPLICATION && tok == MIME_POSTSCRIPT)
+      && !mutt_can_decode(top))
+      {
+        mutt_error(_("I dont know how to print %s attachments!"), type);
+        return 0;
       }
     }
     else if (top->parts)
       }
     }
     else if (top->parts)
-      return (can_print (top->parts, tag));
+      return (can_print(top->parts, tag));
     if (!tag)
       break;
   }
     if (!tag)
       break;
   }
-  return (1);
+  return 1;
 }
 
 static void print_attachment_list (FILE * fp, int tag, BODY * top,
 }
 
 static void print_attachment_list (FILE * fp, int tag, BODY * top,
@@ -670,16 +623,18 @@ static void print_attachment_list (FILE * fp, int tag, BODY * top,
 {
   char type[STRING];
 
 {
   char type[STRING];
 
-
   for (; top; top = top->next) {
     if (!tag || top->tagged) {
   for (; top; top = top->next) {
     if (!tag || top->tagged) {
+      int tok = mime_which_token(top->subtype, -1);
+
       snprintf (type, sizeof (type), "%s/%s", TYPE (top), top->subtype);
       if (!option (OPTATTACHSPLIT)
           && !rfc1524_mailcap_lookup (top, type, NULL, M_PRINT)) {
       snprintf (type, sizeof (type), "%s/%s", TYPE (top), top->subtype);
       if (!option (OPTATTACHSPLIT)
           && !rfc1524_mailcap_lookup (top, type, NULL, M_PRINT)) {
-        if (!ascii_strcasecmp ("text/plain", top->subtype)
-            || !ascii_strcasecmp ("application/postscript", top->subtype))
+        if ((top->type == TYPETEXT && tok == MIME_PLAIN)
+        ||  (top->type == TYPEAPPLICATION && tok == MIME_POSTSCRIPT)) {
           pipe_attachment (fp, top, state);
           pipe_attachment (fp, top, state);
-        else if (mutt_can_decode (top)) {
+        } else
+        if (mutt_can_decode (top)) {
           /* decode and print */
 
           char newfile[_POSIX_PATH_MAX] = "";
           /* decode and print */
 
           char newfile[_POSIX_PATH_MAX] = "";
@@ -697,9 +652,9 @@ static void print_attachment_list (FILE * fp, int tag, BODY * top,
           }
           mutt_unlink (newfile);
         }
           }
           mutt_unlink (newfile);
         }
+      } else {
+        mutt_print_attachment(fp, top);
       }
       }
-      else
-        mutt_print_attachment (fp, top);
     }
     else if (top->parts)
       print_attachment_list (fp, tag, top->parts, state);
     }
     else if (top->parts)
       print_attachment_list (fp, tag, top->parts, state);
@@ -714,8 +669,7 @@ void mutt_print_attachment_list (FILE * fp, int tag, BODY * top)
 
   pid_t thepid;
 
 
   pid_t thepid;
 
-  if (query_quadoption
-      (OPT_PRINT,
+  if (query_quadoption(OPT_PRINT,
        tag ? _("Print tagged attachment(s)?") : _("Print attachment?")) !=
       M_YES)
     return;
        tag ? _("Print tagged attachment(s)?") : _("Print attachment?")) !=
       M_YES)
     return;
@@ -754,10 +708,8 @@ mutt_update_attach_index (BODY * cur, ATTACHPTR *** idxp,
     menu->current = menu->max - 1;
   menu_check_recenter (menu);
   menu->redraw |= REDRAW_INDEX;
     menu->current = menu->max - 1;
   menu_check_recenter (menu);
   menu->redraw |= REDRAW_INDEX;
-
 }
 
 }
 
-
 int
 mutt_attach_display_loop (MUTTMENU * menu, int op, FILE * fp, HEADER * hdr,
                           BODY * cur, ATTACHPTR *** idxp, short *idxlen,
 int
 mutt_attach_display_loop (MUTTMENU * menu, int op, FILE * fp, HEADER * hdr,
                           BODY * cur, ATTACHPTR *** idxp, short *idxlen,
@@ -875,7 +827,6 @@ void mutt_view_attachments (HEADER * hdr)
   if ((msg = mx_open_message (Context, hdr->msgno)) == NULL)
     return;
 
   if ((msg = mx_open_message (Context, hdr->msgno)) == NULL)
     return;
 
-
   if ((hdr->security & ENCRYPT) ||
       (mutt_is_application_smime (hdr->content) & SMIMEOPAQUE))
   {
   if ((hdr->security & ENCRYPT) ||
       (mutt_is_application_smime (hdr->content) & SMIMEOPAQUE))
   {
@@ -919,7 +870,6 @@ void mutt_view_attachments (HEADER * hdr)
     if (need_secured && !secured) {
       mx_close_message (&msg);
       mutt_error _("Can't decrypt encrypted message!");
     if (need_secured && !secured) {
       mx_close_message (&msg);
       mutt_error _("Can't decrypt encrypted message!");
-
       return;
     }
   }
       return;
     }
   }
@@ -941,6 +891,13 @@ void mutt_view_attachments (HEADER * hdr)
   attach_collapse (cur, 0, 1, 0);
   mutt_update_attach_index (cur, &idx, &idxlen, &idxmax, menu);
 
   attach_collapse (cur, 0, 1, 0);
   mutt_update_attach_index (cur, &idx, &idxlen, &idxmax, menu);
 
+#define CHECK_READONLY \
+    if (Context->readonly) {                                            \
+        mutt_flushinp ();                                               \
+        mutt_error _("Mailbox is read-only.");                          \
+        break;                                                          \
+    }
+
 #define CHECK_ATTACH \
     if (option(OPTATTACHMSG)) {                                         \
         mutt_flushinp ();                                               \
 #define CHECK_ATTACH \
     if (option(OPTATTACHMSG)) {                                         \
         mutt_flushinp ();                                               \