changeset 112263:932e0e85675a

Fix setting of buffer-file-coding-system of RMAIL buffer.
author Kenichi Handa <handa@m17n.org>
date Fri, 14 Jan 2011 13:04:10 +0900
parents bd264f28aa7d
children 01708c6828b7
files lisp/ChangeLog lisp/mail/rmailmm.el
diffstat 2 files changed, 41 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Wed Jan 12 15:11:40 2011 +0900
+++ b/lisp/ChangeLog	Fri Jan 14 13:04:10 2011 +0900
@@ -1,3 +1,14 @@
+2011-01-14  Kenichi Handa  <handa@m17n.org>
+
+	* mail/rmailmm.el (rmail-mime-insert-header): Set
+	rmail-mime-coding-system to a cons whose car is the last coding
+	system used to decode the header.
+	(rmail-mime-find-header-encoding): New function.
+	(rmail-mime-insert-decoded-text): Override
+	rmail-mime-coding-system if it is a cons.
+	(rmail-show-mime): If only a header part was decoded, find the
+	coding system while ignoring mm-charset-override-alist.
+
 2011-01-12  Kenichi Handa  <handa@m17n.org>
 
 	* mail/rmailmm.el (rmail-mime-next-item)
--- a/lisp/mail/rmailmm.el	Wed Jan 12 15:11:40 2011 +0900
+++ b/lisp/mail/rmailmm.el	Fri Jan 14 13:04:10 2011 +0900
@@ -460,12 +460,27 @@
 	    (rmail-copy-headers (point) (aref header 1)))))
       (rfc2047-decode-region pos (point))
       (if (and last-coding-system-used (not rmail-mime-coding-system))
-	  (setq rmail-mime-coding-system last-coding-system-used))
+	  (setq rmail-mime-coding-system (cons last-coding-system-used nil)))
       (goto-char (point-min))
       (rmail-highlight-headers)
       (goto-char (point-max))
       (insert "\n"))))
 
+(defun rmail-mime-find-header-encoding (header)
+  "Retun the last coding system used to decode HEADER.
+HEADER is a header component of a MIME-entity object (see
+`rmail-mime-entity')."
+  (with-temp-buffer
+    (let ((last-coding-system-used nil))
+      (with-current-buffer rmail-mime-mbox-buffer
+	(let ((rmail-buffer rmail-mime-mbox-buffer)
+	      (rmail-view-buffer rmail-mime-view-buffer))
+	  (save-excursion
+	    (goto-char (aref header 0))
+	    (rmail-copy-headers (point) (aref header 1)))))
+      (rfc2047-decode-region (point-min) (point-max))
+      last-coding-system-used)))
+
 (defun rmail-mime-text-handler (content-type
 				content-disposition
 				content-transfer-encoding)
@@ -498,7 +513,7 @@
 	      ((string= transfer-encoding "quoted-printable")
 	       (quoted-printable-decode-region pos (point))))))
     (decode-coding-region pos (point) coding-system)
-    (or rmail-mime-coding-system
+    (if (or (not rmail-mime-coding-system) (consp rmail-mime-coding-system))
 	(setq rmail-mime-coding-system coding-system))
     (or (bolp) (insert "\n"))))
 
@@ -1274,8 +1289,19 @@
 	(with-current-buffer rmail-mime-view-buffer
 	  (erase-buffer)
 	  (rmail-mime-insert entity)
-	  (if rmail-mime-coding-system
-	      (set-buffer-file-coding-system rmail-mime-coding-system t t)))
+	  (if (consp rmail-mime-coding-system)
+	      ;; Decoding is done by rfc2047-decode-region only for a
+	      ;; header.  But, as the used coding system may have been
+	      ;; overriden by mm-charset-override-alist, we can't
+	      ;; trust (car rmail-mime-coding-system).  So, here we
+	      ;; try the decoding again with mm-charset-override-alist
+	      ;; bound to nil.
+	      (let ((mm-charset-override-alist nil))
+		(setq rmail-mime-coding-system
+		      (rmail-mime-find-header-encoding
+		       (rmail-mime-entity-header entity)))))
+	  (set-buffer-file-coding-system
+	   (coding-system-base rmail-mime-coding-system) t t))
       ;; Decoding failed.  ENTITY is an error message.  Insert the
       ;; original message body as is, and show warning.
       (let ((region (with-current-buffer rmail-mime-mbox-buffer