Convert-UUlib
view release on metacpan or search on metacpan
=head2 File States
This code is zero, i.e. "false":
UUFILE_READ Read in, but not further processed
The following state codes are or'ed together:
FILE_MISPART Missing Part(s) detected
FILE_NOBEGIN No 'begin' found
FILE_NOEND No 'end' found
FILE_NODATA File does not contain valid uudata
FILE_OK All Parts found, ready to decode
FILE_ERROR Error while decoding
FILE_DECODED Successfully decoded
FILE_TMPFILE Temporary decoded file exists
=head2 Encoding types
UU_ENCODED UUencoded data
B64_ENCODED Mime-Base64 data
XX_ENCODED XXencoded data
BH_ENCODED Binhex encoded
PT_ENCODED Plain-Text encoded (MIME)
QP_ENCODED Quoted-Printable (MIME)
YENC_ENCODED yEnc encoded (non-MIME)
=head1 EXPORTED FUNCTIONS
=head2 Initializing and cleanup
Initialize is automatically called when the module is loaded and allocates
quite a small amount of memory for todays machines ;) CleanUp releases that
again.
On my machine, a fairly complete decode with DBI backend needs about 10MB
RSS to decode 20000 files.
=over
=item CleanUp
Release memory, file items and clean up files. Should be called after a
decoidng run, if you want to start a new one.
=back
=head2 Setting and querying options
=over
=item $option = GetOption OPT_xxx
=item SetOption OPT_xxx, opt-value
=back
See the C<OPT_xxx> constants above to see which options exist.
=head2 Setting various callbacks
=over
=item SetMsgCallback [callback-function]
=item SetBusyCallback [callback-function]
=item SetFileCallback [callback-function]
=item SetFNameFilter [callback-function]
=back
=head2 Call the currently selected FNameFilter
=over
=item $file = FNameFilter $file
=back
=head2 Loading sourcefiles, optionally fuzzy merge and start decoding
=over
=item ($retval, $count) = LoadFile $fname, [$id, [$delflag, [$partno]]]
Load the given file and scan it for encoded contents. Optionally tag it
with the given id, and if C<$delflag> is true, delete the file after it
is no longer necessary. If you are certain of the part number, you can
specify it as the last argument.
A better (usually faster) way of doing this is using the C<SetFNameFilter>
functionality.
=item $retval = Smerge $pass
If you are desperate, try to call C<Smerge> with increasing C<$pass>
values, beginning at C<0>, to try to merge parts that usually would not
have been merged.
Most probably this will result in garbled files, so never do this by
default, except:
If the C<OPT_AUTOCHECK> option has been disabled (by default it is
enabled) to speed up file loading, then you I<have> to call C<Smerge -1>
after loading all files as an additional pre-pass (which is normally done
by C<LoadFile>).
=item $item = GetFileListItem $item_number
Return the C<$item> structure for the C<$item_number>'th found file, or
C<undef> of no file with that number exists.
The first file has number C<0>, and the series has no holes, so you can
iterate over all files by starting with zero and incrementing until you
hit C<undef>.
This function has to walk the linear list of fils on each access, so
if you want to iterate over all items, it is usually faster to use
# otherwise just pass what we have
()
};
# now read all files in the directory uusrc/*
for (<uusrc/*>) {
my ($retval, $count) = LoadFile ($_, $_, 1);
print "file($_), status(", strerror $retval, ") parts($count)\n";
}
SetOption OPT_SAVEPATH, "uudst/";
# now wade through all files and their source parts
for my $uu (GetFileList) {
print "file ", $uu->filename, "\n";
print " state ", $uu->state, "\n";
print " mode ", $uu->mode, "\n";
print " uudet ", strencoding $uu->uudet, "\n";
print " size ", $uu->size, "\n";
print " subfname ", $uu->subfname, "\n";
print " mimeid ", $uu->mimeid, "\n";
print " mimetype ", $uu->mimetype, "\n";
# print additional info about all parts
print " parts";
for ($uu->parts) {
for my $k (sort keys %$_) {
print " $k=$_->{$k}";
}
print "\n";
}
$uu->remove_temp;
if (my $err = $uu->decode) {
print " ERROR ", strerror $err, "\n";
} else {
print " successfully saved as uudst/", $uu->filename, "\n";
}
}
print "cleanup...\n";
CleanUp;
=head1 PERLMULTICORE SUPPORT
This module supports the perlmulticore standard (see
L<http://perlmulticore.schmorp.de/> for more info) for the following
functions - generally these are functions accessing the disk and/or using
considerable CPU time:
LoadFile
$item->decode
$item->decode_temp
$item->remove_temp
$item->info
The perl interpreter will be reacquired/released on every callback
invocation, so for performance reasons, callbacks should be avoided if
that is costly.
Future versions might enable multicore support for more functions.
=head1 BUGS AND LIMITATIONS
The original uulib library this module uses was written at a time where
main memory of measured in megabytes and buffer overflows as a security
thign didn't exist. While a lot of security fixes have been applied over
the years (includign some defense in depth mechanism that can shield
against a lot of as-of-yet undetected bugs), using this library for
security purposes requires care.
Likewise, file sizes when the uulib library was written were tiny compared
to today, so do not expect this library to handle files larger than 2GB.
Lastly, this module uses a very "C-like" interface, which means it doesn't
protect you from invalid points as you might expect from "more perlish"
modules - for example, accessing a file item object after callinbg
C<CleanUp> will likely result in crashes, memory corruption, or worse.
=head1 AUTHOR
Marc Lehmann <schmorp@schmorp.de>, the original uulib library was written
by Frank Pilhofer <fp@informatik.uni-frankfurt.de>, and later heavily
bugfixed by Marc Lehmann.
=head1 SEE ALSO
perl(1), uudeview homepage at L<http://www.fpx.de/fp/Software/UUDeview/>.
=cut
( run in 0.787 second using v1.01-cache-2.11-cpan-140bd7fdf52 )