;;; mm-bodies.el --- Functions for decoding MIME things
-;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+;; Copyright (C) 1998, 1999, 2000, 2001
+;; Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
(mm-encode-coding-region (point-min) (point-max) charset)
charset)
(goto-char (point-min))
- (let ((charsets (mm-find-mime-charset-region (point-min) (point-max)))
+ (let ((charsets (mm-find-mime-charset-region (point-min) (point-max)
+ mm-hack-charsets))
start)
(cond
;; No encoding.
(defun mm-body-encoding (charset &optional encoding)
"Do Content-Transfer-Encoding and return the encoding of the current buffer."
+ (when (stringp encoding)
+ (setq encoding (intern (downcase encoding))))
(let ((bits (mm-body-7-or-8))
(longp (mm-long-lines-p 1000)))
(require 'message)
bits)
((and (not mm-use-ultra-safe-encoding)
(not longp)
+ (not (eq '7bit (cdr (assq charset mm-body-charset-encoding-alist))))
(or (eq t (cdr message-posting-charset))
(memq charset (cdr message-posting-charset))
(eq charset mail-parse-charset)))
;;;
(defun mm-decode-content-transfer-encoding (encoding &optional type)
+ "Decodes buffer encoded with ENCODING, returning success status.
+If TYPE is `text/plain' CRLF->LF translation may occur."
(prog1
(condition-case error
(cond
((eq encoding 'quoted-printable)
- (quoted-printable-decode-region (point-min) (point-max)))
+ (quoted-printable-decode-region (point-min) (point-max))
+ t)
((eq encoding 'base64)
(base64-decode-region
(point-min)
(point))))
((memq encoding '(7bit 8bit binary))
;; Do nothing.
- )
+ t)
((null encoding)
;; Do nothing.
- )
+ t)
((memq encoding '(x-uuencode x-uue))
(require 'mm-uu)
- (funcall mm-uu-decode-function (point-min) (point-max)))
+ (funcall mm-uu-decode-function (point-min) (point-max))
+ t)
((eq encoding 'x-binhex)
(require 'mm-uu)
- (funcall mm-uu-binhex-decode-function (point-min) (point-max)))
+ (funcall mm-uu-binhex-decode-function (point-min) (point-max))
+ t)
+ ((eq encoding 'x-yenc)
+ (require 'mm-uu)
+ (funcall mm-uu-yenc-decode-function (point-min) (point-max))
+ )
((functionp encoding)
- (funcall encoding (point-min) (point-max)))
+ (funcall encoding (point-min) (point-max))
+ t)
(t
(message "Unknown encoding %s; defaulting to 8bit" encoding)))
(error
(message "Error while decoding: %s" error)
nil))
(when (and
- (memq encoding '(base64 x-uuencode x-uue x-binhex))
+ (memq encoding '(base64 x-uuencode x-uue x-binhex x-yenc))
(equal type "text/plain"))
(goto-char (point-min))
(while (search-forward "\r\n" nil t)
(replace-match "\n" t t)))))
-(defun mm-decode-body (charset &optional encoding type)
+(defun mm-decode-body (charset &optional encoding type force)
"Decode the current article that has been encoded with ENCODING.
-The characters in CHARSET should then be decoded."
+The characters in CHARSET should then be decoded. If FORCE is non-nil
+use the supplied charset unconditionally."
(if (stringp charset)
(setq charset (intern (downcase charset))))
(if (or (not charset)
(or (not (eq coding-system 'ascii))
(setq coding-system mail-parse-charset))
(not (eq coding-system 'gnus-decoded)))
- (mm-decode-coding-region (point-min) (point-max) coding-system))))))
+ (if force
+ (mm-decode-coding-region (point-min) (point-max)
+ coding-system)
+ (mm-decode-coding-region-safely (point-min) (point-max)
+ coding-system)))))))
+
+(defun mm-decode-coding-region-safely (start end coding-system)
+ "Decode region between START and END with CODING-SYSTEM.
+If CODING-SYSTEM is not a valid coding system for the text, let Emacs
+decide which coding system to use."
+ (let* ((orig (buffer-substring start end))
+ charsets)
+ (save-restriction
+ (narrow-to-region start end)
+ (mm-decode-coding-region (point-min) (point-max) coding-system)
+ (setq charsets (find-charset-region (point-min) (point-max)))
+ (when (or (memq 'eight-bit-control charsets)
+ (memq 'eight-bit-graphic charsets))
+ (delete-region (point-min) (point-max))
+ (insert orig)
+ (mm-decode-coding-region (point-min) (point-max) 'undecided)))))
(defun mm-decode-string (string charset)
"Decode STRING with CHARSET."