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