From: Thomas Roessler Date: Thu, 2 Sep 1999 11:17:34 +0000 (+0000) Subject: A new edit-message feature, giving the raw message in an editor. X-Git-Tag: mutt-0-96-7-rel~24 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=beafe1ed70094cea3491e477f76b913a3be037de;p=mutt A new edit-message feature, giving the raw message in an editor. --- diff --git a/Makefile.am b/Makefile.am index c6dce388..1d5d0470 100644 --- a/Makefile.am +++ b/Makefile.am @@ -35,7 +35,7 @@ mutt_SOURCES = $(BUILT_SOURCES) \ rfc822.c rfc1524.c rfc2047.c rfc2231.c \ score.c send.c sendlib.c signal.c sort.c \ status.c system.c thread.c charset.c history.c lib.c \ - muttlib.c + muttlib.c editmsg.c mutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ $(LIBIMAP) $(GSSLIBS) $(INTLLIBS) mutt_DEPENDENCIES = @MUTT_LIB_OBJECTS@ @LIBOBJS@ $(LIBIMAPDEPS) $(INTLDEPS) diff --git a/OPS b/OPS index 997488c8..3b738b05 100644 --- a/OPS +++ b/OPS @@ -52,7 +52,7 @@ OP_DELETE_THREAD "delete all messages in thread" OP_DISPLAY_ADDRESS "display full address of sender" OP_DISPLAY_HEADERS "display message with full headers" OP_DISPLAY_MESSAGE "display a message" -OP_EDIT_MESSAGE "edit the current message for resending" +OP_EDIT_MESSAGE "edit the raw message" OP_EDITOR_BACKSPACE "delete the char in front of the cursor" OP_EDITOR_BACKWARD_CHAR "move the cursor one character to the left" OP_EDITOR_BOL "jump to the beginning of the line" diff --git a/compose.c b/compose.c index 0c88b993..df006cd6 100644 --- a/compose.c +++ b/compose.c @@ -1181,20 +1181,16 @@ int mutt_compose_menu (HEADER *msg, /* structure for new message */ if (mutt_enter_fname (_("Write message to mailbox"), fname, sizeof (fname), &menu->redraw, 1) != -1 && fname[0]) { - int oldhdrdate; mutt_message (_("Writing message to %s ..."), fname); mutt_expand_path (fname, sizeof (fname)); if (msg->content->next) msg->content = mutt_make_multipart (msg->content); - oldhdrdate = option(OPTUSEHEADERDATE); - set_option(OPTUSEHEADERDATE); if (mutt_write_fcc (NONULL (fname), msg, NULL, 1, NULL) < 0) msg->content = mutt_remove_multipart (msg->content); else mutt_message _("Message written."); - if(!oldhdrdate) unset_option(OPTUSEHEADERDATE); } break; diff --git a/curs_main.c b/curs_main.c index dce27805..c873e597 100644 --- a/curs_main.c +++ b/curs_main.c @@ -1534,11 +1534,10 @@ int mutt_index_menu (void) CHECK_MSGCOUNT; CHECK_READONLY; CHECK_ATTACH; - - set_option(OPTUSEHEADERDATE); - ci_send_message (SENDEDITMSG, NULL, NULL, Context, CURHDR); - unset_option(OPTUSEHEADERDATE); + + mutt_edit_message (Context, tag ? NULL : CURHDR); menu->redraw = REDRAW_FULL; + break; case OP_FORWARD_MESSAGE: diff --git a/doc/manual.sgml.head b/doc/manual.sgml.head index 0d7ed08a..601c73cf 100644 --- a/doc/manual.sgml.head +++ b/doc/manual.sgml.head @@ -336,9 +336,10 @@ name="ignore"> commands.

(default: e) This command (available in the ``index'' and ``pager'') allows you to -edit the current message. Once editing is complete, the (default: ``:'') diff --git a/editmsg.c b/editmsg.c new file mode 100644 index 00000000..3696560f --- /dev/null +++ b/editmsg.c @@ -0,0 +1,204 @@ +/* + * Copyright (C) 1999 Thomas Roessler + * + * 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., 675 Mass Ave, Cambridge, MA + * 02139, USA. + */ + +/* simple, editor-based message editing */ + +#include "mutt.h" +#include "copy.h" +#include "mailbox.h" +#include "mx.h" + +#include +#include + +#include + +/* + * return value: + * + * 1 message not modified + * 0 message edited successfully + * -1 error + */ + +static int edit_one_message (CONTEXT *ctx, HEADER *cur) +{ + char tmp[_POSIX_PATH_MAX]; + char buff[STRING]; + int omagic; + int oerrno; + int rc; + + unsigned short o_read; + unsigned short o_old; + + int of, cf; + + CONTEXT tmpctx; + MESSAGE *msg; + + FILE *fp = NULL; + + struct stat sb; + time_t mtime = 0; + + mutt_mktemp (tmp); + + omagic = DefaultMagic; + DefaultMagic = M_MBOX; + + rc = (mx_open_mailbox (tmp, M_APPEND, &tmpctx) == NULL) ? -1 : 0; + + DefaultMagic = omagic; + + if (rc == -1) + { + mutt_error (_("could not create temporary folder: %s"), strerror (errno)); + return -1; + } + + rc = mutt_append_message (&tmpctx, ctx, cur, 0, CH_NOLEN); oerrno = errno; + + mx_close_mailbox (&tmpctx); + + if (rc == -1) + { + mutt_error (_("could not write temporary mail folder: %s"), strerror (oerrno)); + goto bail; + } + + if (stat (tmp, &sb) == 0) + mtime = sb.st_mtime; + + mutt_edit_file (Editor, tmp); + + if ((rc = stat (tmp, &sb)) == -1) + { + mutt_error (_("Can't stat: %s"), strerror (errno)); + goto bail; + } + + if (sb.st_size == 0) + { + mutt_message (_("Message file is empty!")); + rc = 1; + goto bail; + } + + if (sb.st_mtime == mtime) + { + mutt_message (_("Message not modified!")); + rc = 1; + goto bail; + } + + if ((fp = fopen (tmp, "r")) == NULL) + { + rc = -1; + mutt_error (_("Can't open message file: %s"), strerror (errno)); + goto bail; + } + + if (mx_open_mailbox (ctx->path, M_APPEND, &tmpctx) == NULL) + { + rc = -1; + mutt_error (_("Can't append to folder: %s"), strerror (errno)); + goto bail; + } + + of = cf = 0; + + if (fgets (buff, sizeof (buff), fp) && is_from (buff, NULL, 0)) + { + if (tmpctx.magic == M_MBOX || tmpctx.magic == M_MMDF || + tmpctx.magic == M_KENDRA) + cf = CH_FROM | CH_FORCE_FROM; + } + else + of = M_ADD_FROM; + + /* + * XXX - we have to play games with the message flags to avoid + * problematic behaviour with maildir folders. + * + */ + + o_read = cur->read; o_old = cur->old; + cur->read = cur->old = 0; + msg = mx_open_new_message (&tmpctx, cur, of); + cur->read = o_read; cur->old = o_old; + + if (msg == NULL) + { + mutt_error (_("Can't append to folder: %s"), strerror (errno)); + mx_close_mailbox (&tmpctx); + goto bail; + } + + if ((rc = mutt_copy_hdr (fp, msg->fp, 0, sb.st_size, CH_NOSTATUS | CH_NOLEN | cf, NULL)) == 0) + rc = mutt_copy_stream (fp, msg->fp); + + rc = mx_commit_message (msg, &tmpctx); + mx_close_message (&msg); + + mx_close_mailbox (&tmpctx); + + bail: + if (fp) fclose (fp); + + if (rc >= 0) + unlink (tmp); + + if (rc == 0) + { + mutt_set_flag (Context, cur, M_DELETE, 1); + mutt_set_flag (Context, cur, M_READ, 1); + + if (option (OPTDELETEUNTAG)) + mutt_set_flag (Context, cur, M_TAG, 0); + } + else if (rc == -1) + mutt_message (_("Error. Preserving temporary file: %s"), tmp); + + + return rc; +} + +int mutt_edit_message (CONTEXT *ctx, HEADER *hdr) +{ + int i, j; + + if (hdr) + return edit_one_message (ctx, hdr); + + + for (i = 0; i < ctx->vcount; i++) + { + j = ctx->v2r[i]; + if (ctx->hdrs[j]->tagged) + { + if (edit_one_message (ctx, ctx->hdrs[j]) == -1) + return -1; + } + } + + return 0; +} diff --git a/mutt.h b/mutt.h index b2249a98..7306db18 100644 --- a/mutt.h +++ b/mutt.h @@ -257,7 +257,6 @@ enum #define SENDBATCH (1<<5) #define SENDMAILX (1<<6) #define SENDKEY (1<<7) -#define SENDEDITMSG (1<<8) /* boolean vars */ enum @@ -374,7 +373,6 @@ enum OPTFORCEREDRAWPAGER, /* (pseudo) used to force a redraw in the pager */ OPTSORTSUBTHREADS, /* (pseudo) used when $sort_aux changes */ OPTNEEDRESCORE, /* (pseudo) set when the `score' command is used */ - OPTUSEHEADERDATE, /* (pseudo) used by edit-message */ OPTATTACHMSG, /* (pseudo) used by attach-message */ #ifdef _PGPPATH diff --git a/protos.h b/protos.h index b3aa98a5..96faff16 100644 --- a/protos.h +++ b/protos.h @@ -215,6 +215,7 @@ int mutt_compose_attachment (BODY *a); int mutt_decode_save_attachment (FILE *, BODY *, char *, int, int); int mutt_display_message (HEADER *h); int mutt_edit_attachment(BODY *); +int mutt_edit_message (CONTEXT *, HEADER *); int mutt_parent_message (CONTEXT *, HEADER *); int mutt_prepare_edit_message(CONTEXT *, HEADER *, HEADER *); #define mutt_enter_fname(A,B,C,D,E) _mutt_enter_fname(A,B,C,D,E,0,NULL,NULL) diff --git a/send.c b/send.c index dec41ca7..f2249697 100644 --- a/send.c +++ b/send.c @@ -932,18 +932,13 @@ ci_send_message (int flags, /* send mode */ { msg = mutt_new_header (); - if (flags == SENDEDITMSG) - { - if (mutt_prepare_edit_message(ctx, msg, cur) < 0) - goto cleanup; - } - else if (flags == SENDPOSTPONED) + if (flags == SENDPOSTPONED) { if ((flags = mutt_get_postponed (ctx, msg, &cur, fcc, sizeof (fcc))) < 0) goto cleanup; } - if (flags & (SENDPOSTPONED | SENDEDITMSG)) + if (flags & SENDPOSTPONED) { if ((tempfp = safe_fopen (msg->content->filename, "a+")) == NULL) { @@ -956,7 +951,7 @@ ci_send_message (int flags, /* send mode */ msg->env = mutt_new_envelope (); } - if (! (flags & (SENDKEY | SENDPOSTPONED | SENDEDITMSG))) + if (! (flags & (SENDKEY | SENDPOSTPONED))) { pbody = mutt_new_body (); pbody->next = msg->content; /* don't kill command-line attachments */ @@ -988,7 +983,7 @@ ci_send_message (int flags, /* send mode */ } /* this is handled here so that the user can match ~f in send-hook */ - if (cur && option (OPTREVNAME) && !(flags & (SENDPOSTPONED | SENDEDITMSG))) + if (cur && option (OPTREVNAME) && !(flags & (SENDPOSTPONED))) { /* we shouldn't have to worry about freeing `msg->env->from' before * setting it here since this code will only execute when doing some @@ -997,7 +992,7 @@ ci_send_message (int flags, /* send mode */ msg->env->from = set_reverse_name (cur->env); } - if (!msg->env->from && option (OPTUSEFROM) && !(flags & (SENDEDITMSG|SENDPOSTPONED))) + if (!msg->env->from && option (OPTUSEFROM) && !(flags & (SENDPOSTPONED))) msg->env->from = mutt_default_from (); if (flags & SENDBATCH) @@ -1009,7 +1004,7 @@ ci_send_message (int flags, /* send mode */ process_user_header (msg->env); } } - else if (! (flags & (SENDPOSTPONED | SENDEDITMSG))) + else if (! (flags & (SENDPOSTPONED))) { if ((flags & (SENDREPLY | SENDFORWARD)) && envelope_defaults (msg->env, ctx, cur, flags) == -1) @@ -1079,7 +1074,7 @@ ci_send_message (int flags, /* send mode */ } /* wait until now to set the real name portion of our return address so that $realname can be set in a send-hook */ - if (msg->env->from && !msg->env->from->personal && !(flags & (SENDEDITMSG | SENDPOSTPONED))) + if (msg->env->from && !msg->env->from->personal && !(flags & ( SENDPOSTPONED))) msg->env->from->personal = safe_strdup (Realname); @@ -1134,7 +1129,7 @@ ci_send_message (int flags, /* send mode */ mutt_edit_file (Editor, msg->content->filename); } - if (! (flags & (SENDPOSTPONED | SENDEDITMSG | SENDFORWARD | SENDKEY))) + if (! (flags & (SENDPOSTPONED | SENDFORWARD | SENDKEY))) { if (stat (msg->content->filename, &st) == 0) { diff --git a/sendlib.c b/sendlib.c index f407757c..f1c61cc2 100644 --- a/sendlib.c +++ b/sendlib.c @@ -1273,18 +1273,9 @@ int mutt_write_rfc822_header (FILE *fp, ENVELOPE *env, BODY *attach, char buffer[LONG_STRING]; LIST *tmp = env->userhdrs; - if (option(OPTUSEHEADERDATE) && !privacy) - { - if(env->date) - fprintf(fp, "Date: %s\n", env->date); - else - fputs (mutt_make_date(buffer, sizeof(buffer)), fp); - } - else if (mode == 0 && !privacy) + if (mode == 0 && !privacy) fputs (mutt_make_date (buffer, sizeof(buffer)), fp); - - /* OPTUSEFROM is not consulted here so that we can still write a From: * field if the user sets it with the `my_hdr' command */