fml 8 tutorial
Prev | Chapter 37. Command (Command Mail, CUI And GUI) | Next

# 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.

Warning
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.

Prev | Home | Next
GUI Command Extension: CGI | Up | Internal Of CGI Process

fml 8.0 (fml-devel) project homepage is www.fml.org/software/fml8/.
fml 4.0 project homepage is www.fml.org/software/fml4/.
about one floppy bsd routers, see www.bsdrouter.org/.
other free softwares are found at www.fml.org/software/.

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>.