Rename `mime-view-quitting-method-for-mime-show-message-mode' ->
[elisp/semi.git] / mime-play.el
index 5c3dbe6..f394087 100644 (file)
 ;;; @ 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-info (get-text-property (point) 'mime-view-entity-info)))
+    (if entity-info
        (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 (get-text-property (point) 'mime-view-raw-buffer)))
+         (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))
+         (mime-raw-play-entity entity-info mode)
+         (when (eq (current-buffer) raw-buffer)
+           (set-buffer the-buf)
+           (goto-char mime-preview-after-decoded-position)
+           )))))
+
+(defun mime-raw-play-entity (entity-info &optional mode)
+  "Play entity specified by ENTITY-INFO.
+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 ((beg (mime-entity-info-point-min entity-info))
+       (end (mime-entity-info-point-max entity-info))
+       (c-type (mime-entity-info-media-type entity-info))
+       (c-subtype (mime-entity-info-media-subtype entity-info))
+       (params (mime-entity-info-parameters entity-info))
+       (encoding (mime-entity-info-encoding entity-info))
        )
        )
+    (or c-type
+       (setq c-type 'text
+             c-subtype 'plain))
     ;; Check for VM
     (if (< beg (point-min))
        (setq beg (point-min))
     ;; Check for VM
     (if (< beg (point-min))
        (setq beg (point-min))
@@ -75,7 +79,8 @@ If MODE is specified, play as it.  Default MODE is \"play\"."
        (setq end (point-max))
       )
     (let (method cal ret)
        (setq end (point-max))
       )
     (let (method cal ret)
-      (setq cal (list* (cons 'type ctype)
+      (setq cal (list* (cons 'type c-type)
+                      (cons 'subtype c-subtype)
                       (cons 'encoding encoding)
                       (cons 'major-mode major-mode)
                       params))
                       (cons 'encoding encoding)
                       (cons 'major-mode major-mode)
                       params))
@@ -116,7 +121,7 @@ If MODE is specified, play as it.  Default MODE is \"play\"."
       (narrow-to-region beg end)
       (goto-char beg)
       (let ((method (cdr (assoc 'method cal)))
       (narrow-to-region beg end)
       (goto-char beg)
       (let ((method (cdr (assoc 'method cal)))
-           (name (mime-article/get-filename cal))
+           (name (mime-raw-get-filename cal))
            )
        (if method
            (let ((file (make-temp-name
            )
        (if method
            (let ((file (make-temp-name
@@ -191,7 +196,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,8 +227,8 @@ 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)
+(defun mime-raw-get-original-filename (param &optional encoding)
+  (or (mime-raw-get-uu-filename param encoding)
       (let (ret)
        (or (if (or (and (setq ret (mime/Content-Disposition))
                         (setq ret (assoc "filename" (cdr ret)))
       (let (ret)
        (or (if (or (and (setq ret (mime/Content-Disposition))
                         (setq ret (assoc "filename" (cdr ret)))
@@ -243,30 +248,63 @@ window.")
            ))
       ))
 
            ))
       ))
 
-(defun mime-article/get-filename (param)
-  (replace-as-filename (mime-article/get-original-filename param))
+(defun mime-raw-get-filename (param)
+  (replace-as-filename (mime-raw-get-original-filename param))
   )
 
 
   )
 
 
+;;; @ file extraction
+;;;
+
+(defun mime-method-to-save (beg end cal)
+  (goto-char beg)
+  (let* ((name
+         (save-restriction
+           (narrow-to-region beg end)
+           (mime-raw-get-filename cal)
+           ))
+        (encoding (cdr (assq 'encoding cal)))
+        (filename
+          (if (and name (not (string-equal name "")))
+             (expand-file-name name
+                               (call-interactively
+                                (function
+                                 (lambda (dir)
+                                   (interactive "DDirectory: ")
+                                   dir))))
+           (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)(point-max) filename encoding)
+    ))
+
+
 ;;; @ 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)
     ))
 
 (defun mime-method-to-display-message/rfc822 (beg end cal)
     (set-window-configuration win-conf)
     (pop-to-buffer mother)
     ))
 
 (defun mime-method-to-display-message/rfc822 (beg end cal)
-  (let* ((cnum (mime-article/point-content-number beg))
+  (let* ((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)
+        (mother mime-preview-buffer)
         (text-decoder
          (cdr (or (assq major-mode mime-text-decoder-alist)
                   (assq t mime-text-decoder-alist))))
         (text-decoder
          (cdr (or (assq major-mode mime-text-decoder-alist)
                   (assq t mime-text-decoder-alist))))
@@ -288,21 +326,26 @@ 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)
+(defvar mime-raw-coding-system-alist
+  `((mh-show-mode . no-conversion)
+    (t . ,(mime-charset-to-coding-system default-mime-charset)))
+  "Alist of major-mode vs. corresponding coding-system.")
+
+(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-coding-system-alist' to choose coding-system to
+write."
   (let ((coding-system-for-write
         (cdr
   (let ((coding-system-for-write
         (cdr
-         (or (assq major-mode mime-article/coding-system-alist)
-             (assq t mime-article/coding-system-alist)
+         (or (assq major-mode mime-raw-coding-system-alist)
+             (assq t mime-raw-coding-system-alist)
              ))))
              ))))
-    (write-region start end file)
+    (write-region start end filename)
     ))
 
     ))
 
