Archive-Zip-SimpleZip
view release on metacpan or search on metacpan
lib/Archive/Zip/StreamedUnzip.pm view on Meta::CPAN
$fh = IO::File->new("<$inValue")
or return _setError(undef, undef, "cannot open file '$inValue': $!");
}
elsif( $inType eq 'buffer' || $inType eq 'handle')
{
$fh = $inValue;
}
else
{
return _illegalFilename
}
my %obj ;
# my $inner = IO::Compress::Base::Common::createSelfTiedObject($class, \$StreamedUnzipError);
# # *$inner->{Pause} = 1;
# $inner->_create(undef, 0, $fh, @_)
# or return undef;
my $inner = IO::Uncompress::Unzip->new($fh) ;
$obj{Inner} = $inner;
$obj{Open} = 1 ;
$obj{FirstOne} = 1 ;
bless \%obj, $class;
}
sub close
{
my $self = shift;
# TODO - fix me
$self->{Inner}->close();
return 1;
}
sub DESTROY
{
my $self = shift;
}
sub next
{
my $self = shift;
if ($self->{FirstOne})
{
$self->{FirstOne} = 0;
}
else
{
my $status = $self->{Inner}->nextStream();
return undef
if $status <= 0;
}
my %member ;
$member{Inner} = $self->{Inner};
# $member{Member} = $member;
$member{Info} = $self->{Inner}->getHeaderInfo() ;
#Scalar::Util::weaken $member{Inner}; # for 5.8
return bless \%member, 'Archive::Zip::StreamedUnzip::Member';
}
sub member
{
my $self = shift;
my $name = shift;
return _setError(undef, undef, "Member '$name' not in zip")
if ! defined $name ;
while (my $member = $self->next())
{
return $member
if $member->name() eq $name ;
}
return _setError(undef, undef, "Member '$name' not in zip") ;
}
sub getExtraParams
{
return (
# Zip header fields
'name' => [IO::Compress::Base::Common::Parse_any, undef],
# 'stream' => [IO::Compress::Base::Common::Parse_boolean, 1],
);
}
sub ckParams
{
my $self = shift ;
my $got = shift ;
# unzip always needs crc32
$got->setValue('crc32' => 1);
*$self->{UnzipData}{Name} = $got->getValue('name');
return 1;
}
{
package Archive::Zip::StreamedUnzip::Member;
sub name
{
my $self = shift;
# $self->_stdPreq() or return 0 ;
return $self->{Info}{Name};
}
lib/Archive/Zip/StreamedUnzip.pm view on Meta::CPAN
# getComment
# getExtra
# compressedSize - 64 bit alert
# uncompressedSize
# time
# isStored
# compressionName
#
# extractToFile
sub compressedSize
{
my $self = shift;
# $self->_stdPreq() or return 0 ;
my $CompressedLength = $self->{Info}{CompressedLength};
if (ref $CompressedLength)
{
return U64::get64bit($CompressedLength)
}
return $CompressedLength;
}
sub uncompressedSize
{
my $self = shift;
# $self->_stdPreq() or return 0 ;
my $UncompressedLength = $self->{Info}{UncompressedLength};
if (ref $UncompressedLength)
{
return U64::get64bit($UncompressedLength)
}
return $UncompressedLength;
}
sub content
{
my $self = shift;
my $data ;
# $self->{Inner}->read($data, $self->{UncompressedLength});
$self->{Inner}->read($data, $self->{Info}{UncompressedLength});
return $data;
}
sub open
{
my $self = shift;
# return return $self->{Inner} ;
# my $handle = Symbol::gensym();
# tie *$handle, "Archive::Zip::StreamedUnzip::Handle", $self->{SZ}{UnZip};
# return $handle;
my $z = IO::Compress::Base::Common::createSelfTiedObject("Archive::Zip::StreamedUnzip::Handle", \$StreamedUnzipError) ;
*$z->{Open} = 1 ;
*$z->{SZ} = $self->{Inner};
Scalar::Util::weaken *$z->{SZ}; # for 5.8
$z;
}
sub close
{
my $self = shift;
return 1;
}
}
{
package Archive::Zip::StreamedUnzip::Handle ;
sub TIEHANDLE
{
return $_[0] if ref($_[0]);
die "OOPS\n" ;
}
sub UNTIE
{
my $self = shift ;
}
sub DESTROY
{
# print "DESTROY H";
my $self = shift ;
local ($., $@, $!, $^E, $?);
$self->close() ;
# TODO - memory leak with 5.8.0 - this isn't called until
# global destruction
#
%{ *$self } = () ;
undef $self ;
}
sub close
{
my $self = shift ;
return 1 if ! *$self->{Open};
*$self->{Open} = 0 ;
# untie *$self
# if $] >= 5.008 ;
if (defined *$self->{SZ})
{
# *$self->{SZ}{Raw} = undef ;
*$self->{SZ} = undef ;
}
1;
( run in 0.731 second using v1.01-cache-2.11-cpan-39bf76dae61 )