changeset 105477:b9bdbb16b3fa

(rmail-cease-edit): If there is a Content-Type header we don't understand, don't insert another. (Bug#4624) If changing mime charset, insert the new one in the right place.
author Glenn Morris <rgm@gnu.org>
date Tue, 06 Oct 2009 02:37:22 +0000
parents e3bdbd8a2169
children e3187820f169
files lisp/ChangeLog lisp/mail/rmailedit.el
diffstat 2 files changed, 43 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Tue Oct 06 02:36:35 2009 +0000
+++ b/lisp/ChangeLog	Tue Oct 06 02:37:22 2009 +0000
@@ -1,3 +1,9 @@
+2009-10-06  Glenn Morris  <rgm@gnu.org>
+
+	* mail/rmailedit.el (rmail-cease-edit): If there is a Content-Type
+	header we don't understand, don't insert another.  (Bug#4624)
+	If changing mime charset, insert the new one in the right place.
+
 2009-10-06  Matthew Junker  <matthew.junker@sbcglobal.net>  (tiny change)
 
 	* calendar/cal-tex.el (cal-tex-cursor-month-landscape)
--- a/lisp/mail/rmailedit.el	Tue Oct 06 02:36:35 2009 +0000
+++ b/lisp/mail/rmailedit.el	Tue Oct 06 02:37:22 2009 +0000
@@ -168,35 +168,43 @@
 		 (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))))
+      ;; FIXME the edit may have inadvertently removed this.
+      (search-forward "\n\n")
+      (setq headers-end (point-marker))
       (goto-char (point-min))
-      (search-forward "\n\n")
-      (setq headers-end (point))
+      (save-restriction
+	(narrow-to-region (point) headers-end)
+	;; 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))
+	       (mime-charset (symbol-name
+			      (or (coding-system-get new-coding :mime-charset)
+				  (if (coding-system-equal new-coding
+							   'undecided)
+				      'us-ascii
+				    new-coding))))
+	       old-coding mime-beg mime-end content-type)
+	  (if (re-search-forward rmail-mime-charset-pattern nil 'move)
+	      (setq mime-beg (match-beginning 1)
+		    mime-end (match-end 1)
+		    old-coding (coding-system-from-name (match-string 1)))
+	    (setq content-type (mail-fetch-field "Content-Type")))
+	  (cond
+	   ;; No match for rmail-mime-charset-pattern, but there was some
+	   ;; other Content-Type.  We should not insert another.  (Bug#4624)
+	   (content-type)
+	   ((null old-coding)
+	    ;; If there was no charset= spec, insert one.
+	    (backward-char 1)
+	    (insert "Content-type: text/plain; charset=" mime-charset "\n"))
+	   ((not (coding-system-equal (coding-system-base old-coding)
+				      new-coding))
+	    (goto-char mime-end)
+	    (delete-region mime-beg mime-end)
+	    (insert mime-charset)))))
+      (goto-char headers-end)
       (setq new-headers (rmail-edit-headers-alist t))
       (rmail-swap-buffers-maybe)
       (narrow-to-region (rmail-msgbeg rmail-current-message)
@@ -205,6 +213,7 @@
 	(setq limit
 	      (save-excursion
 		(goto-char (point-min))
+		;; FIXME this should not be using NOERROR.
 		(search-forward "\n\n" nil t)))
 	;; All 3 of the functions we call below assume the buffer was
 	;; narrowed to just the headers of the message.