X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=recvattach.c;h=90ed28bbb2f4ca179ec414c28a2973f146aa3bb8;hp=b76c43a298fa37f25323ea12121f726f1196da80;hb=9ce749c3b737258ad526d6afc2eb69b788a34cd4;hpb=024fe257a96f97619e236bbdafe57b63101eb17f diff --git a/recvattach.c b/recvattach.c index b76c43a..90ed28b 100644 --- a/recvattach.c +++ b/recvattach.c @@ -11,33 +11,21 @@ #include #include +#include #include #include #include #include - -#include +#include #include "mutt.h" #include "handler.h" #include "recvattach.h" #include "attach.h" #include "copy.h" -#include - -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}, @@ -48,26 +36,6 @@ static struct mapping_t AttachHelp[] = { {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]; @@ -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 path[_POSIX_PATH_MAX] = ""; 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) { - 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]; - snprintf (tmpbuf, sizeof (tmpbuf), "%s%s", LastSaveFolder, buf); + snprintf (tmpbuf, sizeof (tmpbuf), "%s/%s", LastSaveFolder, buf); 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; } - else { - mutt_extract_path (buf, path, sizeof(path)); - m_strcpy(LastSaveFolder, sizeof(LastSaveFolder), path); - } + m_dirname(LastSaveFolder, sizeof(LastSaveFolder), buf); 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)); @@ -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 */ - 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); + } 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..."); - 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."); - return 0; - } - else { + } else { 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); } } - } - else { + } else { 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); + } else { + tfile[0] = '\0'; } - else - tfile[0] = 0; 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."); } - } - else { + } else { 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); - } - else { + } else { 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 */ - buf[0] = 0; + buf[0] = '\0'; 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); - } - else + } else { 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) { - 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 (!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) - return (can_print (top->parts, tag)); + return (can_print(top->parts, tag)); if (!tag) break; } - return (1); + return 1; } 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]; - 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)) { - 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); - else if (mutt_can_decode (top)) { + } else + if (mutt_can_decode (top)) { /* 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); } + } else { + mutt_print_attachment(fp, top); } - else - mutt_print_attachment (fp, top); } 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; - if (query_quadoption - (OPT_PRINT, + if (query_quadoption(OPT_PRINT, 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; - } - 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 ((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!"); - 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); +#define CHECK_READONLY \ + if (Context->readonly) { \ + mutt_flushinp (); \ + mutt_error _("Mailbox is read-only."); \ + break; \ + } + #define CHECK_ATTACH \ if (option(OPTATTACHMSG)) { \ mutt_flushinp (); \