Alien-Win32-LZMA

 view release on metacpan or  search on metacpan

lib/Alien/Win32/LZMA.pm  view on Meta::CPAN

package Alien::Win32::LZMA;

=pod

=head1 NAME

Alien::Win32::LZMA - Install and make available lzma.exe

=head1 DESCRIPTION

On Windows (unlike on Unix systems) the primary mechanism for accessing
LZMA functionality is via the 7-Zip desktop application.

B<Alien::Win32::LZMA> is a simple Alien module which embeds a copy
of the F<lzma.exe> command line utility for use in situations where
the memory-only compression and decompression provided by the current
generation of modules is not sufficient.

The version of lzma.exe provided by this module is taken from the LZMA
SDK 4.65 at L<http://downloads.sourceforge.net/sevenzip/lzma465.tar.bz2>.

=head1 FUNCTIONS

=cut

use 5.008;
use strict;
use warnings;
use Carp                ();
use Exporter            ();
use IPC::Run3     0.042 ();
use File::ShareDir 1.00 ();

our $VERSION = '4.66';
our @ISA     = 'Exporter';

=pod

=head2 lzma_exe

The C<lzma_exe> function returns the location of the installed
F<lzma.exe> command line application as a string.

=cut

sub lzma_exe {
	File::ShareDir::dist_file('Alien-Win32-LZMA', 'lzma.exe');
}

=pod

=head2 lzma_version

The C<lzma_version> function runs F<lzma.exe> and finds the version
of the application. It should match the version of this module.

=cut

sub lzma_version {
	my $exe    = lzma_exe();
	my $stderr = '';
	my $result = IPC::Run3::run3(
		[ $exe ],
		\undef,
		\undef,
		\$stderr,
	);
	unless ( $result ) {
		die "$exe execution failed";
	}
	unless  ( $stderr =~ /^\s*LZMA\s*([\d\.]+)/s ) {
		die "Failed to find LZMA version";
	}
	return "$1";
}

=pod

=head2 lzma_compress

  lzma_compress('file', 'file.lz') or die('Failed to compress');

The C<lzma_compress> function invokes F<lzma.exe> to compress one file
into another file.

Any additional params to C<lzma_compress> will be passed through to
the underlying command line call as options.

Returns true if the invocation returns without error.

=cut

sub lzma_compress {
	my $from = shift;
	my $to   = shift;
	my $cmd  = lzma_exe();
	unless ( -f $from ) {
		Carp::croak("No such file or directory '$from'");
	}
	IPC::Run3::run3(
		[ $cmd, 'e', $from, $to, @_ ],
		\undef, \undef, \undef,
	);
}

=pod

=head2 lzma_decompress

  lzma_decompress('file','file.lz') or die('Failed to decompress');

The C<lzma_decompress> function invokes F<lzma.exe> to decompress
an LZMA file into another file.

Any additional params to C<lzma_compress> will be passed through to
the underlying command line call as options.

Returns true if the invocation returns without error.

=cut

sub lzma_decompress {
	my $from = shift;
	my $to   = shift;
	my $cmd  = lzma_exe();
	unless ( -f $from ) {
		Carp::croak("No such file or directory '$from'");
	}
	IPC::Run3::run3(
		[ $cmd, 'd', $from, $to, @_ ],
		\undef, \undef, \undef,



( run in 1.901 second using v1.01-cache-2.11-cpan-2398b32b56e )