Add and remove files forgotten in change #27384
[p5sagit/p5-mst-13.2.git] / ext / Compress / IO / Zlib / lib / IO / Uncompress / Unzip.pm
CommitLineData
a02d0f6f 1package IO::Uncompress::Unzip;
2
3require 5.004 ;
4
5# for RFC1952
6
7use strict ;
8use warnings;
9use bytes;
10
11use IO::Uncompress::RawInflate ;
12use IO::Compress::Base::Common qw(:Status createSelfTiedObject);
13use IO::Uncompress::Adapter::Identity;
14
15require Exporter ;
16
17our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $UnzipError);
18
19$VERSION = '2.000_08';
20$UnzipError = '';
21
22@ISA = qw(Exporter IO::Uncompress::RawInflate);
23@EXPORT_OK = qw( $UnzipError unzip );
24%EXPORT_TAGS = %IO::Uncompress::RawInflate::EXPORT_TAGS ;
25push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
26Exporter::export_ok_tags('all');
27
28
29sub new
30{
31 my $class = shift ;
32 my $obj = createSelfTiedObject($class, \$UnzipError);
33 $obj->_create(undef, 0, @_);
34}
35
36sub unzip
37{
38 my $obj = createSelfTiedObject(undef, \$UnzipError);
39 return $obj->_inf(@_) ;
40}
41
42sub getExtraParams
43{
44 use IO::Compress::Base::Common qw(:Parse);
45
46
47 return (
48# # Zip header fields
49 'Name' => [1, 1, Parse_any, undef],
50
51# 'Streaming' => [1, 1, Parse_boolean, 1],
52 );
53}
54
55sub ckParams
56{
57 my $self = shift ;
58 my $got = shift ;
59
60 # unzip always needs crc32
61 $got->value('CRC32' => 1);
62
63 *$self->{UnzipData}{Name} = $got->value('Name');
64
65 return 1;
66}
67
68
69sub ckMagic
70{
71 my $self = shift;
72
73 my $magic ;
74 $self->smartReadExact(\$magic, 4);
75
76 *$self->{HeaderPending} = $magic ;
77
78 return $self->HeaderError("Minimum header size is " .
79 4 . " bytes")
80 if length $magic != 4 ;
81
82 return $self->HeaderError("Bad Magic")
83 if ! _isZipMagic($magic) ;
84
85 *$self->{Type} = 'zip';
86
87 return $magic ;
88}
89
90
91
92sub readHeader
93{
94 my $self = shift;
95 my $magic = shift ;
96
97 my $name = *$self->{UnzipData}{Name} ;
98 my $hdr = $self->_readZipHeader($magic) ;
99
100 while (defined $hdr)
101 {
102 if (! defined $name || $hdr->{Name} eq $name)
103 {
104 return $hdr ;
105 }
106
107 # skip the data
108 my $buffer;
109 if (*$self->{ZipData}{Streaming}) {
110
111 while (1) {
112
113 my $b;
114 my $status = $self->smartRead(\$b, 1024 * 16);
115 return undef
116 if $status <= 0 ;
117
118 my $temp_buf;
119 my $out;
120 $status = *$self->{Uncomp}->uncompr(\$b, \$temp_buf, 0, $out);
121
122 return $self->saveErrorString(undef, *$self->{Uncomp}{Error},
123 *$self->{Uncomp}{ErrorNo})
124 if $self->saveStatus($status) == STATUS_ERROR;
125
126 if ($status == STATUS_ENDSTREAM) {
127 *$self->{Uncomp}->reset();
128 $self->pushBack($b) ;
129 last;
130 }
131 }
132
133 # skip the trailer
134 $self->smartReadExact(\$buffer, $hdr->{TrailerLength})
135 or return $self->saveErrorString(undef, "Truncated file");
136 }
137 else {
138 my $c = $hdr->{CompressedLength};
139 $self->smartReadExact(\$buffer, $c)
140 or return $self->saveErrorString(undef, "Truncated file");
141 $buffer = '';
142 }
143
144 $self->chkTrailer($buffer) == STATUS_OK
145 or return $self->saveErrorString(undef, "Truncated file");
146
147 $hdr = $self->_readFullZipHeader();
148
149 return $self->saveErrorString(undef, "Cannot find '$name'")
150 if $self->smartEof();
151 }
152
153 return undef;
154}
155
156sub chkTrailer
157{
158 my $self = shift;
159 my $trailer = shift;
160
161 my ($sig, $CRC32, $cSize, $uSize) ;
162 if (*$self->{ZipData}{Streaming}) {
163 ($sig, $CRC32, $cSize, $uSize) = unpack("V V V V", $trailer) ;
164 return $self->TrailerError("Data Descriptor signature, got $sig")
165 if $sig != 0x08074b50;
166 }
167 else {
168 ($CRC32, $cSize, $uSize) =
169 (*$self->{ZipData}{Crc32},
170 *$self->{ZipData}{CompressedLen},
171 *$self->{ZipData}{UnCompressedLen});
172 }
173
174 if (*$self->{Strict}) {
175 #return $self->TrailerError("CRC mismatch")
176 # if $CRC32 != *$self->{Uncomp}->crc32() ;
177
178 my $exp_isize = *$self->{Uncomp}->compressedBytes();
179 return $self->TrailerError("CSIZE mismatch. Got $cSize"
180 . ", expected $exp_isize")
181 if $cSize != $exp_isize ;
182
183 $exp_isize = *$self->{Uncomp}->uncompressedBytes();
184 return $self->TrailerError("USIZE mismatch. Got $uSize"
185 . ", expected $exp_isize")
186 if $uSize != $exp_isize ;
187 }
188
189 my $reachedEnd = STATUS_ERROR ;
190 # check for central directory or end of central directory
191 while (1)
192 {
193 my $magic ;
194 my $got = $self->smartRead(\$magic, 4);
195
196 return $self->saveErrorString(STATUS_ERROR, "Truncated file")
197 if $got != 4 && *$self->{Strict};
198
199 if ($got == 0) {
200 return STATUS_EOF ;
201 }
202 elsif ($got < 0) {
203 return STATUS_ERROR ;
204 }
205 elsif ($got < 4) {
206 $self->pushBack($magic) ;
207 return STATUS_OK ;
208 }
209
210 my $sig = unpack("V", $magic) ;
211
212 if ($sig == 0x02014b50)
213 {
214 if ($self->skipCentralDirectory($magic) != STATUS_OK ) {
215 if (*$self->{Strict}) {
216 return STATUS_ERROR ;
217 }
218 else {
219 $self->clearError();
220 return STATUS_OK ;
221 }
222 }
223 }
224 elsif ($sig == 0x06054b50)
225 {
226 if ($self->skipEndCentralDirectory($magic) != STATUS_OK) {
227 if (*$self->{Strict}) {
228 return STATUS_ERROR ;
229 }
230 else {
231 $self->clearError();
232 return STATUS_OK ;
233 }
234 }
235 # $reachedEnd = STATUS_OK ;
236 return STATUS_OK ;
237 last;
238 }
239 elsif ($sig == 0x04034b50)
240 {
241 $self->pushBack($magic) ;
242 return STATUS_OK ;
243 }
244 else
245 {
246 # put the data back
247 $self->pushBack($magic) ;
248 last;
249 }
250 }
251
252 return $reachedEnd ;
253}
254
255sub skipCentralDirectory
256{
257 my $self = shift;
258 my $magic = shift ;
259
260 my $buffer;
261 $self->smartReadExact(\$buffer, 46 - 4)
262 or return $self->TrailerError("Minimum header size is " .
263 46 . " bytes") ;
264
265 my $keep = $magic . $buffer ;
266 *$self->{HeaderPending} = $keep ;
267
268 #my $versionMadeBy = unpack ("v", substr($buffer, 4-4, 2));
269 #my $extractVersion = unpack ("v", substr($buffer, 6-4, 2));
270 #my $gpFlag = unpack ("v", substr($buffer, 8-4, 2));
271 #my $compressedMethod = unpack ("v", substr($buffer, 10-4, 2));
272 #my $lastModTime = unpack ("V", substr($buffer, 12-4, 4));
273 #my $crc32 = unpack ("V", substr($buffer, 16-4, 4));
274 #my $compressedLength = unpack ("V", substr($buffer, 20-4, 4));
275 #my $uncompressedLength = unpack ("V", substr($buffer, 24-4, 4));
276 my $filename_length = unpack ("v", substr($buffer, 28-4, 2));
277 my $extra_length = unpack ("v", substr($buffer, 30-4, 2));
278 my $comment_length = unpack ("v", substr($buffer, 32-4, 2));
279 #my $disk_start = unpack ("v", substr($buffer, 34-4, 2));
280 #my $int_file_attrib = unpack ("v", substr($buffer, 36-4, 2));
281 #my $ext_file_attrib = unpack ("V", substr($buffer, 38-4, 2));
282 #my $lcl_hdr_offset = unpack ("V", substr($buffer, 42-4, 2));
283
284
285 my $filename;
286 my $extraField;
287 my $comment ;
288 if ($filename_length)
289 {
290 $self->smartReadExact(\$filename, $filename_length)
291 or return $self->TrailerError("xxx");
292 $keep .= $filename ;
293 }
294
295 if ($extra_length)
296 {
297 $self->smartReadExact(\$extraField, $extra_length)
298 or return $self->TrailerError("xxx");
299 $keep .= $extraField ;
300 }
301
302 if ($comment_length)
303 {
304 $self->smartReadExact(\$comment, $comment_length)
305 or return $self->TrailerError("xxx");
306 $keep .= $comment ;
307 }
308
309 return STATUS_OK ;
310}
311
312sub skipEndCentralDirectory
313{
314 my $self = shift;
315 my $magic = shift ;
316
317 my $buffer;
318 $self->smartReadExact(\$buffer, 22 - 4)
319 or return $self->TrailerError("Minimum header size is " .
320 22 . " bytes") ;
321
322 my $keep = $magic . $buffer ;
323 *$self->{HeaderPending} = $keep ;
324
325 #my $diskNumber = unpack ("v", substr($buffer, 4-4, 2));
326 #my $cntrlDirDiskNo = unpack ("v", substr($buffer, 6-4, 2));
327 #my $entriesInThisCD = unpack ("v", substr($buffer, 8-4, 2));
328 #my $entriesInCD = unpack ("v", substr($buffer, 10-4, 2));
329 #my $sizeOfCD = unpack ("V", substr($buffer, 12-4, 2));
330 #my $offsetToCD = unpack ("V", substr($buffer, 16-4, 2));
331 my $comment_length = unpack ("v", substr($buffer, 20-4, 2));
332
333
334 my $comment ;
335 if ($comment_length)
336 {
337 $self->smartReadExact(\$comment, $comment_length)
338 or return $self->TrailerError("xxx");
339 $keep .= $comment ;
340 }
341
342 return STATUS_OK ;
343}
344
345
346
347
348sub _isZipMagic
349{
350 my $buffer = shift ;
351 return 0 if length $buffer < 4 ;
352 my $sig = unpack("V", $buffer) ;
353 return $sig == 0x04034b50 ;
354}
355
356
357sub _readFullZipHeader($)
358{
359 my ($self) = @_ ;
360 my $magic = '' ;
361
362 $self->smartReadExact(\$magic, 4);
363
364 *$self->{HeaderPending} = $magic ;
365
366 return $self->HeaderError("Minimum header size is " .
367 30 . " bytes")
368 if length $magic != 4 ;
369
370
371 return $self->HeaderError("Bad Magic")
372 if ! _isZipMagic($magic) ;
373
374 my $status = $self->_readZipHeader($magic);
375 delete *$self->{Transparent} if ! defined $status ;
376 return $status ;
377}
378
379sub _readZipHeader($)
380{
381 my ($self, $magic) = @_ ;
382 my ($HeaderCRC) ;
383 my ($buffer) = '' ;
384
385 $self->smartReadExact(\$buffer, 30 - 4)
386 or return $self->HeaderError("Minimum header size is " .
387 30 . " bytes") ;
388
389 my $keep = $magic . $buffer ;
390 *$self->{HeaderPending} = $keep ;
391
392 my $extractVersion = unpack ("v", substr($buffer, 4-4, 2));
393 my $gpFlag = unpack ("v", substr($buffer, 6-4, 2));
394 my $compressedMethod = unpack ("v", substr($buffer, 8-4, 2));
395 my $lastModTime = unpack ("V", substr($buffer, 10-4, 4));
396 my $crc32 = unpack ("V", substr($buffer, 14-4, 4));
397 my $compressedLength = unpack ("V", substr($buffer, 18-4, 4));
398 my $uncompressedLength = unpack ("V", substr($buffer, 22-4, 4));
399 my $filename_length = unpack ("v", substr($buffer, 26-4, 2));
400 my $extra_length = unpack ("v", substr($buffer, 28-4, 2));
401
402 my $filename;
403 my $extraField;
404 my $streamingMode = ($gpFlag & 0x08) ? 1 : 0 ;
405
406 return $self->HeaderError("Streamed Stored content not supported")
407 if $streamingMode && $compressedMethod == 0 ;
408
409 *$self->{ZipData}{Streaming} = $streamingMode;
410
411 if (! $streamingMode) {
412 *$self->{ZipData}{Streaming} = 0;
413 *$self->{ZipData}{Crc32} = $crc32;
414 *$self->{ZipData}{CompressedLen} = $compressedLength;
415 *$self->{ZipData}{UnCompressedLen} = $uncompressedLength;
416 *$self->{CompressedInputLengthRemaining} =
417 *$self->{CompressedInputLength} = $compressedLength;
418 }
419
420
421 if ($filename_length)
422 {
423 $self->smartReadExact(\$filename, $filename_length)
424 or return $self->HeaderError("xxx");
425 $keep .= $filename ;
426 }
427
428 if ($extra_length)
429 {
430 $self->smartReadExact(\$extraField, $extra_length)
431 or return $self->HeaderError("xxx");
432 $keep .= $extraField ;
433 }
434
435 if ($compressedMethod == 8)
436 {
437 *$self->{Type} = 'zip';
438 }
439 elsif ($compressedMethod == 0)
440 {
441 # TODO -- add support for reading uncompressed
442
443 *$self->{Type} = 'zipStored';
444
445 my $obj = IO::Uncompress::Adapter::Identity::mkUncompObject(# $got->value('CRC32'),
446 # $got->value('ADLER32'),
447 );
448
449 *$self->{Uncomp} = $obj;
450
451 }
452 else
453 {
454 return $self->HeaderError("Unsupported Compression format $compressedMethod");
455 }
456
457 return {
458 'Type' => 'zip',
459 'FingerprintLength' => 4,
460 #'HeaderLength' => $compressedMethod == 8 ? length $keep : 0,
461 'HeaderLength' => length $keep,
462 'TrailerLength' => $streamingMode ? 16 : 0,
463 'Header' => $keep,
464 'CompressedLength' => $compressedLength ,
465 'UncompressedLength' => $uncompressedLength ,
466 'CRC32' => $crc32 ,
467 'Name' => $filename,
468 'Time' => _dosToUnixTime($lastModTime),
469 'Stream' => $streamingMode,
470
471 'MethodID' => $compressedMethod,
472 'MethodName' => $compressedMethod == 8
473 ? "Deflated"
474 : $compressedMethod == 0
475 ? "Stored"
476 : "Unknown" ,
477
478# 'TextFlag' => $flag & GZIP_FLG_FTEXT ? 1 : 0,
479# 'HeaderCRCFlag' => $flag & GZIP_FLG_FHCRC ? 1 : 0,
480# 'NameFlag' => $flag & GZIP_FLG_FNAME ? 1 : 0,
481# 'CommentFlag' => $flag & GZIP_FLG_FCOMMENT ? 1 : 0,
482# 'ExtraFlag' => $flag & GZIP_FLG_FEXTRA ? 1 : 0,
483# 'Comment' => $comment,
484# 'OsID' => $os,
485# 'OsName' => defined $GZIP_OS_Names{$os}
486# ? $GZIP_OS_Names{$os} : "Unknown",
487# 'HeaderCRC' => $HeaderCRC,
488# 'Flags' => $flag,
489# 'ExtraFlags' => $xfl,
490# 'ExtraFieldRaw' => $EXTRA,
491# 'ExtraField' => [ @EXTRA ],
492
493
494 }
495}
496
497# from Archive::Zip
498sub _dosToUnixTime
499{
500 #use Time::Local 'timelocal_nocheck';
501 use Time::Local 'timelocal';
502
503 my $dt = shift;
504
505 my $year = ( ( $dt >> 25 ) & 0x7f ) + 80;
506 my $mon = ( ( $dt >> 21 ) & 0x0f ) - 1;
507 my $mday = ( ( $dt >> 16 ) & 0x1f );
508
509 my $hour = ( ( $dt >> 11 ) & 0x1f );
510 my $min = ( ( $dt >> 5 ) & 0x3f );
511 my $sec = ( ( $dt << 1 ) & 0x3e );
512
513 # catch errors
514 my $time_t =
515 eval { timelocal( $sec, $min, $hour, $mday, $mon, $year ); };
516 return 0
517 if $@;
518 return $time_t;
519}
520
521
5221;
523
524__END__
525
526
527=head1 NAME
528
529
530IO::Uncompress::Unzip - Perl interface to read zip files/buffers
531
532
533=head1 SYNOPSIS
534
535 use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
536
537 my $status = unzip $input => $output [,OPTS]
538 or die "unzip failed: $UnzipError\n";
539
540 my $z = new IO::Uncompress::Unzip $input [OPTS]
541 or die "unzip failed: $UnzipError\n";
542
543 $status = $z->read($buffer)
544 $status = $z->read($buffer, $length)
545 $status = $z->read($buffer, $length, $offset)
546 $line = $z->getline()
547 $char = $z->getc()
548 $char = $z->ungetc()
549 $char = $z->opened()
550
551 $status = $z->inflateSync()
552
553 $z->trailingData()
554 $data = $z->getHeaderInfo()
555 $z->tell()
556 $z->seek($position, $whence)
557 $z->binmode()
558 $z->fileno()
559 $z->eof()
560 $z->close()
561
562 $UnzipError ;
563
564 # IO::File mode
565
566 <$z>
567 read($z, $buffer);
568 read($z, $buffer, $length);
569 read($z, $buffer, $length, $offset);
570 tell($z)
571 seek($z, $position, $whence)
572 binmode($z)
573 fileno($z)
574 eof($z)
575 close($z)
576
577
578=head1 DESCRIPTION
579
580
581
582B<WARNING -- This is a Beta release>.
583
584=over 5
585
586=item * DO NOT use in production code.
587
588=item * The documentation is incomplete in places.
589
590=item * Parts of the interface defined here are tentative.
591
592=item * Please report any problems you find.
593
594=back
595
596
597
598
599
600This module provides a Perl interface that allows the reading of
601zlib files/buffers.
602
603For writing zip files/buffers, see the companion module IO::Compress::Zip.
604
605
606
607=head1 Functional Interface
608
609A top-level function, C<unzip>, is provided to carry out
610"one-shot" uncompression between buffers and/or files. For finer
611control over the uncompression process, see the L</"OO Interface">
612section.
613
614 use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
615
616 unzip $input => $output [,OPTS]
617 or die "unzip failed: $UnzipError\n";
618
619
620
621The functional interface needs Perl5.005 or better.
622
623
624=head2 unzip $input => $output [, OPTS]
625
626
627C<unzip> expects at least two parameters, C<$input> and C<$output>.
628
629=head3 The C<$input> parameter
630
631The parameter, C<$input>, is used to define the source of
632the compressed data.
633
634It can take one of the following forms:
635
636=over 5
637
638=item A filename
639
640If the C<$input> parameter is a simple scalar, it is assumed to be a
641filename. This file will be opened for reading and the input data
642will be read from it.
643
644=item A filehandle
645
646If the C<$input> parameter is a filehandle, the input data will be
647read from it.
648The string '-' can be used as an alias for standard input.
649
650=item A scalar reference
651
652If C<$input> is a scalar reference, the input data will be read
653from C<$$input>.
654
655=item An array reference
656
657If C<$input> is an array reference, each element in the array must be a
658filename.
659
660The input data will be read from each file in turn.
661
662The complete array will be walked to ensure that it only
663contains valid filenames before any data is uncompressed.
664
665
666
667=item An Input FileGlob string
668
669If C<$input> is a string that is delimited by the characters "<" and ">"
670C<unzip> will assume that it is an I<input fileglob string>. The
671input is the list of files that match the fileglob.
672
673If the fileglob does not match any files ...
674
675See L<File::GlobMapper|File::GlobMapper> for more details.
676
677
678=back
679
680If the C<$input> parameter is any other type, C<undef> will be returned.
681
682
683
684=head3 The C<$output> parameter
685
686The parameter C<$output> is used to control the destination of the
687uncompressed data. This parameter can take one of these forms.
688
689=over 5
690
691=item A filename
692
693If the C<$output> parameter is a simple scalar, it is assumed to be a
694filename. This file will be opened for writing and the uncompressed
695data will be written to it.
696
697=item A filehandle
698
699If the C<$output> parameter is a filehandle, the uncompressed data
700will be written to it.
701The string '-' can be used as an alias for standard output.
702
703
704=item A scalar reference
705
706If C<$output> is a scalar reference, the uncompressed data will be
707stored in C<$$output>.
708
709
710
711=item An Array Reference
712
713If C<$output> is an array reference, the uncompressed data will be
714pushed onto the array.
715
716=item An Output FileGlob
717
718If C<$output> is a string that is delimited by the characters "<" and ">"
719C<unzip> will assume that it is an I<output fileglob string>. The
720output is the list of files that match the fileglob.
721
722When C<$output> is an fileglob string, C<$input> must also be a fileglob
723string. Anything else is an error.
724
725=back
726
727If the C<$output> parameter is any other type, C<undef> will be returned.
728
729
730
731=head2 Notes
732
733When C<$input> maps to multiple files/buffers and C<$output> is a single
734file/buffer the uncompressed input files/buffers will all be stored
735in C<$output> as a single uncompressed stream.
736
737
738
739=head2 Optional Parameters
740
741Unless specified below, the optional parameters for C<unzip>,
742C<OPTS>, are the same as those used with the OO interface defined in the
743L</"Constructor Options"> section below.
744
745=over 5
746
747=item AutoClose =E<gt> 0|1
748
749This option applies to any input or output data streams to
750C<unzip> that are filehandles.
751
752If C<AutoClose> is specified, and the value is true, it will result in all
753input and/or output filehandles being closed once C<unzip> has
754completed.
755
756This parameter defaults to 0.
757
758
759
760=item BinModeOut =E<gt> 0|1
761
762When writing to a file or filehandle, set C<binmode> before writing to the
763file.
764
765Defaults to 0.
766
767
768
769
770
771=item -Append =E<gt> 0|1
772
773TODO
774
775=item -MultiStream =E<gt> 0|1
776
777Creates a new stream after each file.
778
779Defaults to 1.
780
781
782
783=back
784
785
786
787
788=head2 Examples
789
790To read the contents of the file C<file1.txt.zip> and write the
791compressed data to the file C<file1.txt>.
792
793 use strict ;
794 use warnings ;
795 use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
796
797 my $input = "file1.txt.zip";
798 my $output = "file1.txt";
799 unzip $input => $output
800 or die "unzip failed: $UnzipError\n";
801
802
803To read from an existing Perl filehandle, C<$input>, and write the
804uncompressed data to a buffer, C<$buffer>.
805
806 use strict ;
807 use warnings ;
808 use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
809 use IO::File ;
810
811 my $input = new IO::File "<file1.txt.zip"
812 or die "Cannot open 'file1.txt.zip': $!\n" ;
813 my $buffer ;
814 unzip $input => \$buffer
815 or die "unzip failed: $UnzipError\n";
816
817To uncompress all files in the directory "/my/home" that match "*.txt.zip" and store the compressed data in the same directory
818
819 use strict ;
820 use warnings ;
821 use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
822
823 unzip '</my/home/*.txt.zip>' => '</my/home/#1.txt>'
824 or die "unzip failed: $UnzipError\n";
825
826and if you want to compress each file one at a time, this will do the trick
827
828 use strict ;
829 use warnings ;
830 use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
831
832 for my $input ( glob "/my/home/*.txt.zip" )
833 {
834 my $output = $input;
835 $output =~ s/.zip// ;
836 unzip $input => $output
837 or die "Error compressing '$input': $UnzipError\n";
838 }
839
840=head1 OO Interface
841
842=head2 Constructor
843
844The format of the constructor for IO::Uncompress::Unzip is shown below
845
846
847 my $z = new IO::Uncompress::Unzip $input [OPTS]
848 or die "IO::Uncompress::Unzip failed: $UnzipError\n";
849
850Returns an C<IO::Uncompress::Unzip> object on success and undef on failure.
851The variable C<$UnzipError> will contain an error message on failure.
852
853If you are running Perl 5.005 or better the object, C<$z>, returned from
854IO::Uncompress::Unzip can be used exactly like an L<IO::File|IO::File> filehandle.
855This means that all normal input file operations can be carried out with
856C<$z>. For example, to read a line from a compressed file/buffer you can
857use either of these forms
858
859 $line = $z->getline();
860 $line = <$z>;
861
862The mandatory parameter C<$input> is used to determine the source of the
863compressed data. This parameter can take one of three forms.
864
865=over 5
866
867=item A filename
868
869If the C<$input> parameter is a scalar, it is assumed to be a filename. This
870file will be opened for reading and the compressed data will be read from it.
871
872=item A filehandle
873
874If the C<$input> parameter is a filehandle, the compressed data will be
875read from it.
876The string '-' can be used as an alias for standard input.
877
878
879=item A scalar reference
880
881If C<$input> is a scalar reference, the compressed data will be read from
882C<$$output>.
883
884=back
885
886=head2 Constructor Options
887
888
889The option names defined below are case insensitive and can be optionally
890prefixed by a '-'. So all of the following are valid
891
892 -AutoClose
893 -autoclose
894 AUTOCLOSE
895 autoclose
896
897OPTS is a combination of the following options:
898
899=over 5
900
901=item -AutoClose =E<gt> 0|1
902
903This option is only valid when the C<$input> parameter is a filehandle. If
904specified, and the value is true, it will result in the file being closed once
905either the C<close> method is called or the IO::Uncompress::Unzip object is
906destroyed.
907
908This parameter defaults to 0.
909
910=item -MultiStream =E<gt> 0|1
911
912
913
914Allows multiple concatenated compressed streams to be treated as a single
915compressed stream. Decompression will stop once either the end of the
916file/buffer is reached, an error is encountered (premature eof, corrupt
917compressed data) or the end of a stream is not immediately followed by the
918start of another stream.
919
920This parameter defaults to 0.
921
922
923
924=item -Prime =E<gt> $string
925
926This option will uncompress the contents of C<$string> before processing the
927input file/buffer.
928
929This option can be useful when the compressed data is embedded in another
930file/data structure and it is not possible to work out where the compressed
931data begins without having to read the first few bytes. If this is the
932case, the uncompression can be I<primed> with these bytes using this
933option.
934
935=item -Transparent =E<gt> 0|1
936
937If this option is set and the input file or buffer is not compressed data,
938the module will allow reading of it anyway.
939
940This option defaults to 1.
941
942=item -BlockSize =E<gt> $num
943
944When reading the compressed input data, IO::Uncompress::Unzip will read it in
945blocks of C<$num> bytes.
946
947This option defaults to 4096.
948
949=item -InputLength =E<gt> $size
950
951When present this option will limit the number of compressed bytes read
952from the input file/buffer to C<$size>. This option can be used in the
953situation where there is useful data directly after the compressed data
954stream and you know beforehand the exact length of the compressed data
955stream.
956
957This option is mostly used when reading from a filehandle, in which case
958the file pointer will be left pointing to the first byte directly after the
959compressed data stream.
960
961
962
963This option defaults to off.
964
965=item -Append =E<gt> 0|1
966
967This option controls what the C<read> method does with uncompressed data.
968
969If set to 1, all uncompressed data will be appended to the output parameter
970of the C<read> method.
971
972If set to 0, the contents of the output parameter of the C<read> method
973will be overwritten by the uncompressed data.
974
975Defaults to 0.
976
977=item -Strict =E<gt> 0|1
978
979
980
981This option controls whether the extra checks defined below are used when
982carrying out the decompression. When Strict is on, the extra tests are
983carried out, when Strict is off they are not.
984
985The default for this option is off.
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000=back
1001
1002=head2 Examples
1003
1004TODO
1005
1006=head1 Methods
1007
1008=head2 read
1009
1010Usage is
1011
1012 $status = $z->read($buffer)
1013
1014Reads a block of compressed data (the size the the compressed block is
1015determined by the C<Buffer> option in the constructor), uncompresses it and
1016writes any uncompressed data into C<$buffer>. If the C<Append> parameter is
1017set in the constructor, the uncompressed data will be appended to the
1018C<$buffer> parameter. Otherwise C<$buffer> will be overwritten.
1019
1020Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
1021or a negative number on error.
1022
1023=head2 read
1024
1025Usage is
1026
1027 $status = $z->read($buffer, $length)
1028 $status = $z->read($buffer, $length, $offset)
1029
1030 $status = read($z, $buffer, $length)
1031 $status = read($z, $buffer, $length, $offset)
1032
1033Attempt to read C<$length> bytes of uncompressed data into C<$buffer>.
1034
1035The main difference between this form of the C<read> method and the
1036previous one, is that this one will attempt to return I<exactly> C<$length>
1037bytes. The only circumstances that this function will not is if end-of-file
1038or an IO error is encountered.
1039
1040Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
1041or a negative number on error.
1042
1043
1044=head2 getline
1045
1046Usage is
1047
1048 $line = $z->getline()
1049 $line = <$z>
1050
1051Reads a single line.
1052
1053This method fully supports the use of of the variable C<$/>
1054(or C<$INPUT_RECORD_SEPARATOR> or C<$RS> when C<English> is in use) to
1055determine what constitutes an end of line. Both paragraph mode and file
1056slurp mode are supported.
1057
1058
1059=head2 getc
1060
1061Usage is
1062
1063 $char = $z->getc()
1064
1065Read a single character.
1066
1067=head2 ungetc
1068
1069Usage is
1070
1071 $char = $z->ungetc($string)
1072
1073
1074
1075=head2 inflateSync
1076
1077Usage is
1078
1079 $status = $z->inflateSync()
1080
1081TODO
1082
1083
1084=head2 getHeaderInfo
1085
1086Usage is
1087
1088 $hdr = $z->getHeaderInfo();
1089 @hdrs = $z->getHeaderInfo();
1090
1091This method returns either a hash reference (in scalar context) or a list
1092or hash references (in array context) that contains information about each
1093of the header fields in the compressed data stream(s).
1094
1095
1096
1097
1098=head2 tell
1099
1100Usage is
1101
1102 $z->tell()
1103 tell $z
1104
1105Returns the uncompressed file offset.
1106
1107=head2 eof
1108
1109Usage is
1110
1111 $z->eof();
1112 eof($z);
1113
1114
1115
1116Returns true if the end of the compressed input stream has been reached.
1117
1118
1119
1120=head2 seek
1121
1122 $z->seek($position, $whence);
1123 seek($z, $position, $whence);
1124
1125
1126
1127
1128Provides a sub-set of the C<seek> functionality, with the restriction
1129that it is only legal to seek forward in the input file/buffer.
1130It is a fatal error to attempt to seek backward.
1131
1132
1133
1134The C<$whence> parameter takes one the usual values, namely SEEK_SET,
1135SEEK_CUR or SEEK_END.
1136
1137Returns 1 on success, 0 on failure.
1138
1139=head2 binmode
1140
1141Usage is
1142
1143 $z->binmode
1144 binmode $z ;
1145
1146This is a noop provided for completeness.
1147
1148=head2 opened
1149
1150 $z->opened()
1151
1152Returns true if the object currently refers to a opened file/buffer.
1153
1154=head2 autoflush
1155
1156 my $prev = $z->autoflush()
1157 my $prev = $z->autoflush(EXPR)
1158
1159If the C<$z> object is associated with a file or a filehandle, this method
1160returns the current autoflush setting for the underlying filehandle. If
1161C<EXPR> is present, and is non-zero, it will enable flushing after every
1162write/print operation.
1163
1164If C<$z> is associated with a buffer, this method has no effect and always
1165returns C<undef>.
1166
1167B<Note> that the special variable C<$|> B<cannot> be used to set or
1168retrieve the autoflush setting.
1169
1170=head2 input_line_number
1171
1172 $z->input_line_number()
1173 $z->input_line_number(EXPR)
1174
1175
1176
1177Returns the current uncompressed line number. If C<EXPR> is present it has
1178the effect of setting the line number. Note that setting the line number
1179does not change the current position within the file/buffer being read.
1180
1181The contents of C<$/> are used to to determine what constitutes a line
1182terminator.
1183
1184
1185
1186=head2 fileno
1187
1188 $z->fileno()
1189 fileno($z)
1190
1191If the C<$z> object is associated with a file or a filehandle, this method
1192will return the underlying file descriptor.
1193
1194If the C<$z> object is is associated with a buffer, this method will
1195return undef.
1196
1197=head2 close
1198
1199 $z->close() ;
1200 close $z ;
1201
1202
1203
1204Closes the output file/buffer.
1205
1206
1207
1208For most versions of Perl this method will be automatically invoked if
1209the IO::Uncompress::Unzip object is destroyed (either explicitly or by the
1210variable with the reference to the object going out of scope). The
1211exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
1212these cases, the C<close> method will be called automatically, but
1213not until global destruction of all live objects when the program is
1214terminating.
1215
1216Therefore, if you want your scripts to be able to run on all versions
1217of Perl, you should call C<close> explicitly and not rely on automatic
1218closing.
1219
1220Returns true on success, otherwise 0.
1221
1222If the C<AutoClose> option has been enabled when the IO::Uncompress::Unzip
1223object was created, and the object is associated with a file, the
1224underlying file will also be closed.
1225
1226
1227
1228
1229=head1 Importing
1230
1231No symbolic constants are required by this IO::Uncompress::Unzip at present.
1232
1233=over 5
1234
1235=item :all
1236
1237Imports C<unzip> and C<$UnzipError>.
1238Same as doing this
1239
1240 use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
1241
1242=back
1243
1244=head1 EXAMPLES
1245
1246
1247
1248
1249=head1 SEE ALSO
1250
1251L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
1252
1253L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
1254
1255L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
1256L<Archive::Tar|Archive::Tar>,
1257L<IO::Zlib|IO::Zlib>
1258
1259
1260For RFC 1950, 1951 and 1952 see
1261F<http://www.faqs.org/rfcs/rfc1950.html>,
1262F<http://www.faqs.org/rfcs/rfc1951.html> and
1263F<http://www.faqs.org/rfcs/rfc1952.html>
1264
1265The I<zlib> compression library was written by Jean-loup Gailly
1266F<gzip@prep.ai.mit.edu> and Mark Adler F<madler@alumni.caltech.edu>.
1267
1268The primary site for the I<zlib> compression library is
1269F<http://www.zlib.org>.
1270
1271The primary site for gzip is F<http://www.gzip.org>.
1272
1273
1274
1275
1276
1277
1278
1279=head1 AUTHOR
1280
1281The I<IO::Uncompress::Unzip> module was written by Paul Marquess,
1282F<pmqs@cpan.org>.
1283
1284
1285
1286=head1 MODIFICATION HISTORY
1287
1288See the Changes file.
1289
1290=head1 COPYRIGHT AND LICENSE
1291
1292
1293Copyright (c) 2005-2006 Paul Marquess. All rights reserved.
1294
1295This program is free software; you can redistribute it and/or
1296modify it under the same terms as Perl itself.
1297