-(defun mime-display-message/partial (beg end cal)
+(defun mime-method-to-store-message/partial (beg end cal)
   (goto-char beg)
   (let* ((root-dir
          (expand-file-name
   (goto-char beg)
   (let* ((root-dir
          (expand-file-name
@@ -311,7 +354,7 @@ 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 +380,13 @@ 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)
          )
       (re-search-forward "^$")
       (goto-char (1+ (match-end 0)))
       (setq file (concat root-dir "/" number))
          (select-window pwin)
          )
       (re-search-forward "^$")
       (goto-char (1+ (match-end 0)))
       (setq file (concat root-dir "/" number))
-      (mime-article::write-region (point) end file)
+      (mime-raw-write-region (point) end file)
       (let ((total-file (concat root-dir "/CT")))
        (setq total
              (if total
       (let ((total-file (concat root-dir "/CT")))
        (setq total
              (if total
@@ -411,7 +454,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,14 +464,14 @@ It is registered to variable `mime-view-quitting-method-alist'."
 ;;; @ message/external-body
 ;;;
 
 ;;; @ message/external-body
 ;;;
 
-(defvar mime-article/dired-function
+(defvar mime-raw-dired-function
   (if mime/use-multi-frame
       (function dired-other-frame)
   (if mime/use-multi-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)
@@ -442,7 +485,7 @@ It is registered to variable `mime-view-quitting-method-alist'."
         (pathname (concat "/anonymous@" site ":" directory))
         )
     (message (concat "Accessing " (expand-file-name name pathname) "..."))
         (pathname (concat "/anonymous@" site ":" directory))
         )
     (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,12 +494,12 @@ It is registered to variable `mime-view-quitting-method-alist'."
 ;;; @ rot13-47
 ;;;
 
 ;;; @ rot13-47
 ;;;
 
-(defun mime-display-caesar (start end cal)
+(defun mime-method-to-display-caesar (start end cal)
   "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))
+  (let* ((cnum (mime-raw-point-to-entity-number start))
         (new-name (format "%s-%s" (buffer-name) cnum))
         (the-buf (current-buffer))
         (new-name (format "%s-%s" (buffer-name) cnum))
         (the-buf (current-buffer))
-        (mother mime-view-buffer)
+        (mother mime-preview-buffer)
         (charset (cdr (assoc "charset" cal)))
         (encoding (cdr (assq 'encoding cal)))
         (mode major-mode)
         (charset (cdr (assoc "charset" cal)))
         (encoding (cdr (assq 'encoding cal)))
         (mode major-mode)