;;; rfc2047.el --- Functions for encoding and decoding rfc2047 messages
-;; Copyright (C) 1998 Free Software Foundation, Inc.
+;; Copyright (C) 1998,99 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
(eval-and-compile
(eval
'(unless (fboundp 'base64-decode-string)
- (autoload 'base64-decode-string "base64")
- (autoload 'base64-encode-region "base64" nil t))))
+ (require 'base64))))
+
(require 'qp)
(require 'mm-util)
(require 'ietf-drums)
-
-(defvar rfc2047-default-charset 'iso-8859-1
- "Default MIME charset -- does not need encoding.")
+(require 'mail-prsvr)
(defvar rfc2047-header-encoding-alist
'(("Newsgroups" . nil)
(when method
(cond
((eq method 'mime)
- (rfc2047-encode-region (point-min) (point-max)))
+ (rfc2047-encode-region (point-min) (point-max))
+ (rfc2047-fold-region (point-min) (point-max)))
;; Hm.
(t))))
- (goto-char (point-max))))))))
+ (goto-char (point-max)))))
+ (when mail-parse-charset
+ (encode-coding-region (point-min) (point-max)
+ mail-parse-charset)))))
(defun rfc2047-encodable-p ()
"Say whether the current (narrowed) buffer contains characters that need encoding."
- (let ((charsets (mapcar
- 'mm-mule-charset-to-mime-charset
- (find-charset-region (point-min) (point-max))))
- (cs (list 'us-ascii rfc2047-default-charset))
+ (let ((charsets
+ (mapcar
+ 'mm-mime-charset
+ (mm-find-charset-region (point-min) (point-max))))
+ (cs (list 'us-ascii mail-parse-charset))
found)
(while charsets
(unless (memq (pop charsets) cs)
found))
(defun rfc2047-dissect-region (b e)
- "Dissect the region between B and E."
+ "Dissect the region between B and E into words."
(let (words)
(save-restriction
(narrow-to-region b e)
(concat "[^" ietf-drums-tspecials " \t\n]+") nil t)
(push
(list (match-beginning 0) (match-end 0)
- (car
- (delq 'ascii
- (find-charset-region (match-beginning 0)
- (match-end 0)))))
+ (car (delq 'ascii (mm-find-charset-region
+ (match-beginning 0) (match-end 0)))))
words))
words)))
(defun rfc2047-encode (b e charset)
"Encode the word in the region with CHARSET."
- (let* ((mime-charset
- (mm-mime-charset charset b e))
+ (let* ((mime-charset (mm-mime-charset charset))
(encoding (or (cdr (assq mime-charset
- rfc2047-charset-encoding-alist))
+ rfc2047-charset-encoding-alist))
'B))
(start (concat
"=?" (downcase (symbol-name mime-charset)) "?"
(insert "?=")
(forward-line 1)))))
+(defun rfc2047-fold-region (b e)
+ "Fold the long lines in the region."
+ (save-restriction
+ (narrow-to-region b e)
+ (goto-char (point-min))
+ (let ((break nil))
+ (while (not (eobp))
+ (cond
+ ((memq (char-after) '(? ?\t))
+ (setq break (point)))
+ ((and (not break)
+ (looking-at "=\\?"))
+ (setq break (point)))
+ ((and (looking-at "\\?=")
+ (> (- (point) (save-excursion (beginning-of-line) (point))) 76))
+ (goto-char break)
+ (insert "\n ")
+ (forward-line 1)))
+ (unless (eobp)
+ (forward-char 1))))))
+
(defun rfc2047-b-encode-region (b e)
"Encode the header contained in REGION with the B encoding."
(base64-encode-region b e t)
(prog1
(match-string 0)
(delete-region (match-beginning 0) (match-end 0)))))
- (when (mm-multibyte-p)
- (mm-decode-coding-region b e rfc2047-default-charset))
+ (when (and (mm-multibyte-p)
+ mail-parse-charset)
+ (mm-decode-coding-region b e mail-parse-charset))
(setq b (point)))
- (when (mm-multibyte-p)
- (mm-decode-coding-region b (point-max) rfc2047-default-charset))))))
+ (when (and (mm-multibyte-p)
+ mail-parse-charset
+ (not (eq mail-parse-charset 'us-ascii)))
+ (mm-decode-coding-region b (point-max) mail-parse-charset))))))
(defun rfc2047-decode-string (string)
"Decode the quoted-printable-encoded STRING and return the results."
(inline
(rfc2047-decode-region (point-min) (point-max)))
(buffer-string))))
-
+
(defun rfc2047-parse-and-decode (word)
"Decode WORD and return it if it is an encoded word.
Return WORD if not."
If your Emacs implementation can't decode CHARSET, it returns nil."
(let ((cs (mm-charset-to-coding-system charset)))
(when cs
- (when (eq cs 'ascii)
- (setq cs rfc2047-default-charset))
+ (when (and (eq cs 'ascii)
+ mail-parse-charset)
+ (setq cs mail-parse-charset))
(mm-decode-coding-string
(cond
((equal "B" encoding)