create a lib-hash.a with sha1 and md5.
[apps/madmutt.git] / recvattach.c
index 2c65fae..e123884 100644 (file)
@@ -1,38 +1,37 @@
 /*
+ * Copyright notice from original mutt:
  * Copyright (C) 1996-2000 Michael R. Elkins <me@mutt.org>
  * Copyright (C) 1999-2000 Thomas Roessler <roessler@does-not-exist.org>
- * 
- *     This program is free software; you can redistribute it and/or modify
- *     it under the terms of the GNU General Public License as published by
- *     the Free Software Foundation; either version 2 of the License, or
- *     (at your option) any later version.
- * 
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- * 
- *     You should have received a copy of the GNU General Public License
- *     along with this program; if not, write to the Free Software
- *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ *
+ * This file is part of mutt-ng, see http://www.muttng.org/.
+ * It's licensed under the GNU General Public License,
+ * please see the file GPL in the top level source directory.
  */
 
 #if HAVE_CONFIG_H
 # include "config.h"
 #endif
 
+#include <lib-lib/mem.h>
+#include <lib-lib/str.h>
+#include <lib-lib/macros.h>
+#include <lib-lib/ascii.h>
+
 #include "mutt.h"
+#include "enter.h"
+#include "handler.h"
+#include "recvattach.h"
 #include "mutt_curses.h"
 #include "mutt_menu.h"
 #include "rfc1524.h"
 #include "mime.h"
-#include "mailbox.h"
 #include "attach.h"
 #include "mapping.h"
 #include "mx.h"
 #include "copy.h"
 #include "mutt_crypt.h"
 
+
 #include <ctype.h>
 #include <stdlib.h>
 #include <unistd.h>
@@ -51,18 +50,20 @@ static char LastSaveFolder[_POSIX_PATH_MAX] = "";
     break; \
 }
 
+#define SW              (option(OPTMBOXPANE)?SidebarWidth:0)
+
 static struct mapping_t AttachHelp[] = {
   {N_("Exit"), OP_EXIT},
   {N_("Save"), OP_SAVE},
   {N_("Pipe"), OP_PIPE},
   {N_("Print"), OP_PRINT},
   {N_("Help"), OP_HELP},
-  {NULL}
+  {NULL, OP_NULL}
 };
 
-int mutt_extract_path (char *filename, char *path)
+static int mutt_extract_path (char *filename, char *path)
 {
-  char *tmp = safe_malloc (sizeof (char) * _POSIX_PATH_MAX);
+  char *tmp = p_new(char, _POSIX_PATH_MAX);
   char *help_ptr;
 
   help_ptr = tmp;
@@ -76,7 +77,7 @@ int mutt_extract_path (char *filename, char *path)
     }
     *help_ptr++ = *filename++;
   }
-  FREE (&tmp);
+  p_delete(&tmp);
   return 0;
 }
 
@@ -101,11 +102,11 @@ void mutt_update_tree (ATTACHPTR ** idx, short idxlen)
     }
 
     if (idx[x]->tree) {
-      if (mutt_strcmp (idx[x]->tree, buf) != 0)
-        mutt_str_replace (&idx[x]->tree, buf);
+      if (m_strcmp(idx[x]->tree, buf) != 0)
+        str_replace (&idx[x]->tree, buf);
     }
     else
