NAME

FTN::Outbound::Reference_file - Object-oriented module for working with FTN reference files.

VERSION

version 20170409

SYNOPSIS

use Log::Log4perl ();
use Encode ();
use FTN::Outbound::Reference_file ();

Log::Log4perl -> easy_init( $Log::Log4perl::INFO );

my $reference_file = FTN::Outbound::Reference_file -> new( '/var/lib/ftn/outbound/fidonet/00010001.flo',
                                                           sub {
                                                             Encode::decode( 'cp866', shift );
                                                           },
                                                           sub {
                                                             Encode::encode( 'cp866', shift );
                                                           },
                                                           "\x0d\x0a",
                                                         );

$reference_file
  -> read_existing_file
  -> push_reference( '#', '/tmp/file_to_transfer' )
  -> write_file;

DESCRIPTION

FTN::Outbound::Reference_file module is for working with reference files in FTN following specifications from fts-5005.002 document.

OBJECT CREATION

new

my $reference_file = FTN::Outbound::Reference_file -> new( 'filename',
                                                           sub {
                                                             Encode::decode( 'UTF-8', shift );
                                                           },
                                                           sub {
                                                             Encode::encode( 'UTF-8', shift );
                                                           },
                                                           chr( 0x0a ),
                                                         );

First parameter is a filename as a character string.

Second parameter is either undef (in case no reading from the file expected (means file does not exist)) or sub reference that takes octet string (read from the existing reference file) and returns character string. In simplest case does just decoding from some predefined character set used by your software. Also might do other transformations. For example if other software uses relative path, this is the place where you transform it to absolute path by some rules. Output result used only in memory processing and won't be written to the file.

Third parameter is either undef (in case no updates expected) or sub reference that takes character string and returns octet stream that will be written to the file. Used only by push_reference method.

Forth parameter defines line joiner as standard allows two of them. If not defined or omitted will be either figured out from existing file (if possible) or character with code 0x0a will be used.

FILE READ/WRITE

read_existing_file

Method for explicit reading of existing file. If file exists, this method has not been called and you're trying to update or write file it will be called implicitly before that.

Does not expect any arguments.

If file exists and isn't empty it will be read and each line will be passed to the sub reference which was passed as second parameter to the constructor.

Returns itself for method chaining.

write_file

Method for writing content from memory to the file. Does not need any parameters. If file exists and its content in memory is empty, it will be deleted.

Returns itself for method chaining.

CONTENT ACCESS

referenced_files

Returns list of hash references describing referenced files in list content. In scalar content returns array reference.

Each hash has fields:

octet_line_in_reference_file - original line from the file or result returned by third parameter (sub reference) for constructor during push_reference method call.  This is the value that will be written by write_file method call

character_line_in_reference_file - line that was returned by second parameter (sub reference) for constructor during existing file read or possibly prefixed second argument for push_reference

full_name - character line without prefix

There might be other fields:

prefix - if there is one

size - size in bytes if file existed during read_existing_file or push_reference method call

mstat - last modify time in seconds since the epoch if file existed during read_existing_file or push_reference method call

CONTENT MODIFICATION

process_lines

Method expects one parameter - function reference. That function will be called for each line in reference file with one parameter - hash reference with all details about the referenced file. Function can change/update fields - they are actual values, not a copy.

Function return value is very important. If it is false then this line will be removed from the memory and after write_file call from the actual file. If return value is true then line stays.

Method returns number of lines removed.

push_reference

Expects referenced filename as a character string. If prefix [-#^~!@] needed, it should be defined as first parameter and filename as second parameter.

Returns itself for method chaining.