[HOME] [github] [twitter] [blog] [fml4] [fml8] [北海道] Powered by NetBSD and [nuinui.net] .

How Differ Coding Style Among fml4 And fml8

Consider localization of "help" command as an example of an fml command, which sends back help message to the sender.

In the case of fml4, prepare myProcHelpFileSendBack() function and register it at %LocalProcedure hash to enable it.

%LocalProcedure = (
                    'help',     'myProcHelpFileSendBack',
myProcHelpFileSendBack as follows:
sub myProcHelpFileSendBack
    local($proc, *Fld, *e, *misc) = @_;
    my $UJA_FILE = "/some/where/help";
    &SendFile($Envelope{'Addr2Reply:'}, "UJA $ML_FN", $UJA_FILE);

In the case of fml8, the main code of help command locates at FML::Command::User::help class. This class is called by FML::Process::Command via AUTOLOAD of FML::Command.


All fml8 commands are implemented at either of FML::Command::User or FML::Command::Admin classes. Both CUI (makefml, fml) and GUI (CGI) uses FML::Command::Admin class. Instead command mail users both classes according to the context.

The real content of help command is process() method in FML::Command::User::help class.

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");
where $curproc is an object, which type is hash reference. It corresponds to %Envelope of fml4. It contains several references to objects for this process. For exmple, variable $config is an object holding configuration variables.

All variables of fml4 are global. Instead variables of fml8 locates within configuration space accessed via $config object.

reply_message_prepare_template() converts the message language and expands the arguments in the message templates.

$curproc->reply_message() inserts the specified mesage string into the message queue of this process on memory.

The error/log messages queued in on memory are aggergated to one message at the last of the current process. Mail::Delivery class handles the aggregation and send it. If needed, the aggregator handles text strings or multipart properly to build one message.

This mechanism is same as Notify() of fml4 but the last aggregator which handles all at the last is different.

FYI: commands such as "get" for the file manipulation uses the same message queuing mechanism. fml4's Notify() sends back immediately. Instead fml8's mechanism is queuing based always. This fml8 mechanism is different from fml4's Notify() fundamentally.

[HOME] [github] [twitter] [blog] [fml4] [fml8] [北海道] Powered by NetBSD and [nuinui.net] .
Copyright (C) 1993-2022 Ken'ichi Fukamachi mail:< fukachan at fml.org >