From a7e05b9505748c9fa8ff9f9ce3d6c23aa0d9b54f Mon Sep 17 00:00:00 2001 From: Alan Haggai Alavi Date: Fri, 6 Feb 2009 18:20:34 +0000 Subject: [PATCH] Reverted to revision 4736 and converted `External File Attribute' values for symbolic links to hexadecimal --- lib/Archive/Zip.pm | 12 ++++++------ lib/Archive/Zip/Archive.pm | 29 +++++++++-------------------- lib/Archive/Zip/DirectoryMember.pm | 6 ------ lib/Archive/Zip/FileMember.pm | 8 ++------ lib/Archive/Zip/Member.pm | 7 ++----- lib/Archive/Zip/NewFileMember.pm | 6 +----- lib/Archive/Zip/StringMember.pm | 2 -- 7 files changed, 20 insertions(+), 50 deletions(-) diff --git a/lib/Archive/Zip.pm b/lib/Archive/Zip.pm index b315b30..dccc6ea 100644 --- a/lib/Archive/Zip.pm +++ b/lib/Archive/Zip.pm @@ -531,15 +531,15 @@ sub _asLocalName { my $name = shift; # zip format my $volume = shift; - $volume = '' unless defined( $volume ); # local FS format + $volume = '' unless defined($volume); # local FS format my @paths = split ( /\//, $name ); - my $filename = pop ( @paths ); - $filename = '' unless defined( $filename ); - my $localDirs = @paths ? File::Spec->catdir( @paths ) : ''; + my $filename = pop (@paths); + $filename = '' unless defined($filename); + my $localDirs = @paths?File::Spec->catdir(@paths):''; my $localName = File::Spec->catpath( $volume, $localDirs, $filename ); - require Cwd; - $localName = File::Spec->catfile( Cwd::getcwd, $localName ) unless $volume; + use Cwd; + $localName = File::Spec->catfile(getcwd, $localName) unless $volume; return $localName; } diff --git a/lib/Archive/Zip/Archive.pm b/lib/Archive/Zip/Archive.pm index fd0aff6..49d2f19 100644 --- a/lib/Archive/Zip/Archive.pm +++ b/lib/Archive/Zip/Archive.pm @@ -74,8 +74,6 @@ sub memberNames { # return ref to member with given name or undef sub memberNamed { my ( $self, $fileName ) = @_; - require Encode; - $fileName = Encode::encode( 'cp437', $fileName ); foreach my $member ( $self->members() ) { return $member if $member->fileName() eq $fileName; } @@ -158,8 +156,6 @@ sub extractMember { my $name = shift; # local FS name if given my ( $volumeName, $dirName, $fileName ); if ( defined($name) ) { - require Encode; - $name = Encode::encode( 'cp437', $name ); ( $volumeName, $dirName, $fileName ) = File::Spec->splitpath($name); $dirName = File::Spec->catpath( $volumeName, $dirName, '' ); } @@ -169,11 +165,10 @@ sub extractMember { $dirName = Archive::Zip::_asLocalName($dirName); $name = Archive::Zip::_asLocalName($name); } - # Need to test if this is needed or not: - #if ( $dirName && !-d $dirName ) { - # mkpath($dirName); - # return _ioError("can't create dir $dirName") if ( !-d $dirName ); - #} + if ( $dirName && !-d $dirName ) { + mkpath($dirName); + return _ioError("can't create dir $dirName") if ( !-d $dirName ); + } my $rc = $member->extractToFileNamed( $name, @_ ); # TODO refactor this fix into extractToFileNamed() @@ -189,11 +184,7 @@ sub extractMemberWithoutPaths { my $originalSize = $member->compressedSize(); return AZ_OK if $member->isDirectory(); my $name = shift; - if ( defined($name) ) { - require Encode; - $name = Encode::encode( 'cp437', $name ); - } - else { + unless ($name) { $name = $member->fileName(); $name =~ s{.*/}{}; # strip off directories, if any $name = Archive::Zip::_asLocalName($name); @@ -216,8 +207,8 @@ sub addFile { my $newMember = $self->ZIPMEMBERCLASS->newFromFile( $fileName, $newName ); if ( $self->{'storeSymbolicLink'} && -l $fileName ) { my $newMember = $self->ZIPMEMBERCLASS->newFromString(readlink $fileName, $newName); - # For symbolic links, External File Attribute is set to 0000FFA1 by Info-ZIP - $newMember->{'externalFileAttributes'} = 2717843456; + # For symbolic links, External File Attribute is set to 0xA1FF0000 by Info-ZIP + $newMember->{'externalFileAttributes'} = 0xA1FF0000; $self->addMember($newMember); } else { $self->addMember($newMember); @@ -238,8 +229,8 @@ sub addDirectory { my $link = readlink $name; ( $newName =~ s{/$}{} ) if $newName; # Strip trailing / my $newMember = $self->ZIPMEMBERCLASS->newFromString($link, $newName); - # For symbolic links, External File Attribute is set to 0000FFA1 by Info-ZIP - $newMember->{'externalFileAttributes'} = 2717843456; + # For symbolic links, External File Attribute is set to 0xA1FF0000 by Info-ZIP + $newMember->{'externalFileAttributes'} = 0xA1FF0000; $self->addMember($newMember); } else { $self->addMember($newMember); @@ -674,8 +665,6 @@ sub extractTree { $root = '' unless defined($root); my $dest = shift; # Zip format $dest = './' unless defined($dest); - require Encode; - $dest = Encode::encode( 'cp437', $dest ); my $volume = shift; # optional my $pattern = "^\Q$root"; my @members = $self->membersMatching($pattern); diff --git a/lib/Archive/Zip/DirectoryMember.pm b/lib/Archive/Zip/DirectoryMember.pm index b509979..e1bb100 100644 --- a/lib/Archive/Zip/DirectoryMember.pm +++ b/lib/Archive/Zip/DirectoryMember.pm @@ -21,9 +21,6 @@ sub _newNamed { my $newName = shift; # Zip name $newName = _asZipDirName($fileName) unless $newName; my $self = $class->new(@_); - require Encode; - $fileName = Encode::encode( 'cp437', $fileName ); - $newName = Encode::encode( 'cp437', $newName ); $self->{'externalFileName'} = $fileName; $self->fileName($newName); @@ -61,9 +58,6 @@ sub isDirectory { sub extractToFileNamed { my $self = shift; my $name = shift; # local FS name - require Encode; - $name = Encode::decode( 'cp437', $name ); - $name = Encode::encode( 'iso-8859-1', $name ); my $attribs = $self->unixFileAttributes() & 07777; mkpath( $name, 0, $attribs ); # croaks on error utime( $self->lastModTime(), $self->lastModTime(), $name ); diff --git a/lib/Archive/Zip/FileMember.pm b/lib/Archive/Zip/FileMember.pm index 8c8d847..b7890b2 100644 --- a/lib/Archive/Zip/FileMember.pm +++ b/lib/Archive/Zip/FileMember.pm @@ -35,13 +35,9 @@ sub fh { # opens my file handle from my file name sub _openFile { my $self = shift; - my $fileName = $self->externalFileName; - require Encode; - $fileName = Encode::decode( 'cp437', $fileName ); - $fileName = Encode::encode( 'iso-8859-1', $fileName ); - my ( $status, $fh ) = _newFileHandle( $fileName, 'r' ); + my ( $status, $fh ) = _newFileHandle( $self->externalFileName(), 'r' ); if ( !$status ) { - _ioError( "Can't open", $fileName ); + _ioError( "Can't open", $self->externalFileName() ); return undef; } $self->{'fh'} = $fh; diff --git a/lib/Archive/Zip/Member.pm b/lib/Archive/Zip/Member.pm index ec10e91..720ebb4 100644 --- a/lib/Archive/Zip/Member.pm +++ b/lib/Archive/Zip/Member.pm @@ -405,11 +405,8 @@ sub extractToFileNamed { my $name = shift; # local FS name $self->{'isSymbolicLink'} = 0; - require Encode; - $name = Encode::decode( 'cp437', $name ); - $name = Encode::encode( 'iso-8859-1', $name ); # Check if the file / directory is a symbolic link or not - if ( $self->{'externalFileAttributes'} == 2717843456 ) { + if ( $self->{'externalFileAttributes'} == 0xA1FF0000 ) { $self->{'isSymbolicLink'} = 1; $self->{'newName'} = $name; my ( $status, $fh ) = _newFileHandle( $name, 'r' ); @@ -442,7 +439,7 @@ sub _writeSymbolicLink { sub isSymbolicLink { my $self = shift; - if ( $self->{'externalFileAttributes'} == 2717843456 ) { + if ( $self->{'externalFileAttributes'} == 0xA1FF0000 ) { $self->{'isSymbolicLink'} = 1; } else { return 0; diff --git a/lib/Archive/Zip/NewFileMember.pm b/lib/Archive/Zip/NewFileMember.pm index 1265df4..f4a22c8 100644 --- a/lib/Archive/Zip/NewFileMember.pm +++ b/lib/Archive/Zip/NewFileMember.pm @@ -22,14 +22,10 @@ sub _newFromFileNamed { $newName = _asZipDirName($fileName) unless defined($newName); return undef unless ( stat($fileName) && -r _ && !-d _ ); my $self = $class->new(@_); - my @stat = stat(_); - require Encode; - $newName = Encode::encode( 'cp437', $newName ); - $fileName = Encode::encode( 'cp437', $fileName ); $self->{'fileName'} = $newName; $self->{'externalFileName'} = $fileName; $self->{'compressionMethod'} = COMPRESSION_STORED; - + my @stat = stat(_); $self->{'compressedSize'} = $self->{'uncompressedSize'} = $stat[7]; $self->desiredCompressionMethod( ( $self->compressedSize() > 0 ) diff --git a/lib/Archive/Zip/StringMember.pm b/lib/Archive/Zip/StringMember.pm index dca1e31..230e99d 100644 --- a/lib/Archive/Zip/StringMember.pm +++ b/lib/Archive/Zip/StringMember.pm @@ -19,8 +19,6 @@ sub _newFromString { my $class = shift; my $string = shift; my $name = shift; - require Encode; - $name = Encode::encode( 'cp437', $name ); my $self = $class->new(@_); $self->contents($string); $self->fileName($name) if defined($name); -- 2.11.4.GIT