-      idx[x]->tree = safe_strdup (buf);
+      idx[x]->tree = m_strdup(buf);
 
     if (2 * (idx[x]->level + 2) < sizeof (buf) && idx[x]->level) {
       s = buf + 2 * (idx[x]->level - 1);
@@ -126,7 +127,7 @@ ATTACHPTR **mutt_gen_attach_list (BODY * m,
 
   for (; m; m = m->next) {
     if (*idxlen == *idxmax) {
-      safe_realloc (&idx, sizeof (ATTACHPTR *) * ((*idxmax) += 5));
+      p_realloc(&idx, (*idxmax) += 5);
       for (i = *idxlen; i < *idxmax; i++)
         idx[i] = NULL;
     }
@@ -144,7 +145,7 @@ ATTACHPTR **mutt_gen_attach_list (BODY * m,
     }
     else {
       if (!idx[*idxlen])
-        idx[*idxlen] = (ATTACHPTR *) safe_calloc (1, sizeof (ATTACHPTR));
+        idx[*idxlen] = p_new(ATTACHPTR, 1);
 
       new = idx[(*idxlen)++];
       new->content = m;
@@ -304,6 +305,14 @@ const char *mutt_attach_fmt (char *dest,
       snprintf (dest, destlen, fmt, aptr->num + 1);
     }
     break;
+  case 'Q':
+    if (optional)
+      optional = aptr->content->attach_qualifies;
+    else {
+      snprintf (fmt, sizeof (fmt), "%%%sc", prefix);
+      mutt_format_s (dest, destlen, fmt, "Q");
+    }
+    break;
   case 's':
     if (flags & M_FORMAT_STAT_FILE) {
       struct stat st;
@@ -340,6 +349,14 @@ const char *mutt_attach_fmt (char *dest,
     else if (!aptr->content->unlink)
       optional = 0;
     break;
+  case 'X':
+    if (optional)
+      optional = (aptr->content->attach_count + aptr->content->attach_qualifies) != 0;
+    else {
+      snprintf (fmt, sizeof (fmt), "%%%sd", prefix);
+      snprintf (dest, destlen, fmt, aptr->content->attach_count + aptr->content->attach_qualifies);
+    }
+    break;
   default:
     *dest = 0;
   }
@@ -351,9 +368,10 @@ const char *mutt_attach_fmt (char *dest,
   return (src);
 }
 
-void attach_entry (char *b, size_t blen, MUTTMENU * menu, int num)
+static void attach_entry (char *b, size_t blen, MUTTMENU * menu, int num)
 {
-  mutt_FormatString (b, blen, NONULL (AttachFormat), mutt_attach_fmt,
+  int w=(COLS-SW)>blen?blen:(COLS-SW);
+  mutt_FormatString (b, w, NONULL (AttachFormat), mutt_attach_fmt,
                      (unsigned long) (((ATTACHPTR **) menu->data)[num]),
                      M_FORMAT_ARROWCURSOR);
 }
@@ -533,7 +551,7 @@ void mutt_save_attachment_list (FILE * fp, int tag, BODY * top, HEADER * hdr,
       break;
   }
 
-  FREE (&directory);
+  p_delete(&directory);
 
   if (tag && menu) {
     menu->oldcurrent = menu->current;
@@ -629,7 +647,7 @@ void mutt_pipe_attachment_list (FILE * fp, int tag, BODY * top, int filter)
     filter = 0;                 /* sanity check: we can't filter in the recv case yet */
 
   buf[0] = 0;
-  memset (&state, 0, sizeof (STATE));
+  p_clear(&state, 1);
 
   if (mutt_get_field ((filter ? _("Filter through: ") : _("Pipe to: ")),
                       buf, sizeof (buf), M_CMD) != 0 || !buf[0])
@@ -733,7 +751,7 @@ void mutt_print_attachment_list (FILE * fp, int tag, BODY * top)
     if (!can_print (top, tag))
       return;
     mutt_endwin (NULL);
-    memset (&state, 0, sizeof (STATE));
+    p_clear(&state, 1);
     thepid = mutt_create_filter (NONULL (PrintCmd), &state.fpout, NULL, NULL);
     print_attachment_list (fp, tag, top, &state);
     fclose (state.fpout);
@@ -744,7 +762,7 @@ void mutt_print_attachment_list (FILE * fp, int tag, BODY * top)
     print_attachment_list (fp, tag, top, &state);
 }
 
-void
+static void
 mutt_update_attach_index (BODY * cur, ATTACHPTR *** idxp,
                           short *idxlen, short *idxmax, MUTTMENU * menu)
 {
@@ -892,7 +910,7 @@ void mutt_view_attachments (HEADER * hdr)
 
   char helpstr[SHORT_STRING];
   MUTTMENU *menu;
-  BODY *cur;
+  BODY *cur = NULL;
   MESSAGE *msg;
   FILE *fp;
   ATTACHPTR **idx = NULL;
@@ -1083,7 +1101,7 @@ void mutt_view_attachments (HEADER * hdr)
       }
 #endif
 
-      if (WithCrypto && hdr->security) {
+      if (WithCrypto && (hdr->security & (~PGP_TRADITIONAL_CHECKED))) {
         mutt_message
           _
           ("Deletion of attachments from encrypted messages is unsupported.");
@@ -1181,7 +1199,7 @@ void mutt_view_attachments (HEADER * hdr)
       CHECK_ATTACH;
 
       if (!idx[menu->current]->content->hdr->env->followup_to ||
-          mutt_strcasecmp (idx[menu->current]->content->hdr->env->followup_to,
+          str_casecmp (idx[menu->current]->content->hdr->env->followup_to,
                            "poster")
           || query_quadoption (OPT_FOLLOWUPTOPOSTER,
                                _("Reply by mail as poster prefers?")) !=
@@ -1224,12 +1242,12 @@ void mutt_view_attachments (HEADER * hdr)
           hdr->attach_del = 1;
         if (idx[idxmax]->content)
           idx[idxmax]->content->aptr = NULL;
-        FREE (&idx[idxmax]->tree);
-        FREE (&idx[idxmax]);
+        p_delete(&idx[idxmax]->tree);
+        p_delete(&idx[idxmax]);
       }
       if (hdr->attach_del)
         hdr->changed = 1;
-      FREE (&idx);
+      p_delete(&idx);
       idxmax = 0;
 
       if (WithCrypto && need_secured && secured) {