[mew-dist 18207] Re: CT Application/X-Gzip CTE base64 な part を message mode に表 示させるには...

Hideyuki SHIRAI ( 白井秀行 ) shirai at example.com
2001年 7月 25日 (水) 09:26:34 JST


From: Kazu Yamamoto (山本和彦) <kazu at example.com> さん曰く
Subject: [mew-dist 18205] Re: CT Application/X-Gzip CTE base64 な part を message mode に表 示させるには...
Message-ID: <20010725.091851.125118939.kazu at example.com>
Date: Wed, 25 Jul 2001 09:18:51 +0900 (JST)

kazu> > CT: Application/X-Gzip
kazu> > CTE: base64
kazu> > で、中身は Plain text を gzip で固めたものを
kazu> > message mode で直接表示させることは出来ないものでしょうか ?
kazu> > 
kazu> > 上記のような CT, CTE の組み合わせの場合には
kazu> > CT: Application/Octet-Stream
kazu> > CTE: Gzip64
kazu> > と見なして処理をするようなコマンドが有ると可能だと思うのですが、
kazu> > こんな例外処理はダメでしょうか ?
kazu> 
kazu> 個別にやるのはむなしいので、この手のものをまとめて下さい。
kazu> Applicatoin/Zip とか、いろいろあるはずです。

100% 力付くですが、以前からこんなことをやっています。改造に改造
を重ねて、つぎはぎだらけなのでめちゃくちゃ汚いです。

(1) gzip, bzip2 を直接見る。
(2) tar, zip だと中身をみる。
(3) Content-Transfer-Encoding: x-bzip64 なども適当に対処。

です。

# そういえば、きれいにして売り込もうと思っていたりした。

(add-hook
 'mew-summary-mode-hook
 (lambda ()
   (define-key mew-summary-mode-map "\C-c\C-u" 'mew-summary-insert-uncompress)))

(defun mew-summary-insert-uncompress (&optional arg)
  "Application/Octet-Stream などで gzip または bzip2 された part を表示する。
ついでに tar/zip の中身も見てみる。
ちなみに、C-u で coding-system の指定もできる。"
  (interactive "P")
  (mew-summary-part
   (let* ((fld (mew-current-get-fld (mew-frame-id)))
	  (msg (mew-current-get-msg (mew-frame-id)))
	  (part (mew-syntax-nums))
	  (cache (mew-cache-hit fld msg 'must-hit))
	  (syntax (mew-cache-decode-syntax cache))
	  (stx (mew-syntax-get-entry syntax part))
	  (ctl (mew-syntax-get-ct stx))
	  (cte (mew-syntax-get-cte stx))
	  (cdpl (mew-syntax-get-cdp stx))
	  (file (mew-syntax-get-filename cdpl ctl))
	  (begin (mew-syntax-get-begin stx))
	  (end (mew-syntax-get-end stx))
	  (buf (current-buffer))
	  (prog "gzip")
	  (opts (list "-c" "-d"))
	  (base64 (if (and cte (string-match "64$" cte)) (setq base64 t)))
	  (tocs mew-cs-autoconv)
	  (tarfile nil))
     (unwind-protect
	 (progn
	   (mew-summary-toggle-disp-msg 'on)
	   (mew-window-configure 'message)
	   ;; message buffer
	   (mew-elet
	    (mew-summary-display-preamble)
	    (mew-flet
	     (insert-buffer-substring cache begin end))
	    (when base64
	      (condition-case nil
		  (base64-decode-region (point-min) (point-max))
		(error nil)))
	    (goto-char (point-min))
	    (cond
	     ;; gzip or bzip2
	     ((or (looking-at (concat "^"
				      (char-to-string 31)
				      (char-to-string 139))) ;; gzip ?
		  (and (looking-at "^BZh") ;; bzip2 ?
		       (setq prog "bzip2" opts (list "-d"))))
	      (progn
		(message "\"%s\" uncompress ..." (upcase prog))
		(mew-plet
		 (apply (function call-process-region)
			(point-min) (point-max)
			prog t t nil opts))
		(message "\"%s\" uncompress ... done." (upcase prog))
		(goto-char (point-min))
		(when (and file
			   (string-match "\\.tar\\.\\|\\.tgz$" file)
			   (y-or-n-p "View tar ? "))
		  (setq tarfile
			(mew-make-temp-name
			 (concat (substring file 0 (match-beginning 0)) ".tar")))
		  (mew-flet
		   (write-region (point-min) (point-max) tarfile nil 'nomsg)))))
	     ;; zip
	     ((and (re-search-forward "^PK\003\004" nil t)
		   (y-or-n-p "View ZIP ? "))
	      (unless file (setq file "tmp.zip"))
	      (setq tarfile (mew-make-temp-name file))
	      (mew-flet
	       (write-region (point-min) (point-max) tarfile nil 'nomsg)))
	     ((and file  ;; tar のみ
		   (string-match "\\.tar$" file)
		   (y-or-n-p "View tar ? "))
	      (setq tarfile
		    (mew-make-temp-name
		     (concat (substring file 0 (match-beginning 0)) ".tar")))
	      (mew-flet
	       (write-region (point-min) (point-max) tarfile nil 'nomsg))))
	    (goto-char (point-min))
	    (if arg (setq tocs (read-coding-system "Coding-system: ")))
	    (mew-cs-decode-region (point-min) (point-max) tocs)
	    ;; (mew-highlight-body)
	    (mew-summary-display-postscript 'no-hook)))
       (mew-pop-to-buffer buf)
       (if tarfile (view-file-other-window tarfile))))))

## 姉妹品に
##   (define-key mew-draft-attach-map "g" 'mew-attach-copy-with-compress)
##   (define-key mew-draft-attach-map "z" 'mew-attach-copy-with-zip)))
## などというのもあるけど、省略 ^^;;

-- 
白井秀行 (mailto:shirai at example.com)



Mew-dist メーリングリストの案内