(title): fixed.
[elisp/flim.git] / mel-u.el
index 0fab184..3328e56 100644 (file)
--- a/mel-u.el
+++ b/mel-u.el
@@ -1,13 +1,12 @@
 ;;; mel-u.el: uuencode encoder/decoder for GNU Emacs
 
-;; Copyright (C) 1995,1996,1997 Free Software Foundation, Inc.
+;; Copyright (C) 1995,1996,1997,1998 Free Software Foundation, Inc.
 
 ;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
 ;; Created: 1995/10/25
-;; Version: $Id: mel-u.el,v 5.7 1997/03/10 15:15:09 morioka Exp $
 ;; Keywords: uuencode
 
-;; This file is part of MEL (MIME Encoding Library).
+;; This file is part of FLIM (Faithful Library about Internet Message).
 
 ;; This program is free software; you can redistribute it and/or
 ;; modify it under the terms of the GNU General Public License as
 ;;; Code:
 
 (require 'emu)
-(require 'mel)
+(require 'mime-def)
+
+
+(mel-define-backend "x-uue")
 
 
 ;;; @ variables
@@ -36,8 +38,7 @@
 (defvar uuencode-external-encoder '("uuencode" "-")
   "*list of uuencode encoder program name and its arguments.")
 
-(defvar uuencode-external-decoder
-  (list "sh" "-c" (format "(cd %s; uudecode)" mime-temp-directory))
+(defvar uuencode-external-decoder '("sh" "-c" "uudecode")
   "*list of uuencode decoder program name and its arguments.")
 
 
@@ -76,26 +77,51 @@ variable `uuencode-external-decoder'."
                            (if (looking-at ".+$")
                                (buffer-substring (match-beginning 0)
                                                  (match-end 0))
-                             ))))))
+                             )))))
+         (default-directory temporary-file-directory))
       (if filename
          (as-binary-process
           (apply (function call-process-region)
                  start end (car uuencode-external-decoder)
                  t nil nil (cdr uuencode-external-decoder))
-          (setq filename (expand-file-name filename mime-temp-directory))
           (as-binary-input-file (insert-file-contents filename))
-          (delete-file filename)
+          ;; The previous line causes the buffer to be made read-only, I
+          ;; do not pretend to understand the control flow leading to this
+          ;; but suspect it has something to do with image-mode. -slb
+          ;;   Use `inhibit-read-only' to avoid to force
+          ;;   buffer-read-only nil. - tomo.
+          (let ((inhibit-read-only t))
+            (delete-file filename)
+            )
           ))
       )))
 
-(defalias 'uuencode-encode-region 'uuencode-external-encode-region)
-(defalias 'uuencode-decode-region 'uuencode-external-decode-region)
+(mel-define-method-function (mime-encode-region start end (nil "x-uue"))
+                           'uuencode-external-encode-region)
+(mel-define-method-function (mime-decode-region start end (nil "x-uue"))
+                           'uuencode-external-decode-region)
+
+
+;;; @ encoder/decoder for string
+;;;
+
+(mel-define-method mime-encode-string (string (nil "x-uue"))
+  (with-temp-buffer
+    (insert string)
+    (uuencode-external-encode-region (point-min)(point-max))
+    (buffer-string)))
+
+(mel-define-method mime-decode-string (string (nil "x-uue"))
+  (with-temp-buffer
+    (insert string)
+    (uuencode-external-decode-region (point-min)(point-max))
+    (buffer-string)))
 
 
 ;;; @ uuencode encoder/decoder for file
 ;;;
 
-(defun uuencode-insert-encoded-file (filename)
+(mel-define-method mime-insert-encoded-file (filename (nil "x-uue"))
   "Insert file encoded by unofficial uuencode format.
 This function uses external uuencode encoder which is specified by
 variable `uuencode-external-encoder'."
@@ -104,10 +130,38 @@ variable `uuencode-external-encoder'."
                (file-name-nondirectory filename))
   )
 
+(mel-define-method mime-write-decoded-region (start end filename
+                                                   (nil "x-uue"))
+  "Decode and write current region encoded by uuencode into FILENAME.
+START and END are buffer positions."
+  (interactive
+   (list (region-beginning) (region-end)
+        (read-file-name "Write decoded region to file: ")))
+  (save-excursion
+    (let ((file (save-excursion
+                 (save-restriction
+                   (narrow-to-region start end)
+                   (goto-char start)
+                   (if (re-search-forward "^begin [0-9]+ " nil t)
+                       (if (looking-at ".+$")
+                           (buffer-substring (match-beginning 0)
+                                             (match-end 0))
+                         )))))
+         (default-directory temporary-file-directory))
+      (if file
+         (as-binary-process
+          (apply (function call-process-region)
+                 start end (car uuencode-external-decoder)
+                 nil nil nil (cdr uuencode-external-decoder))
+          (rename-file file filename 'overwrites)
+          )))))
+
 
 ;;; @ end
 ;;;
 
 (provide 'mel-u)
 
+(mel-define-backend "x-uuencode" ("x-uue"))
+
 ;;; mel-u.el ends here