* mime-view.el (mime-view-insert-fontified-text-content): Don't use
[elisp/semi.git] / mime-play.el
index e539a94..a476a05 100644 (file)
@@ -33,8 +33,7 @@
 (eval-when-compile
   (condition-case nil
       (require 'bbdb)
-    (error (defvar bbdb-buffer-name nil)))
-  )
+    (error (defvar bbdb-buffer-name nil))))
 
 (defcustom mime-save-directory "~/"
   "*Name of the directory where MIME entity will be saved in.
@@ -43,6 +42,12 @@ If t, it means current directory."
   :type '(choice (const :tag "Current directory" t)
                 (directory)))
 
+(defvar mime-play-find-every-situations t
+  "*Find every available situations if non-nil.")
+
+(defvar mime-play-messages-coding-system nil
+  "Coding system to be used for external MIME playback method.")
+
 
 ;;; @ content decoder
 ;;;
@@ -71,8 +76,7 @@ If MODE is specified, play as it.  Default MODE is \"play\"."
              (setq situation
                    (cons (cons 'ignore-examples ignore-examples)
                          situation)))
-         (mime-play-entity entity situation)
-         ))))
+         (mime-play-entity entity situation)))))
 
 ;;;###autoload
 (defun mime-play-entity (entity &optional situation ignored-method)
@@ -84,34 +88,30 @@ specified, play as it.  Default MODE is \"play\"."
         (mime-unify-situations (mime-entity-situation entity situation)
                                mime-acting-condition
                                mime-acting-situation-example-list
-                               ignored-method))
-       method)
+                               'method ignored-method
+                               mime-play-find-every-situations))
+       method menu)
     (setq mime-acting-situation-example-list (cdr ret)
          ret (car ret))
     (cond ((cdr ret)
-          (setq ret (select-menu-alist
-                     "Methods"
-                     (mapcar (function
-                              (lambda (situation)
-                                (cons
-                                 (format "%s"
-                                         (cdr (assq 'method situation)))
-                                 situation)))
-                             ret)))
-          (setq ret (mime-sort-situation ret))
-          (add-to-list 'mime-acting-situation-example-list (cons ret 0))
-          )
+          (while ret
+            (or (vassoc (setq method
+                              (format "%s"
+                                      (cdr (assq 'method (pop ret)))))
+                        menu)
+                (push (vector method situation t) menu)))
+          (setq ret (mime-sort-situation
+                     (mime-menu-select "Play entity with: "
+                                       (cons "Methods" menu))))
+          (add-to-list 'mime-acting-situation-example-list (cons ret 0)))
          (t
-          (setq ret (car ret))
-          ))
+          (setq ret (car ret))))
     (setq method (cdr (assq 'method ret)))
     (cond ((and (symbolp method)
                (fboundp method))
-          (funcall method entity ret)
-          )
+          (funcall method entity ret))
          ((stringp method)
-          (mime-activate-mailcap-method entity ret)
-          )
+          (mime-activate-mailcap-method entity ret))
           ;; ((and (listp method)(stringp (car method)))
           ;;  (mime-activate-external-method entity ret)
           ;;  )
@@ -121,9 +121,7 @@ specified, play as it.  Default MODE is \"play\"."
                                   (cdr (assq 'type situation))
                                   (cdr (assq 'subtype situation))))
           (if (y-or-n-p "Do you want to save current entity to disk?")
-              (mime-save-content entity situation))
-          ))
-    ))
+              (mime-save-content entity situation))))))
 
 
 ;;; @ external decoder
@@ -138,28 +136,25 @@ specified, play as it.  Default MODE is \"play\"."
          (if (and name (not (string= name "")))
              (expand-file-name name temporary-file-directory)
            (make-temp-name
-            (expand-file-name "EMI" temporary-file-directory))
-           ))
+            (expand-file-name "EMI" temporary-file-directory))))
     (mime-write-entity-content entity name)
     (message "External method is starting...")
     (let ((process
           (let ((command
-                 (mailcap-format-command
+                 (mime-format-mailcap-command
                   method
                   (cons (cons 'filename name) situation))))
-            (start-process command mime-echo-buffer-name
-                           shell-file-name shell-command-switch command)
-            )))
+            (binary-to-text-funcall
+             mime-play-messages-coding-system
+             #'start-process command mime-echo-buffer-name
+             shell-file-name shell-command-switch command))))
       (set-alist 'mime-mailcap-method-filename-alist process name)
-      (set-process-sentinel process 'mime-mailcap-method-sentinel)
-      )
-    ))
+      (set-process-sentinel process 'mime-mailcap-method-sentinel))))
 
 (defun mime-mailcap-method-sentinel (process event)
   (let ((file (cdr (assq process mime-mailcap-method-filename-alist))))
     (if (file-exists-p file)
-       (delete-file file)
-      ))
+       (delete-file file)))
   (remove-alist 'mime-mailcap-method-filename-alist process)
   (message (format "%s %s" process event)))
 
@@ -170,8 +165,7 @@ specified, play as it.  Default MODE is \"play\"."
 (defvar mime-echo-window-height
   (function
    (lambda ()
-     (/ (window-height) 5)
-     ))
+     (/ (window-height) 5)))
   "*Size of mime-echo window.
 It allows function or integer.  If it is function,
 `mime-show-echo-buffer' calls it to get height of mime-echo window.
@@ -194,19 +188,14 @@ window.")
                   (- (window-height)
                      (if (functionp mime-echo-window-height)
                          (funcall mime-echo-window-height)
-                       mime-echo-window-height)
-                     )))
-       )
-      (set-window-buffer win mime-echo-buffer-name)
-      )
+                       mime-echo-window-height)))))
+      (set-window-buffer win mime-echo-buffer-name))
     (select-window win)
     (goto-char (point-max))
     (if forms
        (let ((buffer-read-only nil))
-         (insert (apply (function format) forms))
-         ))
-    (select-window the-win)
-    ))
+         (insert (apply (function format) forms))))
+    (select-window the-win)))
 
 
 ;;; @ file name
@@ -231,11 +220,9 @@ window.")
               (if (and subj
                        (or (string-match mime-view-file-name-regexp-1 subj)
                            (string-match mime-view-file-name-regexp-2 subj)))
-                  (substring subj (match-beginning 0)(match-end 0))
-                )))))
+                  (substring subj (match-beginning 0)(match-end 0)))))))
     (if filename
-       (replace-as-filename filename)
-      )))
+       (replace-as-filename filename))))
 
 
 ;;; @ file extraction
@@ -260,8 +247,7 @@ window.")
     (if (file-exists-p filename)
        (or (yes-or-no-p (format "File %s exists. Save anyway? " filename))
            (error "")))
-    (mime-write-entity-content entity (expand-file-name filename))
-    ))
+    (mime-write-entity-content entity (expand-file-name filename))))
 
 
 ;;; @ file detection
@@ -274,8 +260,7 @@ window.")
     ("^II\\*\000"                      image tiff)
     ("^MM\000\\*"                      image tiff)
     ("^MThd"                           audio midi)
-    ("^\000\000\001\263"               video mpeg)
-    )
+    ("^\000\000\001\263"               video mpeg))
   "*Alist of regexp about magic-number vs. corresponding media-types.
 Each element looks like (REGEXP TYPE SUBTYPE).
 REGEXP is a regular expression to match against the beginning of the
@@ -291,8 +276,7 @@ SUBTYPE is symbol to indicate subtype of media-type.")
                    (if cell
                        (if (string-match (car cell) mdata)
                            (setq type (nth 1 cell)
-                                 subtype (nth 2 cell))
-                         )
+                                 subtype (nth 2 cell)))
                      t)))
        (setq rest (cdr rest))))
     (setq situation (del-alist 'method (copy-alist situation)))
@@ -311,15 +295,14 @@ SUBTYPE is symbol to indicate subtype of media-type.")
 (defun mime-preview-quitting-method-for-mime-show-message-mode ()
   "Quitting method for mime-view.
 It is registered to variable `mime-preview-quitting-method-alist'."
-  (let ((raw-buffer (mime-entity-buffer
-                    (get-text-property (point-min) 'mime-view-entity)))
-       (mother mime-mother-buffer)
+  (let ((mother mime-mother-buffer)
        (win-conf mime-preview-original-window-configuration))
-    (kill-buffer raw-buffer)
+    (if (and (boundp 'mime-view-temp-message-buffer)
+            (buffer-live-p mime-view-temp-message-buffer))
+       (kill-buffer mime-view-temp-message-buffer))
     (mime-preview-kill-buffer)
     (set-window-configuration win-conf)
-    (pop-to-buffer mother)
-    ))
+    (pop-to-buffer mother)))
 
 (defun mime-view-message/rfc822 (entity situation)
   (let* ((new-name
@@ -335,8 +318,7 @@ It is registered to variable `mime-preview-quitting-method-alist'."
        (let ((m-win (get-buffer-window mother)))
          (if m-win
              (set-window-buffer m-win preview-buffer)
-           (switch-to-buffer preview-buffer)
-           )))))
+           (switch-to-buffer preview-buffer))))))
 
 
 ;;; @ message/partial
@@ -366,14 +348,14 @@ It is registered to variable `mime-preview-quitting-method-alist'."
          (save-window-excursion
            (set-buffer full-buf)
            (erase-buffer)
-           (as-binary-input-file (insert-file-contents file))
+           (binary-insert-encoded-file file)
            (setq major-mode 'mime-show-message-mode)
            (mime-view-buffer (current-buffer) nil mother)
            (setq pbuf (current-buffer))
-           )
+           (make-local-variable 'mime-view-temp-message-buffer)
+           (setq mime-view-temp-message-buffer full-buf))
          (set-window-buffer pwin pbuf)
-         (select-window pwin)
-         )
+         (select-window pwin))
       (setq file (concat root-dir "/" number))
       (mime-write-entity-body entity file)
       (let ((total-file (concat root-dir "/CT")))
@@ -387,10 +369,8 @@ It is registered to variable `mime-preview-quitting-method-alist'."
                          (erase-buffer)
                          (insert total)
                          (write-region (point-min)(point-max) total-file)
-                         (kill-buffer (current-buffer))
-                         ))
-                   (string-to-number total)
-                   )
+                         (kill-buffer (current-buffer))))
+                   (string-to-number total))
                (and (file-exists-p total-file)
                     (save-excursion
                       (set-buffer (find-file-noselect total-file))
@@ -398,11 +378,8 @@ It is registered to variable `mime-preview-quitting-method-alist'."
                           (and (re-search-forward "[0-9]+" nil t)
                                (string-to-number
                                 (buffer-substring (match-beginning 0)
-                                                  (match-end 0)))
-                               )
-                        (kill-buffer (current-buffer))
-                        )))
-               )))
+                                                  (match-end 0))))
+                        (kill-buffer (current-buffer))))))))
       (if (and total (> total 0)
               (>= (length (directory-files root-dir nil "^[0-9]+$" t))
                   total))
@@ -415,36 +392,33 @@ It is registered to variable `mime-preview-quitting-method-alist'."
                  (while (<= i total)
                    (setq file (concat root-dir "/" (int-to-string i)))
                    (or (file-exists-p file)
-                       (throw 'tag nil)
-                       )
-                   (as-binary-input-file (insert-file-contents file))
+                       (throw 'tag nil))
+                   (binary-insert-encoded-file file)
                    (goto-char (point-max))
-                   (setq i (1+ i))
-                   ))
-               (as-binary-output-file
-                (write-region (point-min)(point-max)
-                              (expand-file-name "FULL" root-dir)))
+                   (setq i (1+ i))))
+               (binary-write-decoded-region
+                (point-min)(point-max)
+                (expand-file-name "FULL" root-dir))
                (let ((i 1))
                  (while (<= i total)
                    (let ((file (format "%s/%d" root-dir i)))
                      (and (file-exists-p file)
-                          (delete-file file)
-                          ))
-                   (setq i (1+ i))
-                   ))
+                          (delete-file file)))
+                   (setq i (1+ i))))
                (let ((file (expand-file-name "CT" root-dir)))
                  (and (file-exists-p file)
-                      (delete-file file)
-                      ))
-               (let ((pwin (or (get-buffer-window mother)
+                      (delete-file file)))
+               (let ((buf (current-buffer))
+                     (pwin (or (get-buffer-window mother)
                                (get-largest-window)))
                      (pbuf (mime-display-message
                             (mime-open-entity 'buffer (current-buffer))
                             nil mother nil 'mime-show-message-mode)))
+                 (with-current-buffer pbuf
+                   (make-local-variable 'mime-view-temp-message-buffer)
+                   (setq mime-view-temp-message-buffer buf))
                  (set-window-buffer pwin pbuf)
-                 (select-window pwin)
-                 )))))
-      )))
+                 (select-window pwin)))))))))
 
 
 ;;; @ message/external-body
@@ -453,15 +427,13 @@ It is registered to variable `mime-preview-quitting-method-alist'."
 (defvar mime-raw-dired-function
   (if (and (>= emacs-major-version 19) window-system)
       (function dired-other-frame)
-    (function mime-raw-dired-function-for-one-frame)
-    ))
+    (function mime-raw-dired-function-for-one-frame)))
 
 (defun mime-raw-dired-function-for-one-frame (dir)
   (let ((win (or (get-buffer-window mime-preview-buffer)
                 (get-largest-window))))
     (select-window win)
-    (dired dir)
-    ))
+    (dired dir)))
 
 (defun mime-view-message/external-anon-ftp (entity cal)
   (let* ((site (cdr (assoc "site" cal)))
@@ -471,8 +443,7 @@ It is registered to variable `mime-preview-quitting-method-alist'."
     (message (concat "Accessing " (expand-file-name name pathname) " ..."))
     (funcall mime-raw-dired-function pathname)
     (goto-char (point-min))
-    (search-forward name)
-    ))
+    (search-forward name)))
 
 (defvar mime-raw-browse-url-function mime-browse-url-function)
 
@@ -494,15 +465,12 @@ It is registered to variable `mime-preview-quitting-method-alist'."
       (erase-buffer)
       (mime-insert-text-content entity)
       (mule-caesar-region (point-min) (point-max))
-      (set-buffer-modified-p nil)
-      )
+      (set-buffer-modified-p nil))
     (let ((win (get-buffer-window (current-buffer))))
       (or (eq (selected-window) win)
-         (select-window (or win (get-largest-window)))
-         ))
+         (select-window (or win (get-largest-window)))))
     (view-buffer buf)
-    (goto-char (point-min))
-    ))
+    (goto-char (point-min))))
 
 
 ;;; @ end