tm 7.103.2.
[elisp/tm.git] / tm-play.el
index f94b373..dc85793 100644 (file)
@@ -1,37 +1,34 @@
-;;;
 ;;; tm-play.el --- decoder for tm-view.el
 ;;; tm-play.el --- decoder for tm-view.el
-;;;
-;;; Copyright (C) 1995 Free Software Foundation, Inc.
-;;; Copyright (C) 1994,1995 MORIOKA Tomohiko
-;;;
-;;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
-;;; Maintainer: MORIOKA Tomohiko <morioka@jaist.ac.jp>
-;;; Created: 1995/9/26 (separated from tm-view.el)
-;;; Version:
-;;;    $Id: tm-play.el,v 7.9 1995/12/10 20:33:48 morioka Exp $
-;;; Keywords: mail, news, MIME, multimedia
-;;;
-;;; This file is part of tm (Tools for MIME).
-;;;
-;;; This program is free software; you can redistribute it and/or
-;;; modify it under the terms of the GNU General Public License as
-;;; published by the Free Software Foundation; either version 2, or
-;;; (at your option) any later version.
-;;;
-;;; This program is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-;;; General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with This program.  If not, write to the Free Software
-;;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-;;;
+
+;; Copyright (C) 1994,1995,1996,1997 Free Software Foundation, Inc.
+
+;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; Created: 1995/9/26 (separated from tm-view.el)
+;; Version: $Id: tm-play.el,v 7.40 1997/02/04 11:04:07 morioka Exp $
+;; Keywords: mail, news, MIME, multimedia
+
+;; This file is part of tm (Tools for MIME).
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2, or (at
+;; your option) any later version.
+
+;; This program is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
 ;;; Code:
 
 (require 'tm-view)
 
 ;;; Code:
 
 (require 'tm-view)
 
-
+  
 ;;; @ content decoder
 ;;;
 
 ;;; @ content decoder
 ;;;
 
                ))
          ))))
 
                ))
          ))))
 
