(mime-entity-safe-filename): Use `mime-read-field' instead of
[elisp/semi.git] / mime-play.el
index 72dc132..d2e2f61 100644 (file)
@@ -1,4 +1,4 @@
-;;; mime-play.el --- decoder for mime-view.el
+;;; mime-play.el --- Playback processing module for mime-view.el
 
 ;; Copyright (C) 1994,1995,1996,1997,1998 Free Software Foundation, Inc.
 
 
 ;; Copyright (C) 1994,1995,1996,1997,1998 Free Software Foundation, Inc.
 
 (require 'alist)
 (require 'filename)
 
 (require 'alist)
 (require 'filename)
 
+(eval-when-compile
+  (require 'mime-text)
+  (condition-case nil
+      (require 'bbdb)
+    (error (defvar bbdb-buffer-name nil))
+    ))
+
+(defvar mime-acting-situation-examples nil)
+
+(defun mime-save-acting-situation-examples ()
+  (let* ((file mime-acting-situation-examples-file)
+        (buffer (get-buffer-create " *mime-example*")))
+    (unwind-protect
+        (save-excursion
+          (set-buffer buffer)
+          (setq buffer-file-name file)
+          (erase-buffer)
+          (insert ";;; " (file-name-nondirectory file) "\n")
+          (insert "\n;; This file is generated automatically by "
+                  mime-view-version-string "\n\n")
+         (insert ";;; Code:\n\n")
+         (pp `(setq mime-acting-situation-examples
+                    ',mime-acting-situation-examples)
+             (current-buffer))
+         (insert "\n;;; "
+                  (file-name-nondirectory file)
+                  " ends here.\n")
+          (save-buffer))
+      (kill-buffer buffer))))
+
+(add-hook 'kill-emacs-hook 'mime-save-acting-situation-examples)
+
   
 ;;; @ content decoder
 ;;;
 
   
 ;;; @ content decoder
 ;;;
 
