コマンドの典型である『ファイルを送り返す』だけの help コマンドを例にとり、 相違点を説明しましょう。
fml4 では、適当な関数、たとえば myProcHelpFileSendBack を作り、 %LocalProcedure に書いておきます。
%LocalProcedure = ( 'help', 'myProcHelpFileSendBack', );myProcHelpFileSendBack をあえて書き下すと、つぎのようなものでしょう。
sub myProcHelpFileSendBack { local($proc, *Fld, *e, *misc) = @_; my $UJA_FILE = "/some/where/help"; &SendFile($Envelope{'Addr2Reply:'}, "UJA $ML_FN", $UJA_FILE); }
一方、fml8 では help ファイルを送り返すコードの実体は FML::Command::User::help にあり、 FML::Process::Command クラスから (FML::Command の AUTOLOAD を経由して)呼び出されます。
Warning |
全てのコマンドは「FML::Command::User::コマンド」クラスもしくは 「FML::Command::Admin::コマンド」クラスとして実装されています。なお makefml は「FML::Command::Admin::コマンド」を使います。 コマンドメールや CGI は User や Admin を権限に応じて適宜使い分けます。 |
help コマンドの実体は FML::Command::User::help の process() 関数です。
sub process { my ($self, $curproc, $optargs) = @_; my $config = $curproc->config(); my $charset = $config->{ report_mail_charset_ja }; my $help_file = $config->{ help_file }; # template substitution: kanji code, $varname expansion et. al. my $params = { src => $help_file, charset_out => $charset, }; my $help_template = $curproc->reply_message_prepare_template( $params ); if (-f $help_template) { $curproc->reply_message( { type => "text/plain; charset=$charset", path => $help_template, filename => "help", disposition => "help", }); } else { croak("no help file ($help_template)\n"); } }ここで $curproc はハッシュリファレンスで、fml4 の %Envelope におおむ ね相当します。名前の通り、Unix カーネルでおなじみの current process 構 造体へのポインタのようなもので、プロセスに関連するいろいろなデータ構造 やオブジェクトへのリファレンスを含んでいます。
fml4 の変数は、すべてグローバル変数です。一方 fml8 では $config オ ブジェクトを通じてアクセスできる設定変数空間の中にあります。常に $config オブジェクトを通じて読み書きをしてください。
reply_message_prepare_template() メソッドは送り返すメッセージのテンプ レート中にある変数の展開や文字コード変換を行ない、生成されたテンプレー トへのファイルパスを返します(テンプレートファイルは $tmp_dir ディレク トリに作られます)。
首尾良くテンプレートファイルを用意できたら、 $curproc->reply_message() というプロセス全体のメッセージ処理を行なう関 数群のトップレベルメソッドを呼び出し、メッセージの返送処理を依頼します。
$curproc->reply_message() は引数によって振舞いがことなりますが、 いずれにせよ、メッセージをメッセージキューに入れるメソッドです。
コマンドモジュールでの処理は、キューに入れたところで終りとなります。 以下の返送処理は、どんな時でも行なわれる通常のフローの一部です。
メッセージキューに入れられたメッセージ群は、プロセスの終了直前に受信者 ごとにメッセージがまとめられ一通のメールとして組み立てなおされます。 メッセージキューの種類がファイルとメッセージが混在している場合は適宜 MIME マルチパートのメッセージが生成されます。
メッセージの準備が整うと、送信処理を担当するメソッドが呼ばれます。 Mail::Delivery クラスが送信処理を担当するモジュールです。 生成されたメールは、 最終的に Mail::Delivery クラスへ渡され送信処理が行なわれます。
この返送の大筋は fml4 の Notify() と同様ですが、あらゆるメッセージが 一度キューに入れられ、最後に一気に処理されるという点で大きく異なります。
なお get コマンドなども同じキューイングの仕組みを使っています。つまり fml4 の Notify() 相当部分が(通常の記事配送以外の)あらゆる送信機能を 担当し、かつキューイングのみをします。そしてキューイングされたメッセー ジは最後に一気に処理されます。この点において、送信のキューイングのメカ ニズムが fml4 と大きく異なっているわけです。
author's homepage is www.fml.org/home/fukachan/.
Also, visit nuinui's world :) at www.nuinui.net.
For questions about FML, e-mail <fml-bugs@fml.org>.