method
------

mime/viewer-mode では user は各 content に対して、play (v), extract (e), print (C-c C-p) という操作を行なうことができます。こうした操作のことを『（content に対する）decode 操作』と呼ぶことにします。また、play, extract, print という decode 操作の種類のことを decoding-mode と呼ぶことにします。

decode 操作が行なわれた時、その content の content-type などの条件やその場の環境に応じて実際にその操作を実行する手続きが呼ばれます。この手続きのことを method と呼びます。

method には、Emacs Lisp で書かれた 内部 method と、外部 program で実現された 外部 method があります。内部 method は Emacs の機能を使ってきめ細かい処理を行なうことができます。外部 method は非同期プロセス呼び出しを使って実現されているので、実行中待たされずにすみます。このため、静止画や動画などの巨大な data を再生するのに良いでしょう。

content の decode 条件の設定
......................

tm-view は decode 操作が行なわれると、変数 mime/content-decoding-condition からその時の条件に合致した method を捜し出して、それを呼び出します。

変数 mime/content-decoding-condition は

             (条件1 条件2 ...)

という形をした list で、各条件は

             ((field-type_1 . value_1)
              (field-type_2 . value_2)
              ...)

という形の連想 list になっています。

例えば、text/plain の時、tm-plain を起動する時、

             ((type . "text/plain")
              (method "tm-plain" nil 'file 'type 'encoding 'mode 'name))

という条件を書きます。この method の value 部の書式については後で詳しく述べます。

この条件は content-type が text/plain である content なら全ての decoding-mode で有効です。しかし、

             ((type . "text/plain")
              (method "tm-plain" nil 'file 'type 'encoding 'mode 'name)
              (mode . "play"))

なら、play mode の時しか有効になりません。

逆に、

             ((method "metamail" t "-m" "tm" "-x" "-d" "-z" "-e" 'file)
              (mode . "play"))

なら、全ての content-type の play mode で有効になります。

こうして各条件を前から見て行き、最初に有効になった条件が実行されます。

method の値部の書式
.............

decode-condition の method field は

             (method . SYMBOL)

か

             (method  文字列  FLAG  引数1  引数2  ...)

という形をしています。

前者は内部 method を指定するための形式で、decode 操作が行なわれた時、 SYMBOL という関数が関数呼び出しによって内部 method として呼び出されます。

後者は外部 method を指定するための形式で、decode 操作が行なわれた時、文字列で指定された外部 program が非同期プロセス呼び出しによって外部 method として呼び出されます。

外部 method を指定する場合の method field の書式は以下の通りです。

文字列
     外部 method の名前

FLAG
     t なら content-header も外部 method に渡す。nil なら content-body のみを渡す。

引数列
     外部 method の引数

また、外部 method の引数は次のような形式で書きます。

文字列
     その文字列を渡す

'SYMBOL
     SYMBOL を key とした decoding-condition の値を渡す

'文字列
     文字列を key とした decoding-condition の値を渡す

'SYMBOL で指定できるものには、

'file
     content を渡すための file 名

'type
     Content-Type field の content-type/subtype

'encoding
     Content-Transfer-Encoding field の field body

'mode
     decoding-mode

'name
     file に落す場合の file 名

などがあり、'文字列 では Content-Type field の parameter の値が指定できます。

decoding-condition の例
.....................

以下に decoding-condition の設定例を示します。

     (defvar mime/content-decoding-condition
       '(((type . "text/plain")
          (method "tm-plain" nil 'file 'type 'encoding 'mode 'name))
         ((type . "text/x-latex")
          (method "tm-latex" nil 'file 'type 'encoding 'mode 'name))
         ((type . "audio/basic")
          (method "tm-au"    nil 'file 'type 'encoding 'mode 'name))
         ((type . "image/gif")
          (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
         ((type . "image/jpeg")
          (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
         ((type . "image/tiff")
          (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
         ((type . "image/x-tiff")
          (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
         ((type . "image/x-xbm")
          (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
         ((type . "image/x-pic")
          (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
         ((type . "video/mpeg")`
          (method "tm-mpeg"  nil 'file 'type 'encoding 'mode 'name))
         ((type . "application/octet-stream")
          (method "tm-file"  nil 'file 'type 'encoding 'mode 'name))
         ((type . "message/partial")
          (method . mime/decode-message/partial-region))
         ((method "metamail" t
                  "-m" "tm" "-x" "-d" "-z" "-e" 'file)(mode . "play"))
         ))

例えば、「全部 metamail 使うんや」という場合、

     (setq mime/content-decoding-condition
           '(
             ((method "metamail" t "-m" "tm" "-x" "-d" "-z" "-e" 'file))
            ))

とすれば OK です。

工夫すれば、かなり複雑な条件が書けるでしょう。

以下に、decoding-condition を設定するための有用な関数を紹介します。

Function set-atype symbol alist

SYMBOL に条件 ALIST を追加します。

例：

     (set-atype 'mime/content-decoding-condition
     	   '((type . "message/external-body")
     	     ("access-type" . "anon-ftp")
     	     (method . mime/decode-message/external-ftp)
     	     ))

環境変数
====

以下に tm-view の標準 method が参照する環境変数を示します。

TM_TMP_DIR
     一時的に作成される file や file 出力する場合の default の出力先として用いられる directory を指定する。省略された場合、/tmp/ が用いられる。

VIDEO_DITHER
     mpeg_play での dither のかけ方を指定する。既定値は `gray'.

TM_WWW_BROWSER
     WWW browser を指定する。既定値は `netscape'.