/*
+ * 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 <lib-lib/file.h>
+#include <lib-lib/mapping.h>
+
+#include <lib-mime/mime.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>
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;
}
*help_ptr++ = *filename++;
}
- FREE (&tmp);
+ p_delete(&tmp);
return 0;
}
}
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);
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;
}
}
else {
if (!idx[*idxlen])
- idx[*idxlen] = (ATTACHPTR *) safe_calloc (1, sizeof (ATTACHPTR));
+ idx[*idxlen] = p_new(ATTACHPTR, 1);
new = idx[(*idxlen)++];
new->content = m;
if (aptr->content->filename && *aptr->content->filename == '/') {
char path[_POSIX_PATH_MAX];
- strfcpy (path, aptr->content->filename, sizeof (path));
+ m_strcpy(path, sizeof(path), aptr->content->filename);
mutt_pretty_mailbox (path);
mutt_format_s (dest, destlen, prefix, path);
}
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;
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;
}
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);
}
if (body->filename) {
if (directory && *directory)
- mutt_concat_path (buf, *directory, mutt_basename (body->filename),
- sizeof (buf));
+ mutt_concat_path(buf, sizeof(buf), *directory,
+ mutt_basename(body->filename));
else
- strfcpy (buf, body->filename, sizeof (buf));
+ m_strcpy(buf, sizeof(buf), body->filename);
}
else if (body->hdr &&
body->encoding != ENCBASE64 &&
char tmpbuf[_POSIX_PATH_MAX];
snprintf (tmpbuf, sizeof (tmpbuf), "%s%s", LastSaveFolder, buf);
- strfcpy (buf, tmpbuf, sizeof (buf));
+ m_strcpy(buf, sizeof(buf), tmpbuf);
ret = mutt_get_field (_("Save to file: ")
, buf, sizeof (buf), M_FILE);
if ((ret != 0) || (!buf[0]))
}
else {
mutt_extract_path (buf, path);
- strfcpy (LastSaveFolder, path, sizeof (LastSaveFolder));
+ m_strcpy(LastSaveFolder, sizeof(LastSaveFolder), path);
}
prompt = NULL;
}
else if (rc == -1)
return -1;
- strfcpy (tfile, buf, sizeof (tfile));
+ m_strcpy(tfile, sizeof(tfile), buf);
}
else {
if ((rc =
if (!buf[0]) {
int append = 0;
- strfcpy (buf, NONULL (top->filename), sizeof (buf));
+ m_strcpy(buf, sizeof(buf), NONULL(top->filename));
if (mutt_get_field (_("Save to file: "), buf, sizeof (buf),
M_FILE | M_CLEAR) != 0 || !buf[0])
return;
break;
}
- FREE (&directory);
+ p_delete(&directory);
if (tag && menu) {
menu->oldcurrent = menu->current;
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])
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);
print_attachment_list (fp, tag, top, &state);
}
-void
+static void
mutt_update_attach_index (BODY * cur, ATTACHPTR *** idxp,
short *idxlen, short *idxmax, MUTTMENU * menu)
{
char helpstr[SHORT_STRING];
MUTTMENU *menu;
- BODY *cur;
+ BODY *cur = NULL;
MESSAGE *msg;
FILE *fp;
ATTACHPTR **idx = NULL;
attach_collapse (cur, 0, 1, 0);
mutt_update_attach_index (cur, &idx, &idxlen, &idxmax, menu);
- FOREVER {
+ for (;;) {
if (op == OP_NULL)
op = mutt_menuLoop (menu);
switch (op) {
}
#endif
- if (WithCrypto && hdr->security) {
+ if (WithCrypto && (hdr->security & (~PGP_TRADITIONAL_CHECKED))) {
mutt_message
_
("Deletion of attachments from encrypted messages is unsupported.");
CHECK_ATTACH;
if (!idx[menu->current]->content->hdr->env->followup_to ||
- mutt_strcasecmp (idx[menu->current]->content->hdr->env->followup_to,
+ m_strcasecmp(idx[menu->current]->content->hdr->env->followup_to,
"poster")
|| query_quadoption (OPT_FOLLOWUPTOPOSTER,
_("Reply by mail as poster prefers?")) !=
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) {