File Coverage

blib/lib/Archive/Zip/NewFileMember.pm
Criterion Covered Total %
statement 43 43 100.0
branch 12 18 66.6
condition 4 9 44.4
subroutine 8 8 100.0
pod 2 2 100.0
total 69 80 86.2


line stmt bran cond sub pod time code
1             package Archive::Zip::NewFileMember;
2              
3 28     28   709 use strict;
  28         60  
  28         795  
4 28     28   137 use vars qw( $VERSION @ISA );
  28         49  
  28         1508  
5              
6             BEGIN {
7 28     28   84 $VERSION = '1.67';
8 28         1075 @ISA = qw ( Archive::Zip::FileMember );
9             }
10              
11 28         14881 use Archive::Zip qw(
12             :CONSTANTS
13             :ERROR_CODES
14             :UTILITY_METHODS
15 28     28   150 );
  28         52  
16              
17             # Given a file name, set up for eventual writing.
18             sub _newFromFileNamed {
19 334     334   443 my $class = shift;
20 334         413 my $fileName = shift; # local FS format
21 334         380 my $newName = shift;
22 334 100       596 $newName = _asZipDirName($fileName) unless defined($newName);
23 334 50 33     5562 return undef unless (stat($fileName) && -r _ && !-d _ );
      33        
24 334         6703 my $self = $class->new(@_);
25 334         582 $self->{'fileName'} = $newName;
26 334         564 $self->{'externalFileName'} = $fileName;
27 334         416 $self->{'compressionMethod'} = COMPRESSION_STORED;
28 334         826 my @stat = stat(_);
29 334         469 $self->{'compressedSize'} = $self->{'uncompressedSize'} = $stat[7];
30 334 100       646 $self->desiredCompressionMethod(
31             ($self->compressedSize() > 0)
32             ? COMPRESSION_DEFLATED
33             : COMPRESSION_STORED
34             );
35 334         973 $self->unixFileAttributes($stat[2]);
36 334         840 $self->setLastModFileDateTimeFromUnix($stat[9]);
37 334         12055 $self->isTextFile(-T _ );
38 334         879 return $self;
39             }
40              
41             sub rewindData {
42 69     69 1 111 my $self = shift;
43              
44 69         208 my $status = $self->SUPER::rewindData(@_);
45 69 50       199 return $status unless $status == AZ_OK;
46              
47 69 50       238 return AZ_IO_ERROR unless $self->fh();
48 69         162 $self->fh()->clearerr();
49 69 50       163 $self->fh()->seek(0, IO::Seekable::SEEK_SET)
50             or return _ioError("rewinding", $self->externalFileName());
51 69         889 return AZ_OK;
52             }
53              
54             # Return bytes read. Note that first parameter is a ref to a buffer.
55             # my $data;
56             # my ( $bytesRead, $status) = $self->readRawChunk( \$data, $chunkSize );
57             sub _readRawChunk {
58 73     73   146 my ($self, $dataRef, $chunkSize) = @_;
59 73 50       153 return (0, AZ_OK) unless $chunkSize;
60 73 50       195 my $bytesRead = $self->fh()->read($$dataRef, $chunkSize)
61             or return (0, _ioError("reading data"));
62 73         1996 return ($bytesRead, AZ_OK);
63             }
64              
65             # If I already exist, extraction is a no-op.
66             sub extractToFileNamed {
67 14     14 1 28 my $self = shift;
68 14         33 my $name = shift; # local FS name
69 14 100 66     312 if (File::Spec->rel2abs($name) eq
70             File::Spec->rel2abs($self->externalFileName()) and -r $name) {
71 3         16 return AZ_OK;
72             } else {
73 11         59 return $self->SUPER::extractToFileNamed($name, @_);
74             }
75             }
76              
77             1;