(ew-find-charset-rule): Renamed from `tm-eword::find-charset-rule';
[elisp/flim.git] / mel.el
diff --git a/mel.el b/mel.el
index bd4ea11..b1902b4 100644 (file)
--- a/mel.el
+++ b/mel.el
@@ -26,6 +26,7 @@
 ;;; Code:
 
 (require 'mime-def)
+(require 'poem)
 
 (defcustom mime-encoding-list
   '("7bit" "8bit" "binary" "base64" "quoted-printable")
@@ -78,26 +79,6 @@ Content-Transfer-Encoding for it."
 ;;; @ setting for modules
 ;;;
 
-(defvar mel-ccl-module
-  (and (featurep 'mule)
-       (progn
-        (require 'path-util)
-        (module-installed-p 'mel-ccl)
-        )))
-
-(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 mel-ccl-module
-    (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)
@@ -115,6 +96,75 @@ Content-Transfer-Encoding for it."
 
 (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-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
 ;;;
@@ -154,8 +204,10 @@ ENCODING must be string."
 ENCODING must be string.  If ENCODING is found in
 `mime-string-decoding-method-alist' as its key, this function decodes
 the STRING by its value."
-  (funcall (mel-find-function 'mime-decode-string encoding)
-          string))
+  (let ((f (mel-find-function 'mime-decode-string encoding)))
+    (if f
+       (funcall f string)
+      string)))
 
 
 (mel-define-service encoded-text-encode-string (string encoding)
@@ -167,11 +219,7 @@ ENCODING must be string.")
 ENCODING must be string.")
 
 (defun base64-encoded-length (string)
-  (let ((len (length string)))
-    (* (+ (/ len 3)
-         (if (= (mod len 3) 0) 0 1)
-         ) 4)
-    ))
+  (* (/ (+ (length string) 2) 3) 4))
 
 (defsubst Q-encoding-printable-char-p (chr mode)
   (and (not (memq chr '(?= ?? ?_)))