Blame lib/Archive/Zip/NewFileMember.pm

Packit 0bf95d
package Archive::Zip::NewFileMember;
Packit 0bf95d
Packit 0bf95d
use strict;
Packit 0bf95d
use vars qw( $VERSION @ISA );
Packit 0bf95d
Packit 0bf95d
BEGIN {
Packit 0bf95d
    $VERSION = '1.60';
Packit 0bf95d
    @ISA     = qw ( Archive::Zip::FileMember );
Packit 0bf95d
}
Packit 0bf95d
Packit 0bf95d
use Archive::Zip qw(
Packit 0bf95d
  :CONSTANTS
Packit 0bf95d
  :ERROR_CODES
Packit 0bf95d
  :UTILITY_METHODS
Packit 0bf95d
);
Packit 0bf95d
Packit 0bf95d
# Given a file name, set up for eventual writing.
Packit 0bf95d
sub _newFromFileNamed {
Packit 0bf95d
    my $class    = shift;
Packit 0bf95d
    my $fileName = shift;    # local FS format
Packit 0bf95d
    my $newName  = shift;
Packit 0bf95d
    $newName = _asZipDirName($fileName) unless defined($newName);
Packit 0bf95d
    return undef unless (stat($fileName) && -r _ && !-d _ );
Packit 0bf95d
    my $self = $class->new(@_);
Packit 0bf95d
    $self->{'fileName'}          = $newName;
Packit 0bf95d
    $self->{'externalFileName'}  = $fileName;
Packit 0bf95d
    $self->{'compressionMethod'} = COMPRESSION_STORED;
Packit 0bf95d
    my @stat = stat(_);
Packit 0bf95d
    $self->{'compressedSize'} = $self->{'uncompressedSize'} = $stat[7];
Packit 0bf95d
    $self->desiredCompressionMethod(
Packit 0bf95d
        ($self->compressedSize() > 0)
Packit 0bf95d
        ? COMPRESSION_DEFLATED
Packit 0bf95d
        : COMPRESSION_STORED
Packit 0bf95d
    );
Packit 0bf95d
    $self->unixFileAttributes($stat[2]);
Packit 0bf95d
    $self->setLastModFileDateTimeFromUnix($stat[9]);
Packit 0bf95d
    $self->isTextFile(-T _ );
Packit 0bf95d
    return $self;
Packit 0bf95d
}
Packit 0bf95d
Packit 0bf95d
sub rewindData {
Packit 0bf95d
    my $self = shift;
Packit 0bf95d
Packit 0bf95d
    my $status = $self->SUPER::rewindData(@_);
Packit 0bf95d
    return $status unless $status == AZ_OK;
Packit 0bf95d
Packit 0bf95d
    return AZ_IO_ERROR unless $self->fh();
Packit 0bf95d
    $self->fh()->clearerr();
Packit 0bf95d
    $self->fh()->seek(0, IO::Seekable::SEEK_SET)
Packit 0bf95d
      or return _ioError("rewinding", $self->externalFileName());
Packit 0bf95d
    return AZ_OK;
Packit 0bf95d
}
Packit 0bf95d
Packit 0bf95d
# Return bytes read. Note that first parameter is a ref to a buffer.
Packit 0bf95d
# my $data;
Packit 0bf95d
# my ( $bytesRead, $status) = $self->readRawChunk( \$data, $chunkSize );
Packit 0bf95d
sub _readRawChunk {
Packit 0bf95d
    my ($self, $dataRef, $chunkSize) = @_;
Packit 0bf95d
    return (0, AZ_OK) unless $chunkSize;
Packit 0bf95d
    my $bytesRead = $self->fh()->read($$dataRef, $chunkSize)
Packit 0bf95d
      or return (0, _ioError("reading data"));
Packit 0bf95d
    return ($bytesRead, AZ_OK);
Packit 0bf95d
}
Packit 0bf95d
Packit 0bf95d
# If I already exist, extraction is a no-op.
Packit 0bf95d
sub extractToFileNamed {
Packit 0bf95d
    my $self = shift;
Packit 0bf95d
    my $name = shift;    # local FS name
Packit 0bf95d
    if (File::Spec->rel2abs($name) eq
Packit 0bf95d
        File::Spec->rel2abs($self->externalFileName()) and -r $name) {
Packit 0bf95d
        return AZ_OK;
Packit 0bf95d
    } else {
Packit 0bf95d
        return $self->SUPER::extractToFileNamed($name, @_);
Packit 0bf95d
    }
Packit 0bf95d
}
Packit 0bf95d
Packit 0bf95d
1;