(bbdb-extract-field-value): Use `eword-decode-string' instead of
[elisp/tm.git] / tm-play.el
index acbf645..a1366d7 100644 (file)
@@ -1,10 +1,10 @@
 ;;; tm-play.el --- decoder for tm-view.el
 
 ;;; tm-play.el --- decoder for tm-view.el
 
-;; Copyright (C) 1994,1995,1996 Free Software Foundation, Inc.
+;; 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)
 
 ;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
 ;; Created: 1995/9/26 (separated from tm-view.el)
-;; Version: $Id: tm-play.el,v 7.29 1996/09/23 13:14:07 morioka Exp $
+;; Version: $Id: tm-play.el,v 7.43 1997/03/12 14:26:55 morioka Exp $
 ;; Keywords: mail, news, MIME, multimedia
 
 ;; This file is part of tm (Tools for MIME).
 ;; Keywords: mail, news, MIME, multimedia
 
 ;; This file is part of tm (Tools for MIME).
 
 (require 'tm-view)
 
 
 (require 'tm-view)
 
-(defvar mime-viewer/external-progs "/usr/local/share/tm"
-  "*Directory containing tm external methods.")
-
-(add-to-list 'exec-path mime-viewer/external-progs)
-
-(let ((paths (parse-colon-path (getenv "PATH"))))
-  (or (member mime-viewer/external-progs paths)
-      (setenv "PATH"
-             (mapconcat (function identity)
-                        (append paths (list mime-viewer/external-progs))
-                        path-separator))
-      ))
-
   
 ;;; @ content decoder
 ;;;
   
 ;;; @ content decoder
 ;;;
 ;;;
 
 (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 ((boundp 'MULE) ; for MULE 2.3 or older
+       (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)
+          ))
+       )
+      ((featurep 'mule) ; for Emacs/mule and XEmacs/mule
+       (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)
+          ))
+       )
+      ((boundp 'NEMACS) ; for 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 ; for Emacs 19 or older and XEmacs without mule
+       (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))
-             ))
+         (set-window-buffer pwin
+                            (save-excursion
+                              (set-buffer full-buf)
+                              mime::article/preview-buffer))
+         (select-window pwin)
          )
          )
-      (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)
-         )
-       (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
 ;;;
 
+(require 'view)
+
+(defconst mime-view-text/plain-mode-map (copy-keymap view-mode-map))
+(define-key mime-view-text/plain-mode-map
+  "q" (function mime-view-text/plain-exit))
+
+(defun mime-view-text/plain-mode ()
+  "\\{mime-view-text/plain-mode-map}"
+  (setq buffer-read-only t)
+  (setq major-mode 'mime-view-text/plain-mode)
+  (setq mode-name "MIME-View text/plain")
+  (use-local-map mime-view-text/plain-mode-map)
+  )
+
+(defun mime-view-text/plain-exit ()
+  (interactive)
+  (kill-buffer (current-buffer))
+  )
+
 (defun mime-article/decode-caesar (beg end cal)
   (let* ((cnum (mime-article/point-content-number beg))
         (cur-buf (current-buffer))
 (defun mime-article/decode-caesar (beg end cal)
   (let* ((cnum (mime-article/point-content-number beg))
         (cur-buf (current-buffer))
         (mode major-mode)
         str)
     (setq str (buffer-substring beg end))
         (mode major-mode)
         str)
     (setq str (buffer-substring beg end))
-    (switch-to-buffer new-name)
+    (let ((pwin (or (get-buffer-window mother)
+                   (get-largest-window)))
+         (buf (get-buffer-create new-name))
+         )
+      (set-window-buffer pwin buf)
+      (set-buffer buf)
+      (select-window pwin)
+      )
     (setq buffer-read-only nil)
     (erase-buffer)
     (insert str)
     (setq buffer-read-only nil)
     (erase-buffer)
     (insert str)
     (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))
       (tm:caesar-region)
       )
     (save-excursion
       (set-mark (point-min))
       (goto-char (point-max))
       (tm:caesar-region)
       )
-    (view-mode)
+    (set-buffer-modified-p nil)
+    (mime-view-text/plain-mode)
     ))
 
 
     ))