Fix some more docstring etc. quoting problems
[gnus] / lisp / mm-archive.el
index c8fced4..9c86c4a 100644 (file)
@@ -1,6 +1,6 @@
 ;;; mm-archive.el --- Functions for parsing archive files as MIME
 
-;; Copyright (C) 2012  Free Software Foundation, Inc.
+;; Copyright (C) 2012-2015 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; This file is part of GNU Emacs.
 
 ;;; Code:
 
+(require 'mm-decode)
+(autoload 'gnus-recursive-directory-files "gnus-util")
+(autoload 'mailcap-extension-to-mime "mailcap")
+
 (defvar mm-archive-decoders
-  '(("application/ms-tnef" "tnef" "-f" "-" "-C")
-    ("application/x-tar" "tar" "xf" "-" "-C")))
+  '(("application/ms-tnef" t "tnef" "-f" "-" "-C")
+    ("application/zip" nil "unzip" "-j" "-x" "%f" "-d")
+    ("application/x-gtar-compressed" nil "tar" "xzf" "-" "-C")
+    ("application/x-tar" nil "tar" "xf" "-" "-C")))
+
+(defun mm-archive-decoders () mm-archive-decoders)
 
 (defun mm-dissect-archive (handle)
-  (let ((decoder (cdr (assoc (car (mm-handle-type handle))
-                            mm-archive-decoders)))
+  (let ((decoder (cddr (assoc (car (mm-handle-type handle))
+                             mm-archive-decoders)))
        (dir (mm-make-temp-file
              (expand-file-name "emm." mm-tmp-directory) 'dir)))
     (set-file-modes dir #o700)
        (progn
          (mm-with-unibyte-buffer
            (mm-insert-part handle)
-           (apply 'call-process-region (point-min) (point-max) (car decoder)
-                  nil (get-buffer-create "*tnef*")
-                  nil (append (cdr decoder) (list dir))))
+           (if (member "%f" decoder)
+               (let ((file (expand-file-name "mail.zip" dir)))
+                 (write-region (point-min) (point-max) file nil 'silent)
+                 (setq decoder (copy-sequence decoder))
+                 (setcar (member "%f" decoder) file)
+                 (apply 'call-process (car decoder) nil nil nil
+                        (append (cdr decoder) (list dir)))
+                 (delete-file file))
+             (apply 'call-process-region (point-min) (point-max) (car decoder)
+                    nil (get-buffer-create "*tnef*")
+                    nil (append (cdr decoder) (list dir)))))
          `("multipart/mixed"
            ,handle
-           ,@(mm-archive-list-files dir)))
-      (dolist (file (directory-files dir))
-       (unless (member file '("." ".."))
-         (ignore-errors
-           (delete-file (expand-file-name file dir)))))
-      (ignore-errors
-       (delete-directory dir)))))
+           ,@(mm-archive-list-files (gnus-recursive-directory-files dir))))
+      (delete-directory dir t))))
 
-(defun mm-archive-list-files (dir)
+(defun mm-archive-list-files (files)
   (let ((handles nil)
-       type)
-    (dolist (file (directory-files dir))
-      (unless (member file '("." ".."))
-       (with-temp-buffer
-         (when (string-match "\\.\\([^.]+\\)$" file)
-           (setq type (mailcap-extension-to-mime (match-string 1 file))))
-         (unless type
-           (setq type "application/octet-stream"))
-         (insert (format "Content-type: %s\n" type))
-         (insert "Content-Transfer-Encoding: 8bit\n\n")
-         (insert-file-contents (expand-file-name file dir))
-         (push
-          (mm-make-handle (mm-copy-to-buffer)
-                          (list type)
-                          '8bit nil
-                          `("attachment" (filename . ,file))
-                          nil nil nil)
-          handles))))
+       type disposition)
+    (dolist (file files)
+      (with-temp-buffer
+       (when (string-match "\\.\\([^.]+\\)$" file)
+         (setq type (mailcap-extension-to-mime (match-string 1 file))))
+       (unless type
+         (setq type "application/octet-stream"))
+       (setq disposition
+             (if (string-match "^image/\\|^text/" type)
+                 "inline"
+               "attachment"))
+       (insert (format "Content-type: %s\n" type))
+       (insert "Content-Transfer-Encoding: 8bit\n\n")
+       (insert-file-contents file)
+       (push
+        (mm-make-handle (mm-copy-to-buffer)
+                        (list type)
+                        '8bit nil
+                        `(,disposition (filename . ,file))
+                        nil nil nil)
+        handles)))
     handles))
 
+(defun mm-archive-dissect-and-inline (handle)
+  (let ((start (point-marker)))
+    (save-restriction
+      (narrow-to-region (point) (point))
+      (dolist (handle (cddr (mm-dissect-archive handle)))
+       (goto-char (point-max))
+       (mm-display-inline handle))
+      (goto-char (point-max))
+      (mm-handle-set-undisplayer
+       handle
+       `(lambda ()
+         (let ((inhibit-read-only t)
+               (end ,(point-marker)))
+           (remove-images ,start end)
+           (delete-region ,start end)))))))
+
 (provide 'mm-archive)
 
 ;; mm-archive.el ends here