コマンド処理の概要:
『4.0 と 5.0 のコードの書き方はどのくらい違うか?』
コマンドの典型『ファイルを送り返す』だけの help コマンドを例にとり説明
しましょう。
5.0 では help ファイルを送り返すコードの実体は
FML::Command::User::help にあり、
FML::Process::Command クラスから
(FML::Command の AUTOLOAD を経由して)呼び出されます。
注意: 全てのコマンドは FML::Command::User::コマンド もしくは
FML::Command::Admin::コマンド クラスとして実装されています。
なお makefml は FML::Command::Admin::コマンド を使います。
help の実体は FML::Command::User::help のこの関数です。
sub process
{
my ($self, $curproc, $optargs) = @_;
my $config = $curproc->{ config };
my $charset = $config->{ reply_message_charset };
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->prepare_file_to_return( $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 は UNIX カーネルでおなじみの current process 構造体へ
のポインタに相当するハッシュリファレンスです。
そして $config ハッシュとして蓄えられている設定変数空間は、4.0 ではグ
ローバル変数です。
prepare_file_to_return() はメッセージテンプレートの中にある変数の展開
や文字コード変換を適宜行ないます。
$curproc->reply_message() は引数によって振舞いがことなりますが、
いずれにせよ、メッセージをキューに入れるメソッドです。
キューに入れられたメッセージ群は、プロセスの終了直前に一通のメールとし
て組み立てなおされ、Mail::Delivery クラス経由で送信されます。メッセー
ジキューの種類がファイルとメッセージが混在していれば、適宜 MIME マルチ
パートのメッセージが生成されます。
この仕組みは fml 4.0 の Notify() と同様ですが、あらゆるメッセージがキュー
に入れられ、最後に一気に処理されるという点で大きく異なります。get コマ
ンドなども同じように扱われます。つまり 4.0 の Notify() 相当部分が(通常
の記事配送以外の)あらゆる送信機能を担当するということです。
この点において、送信のキューイングのメカニズムは大きく異なっています。