update.
[elisp/semi.git] / mime-play.el
index 45ff40d..b163641 100644 (file)
@@ -34,8 +34,8 @@
   (require 'mime-text)
   (condition-case nil
       (require 'bbdb)
-    (error (defvar bbdb-buffer-name nil))
-    ))
+    (error (defvar bbdb-buffer-name nil)))
+  )
 
 (defvar mime-acting-situation-examples nil)
 
@@ -73,9 +73,7 @@
 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"))
+  (interactive (list "play"))
   (let ((entity (get-text-property (point) 'mime-view-entity)))
     (if entity
        (let ((the-buf (current-buffer))
@@ -206,10 +204,14 @@ specified, play as it.  Default MODE is \"play\"."
        (narrow-to-region start end)
        (goto-char start)
        (let ((method (cdr (assoc 'method situation)))
-             (name (expand-file-name (mime-raw-get-filename situation)
-                                     mime-temp-directory)))
-         (mime-write-decoded-region (mime-entity-body-start entity) end
-                                    name (cdr (assq 'encoding situation)))
+             (name (mime-entity-safe-filename entity)))
+         (setq name
+               (if (and name (not (string= name "")))
+                   (expand-file-name name mime-temp-directory)
+                 (make-temp-name
+                  (expand-file-name "EMI" mime-temp-directory))
+                 ))
+          (mime-write-entity-content entity name)
          (message "External method is starting...")
          (let ((process
                 (let ((command
@@ -232,53 +234,6 @@ specified, play as it.  Default MODE is \"play\"."
   (remove-alist 'mime-mailcap-method-filename-alist process)
   (message (format "%s %s" process event)))
 
-;; (defun mime-activate-external-method (entity cal)
-;;   (save-excursion
-;;     (save-restriction
-;;       (let ((beg (mime-entity-point-min entity))
-;;             (end (mime-entity-point-max entity)))
-;;         (narrow-to-region beg end)
-;;         (goto-char beg)
-;;         (let ((method (cdr (assoc 'method cal)))
-;;               (name (mime-raw-get-filename cal)))
-;;           (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 (mime-entity-body-start entity)))
-;;                 (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-make-external-method-args
-;;                              cal (cdr (cdr method)))
-;;                             ))
-;;                 (apply (function start-process) args)
-;;                 (mime-show-echo-buffer)
-;;                 ))
-;;           )))))
-
-;; (defun mime-make-external-method-args (cal format)
-;;   (mapcar (function
-;;            (lambda (arg)
-;;              (if (stringp arg)
-;;                  arg
-;;                (let* ((item (eval arg))
-;;                       (ret (cdr (assoc item cal))))
-;;                  (or ret
-;;                      (if (eq item 'encoding)
-;;                          "7bit"
-;;                        ""))
-;;                  ))))
-;;           format))
-
 (defvar mime-echo-window-is-shared-with-bbdb t
   "*If non-nil, mime-echo window is shared with BBDB window.")
 
@@ -336,78 +291,56 @@ window.")
   (concat (regexp-* mime-view-file-name-char-regexp)
          "\\(\\." mime-view-file-name-char-regexp "+\\)*"))
 
-(defun mime-raw-get-original-filename (param)
-  (or (if (member (cdr (assq 'encoding param))
-                 mime-view-uuencode-encoding-name-list)
-         (mime-raw-get-uu-filename))
-      (let (ret)
-       (or (if (or (and (setq ret (mime-read-Content-Disposition))
-                        (setq ret
-                              (assoc
-                               "filename"
-                               (mime-content-disposition-parameters 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-raw-get-filename (param)
-  (replace-as-filename (mime-raw-get-original-filename param))
-  )
+(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)
+      )))
 
 
 ;;; @ file extraction
 ;;;
 
-(defun mime-method-to-save (entity cal)
-  (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-raw-get-filename cal)
-                  ))
-          (encoding (or (cdr (assq 'encoding cal)) "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 "")))
-      (re-search-forward "\n\n")
-      (mime-write-decoded-region (match-end 0) end filename encoding)
-      )))
+(defun mime-save-content (entity situation)
+  (let* ((name (mime-entity-safe-filename entity))
+        (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-entity-content entity filename)
+    ))
 
 
 ;;; @ file detection
 ;;;
 
 (defvar mime-file-content-type-alist
-  '(("JPEG"    image jpeg)
-    ("GIF"     image gif)
+  '(("JPEG"            image jpeg)
+    ("GIF"             image gif)
+    ("Standard MIDI"   audio midi)
     )
   "*Alist of \"file\" output patterns vs. corresponding media-types.
 Each element looks like (REGEXP TYPE SUBTYPE).
@@ -415,13 +348,13 @@ 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-method-to-detect (entity situation)
+(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-raw-get-filename situation)
+                  (mime-entity-safe-filename entity)
                   ))
           (encoding (or (cdr (assq 'encoding situation)) "7bit"))
           (filename (if (and name (not (string-equal name "")))
@@ -437,10 +370,12 @@ SUBTYPE is symbol to indicate subtype of media-type.")
          (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))
-                               )))
+                             (if cell
+                                 (if (looking-at (car cell))
+                                     (setq type (nth 1 cell)
+                                           subtype (nth 2 cell))
+                                   )
+                               t)))
                  (setq rest (cdr rest))))))
        (if type
            (mime-raw-play-entity
@@ -467,50 +402,27 @@ It is registered to variable `mime-preview-quitting-method-alist'."
     (pop-to-buffer mother)
     ))
 
-(defun mime-method-to-display-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))
+(defun mime-view-message/rfc822 (entity situation)
+  (let* ((new-name
+         (format "%s-%s" (buffer-name) (mime-entity-number entity)))
         (mother mime-preview-buffer)
-        (representation-type
-         (cdr (or (assq major-mode mime-raw-representation-type-alist)
-                  (assq t mime-raw-representation-type-alist))))
-        str)
-    (setq str (buffer-substring beg end))
-    (switch-to-buffer new-name)
+        (children (car (mime-entity-children entity))))
+    (set-buffer (get-buffer-create new-name))
     (erase-buffer)
-    (insert str)
-    (goto-char (point-min))
-    (if (re-search-forward "^\n" nil t)
-       (delete-region (point-min) (match-end 0))
-      )
+    (insert-buffer-substring (mime-entity-buffer children)
+                            (mime-entity-point-min children)
+                            (mime-entity-point-max children))
+    (setq mime-message-structure children)
     (setq major-mode 'mime-show-message-mode)
-    (setq mime-raw-representation-type representation-type)
-    (mime-view-mode mother)
+    (mime-view-buffer (current-buffer) nil mother
+                     nil (if (mime-entity-cooked-p entity) 'cooked))
     ))
 
 
 ;;; @ message/partial
 ;;;
 
-(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-method-to-store-message/partial (entity cal)
+(defun mime-store-message/partial-piece (entity cal)
   (goto-char (mime-entity-point-min entity))
   (let* ((root-dir
          (expand-file-name
@@ -548,10 +460,8 @@ saved as binary.  Otherwise the region is saved by `write-region'."
                               mime-preview-buffer))
          (select-window pwin)
          )
-      (re-search-forward "^$")
-      (goto-char (1+ (match-end 0)))
       (setq file (concat root-dir "/" number))
-      (mime-raw-write-region (point) (mime-entity-point-max entity) file)
+      (mime-write-entity-body entity file)
       (let ((total-file (concat root-dir "/CT")))
        (setq total
              (if total
@@ -642,22 +552,29 @@ saved as binary.  Otherwise the region is saved by `write-region'."
     (dired dir)
     ))
 
-(defun mime-method-to-display-message/external-ftp (entity cal)
+(defun mime-view-message/external-anon-ftp (entity cal)
   (let* ((site (cdr (assoc "site" cal)))
         (directory (cdr (assoc "directory" cal)))
         (name (cdr (assoc "name" cal)))
         (pathname (concat "/anonymous@" site ":" directory)))
-    (message (concat "Accessing " (expand-file-name name pathname) "..."))
+    (message (concat "Accessing " (expand-file-name name pathname) " ..."))
     (funcall mime-raw-dired-function pathname)
     (goto-char (point-min))
     (search-forward name)
     ))
 
+(defvar mime-raw-browse-url-function (function mime-browse-url))
+
+(defun mime-view-message/external-url (entity cal)
+  (let ((url (cdr (assoc "url" cal))))
+    (message (concat "Accessing " url " ..."))
+    (funcall mime-raw-browse-url-function url)))
+
 
 ;;; @ rot13-47
 ;;;
 
-(defun mime-method-to-display-caesar (entity situation)
+(defun mime-view-caesar (entity situation)
   "Internal method for mime-view to display ROT13-47-48 message."
   (let* ((new-name (format "%s-%s" (buffer-name)
                           (mime-entity-number entity)))