;;; Code:
-(require 'emu)
(require 'mime-def)
+(require 'poem)
(defcustom mime-encoding-list
'("7bit" "8bit" "binary" "base64" "quoted-printable")
:group 'mime
:type '(repeat string))
-(defvar mel-encoding-module-alist nil)
-
(defun mime-encoding-list (&optional service)
- "Return list of Content-Transfer-Encoding."
+ "Return list of Content-Transfer-Encoding.
+If SERVICE is specified, it returns available list of
+Content-Transfer-Encoding for it."
(if service
(let (dest)
(mapatoms (lambda (sym)
)))
(defsubst mel-find-function (service encoding)
- (let* ((oba (symbol-value (intern (format "%s-obarray" service))))
- (f (intern-soft encoding oba)))
- (or f
- (let ((rest (cdr (assoc encoding mel-encoding-module-alist))))
- (while (and rest
- (progn
- (require (car rest))
- (null (setq f (intern-soft encoding oba)))
- ))
- (setq rest (cdr rest))
- )
- f))))
+ (mel-find-function-from-obarray
+ (symbol-value (intern (format "%s-obarray" service))) encoding))
;;; @ setting for modules
;;;
-(defvar base64-dl-module
- (and (fboundp 'dynamic-link)
- (let ((path (expand-file-name "base64.so" exec-directory)))
- (and (file-exists-p path)
- path))))
-
-
-(mel-use-module 'mel-b '("base64" "B"))
-(mel-use-module 'mel-q '("quoted-printable" "Q"))
-(mel-use-module 'mel-g '("x-gzip64"))
-(mel-use-module 'mel-u '("x-uue" "x-uuencode"))
-
-(if (featurep 'mule)
- (mel-use-module 'mel-ccl '("base64" "quoted-printable" "B" "Q"))
- )
-
-(if base64-dl-module
- (mel-use-module 'mel-b-dl '("base64" "B"))
- )
-
+(mel-define-backend "7bit")
(mel-define-method-function (mime-encode-string string (nil "7bit"))
'identity)
(mel-define-method-function (mime-decode-string string (nil "7bit"))
start end filename (nil "7bit"))
'write-region-as-binary)
-(mel-define-method-function (mime-encode-string string (nil "8bit"))
- 'identity)
-(mel-define-method-function (mime-decode-string string (nil "8bit"))
- 'identity)
-(mel-define-method mime-encode-region (start end (nil "8bit")))
-(mel-define-method mime-decode-region (start end (nil "8bit")))
-(mel-define-method-function (mime-insert-encoded-file filename (nil "8bit"))
- 'insert-file-contents-as-binary)
-(mel-define-method-function (mime-write-decoded-region
- start end filename (nil "8bit"))
- 'write-region-as-binary)
+(mel-define-backend "8bit" ("7bit"))
+
+(mel-define-backend "binary" ("8bit"))
+
+(defvar mel-b-builtin
+ (and (fboundp 'base64-encode-string)
+ (subrp (symbol-function 'base64-encode-string))))
+
+(when mel-b-builtin
+ (mel-define-backend "base64")
+ (mel-define-method-function (mime-encode-string string (nil "base64"))
+ 'base64-encode-string)
+ (mel-define-method-function (mime-decode-string string (nil "base64"))
+ 'base64-decode-string)
+ (mel-define-method-function (mime-encode-region start end (nil "base64"))
+ 'base64-encode-region)
+ (mel-define-method-function (mime-decode-region start end (nil "base64"))
+ 'base64-decode-region)
+ (mel-define-method mime-insert-encoded-file (filename (nil "base64"))
+ "Encode contents of file FILENAME to base64, and insert the result.
+It calls external base64 encoder specified by
+`base64-external-encoder'. So you must install the program (maybe
+mmencode included in metamail or XEmacs package)."
+ (interactive (list (read-file-name "Insert encoded file: ")))
+ (insert (base64-encode-string
+ (with-temp-buffer
+ (set-buffer-multibyte nil)
+ (insert-file-contents-as-binary filename)
+ (buffer-string))))
+ (or (bolp)
+ (insert "\n"))
+ )
+
+ (mel-define-method-function (encoded-text-encode-string string (nil "B"))
+ 'base64-encode-string)
+ (mel-define-method encoded-text-decode-string (string (nil "B"))
+ (if (and (string-match B-encoded-text-regexp string)
+ (string= string (match-string 0 string)))
+ (base64-decode-string string)
+ (error "Invalid encoded-text %s" string)))
+ )
-(mel-define-method-function (mime-encode-string string (nil "binary"))
- 'identity)
-(mel-define-method-function (mime-decode-string string (nil "binary"))
- 'identity)
-(mel-define-method mime-encode-region (start end (nil "binary")))
-(mel-define-method mime-decode-region (start end (nil "binary")))
-(mel-define-method-function (mime-insert-encoded-file filename (nil "binary"))
- 'insert-file-contents-as-binary)
-(mel-define-method-function (mime-write-decoded-region
- start end filename (nil "binary"))
- 'write-region-as-binary)
+(mel-use-module 'mel-b-el '("base64" "B"))
+(mel-use-module 'mel-q '("quoted-printable" "Q"))
+(mel-use-module 'mel-g '("x-gzip64"))
+(mel-use-module 'mel-u '("x-uue" "x-uuencode"))
+
+(defvar mel-b-ccl-module
+ (and (featurep 'mule)
+ (progn
+ (require 'path-util)
+ (module-installed-p 'mel-b-ccl)
+ )))
+
+(defvar mel-q-ccl-module
+ (and (featurep 'mule)
+ (progn
+ (require 'path-util)
+ (module-installed-p 'mel-q-ccl)
+ )))
+
+(if mel-b-ccl-module
+ (mel-use-module 'mel-b-ccl '("base64" "B"))
+ )
+
+(if mel-q-ccl-module
+ (mel-use-module 'mel-q-ccl '("quoted-printable" "Q"))
+ )
+
+(if base64-dl-module
+ (mel-use-module 'mel-b-dl '("base64" "B"))
+ )
;;; @ region