-
 (defun mime-article/decode-content (cinfo)
   (let ((beg (mime::content-info/point-min cinfo))
        (end (mime::content-info/point-max cinfo))
 (defun mime-article/decode-content (cinfo)
   (let ((beg (mime::content-info/point-min cinfo))
        (end (mime::content-info/point-max cinfo))
-       (ctype (mime::content-info/type cinfo))
+       (ctype (or (mime::content-info/type cinfo) "text/plain"))
        (params (mime::content-info/parameters cinfo))
        (encoding (mime::content-info/encoding cinfo))
        )
        (params (mime::content-info/parameters cinfo))
        (encoding (mime::content-info/encoding cinfo))
        )
-    (if ctype
-       (let (method cal ret)
-         (setq cal (append (list (cons 'type ctype)
-                                 (cons 'encoding encoding)
-                                 (cons 'major-mode major-mode)
-                                 )
-                           params))
-         (if mime-viewer/decoding-mode
-             (setq cal (cons
-                        (cons 'mode mime-viewer/decoding-mode)
-                        cal))
-           )
-         (setq ret (mime/get-content-decoding-alist cal))
-         (setq method (cdr (assoc '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-article/show-output-buffer
-                 "No method are specified for %s\n" ctype)
-                ))
-         ))
+    ;; 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 mime-viewer/decoding-mode
+         (setq cal (cons
+                    (cons 'mode mime-viewer/decoding-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-article/show-output-buffer
+             "No method are specified for %s\n" ctype)
+            ))
+      )
     ))
 
     ))
 
+(defun field-unifier-for-mode (a b)
+  (let ((va (cdr a)))
+    (if (if (consp va)
+           (member (cdr b) va)
+         (equal va (cdr b))
+         )
+       (list nil b nil)
+      )))
+
 (defun mime/get-content-decoding-alist (al)
   (get-unified-alist mime/content-decoding-condition al)
   )
 (defun mime/get-content-decoding-alist (al)
   (get-unified-alist mime/content-decoding-condition al)
   )
       (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-name cal))
+           (name (mime-article/get-filename cal))
            )
        (if method
            (let ((file (make-temp-name
            )
        (if method
            (let ((file (make-temp-name
                )
              (goto-char b)
              (write-region b end file)
                )
              (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 cal (put-alist
                         'name (replace-as-filename name) cal))
              (setq cal (put-alist 'file file cal))
           (lambda (arg)
             (if (stringp arg)
                 arg
           (lambda (arg)
             (if (stringp arg)
                 arg
-              (let ((ret (cdr (assoc (eval arg) cal))))
+              (let* ((item (eval arg))
+                     (ret (cdr (assoc item cal)))
+                     )
                 (if ret
                     ret
                 (if ret
                     ret
-                  "")
+                  (if (eq item 'encoding)
+                      "7bit"
+                    ""))
                 ))
             ))
          format))
                 ))
             ))
          format))
   (let ((the-win (selected-window))
        (win (get-buffer-window mime/output-buffer-name))
        )
   (let ((the-win (selected-window))
        (win (get-buffer-window mime/output-buffer-name))
        )
-    (if (null win)
-       (progn
+    (or win
+       (if (and mime/output-buffer-window-is-shared-with-bbdb
+                (boundp 'bbdb-buffer-name)
+                (setq win (get-buffer-window bbdb-buffer-name))
+                )
+           (set-window-buffer win mime/output-buffer-name)
+         (select-window (get-buffer-window mime::article/preview-buffer))
          (setq win (split-window-vertically (/ (* (window-height) 3) 4)))
          (set-window-buffer win mime/output-buffer-name)
          ))
          (setq win (split-window-vertically (/ (* (window-height) 3) 4)))
          (set-window-buffer win mime/output-buffer-name)
          ))
   (concat (regexp-* mime-viewer/file-name-char-regexp)
          "\\(\\." mime-viewer/file-name-char-regexp "+\\)*"))
 
   (concat (regexp-* mime-viewer/file-name-char-regexp)
          "\\(\\." mime-viewer/file-name-char-regexp "+\\)*"))
 
-(defun mime-article/get-name (param)
-  (let ((str (mime-viewer/get-subject param)))
-    (if (string-match " " str)
-       (if (or (string-match mime-viewer/file-name-regexp-1 str)
-               (string-match mime-viewer/file-name-regexp-2 str))
-           (substring str (match-beginning 0)(match-end 0))
-         )
-      (replace-as-filename str)
-      )))
+(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-viewer/file-name-regexp-1 ret)
+                       (string-match mime-viewer/file-name-regexp-2 ret))
+                   (substring ret (match-beginning 0)(match-end 0))
+                 ))
+           ))
+      ))
+
+(defun mime-article/get-filename (param)
+  (replace-as-filename (mime-article/get-original-filename param))
+  )
 
 
 ;;; @ mail/news message
 
 
 ;;; @ mail/news message
 ;;;
 
 (defvar mime-article/coding-system-alist
 ;;;
 
 (defvar mime-article/coding-system-alist
-  (and (boundp 'MULE)
-       '((mh-show-mode . *noconv*)
-        (t            . *ctext*)
-        )))             
+  (list (cons 'mh-show-mode *noconv*)
+       (cons t (mime-charset-to-coding-system default-mime-charset))
+       ))
 
 
-(defvar mime-article/kanji-code-alist
-  (and (boundp 'NEMACS)
-       '((mh-show-mode . nil)
-        (t            . 2)
-        ))) 
+(cond (running-mule-merged-emacs
+       (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)
+          ))
+       )
+      ((or (boundp 'MULE)
+          running-xemacs-with-mule)
+       (defun mime-article::write-region (start end file)
+        (let ((file-coding-system
+               (cdr
+                (or (assq major-mode mime-article/coding-system-alist)
+                    (assq t mime-article/coding-system-alist)
+                    ))))
+          (write-region start end file)
+          ))
+       )
+      ((boundp 'NEMACS)
+       (defun mime-article::write-region (start end file)
+        (let ((kanji-fileio-code
+               (cdr
+                (or (assq major-mode mime-article/kanji-code-alist)
+                    (assq t mime-article/kanji-code-alist)
+                    ))))
+          (write-region start end file)
+          ))
+       )
+      (t
+       (defalias 'mime-article::write-region 'write-region)
+       ))
 
 (defun mime-article/decode-message/partial (beg end cal)
   (goto-char beg)
 
 (defun mime-article/decode-message/partial (beg end cal)
   (goto-char beg)
         (id (cdr (assoc "id" cal)))
         (number (cdr (assoc "number" cal)))
         (total (cdr (assoc "total" cal)))
         (id (cdr (assoc "id" cal)))
         (number (cdr (assoc "number" cal)))
         (total (cdr (assoc "total" cal)))
-        (the-buf (current-buffer))
         file
         (mother mime::article/preview-buffer)
         file
         (mother mime::article/preview-buffer)
-        (win-conf (save-excursion
-                    (set-buffer mother)
-                    mime::preview/original-window-configuration))
-        )
-    (if (not (file-exists-p root-dir))
+         )
+    (or (file-exists-p root-dir)
        (make-directory root-dir)
        (make-directory root-dir)
-      )
+       )
     (setq id (replace-as-filename id))
     (setq root-dir (concat root-dir "/" id))
     (setq id (replace-as-filename id))
     (setq root-dir (concat root-dir "/" id))
-    (if (not (file-exists-p root-dir))
+    (or (file-exists-p root-dir)
        (make-directory root-dir)
        (make-directory root-dir)
-      )
+       )
     (setq file (concat root-dir "/FULL"))
     (setq file (concat root-dir "/FULL"))
-    (if (not (file-exists-p file))
-       (progn
-         (re-search-forward "^$")
-         (goto-char (1+ (match-end 0)))
-         (setq file (concat root-dir "/" number))
-         (let ((file-coding-system
-                (cdr
-                 (or (assq major-mode mime-article/coding-system-alist)
-                     (assq t mime-article/coding-system-alist)
-                     )))
-               (kanji-fileio-code
-                (cdr
-                 (or (assq major-mode mime-article/kanji-code-alist)
-                     (assq t mime-article/kanji-code-alist)
-                     )))
-               )
-           (write-region (point) (point-max) file)
-           )
-         (if (get-buffer mime/temp-buffer-name)
-             (kill-buffer mime/temp-buffer-name)
+    (if (file-exists-p file)
+       (let ((full-buf (get-buffer-create "FULL"))
+             (pwin (or (get-buffer-window mother)
+                       (get-largest-window)))
+             )
+         (save-window-excursion
+           (set-buffer full-buf)
+           (erase-buffer)
+           (as-binary-input-file (insert-file-contents file))
+           (setq major-mode 'mime/show-message-mode)
+           (mime/viewer-mode mother)
            )
            )
-         (switch-to-buffer mime/temp-buffer-name)
-         (let ((i 1)
-               (max (string-to-int total))
-               (file-coding-system-for-read (if (boundp 'MULE)
-                                                *noconv*))
-               kanji-fileio-code)
-           (catch 'tag
-             (while (<= i max)
-               (setq file (concat root-dir "/" (int-to-string i)))
-               (if (not (file-exists-p file))
-                   (progn
-                     (switch-to-buffer the-buf)
-                     (throw 'tag nil)
-                     ))
-               (insert-file-contents file)
-               (goto-char (point-max))
-               (setq i (1+ i))
-               )
-             ;;(delete-other-windows)
-             (let ((buf (current-buffer)))
-               (write-file (concat root-dir "/FULL"))
-               (set-window-configuration win-conf)
-               (let ((win (get-buffer-window mother)))
-                 (if win
-                     (select-window win)
-                   ))
-               (set-window-buffer (selected-window) buf)
-               ;;(set-window-buffer buf)
-               (setq major-mode 'mime/show-message-mode)
-               )
-             (mime/viewer-mode mother)
-             (pop-to-buffer (current-buffer))
-             ))
-         )
-      (progn
-       ;;(delete-other-windows)
-       (set-window-configuration win-conf)
-       (select-window (get-buffer-window mother))
-       (let ((file-coding-system-for-read
-              (if (boundp 'MULE) *noconv*))
-             kanji-fileio-code)
-         (set-buffer (get-buffer-create "FULL"))
-         (insert-file-contents file)
+         (set-window-buffer pwin
+                            (save-excursion
+                              (set-buffer full-buf)
+                              mime::article/preview-buffer))
+         (select-window pwin)
          )
          )
-       (setq major-mode 'mime/show-message-mode)
-       (mime/viewer-mode mother)
-       ;;(pop-to-buffer (current-buffer))
-       ))
-    ))
+      (re-search-forward "^$")
+      (goto-char (1+ (match-end 0)))
+      (setq file (concat root-dir "/" number))
+      (mime-article::write-region (point) (point-max) file)
+      (let ((total-file (concat root-dir "/CT")))
+       (setq total
+             (if total
+                 (progn
+                   (or (file-exists-p total-file)
+                       (save-excursion
+                         (set-buffer
+                          (get-buffer-create mime/temp-buffer-name))
+                         (erase-buffer)
+                         (insert total)
+                         (write-file total-file)
+                         (kill-buffer (current-buffer))
+                         ))
+                   (string-to-number total)
+                   )
+               (and (file-exists-p total-file)
+                    (save-excursion
+                      (set-buffer (find-file-noselect total-file))
+                      (prog1
+                          (and (re-search-forward "[0-9]+" nil t)
+                               (string-to-number
+                                (buffer-substring (match-beginning 0)
+                                                  (match-end 0)))
+                               )
+                        (kill-buffer (current-buffer))
+                        )))
+               )))
+      (if (and total (> total 0))
+         (catch 'tag
+           (save-excursion
+             (set-buffer (get-buffer-create mime/temp-buffer-name))
+             (let ((full-buf (current-buffer)))
+               (erase-buffer)
+               (let ((i 1))
+                 (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))
+                   (goto-char (point-max))
+                   (setq i (1+ i))
+                   ))
+               (as-binary-output-file (write-file (concat root-dir "/FULL")))
+               (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))
+                   ))
+               (let ((file (expand-file-name "CT" root-dir)))
+                 (and (file-exists-p file)
+                      (delete-file file)
+                      ))
+               (save-window-excursion
+                 (setq major-mode 'mime/show-message-mode)
+                 (mime/viewer-mode mother)
+                 )
+               (let ((pwin (or (get-buffer-window mother)
+                               (get-largest-window)
+                               ))
+                     (pbuf (save-excursion
+                             (set-buffer full-buf)
+                             mime::article/preview-buffer)))
+                 (set-window-buffer pwin pbuf)
+                 (select-window pwin)
+                 )))))
+      )))
 
 
 ;;; @ rot13-47
 
 
 ;;; @ rot13-47
         (new-name (format "%s-%s" (buffer-name) cnum))
         (mother mime::article/preview-buffer)
         (charset (cdr (assoc "charset" cal)))
         (new-name (format "%s-%s" (buffer-name) cnum))
         (mother mime::article/preview-buffer)
         (charset (cdr (assoc "charset" cal)))
-        (encoding (cdr (assoc "encoding" cal)))
+        (encoding (cdr (assq 'encoding cal)))
         (mode major-mode)
         str)
     (setq str (buffer-substring beg end))
         (mode major-mode)
         str)
     (setq str (buffer-substring beg end))
     (if (re-search-forward "^\n" nil t)
        (delete-region (point-min) (match-end 0))
       )
     (if (re-search-forward "^\n" nil t)
        (delete-region (point-min) (match-end 0))
       )
-    (let ((m (assq mode mime-viewer/code-converter-alist)))
-      (if (and m (fboundp (setq m (cdr m))))
-         (funcall m (point-min) (point-max) charset encoding)
-       (mime-viewer/default-code-convert-region (point-min) (point-max)
-                                                charset encoding)
-       ))
+    (let ((m (cdr (or (assq mode mime-viewer/code-converter-alist)
+                     (assq t mime-viewer/code-converter-alist)))))
+      (and (functionp m)
+          (funcall m charset encoding)
+          ))
     (save-excursion
       (set-mark (point-min))
       (goto-char (point-max))
     (save-excursion
       (set-mark (point-min))
       (goto-char (point-max))
 ;;;
 
 (provide 'tm-play)
 ;;;
 
 (provide 'tm-play)
+
+;;; tm-play.el ends here