Mercurial > emacs
changeset 102165:f93f5035af02
(rmail-cease-edit): Notice changes in buffer's encoding during editing.
Make sure to use encoding that can safely encode the message.
Rewrite MIME charset= header if the new encoding is different from the old one.
author | Eli Zaretskii <eliz@gnu.org> |
---|---|
date | Sat, 21 Feb 2009 15:05:01 +0000 |
parents | 728f9439568b |
children | 07a0e776f607 |
files | lisp/mail/rmailedit.el |
diffstat | 1 files changed, 42 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/mail/rmailedit.el Sat Feb 21 13:45:59 2009 +0000 +++ b/lisp/mail/rmailedit.el Sat Feb 21 15:05:01 2009 +0000 @@ -136,9 +136,18 @@ (insert "\n"))) (let ((old rmail-old-text) (pruned rmail-old-pruned) + ;; People who know what they are doing might have modified the + ;; buffer's encoding if editing the message included inserting + ;; characters that were unencodable by the original message's + ;; encoding. Make note of the new encoding and use it for + ;; encoding the edited message. + (edited-coding buffer-file-coding-system) new-headers character-coding is-text-message coding-system headers-end limit) + ;; Make sure `edited-coding' can safely encode the edited message. + (setq edited-coding + (select-safe-coding-system (point-min) (point-max) edited-coding)) ;; Go back to Rmail mode, but carefully. (force-mode-line-update) (let ((rmail-buffer-swapped nil)) ; Prevent change-major-mode-hook @@ -154,6 +163,33 @@ (string= old (buffer-substring (point-min) (point-max)))) (setq old nil) (goto-char (point-min)) + ;; If they changed the message's encoding, rewrite the charset= + ;; header for them, so that subsequent rmail-show-message + ;; decodes it correctly. + (let ((buffer-read-only nil) + (new-coding (coding-system-base edited-coding)) + old-coding mime-charset mime-beg mime-end) + (when (re-search-forward rmail-mime-charset-pattern + (1- (save-excursion (search-forward "\n\n"))) + 'move) + (setq mime-beg (match-beginning 1) + mime-end (match-end 1) + old-coding (coding-system-from-name (match-string 1)))) + (setq mime-charset + (symbol-name + (or (coding-system-get new-coding :mime-charset) + (if (coding-system-equal new-coding 'undecided) + 'us-ascii + new-coding)))) + (cond + ((null old-coding) + ;; If there was no charset= spec, insert one. + (insert "Content-type: text/plain; charset=" mime-charset "\n")) + ((not (coding-system-equal (coding-system-base old-coding) + new-coding)) + (delete-region mime-beg mime-end) + (insert mime-charset)))) + (goto-char (point-min)) (search-forward "\n\n") (setq headers-end (point)) (setq new-headers (rmail-edit-headers-alist t)) @@ -171,7 +207,12 @@ (setq character-coding (mail-fetch-field "content-transfer-encoding") is-text-message (rmail-is-text-p) - coding-system (rmail-get-coding-system))) + coding-system (if (and edited-coding + (not (coding-system-equal + (coding-system-base edited-coding) + 'undecided))) + edited-coding + (rmail-get-coding-system)))) (if character-coding (setq character-coding (downcase character-coding)))