-(defvar mime-preview/after-decoded-position nil)
+(defvar mime-preview-after-decoded-position nil)
 
 
-(defun mime-view-play-current-entity (&optional mode)
+(defun mime-preview-play-current-entity (&optional mode)
   "Play current entity.
 It decodes current entity to call internal or external method.  The
 method is selected from variable `mime-acting-condition'.
 If MODE is specified, play as it.  Default MODE is \"play\"."
   (interactive)
   (or mode
   "Play current entity.
 It decodes current entity to call internal or external method.  The
 method is selected from variable `mime-acting-condition'.
 If MODE is specified, play as it.  Default MODE is \"play\"."
   (interactive)
   (or mode
-      (setq mode "play")
-      )
-  (let ((cinfo (get-text-property (point) 'mime-view-cinfo)))
-    (if cinfo
+      (setq mode "play"))
+  (let ((entity (get-text-property (point) 'mime-view-entity)))
+    (if entity
        (let ((the-buf (current-buffer))
        (let ((the-buf (current-buffer))
-             (raw-buffer (get-text-property (point) 'mime-view-raw-buffer))
-             )
-         (setq mime-preview/after-decoded-position (point))
+             (raw-buffer (mime-entity-buffer entity)))
+         (setq mime-preview-after-decoded-position (point))
          (set-buffer raw-buffer)
          (set-buffer raw-buffer)
-         (mime-playback-entity cinfo mode)
-         (if (eq (current-buffer) raw-buffer)
-             (progn
-               (set-buffer the-buf)
-               (goto-char mime-preview/after-decoded-position)
-               ))
-         ))))
-
-(defun mime-playback-entity (cinfo &optional mode)
-  (let ((beg (mime-entity-info-point-min cinfo))
-       (end (mime-entity-info-point-max cinfo))
-       (ctype (or (mime-entity-info-type/subtype cinfo) "text/plain"))
-       (params (mime-entity-info-parameters cinfo))
-       (encoding (mime-entity-info-encoding cinfo))
-       )
-    ;; Check for VM
-    (if (< beg (point-min))
-       (setq beg (point-min))
-      )
-    (if (< (point-max) end)
-       (setq end (point-max))
-      )
-    (let (method cal ret)
-      (setq cal (list* (cons 'type ctype)
-                      (cons 'encoding encoding)
-                      (cons 'major-mode major-mode)
-                      params))
-      (if mode
-         (setq cal (cons (cons 'mode mode) cal))
-       )
-      (setq ret (mime/get-content-decoding-alist cal))
-      (setq method (cdr (assq 'method ret)))
-      (cond ((and (symbolp method)
-                 (fboundp method))
-            (funcall method beg end ret)
-            )
-           ((and (listp method)(stringp (car method)))
-            (mime-article/start-external-method-region beg end ret)
-            )
-           (t
-            (mime-show-echo-buffer
-             "No method are specified for %s\n" ctype)
-            ))
+         (mime-raw-play-entity entity mode)
+         (when (eq (current-buffer) raw-buffer)
+           (set-buffer the-buf)
+           (goto-char mime-preview-after-decoded-position)
+           )))))
+
+(defun mime-sort-situation (situation)
+  (sort situation
+       #'(lambda (a b)
+           (let ((a-t (car a))
+                 (b-t (car b))
+                 (order '((type . 1)
+                          (subtype . 2)
+                          (mode . 3)
+                          (method . 4)
+                          (major-mode . 5)
+                          (disposition-type . 6)
+                          ))
+                 a-order b-order)
+             (if (symbolp a-t)
+                 (let ((ret (assq a-t order)))
+                   (if ret
+                       (setq a-order (cdr ret))
+                     (setq a-order 7)
+                     ))
+               (setq a-order 8)
+               )
+             (if (symbolp b-t)
+                 (let ((ret (assq b-t order)))
+                   (if ret
+                       (setq b-order (cdr ret))
+                     (setq b-order 7)
+                     ))
+               (setq b-order 8)
+               )
+             (if (= a-order b-order)
+                 (string< (format "%s" a-t)(format "%s" b-t))
+               (< a-order b-order))
+             )))
+  )
+
+(defsubst mime-delq-null-situation (situations field)
+  (let (dest)
+    (while situations
+      (let ((situation (car situations)))
+       (if (assq field situation)
+           (setq dest (cons situation dest))
+         ))
+      (setq situations (cdr situations)))
+    dest))
+
+(defun mime-raw-play-entity (entity &optional mode situation)
+  "Play entity specified by ENTITY.
+It decodes the entity to call internal or external method.  The method
+is selected from variable `mime-acting-condition'.  If MODE is
+specified, play as it.  Default MODE is \"play\"."
+  (let (method ret)
+    (or situation
+       (setq situation (mime-entity-situation entity)))
+    (if mode
+       (setq situation (cons (cons 'mode mode) situation))
       )
       )
+    (setq ret
+         (or (ctree-match-calist mime-acting-situation-examples situation)
+             (ctree-match-calist-partially mime-acting-situation-examples
+                                           situation)
+             situation))
+    (setq ret
+         (or (mime-delq-null-situation
+              (ctree-find-calist mime-acting-condition ret
+                                 mime-view-find-every-acting-situation)
+              'method)
+             (mime-delq-null-situation
+              (ctree-find-calist mime-acting-condition situation
+                                 mime-view-find-every-acting-situation)
+              'method)
+             ))
+    (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))
+          (ctree-set-calist-strictly 'mime-acting-situation-examples ret)
+          )
+         (t
+          (setq ret (car ret))
+          ))
+    (setq method (cdr (assq 'method ret)))
+    (cond ((and (symbolp method)
+               (fboundp method))
+          (funcall method entity ret)
+          )
+         ((stringp method)
+          (mime-activate-mailcap-method entity ret)
+          )
+          ;; ((and (listp method)(stringp (car method)))
+          ;;  (mime-activate-external-method entity ret)
+          ;;  )
+         (t
+          (mime-show-echo-buffer "No method are specified for %s\n"
+                                 (mime-entity-type/subtype entity))
+          ))
     ))
 
 
     ))
 
 
-;;; @ method selector
-;;;
-
-(defun mime/get-content-decoding-alist (al)
-  (get-unified-alist mime-acting-condition al)
-  )
-
-
 ;;; @ external decoder
 ;;;
 
 ;;; @ external decoder
 ;;;
 
-(defun mime-article/start-external-method-region (beg end cal)
+(defvar mime-mailcap-method-filename-alist nil)
+
+(defun mime-activate-mailcap-method (entity situation)
   (save-excursion
     (save-restriction
   (save-excursion
     (save-restriction
-      (narrow-to-region beg end)
-      (goto-char beg)
-      (let ((method (cdr (assoc 'method cal)))
-           (name (mime-article/get-filename cal))
+      (let ((start (mime-entity-point-min entity))
+           (end (mime-entity-point-max entity)))
+       (narrow-to-region start end)
+       (goto-char start)
+       (let ((method (cdr (assoc 'method situation)))
+             (name (mime-entity-safe-filename entity)))
+         (setq name
+               (if name
+                   (expand-file-name name mime-temp-directory)
+                 (make-temp-name
+                  (expand-file-name "EMI" mime-temp-directory))
+                 ))
+         (mime-write-decoded-region (mime-entity-body-start entity) end
+                                    name (cdr (assq 'encoding situation)))
+         (message "External method is starting...")
+         (let ((process
+                (let ((command
+                       (mailcap-format-command
+                        method
+                        (cons (cons 'filename name) situation))))
+                  (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)
            )
            )
-       (if method
-           (let ((file (make-temp-name
-                        (expand-file-name "TM" mime-temp-directory)))
-                 b args)
-             (if (nth 1 method)
-                 (setq b beg)
-               (setq b
-                     (if (re-search-forward "^$" nil t)
-                         (1+ (match-end 0))
-                       (point-min)
-                       ))
-               )
-             (goto-char b)
-             (write-region b end file)
-             (message "External method is starting...")
-             (setq cal (put-alist
-                        'name (replace-as-filename name) cal))
-             (setq cal (put-alist 'file file cal))
-             (setq args (nconc
-                         (list (car method)
-                               mime-echo-buffer-name (car method)
-                               )
-                         (mime-article/make-method-args cal
-                                                        (cdr (cdr method)))
-                         ))
-             (apply (function start-process) args)
-             (mime-show-echo-buffer)
-             ))
-       ))))
-
-(defun mime-article/make-method-args (cal format)
-  (mapcar (function
-          (lambda (arg)
-            (if (stringp arg)
-                arg
-              (let* ((item (eval arg))
-                     (ret (cdr (assoc item cal)))
-                     )
-                (if ret
-                    ret
-                  (if (eq item 'encoding)
-                      "7bit"
-                    ""))
-                ))
-            ))
-         format))
+         )))))
+
+(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)
+      ))
+  (remove-alist 'mime-mailcap-method-filename-alist process)
+  (message (format "%s %s" process event)))
 
 (defvar mime-echo-window-is-shared-with-bbdb t
   "*If non-nil, mime-echo window is shared with BBDB window.")
 
 (defvar mime-echo-window-is-shared-with-bbdb t
   "*If non-nil, mime-echo window is shared with BBDB window.")
@@ -191,7 +263,7 @@ window.")
                 (setq win (get-buffer-window bbdb-buffer-name))
                 )
            (set-window-buffer win mime-echo-buffer-name)
                 (setq win (get-buffer-window bbdb-buffer-name))
                 )
            (set-window-buffer win mime-echo-buffer-name)
-         (select-window (get-buffer-window mime-view-buffer))
+         (select-window (get-buffer-window mime-preview-buffer))
          (setq win (split-window-vertically
                     (- (window-height)
                        (if (functionp mime-echo-window-height)
          (setq win (split-window-vertically
                     (- (window-height)
                        (if (functionp mime-echo-window-height)
@@ -222,54 +294,124 @@ window.")
   (concat (regexp-* mime-view-file-name-char-regexp)
          "\\(\\." mime-view-file-name-char-regexp "+\\)*"))
 
   (concat (regexp-* mime-view-file-name-char-regexp)
          "\\(\\." mime-view-file-name-char-regexp "+\\)*"))
 
-(defun mime-article/get-original-filename (param &optional encoding)
-  (or (mime-article/get-uu-filename param encoding)
-      (let (ret)
-       (or (if (or (and (setq ret (mime/Content-Disposition))
-                        (setq ret (assoc "filename" (cdr ret)))
-                        )
-                   (setq ret (assoc "name" param))
-                   (setq ret (assoc "x-name" param))
-                   )
-               (std11-strip-quoted-string (cdr ret))
-             )
-           (if (setq ret
-                     (std11-find-field-body '("Content-Description"
-                                              "Subject")))
-               (if (or (string-match mime-view-file-name-regexp-1 ret)
-                       (string-match mime-view-file-name-regexp-2 ret))
-                   (substring ret (match-beginning 0)(match-end 0))
-                 ))
-           ))
-      ))
+(defun mime-entity-safe-filename (entity)
+  (let ((filename
+        (or (mime-entity-filename entity)
+            (let ((subj
+                   (or (mime-read-field 'Content-Description entity)
+                       (mime-read-field 'Subject entity))))
+              (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))
+                )))))
+    (if filename
+       (replace-as-filename filename)
+      )))
 
 
-(defun mime-article/get-filename (param)
-  (replace-as-filename (mime-article/get-original-filename param))
-  )
+
+;;; @ file extraction
+;;;
+
+(defun mime-save-content (entity situation)
+  (let* ((name (mime-entity-safe-filename entity))
+        (encoding (or (mime-entity-encoding entity) "7bit"))
+        (filename (if (and name (not (string-equal name "")))
+                      (expand-file-name name
+                                        (save-window-excursion
+                                          (call-interactively
+                                           (function
+                                            (lambda (dir)
+                                              (interactive "DDirectory: ")
+                                              dir)))))
+                    (save-window-excursion
+                      (call-interactively
+                       (function
+                        (lambda (file)
+                          (interactive "FFilename: ")
+                          (expand-file-name file)))))))
+        )
+    (if (file-exists-p filename)
+       (or (yes-or-no-p (format "File %s exists. Save anyway? " filename))
+           (error "")))
+    (mime-write-decoded-region (mime-entity-body-start entity)
+                              (mime-entity-body-end entity)
+                              filename encoding)
+    ))
+
+
+;;; @ file detection
+;;;
+
+(defvar mime-file-content-type-alist
+  '(("JPEG"    image jpeg)
+    ("GIF"     image gif)
+    )
+  "*Alist of \"file\" output patterns vs. corresponding media-types.
+Each element looks like (REGEXP TYPE SUBTYPE).
+REGEXP is pattern for \"file\" command output.
+TYPE is symbol to indicate primary type of media-type.
+SUBTYPE is symbol to indicate subtype of media-type.")
+
+(defun mime-detect-content (entity situation)
+  (let ((beg (mime-entity-point-min entity))
+       (end (mime-entity-point-max entity)))
+    (goto-char beg)
+    (let* ((name (save-restriction
+                  (narrow-to-region beg end)
+                  (mime-entity-safe-filename entity)
+                  ))
+          (encoding (or (cdr (assq 'encoding situation)) "7bit"))
+          (filename (if (and name (not (string-equal name "")))
+                        (expand-file-name name mime-temp-directory)
+                      (make-temp-name
+                       (expand-file-name "EMI" mime-temp-directory)))))
+      (mime-write-decoded-region (mime-entity-body-start entity) end
+                                filename encoding)
+      (let (type subtype)
+       (with-temp-buffer
+         (call-process "file" nil t nil filename)
+         (goto-char (point-min))
+         (if (search-forward (concat filename ": ") nil t)
+             (let ((rest mime-file-content-type-alist))
+               (while (not (let ((cell (car rest)))
+                             (if (looking-at (car cell))
+                                 (setq type (nth 1 cell)
+                                       subtype (nth 2 cell))
+                               )))
+                 (setq rest (cdr rest))))))
+       (if type
+           (mime-raw-play-entity
+            entity "play"
+            (put-alist 'type type
+                       (put-alist 'subtype subtype
+                                  (mime-entity-situation entity))))
+         ))
+      )))
 
 
 ;;; @ mail/news message
 ;;;
 
 
 
 ;;; @ mail/news message
 ;;;
 
-(defun mime-view-quitting-method-for-mime-show-message-mode ()
+(defun mime-preview-quitting-method-for-mime-show-message-mode ()
   "Quitting method for mime-view.
   "Quitting method for mime-view.
-It is registered to variable `mime-view-quitting-method-alist'."
+It is registered to variable `mime-preview-quitting-method-alist'."
   (let ((mother mime-mother-buffer)
   (let ((mother mime-mother-buffer)
-       (win-conf mime::preview/original-window-configuration)
+       (win-conf mime-preview-original-window-configuration)
        )
     (kill-buffer mime-raw-buffer)
        )
     (kill-buffer mime-raw-buffer)
-    (mime-view-kill-buffer)
+    (mime-preview-kill-buffer)
     (set-window-configuration win-conf)
     (pop-to-buffer mother)
     ))
 
     (set-window-configuration win-conf)
     (pop-to-buffer mother)
     ))
 
-(defun mime-display-message/rfc822 (beg end cal)
-  (let* ((cnum (mime-article/point-content-number beg))
+(defun mime-view-message/rfc822 (entity cal)
+  (let* ((beg (mime-entity-point-min entity))
+        (end (mime-entity-point-max entity))
+        (cnum (mime-raw-point-to-entity-number beg))
         (new-name (format "%s-%s" (buffer-name) cnum))
         (new-name (format "%s-%s" (buffer-name) cnum))
-        (mother mime-view-buffer)
-        (text-decoder
-         (cdr (or (assq major-mode mime-text-decoder-alist)
-                  (assq t mime-text-decoder-alist))))
+        (mother mime-preview-buffer)
+        (representation-type (mime-entity-representation-type entity))
         str)
     (setq str (buffer-substring beg end))
     (switch-to-buffer new-name)
         str)
     (setq str (buffer-substring beg end))
     (switch-to-buffer new-name)
@@ -280,7 +422,7 @@ It is registered to variable `mime-view-quitting-method-alist'."
        (delete-region (point-min) (match-end 0))
       )
     (setq major-mode 'mime-show-message-mode)
        (delete-region (point-min) (match-end 0))
       )
     (setq major-mode 'mime-show-message-mode)
-    (setq mime-text-decoder text-decoder)
+    (setq mime-raw-representation-type representation-type)
     (mime-view-mode mother)
     ))
 
     (mime-view-mode mother)
     ))
 
@@ -288,22 +430,24 @@ It is registered to variable `mime-view-quitting-method-alist'."
 ;;; @ message/partial
 ;;;
 
 ;;; @ message/partial
 ;;;
 
-(defvar mime-article/coding-system-alist
-  (list '(mh-show-mode . no-conversion)
-       (cons t (mime-charset-to-coding-system default-mime-charset))
-       ))
-
-(defun mime-article::write-region (start end file)
-  (let ((coding-system-for-write
-        (cdr
-         (or (assq major-mode mime-article/coding-system-alist)
-             (assq t mime-article/coding-system-alist)
-             ))))
-    (write-region start end file)
-    ))
+(defun mime-raw-write-region (start end filename)
+  "Write current region into specified file.
+When called from a program, takes three arguments:
+START, END and FILENAME.  START and END are buffer positions.
+It refer `mime-raw-representation-type' or `major-mode
+mime-raw-representation-type-alist'.  If it is `binary', region is
+saved as binary.  Otherwise the region is saved by `write-region'."
+  (let ((presentation-type
+        (or mime-raw-representation-type
+            (cdr (or (assq major-mode mime-raw-representation-type-alist)
+                     (assq t mime-raw-representation-type-alist))))))
+    (if (eq presentation-type 'binary)
+       (write-region-as-binary start end filename)
+      (write-region start end filename)
+      )))
 
 
-(defun mime-display-message/partial (beg end cal)
-  (goto-char beg)
+(defun mime-store-message/partial-piece (entity cal)
+  (goto-char (mime-entity-point-min entity))
   (let* ((root-dir
          (expand-file-name
           (concat "m-prts-" (user-login-name)) mime-temp-directory))
   (let* ((root-dir
          (expand-file-name
           (concat "m-prts-" (user-login-name)) mime-temp-directory))
@@ -311,8 +455,8 @@ It is registered to variable `mime-view-quitting-method-alist'."
         (number (cdr (assoc "number" cal)))
         (total (cdr (assoc "total" cal)))
         file
         (number (cdr (assoc "number" cal)))
         (total (cdr (assoc "total" cal)))
         file
-        (mother mime-view-buffer)
-         )
+        (mother mime-preview-buffer)
+        )
     (or (file-exists-p root-dir)
        (make-directory root-dir)
        )
     (or (file-exists-p root-dir)
        (make-directory root-dir)
        )
@@ -337,13 +481,12 @@ It is registered to variable `mime-view-quitting-method-alist'."
          (set-window-buffer pwin
                             (save-excursion
                               (set-buffer full-buf)
          (set-window-buffer pwin
                             (save-excursion
                               (set-buffer full-buf)
-                              mime-view-buffer))
+                              mime-preview-buffer))
          (select-window pwin)
          )
          (select-window pwin)
          )
-      (re-search-forward "^$")
-      (goto-char (1+ (match-end 0)))
       (setq file (concat root-dir "/" number))
       (setq file (concat root-dir "/" number))
-      (mime-article::write-region (point) end file)
+      (mime-raw-write-region (mime-entity-body-start entity)
+                            (mime-entity-body-end entity) file)
       (let ((total-file (concat root-dir "/CT")))
        (setq total
              (if total
       (let ((total-file (concat root-dir "/CT")))
        (setq total
              (if total
@@ -388,8 +531,8 @@ It is registered to variable `mime-view-quitting-method-alist'."
                    (setq i (1+ i))
                    ))
                (as-binary-output-file
                    (setq i (1+ i))
                    ))
                (as-binary-output-file
-                 (write-region (point-min)(point-max)
-                               (expand-file-name "FULL" root-dir)))
+                (write-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)))
                (let ((i 1))
                  (while (<= i total)
                    (let ((file (format "%s/%d" root-dir i)))
@@ -411,7 +554,7 @@ It is registered to variable `mime-view-quitting-method-alist'."
                                ))
                      (pbuf (save-excursion
                              (set-buffer full-buf)
                                ))
                      (pbuf (save-excursion
                              (set-buffer full-buf)
-                             mime-view-buffer)))
+                             mime-preview-buffer)))
                  (set-window-buffer pwin pbuf)
                  (select-window pwin)
                  )))))
                  (set-window-buffer pwin pbuf)
                  (select-window pwin)
                  )))))
@@ -421,28 +564,26 @@ It is registered to variable `mime-view-quitting-method-alist'."
 ;;; @ message/external-body
 ;;;
 
 ;;; @ message/external-body
 ;;;
 
-(defvar mime-article/dired-function
-  (if mime/use-multi-frame
+(defvar mime-raw-dired-function
+  (if (and (>= emacs-major-version 19) window-system)
       (function dired-other-frame)
       (function dired-other-frame)
-    (function mime-article/dired-function-for-one-frame)
+    (function mime-raw-dired-function-for-one-frame)
     ))
 
     ))
 
-(defun mime-article/dired-function-for-one-frame (dir)
-  (let ((win (or (get-buffer-window mime-view-buffer)
+(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)
     ))
 
                 (get-largest-window))))
     (select-window win)
     (dired dir)
     ))
 
-(defun mime-display-message/external-ftp (beg end cal)
+(defun mime-view-message/external-ftp (entity cal)
   (let* ((site (cdr (assoc "site" cal)))
         (directory (cdr (assoc "directory" cal)))
         (name (cdr (assoc "name" cal)))
   (let* ((site (cdr (assoc "site" cal)))
         (directory (cdr (assoc "directory" cal)))
         (name (cdr (assoc "name" cal)))
-        ;;(mode (cdr (assoc "mode" cal)))
-        (pathname (concat "/anonymous@" site ":" directory))
-        )
+        (pathname (concat "/anonymous@" site ":" directory)))
     (message (concat "Accessing " (expand-file-name name pathname) "..."))
     (message (concat "Accessing " (expand-file-name name pathname) "..."))
-    (funcall mime-article/dired-function pathname)
+    (funcall mime-raw-dired-function pathname)
     (goto-char (point-min))
     (search-forward name)
     ))
     (goto-char (point-min))
     (search-forward name)
     ))
@@ -451,36 +592,21 @@ It is registered to variable `mime-view-quitting-method-alist'."
 ;;; @ rot13-47
 ;;;
 
 ;;; @ rot13-47
 ;;;
 
-(defun mime-display-caesar (start end cal)
+(defun mime-view-caesar (entity situation)
   "Internal method for mime-view to display ROT13-47-48 message."
   "Internal method for mime-view to display ROT13-47-48 message."
-  (let* ((cnum (mime-article/point-content-number start))
-        (new-name (format "%s-%s" (buffer-name) cnum))
-        (the-buf (current-buffer))
-        (mother mime-view-buffer)
-        (charset (cdr (assoc "charset" cal)))
-        (encoding (cdr (assq 'encoding cal)))
-        (mode major-mode)
-        )
+  (let* ((new-name (format "%s-%s" (buffer-name)
+                          (mime-entity-number entity)))
+        (mother mime-preview-buffer))
     (let ((pwin (or (get-buffer-window mother)
                    (get-largest-window)))
     (let ((pwin (or (get-buffer-window mother)
                    (get-largest-window)))
-         (buf (get-buffer-create new-name))
-         )
+         (buf (get-buffer-create new-name)))
       (set-window-buffer pwin buf)
       (set-buffer buf)
       (select-window pwin)
       )
     (setq buffer-read-only nil)
     (erase-buffer)
       (set-window-buffer pwin buf)
       (set-buffer buf)
       (select-window pwin)
       )
     (setq buffer-read-only nil)
     (erase-buffer)
-    (insert-buffer-substring the-buf start end)
-    (goto-char (point-min))
-    (if (re-search-forward "^\n" nil t)
-       (delete-region (point-min) (match-end 0))
-      )
-    (let ((m (cdr (or (assq mode mime-text-decoder-alist)
-                     (assq t mime-text-decoder-alist)))))
-      (and (functionp m)
-          (funcall m charset encoding)
-          ))
+    (mime-text-insert-decoded-body entity)
     (mule-caesar-region (point-min) (point-max))
     (set-buffer-modified-p nil)
     (set-buffer mother)
     (mule-caesar-region (point-min) (point-max))
     (set-buffer-modified-p nil)
     (set-buffer mother)
@@ -493,4 +619,19 @@ It is registered to variable `mime-view-quitting-method-alist'."
 
 (provide 'mime-play)
 
 
 (provide 'mime-play)
 
+(let* ((file mime-acting-situation-examples-file)
+       (buffer (get-buffer-create " *mime-example*")))
+  (if (file-readable-p file)
+      (unwind-protect
+         (save-excursion
+           (set-buffer buffer)
+           (erase-buffer)
+           (insert-file-contents file)
+           (eval-buffer)
+           ;; format check
+           (or (eq (car mime-acting-situation-examples) 'type)
+               (setq mime-acting-situation-examples nil))
+           )
+       (kill-buffer buffer))))
+
 ;;; mime-play.el ends here
 ;;; mime-play.el ends here