;;; mm-decode.el --- Functions for decoding MIME things
-;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
(autoload 'mm-inline-external-body "mm-extern")
(autoload 'mm-insert-inline "mm-view"))
+(defvar gnus-current-window-configuration)
+
(add-hook 'gnus-exit-gnus-hook 'mm-destroy-postponed-undisplay-list)
(defgroup mime-display ()
("text/richtext" mm-inline-text identity)
("text/x-patch" mm-display-patch-inline
(lambda (handle)
- (locate-library "diff-mode")))
+ ;; If the diff-mode.el package is installed, the function is
+ ;; autoloaded. Checking (locate-library "diff-mode") would be trying
+ ;; to cater to broken installations. OTOH checking the function
+ ;; makes it possible to install another package which provides an
+ ;; alternative implementation of diff-mode. --Stef
+ (fboundp 'diff-mode)))
("application/emacs-lisp" mm-display-elisp-inline identity)
("application/x-emacs-lisp" mm-display-elisp-inline identity)
("text/dns" mm-display-dns-inline identity)
:group 'mime-display)
(defcustom mm-automatic-display
- '("text/plain" "text/enriched" "text/richtext" "text/html"
+ '("text/plain" "text/enriched" "text/richtext" "text/html" "text/x-verbatim"
"text/x-vcard" "image/.*" "message/delivery-status" "multipart/.*"
"message/rfc822" "text/x-patch" "text/dns" "application/pgp-signature"
"application/emacs-lisp" "application/x-emacs-lisp"
(defvar mm-viewer-completion-map
(let ((map (make-sparse-keymap 'mm-viewer-completion-map)))
(set-keymap-parent map minibuffer-local-completion-map)
+ ;; Should we bind other key to minibuffer-complete-word?
+ (define-key map " " 'self-insert-command)
map)
"Keymap for input viewer with completion.")
-;; Should we bind other key to minibuffer-complete-word?
-(define-key mm-viewer-completion-map " " 'self-insert-command)
-
(defvar mm-viewer-completion-map
(let ((map (make-sparse-keymap 'mm-viewer-completion-map)))
(set-keymap-parent map minibuffer-local-completion-map)
+ ;; Should we bind other key to minibuffer-complete-word?
+ (define-key map " " 'self-insert-command)
map)
"Keymap for input viewer with completion.")
-;; Should we bind other key to minibuffer-complete-word?
-(define-key mm-viewer-completion-map " " 'self-insert-command)
-
;;; The functions.
(defun mm-alist-to-plist (alist)
;; what really needs to be done here is a way to link a
;; MIME handle back to it's parent MIME handle (in a multilevel
;; MIME article). That would probably require changing
- ;; the mm-handle API so we simply store the multipart buffert
+ ;; the mm-handle API so we simply store the multipart buffer
;; name as a text property of the "multipart/whatever" string.
(add-text-properties 0 (length (car ctl))
(list 'buffer (mm-copy-to-buffer)
(mm-mailcap-command
method file (mm-handle-type handle)))
(if (buffer-live-p buffer)
- (save-excursion
- (set-buffer buffer)
+ (with-current-buffer buffer
(buffer-string))))
(progn
(ignore-errors (delete-file file))
(let ((command (mm-mailcap-command
method file (mm-handle-type handle))))
(unwind-protect
- (start-process "*display*"
- (setq buffer
- (generate-new-buffer " *mm*"))
- shell-file-name
- shell-command-switch command)
+ (progn
+ (start-process "*display*"
+ (setq buffer
+ (generate-new-buffer " *mm*"))
+ shell-file-name
+ shell-command-switch command)
+ (set-process-sentinel
+ (get-buffer-process buffer)
+ `(lambda (process state)
+ (when (eq 'exit (process-status process))
+ ;; Don't use `ignore-errors'.
+ (condition-case nil
+ (delete-file ,file)
+ (error))
+ (condition-case nil
+ (delete-directory ,(file-name-directory file))
+ (error))
+ (condition-case nil
+ (kill-buffer ,buffer)
+ (error))
+ (condition-case nil
+ ,(macroexpand (list 'mm-handle-set-undisplayer
+ (list 'quote handle)
+ nil))
+ (error))
+ (message "Displaying %s...done" ,command)))))
(mm-handle-set-external-undisplayer
handle (cons file buffer)))
(message "Displaying %s..." command))
(defun mm-insert-part (handle)
"Insert the contents of HANDLE in the current buffer."
(save-excursion
- (insert (if (mm-multibyte-p)
- (mm-string-as-multibyte (mm-get-part handle))
- (mm-get-part handle)))))
+ (insert
+ (cond ((eq (mail-content-type-get (mm-handle-type handle) 'charset)
+ 'gnus-decoded)
+ (with-current-buffer (mm-handle-buffer handle)
+ (buffer-string)))
+ ((mm-multibyte-p)
+ (mm-string-as-multibyte (mm-get-part handle)))
+ (t
+ (mm-get-part handle))))))
(defun mm-file-name-delete-whitespace (file-name)
"Remove all whitespace characters from FILE-NAME."
(setq filename (gnus-replace-in-string filename "[<>|]" ""))
(gnus-replace-in-string filename "^[.-]+" ""))
-(defun mm-save-part (handle)
- "Write HANDLE to a file."
+(defun mm-save-part (handle &optional prompt)
+ "Write HANDLE to a file.
+PROMPT overrides the default one used to ask user for a file name."
(let* ((name (mail-content-type-get (mm-handle-type handle) 'name))
(filename (mail-content-type-get
(mm-handle-disposition handle) 'filename))
(file-name-nondirectory filename))))
(setq file
(mm-with-multibyte
- (read-file-name "Save MIME part to: "
+ (read-file-name (or prompt "Save MIME part to: ")
(or mm-default-directory default-directory)
nil nil (or filename name ""))))
(setq mm-default-directory (file-name-directory file))