Function: rmail-show-mime

rmail-show-mime is a byte-compiled function defined in rmailmm.el.gz.

Signature

(rmail-show-mime)

Documentation

Function to use for the value of rmail-show-mime-function.

Source Code

;; Defined in /usr/src/emacs/lisp/mail/rmailmm.el.gz
(defun rmail-show-mime ()
  "Function to use for the value of `rmail-show-mime-function'."
  (let ((entity (rmail-mime-parse))
	(rmail-mime-mbox-buffer rmail-buffer)
	(rmail-mime-view-buffer rmail-view-buffer)
	(rmail-mime-coding-system nil))
    ;; If ENTITY is not a vector, it is a string describing an error.
    (if (rmail-mime-entity-p entity)
	(with-current-buffer rmail-mime-view-buffer
	  (erase-buffer)
	  ;; This condition-case is for catching an error in the
	  ;; internal MIME decoding (e.g. incorrect BASE64 form) that
	  ;; may be signaled by rmail-mime-insert.
	  ;; FIXME: The current code doesn't set a proper error symbol
	  ;; in ERR.  We must find a way to propagate a correct error
	  ;; symbol that is caused in the very deep code of text
	  ;; decoding (e.g. an error by base64-decode-region called by
	  ;; post-read-conversion function of utf-7).
	  (condition-case err
	      (progn
		(rmail-mime-insert entity)
		(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
		    ;; overridden 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
		 (if rmail-mime-coding-system
		     (coding-system-base rmail-mime-coding-system)
		   'undecided)
		 t t))
	    (error (setq entity (format "%s" err))))))
    ;; Re-check ENTITY.  It may be set to an error string.
    (when (stringp entity)
      ;; 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
		      (goto-char (point-min))
		      (re-search-forward "^$" nil t)
		      (forward-line 1)
		      (vector (point-min) (point) (point-max)))))
	(with-current-buffer rmail-mime-view-buffer
	  (let ((inhibit-read-only t))
	    (erase-buffer)
	    (rmail-mime-insert-header region)
	    (insert-buffer-substring rmail-mime-mbox-buffer
				     (aref region 1) (aref region 2))))
	(set-buffer-file-coding-system 'no-conversion t t)
	(message "MIME decoding failed: %s" entity)))))