*** empty log message ***
[gnus] / lisp / mm-uu.el
index 03aa0c6..59f809b 100644 (file)
@@ -2,9 +2,9 @@
 ;; Copyright (c) 1998 by Shenghuo Zhu <zsh@cs.rochester.edu>
 
 ;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
-;; $Revision: 5.2 $
+;; $Revision: 5.9 $
 ;; Keywords: news postscript uudecode binhex shar
-  
+
 ;; This file is not part of GNU Emacs, but the same permissions
 ;; apply.
 ;;
@@ -59,7 +59,7 @@
 (defconst mm-uu-shar-begin-line "^#! */bin/sh")
 (defconst mm-uu-shar-end-line "^exit 0")
 
-(defvar mm-uu-begin-line 
+(defvar mm-uu-begin-line
   (concat mm-uu-postscript-begin-line "\\|"
          mm-uu-uu-begin-line "\\|"
          mm-uu-binhex-begin-line "\\|"
 (defvar mm-uu-identifier-alist
   '((?% . postscript) (?b . uu) (?: . binhex) (?# . shar)))
 
+(defvar mm-dissect-disposition "inline"
+  "The default disposition of uu parts.
+This can be either \"inline\" or \"attachment\".")
+
 ;;;### autoload
 
 (defun mm-uu-dissect ()
   "Dissect the current buffer and return a list of uu handles."
-  (save-excursion
-    (save-restriction
-      (mail-narrow-to-head)
-      (goto-char (point-max)))
-    (forward-line)
-    (let ((text-start (point)) start-char end-char 
-         type file-name end-line result)
+  (let (ct ctl cte charset text-start start-char end-char
+          type file-name end-line result text-plain-type)
+    (save-excursion
+      (save-restriction
+       (mail-narrow-to-head)
+       (when (and (mail-fetch-field "mime-version")
+                  (setq ct (mail-fetch-field "content-type")))
+         (setq cte (message-fetch-field "content-transfer-encoding" t)
+               ctl (ignore-errors (mail-header-parse-content-type ct))
+               charset (and ctl (mail-content-type-get ctl 'charset)))
+         (if (stringp cte)
+             (setq cte (intern (downcase (mail-header-remove-whitespace
+                                          (mail-header-remove-comments
+                                           cte)))))))
+       (goto-char (point-max)))
+      (forward-line)
+      (setq text-start (point)
+           text-plain-type (cons "text/plain"
+                                 (if charset
+                                     (list (cons 'charset charset)))))
       (while (re-search-forward mm-uu-begin-line nil t)
        (beginning-of-line)
        (setq start-char (point))
        (forward-line) ;; in case of failure
-       (setq type (cdr (assq (aref (match-string 0) 0) 
+       (setq type (cdr (assq (aref (match-string 0) 0)
                              mm-uu-identifier-alist)))
-       (setq file-name 
+       (setq file-name
              (if (eq type 'uu)
                  (and (match-string 1)
                       (let ((nnheader-file-name-translation-alist
                              '((?/ . ?,) (? . ?_) (?* . ?_) (?$ . ?_))))
                         (nnheader-translate-file-chars (match-string 1))))))
-       (setq end-line (symbol-value 
-                       (intern (concat "mm-uu-" (symbol-name type) 
-                                      "-end-line"))))
+       (setq end-line (symbol-value
+                       (intern (concat "mm-uu-" (symbol-name type)
+                                       "-end-line"))))
        (when (re-search-forward end-line nil t)
          (forward-line)
          (setq end-char (point))
          (when (or (not (eq type 'binhex))
-                   (setq file-name 
-                         (condition-case nil
-                             (binhex-decode-region start-char end-char t)
-                           (error nil))))
+                   (setq file-name
+                         (ignore-errors
+                           (binhex-decode-region start-char end-char t))))
            (if (> start-char text-start)
                (push
-                (list (mm-uu-copy-to-buffer text-start start-char) 
-                      '("text/plain") nil nil nil nil) 
+                (mm-make-handle (mm-uu-copy-to-buffer text-start start-char)
+                      text-plain-type cte)
                 result))
-           (push 
+           (push
             (cond
              ((eq type 'postscript)
-              (list (mm-uu-copy-to-buffer start-char end-char) 
-                    '("application/postscript") nil nil nil nil))
+              (mm-make-handle (mm-uu-copy-to-buffer start-char end-char)
+                    '("application/postscript")))
              ((eq type 'uu)
-              (list (mm-uu-copy-to-buffer start-char end-char) 
+              (mm-make-handle (mm-uu-copy-to-buffer start-char end-char)
                     (list (or (and file-name
-                                   (string-match "\\.[^\\.]+$" file-name) 
-                                   (mailcap-extension-to-mime 
+                                   (string-match "\\.[^\\.]+$" file-name)
+                                   (mailcap-extension-to-mime
                                     (match-string 0 file-name)))
                               "application/octet-stream"))
-                    mm-uu-decode-function nil 
+                    'x-uuencode nil
                     (if (and file-name (not (equal file-name "")))
-                        (list "attachment" (cons 'filename file-name)))
-                  file-name))
+                        (list mm-dissect-disposition
+                              (cons 'filename file-name)))))
              ((eq type 'binhex)
-              (list (mm-uu-copy-to-buffer start-char end-char) 
+              (mm-make-handle (mm-uu-copy-to-buffer start-char end-char)
                     (list (or (and file-name
-                                   (string-match "\\.[^\\.]+$" file-name) 
-                                   (mailcap-extension-to-mime 
+                                   (string-match "\\.[^\\.]+$" file-name)
+                                   (mailcap-extension-to-mime
                                     (match-string 0 file-name)))
                               "application/octet-stream"))
-                    mm-uu-binhex-decode-function nil 
+                    'x-binhex nil
                     (if (and file-name (not (equal file-name "")))
-                        (list "attachment" (cons 'filename file-name)))
-                    file-name))
+                        (list mm-dissect-disposition
+                              (cons 'filename file-name)))))
              ((eq type 'shar)
-              (list (mm-uu-copy-to-buffer start-char end-char) 
-                    '("application/x-shar") nil nil nil nil))) 
+              (mm-make-handle (mm-uu-copy-to-buffer start-char end-char)
+                    '("application/x-shar"))))
             result)
            (setq text-start end-char))))
       (when result
        (if (> (point-max) (1+ text-start))
            (push
-            (list (mm-uu-copy-to-buffer text-start (point-max)) 
-                  '("text/plain") nil nil nil nil) 
+            (mm-make-handle (mm-uu-copy-to-buffer text-start (point-max))
+                  text-plain-type cte)
             result))
        (setq result (cons "multipart/mixed" (nreverse result))))
       result)))
 
+;;;### autoload
+(defun mm-uu-test ()
+  "Check whether the current buffer contains uu stuffs."
+  (save-excursion
+    (save-restriction
+      (mail-narrow-to-head)
+      (goto-char (point-max)))
+    (forward-line)
+    (let (type end-line result)
+      (while (and (not result) (re-search-forward mm-uu-begin-line nil t))
+       (forward-line)
+       (setq type (cdr (assq (aref (match-string 0) 0)
+                             mm-uu-identifier-alist)))
+       (setq end-line (symbol-value
+                       (intern (concat "mm-uu-" (symbol-name type)
+                                       "-end-line"))))
+       (if (re-search-forward end-line nil t)
+           (setq result t)))
+      result)))
+
 (provide 'mm-uu)
 
 ;;; mm-uu.el ends here