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