1package IO::Uncompress::RawInflate ; 2# for RFC1951 3 4use strict ; 5use warnings; 6use bytes; 7 8use Compress::Raw::Zlib 2.024 ; 9use IO::Compress::Base::Common 2.024 qw(:Status createSelfTiedObject); 10 11use IO::Uncompress::Base 2.024 ; 12use IO::Uncompress::Adapter::Inflate 2.024 ; 13 14require Exporter ; 15our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, %DEFLATE_CONSTANTS, $RawInflateError); 16 17$VERSION = '2.024'; 18$RawInflateError = ''; 19 20@ISA = qw( Exporter IO::Uncompress::Base ); 21@EXPORT_OK = qw( $RawInflateError rawinflate ) ; 22%DEFLATE_CONSTANTS = (); 23%EXPORT_TAGS = %IO::Uncompress::Base::EXPORT_TAGS ; 24push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ; 25Exporter::export_ok_tags('all'); 26 27#{ 28# # Execute at runtime 29# my %bad; 30# for my $module (qw(Compress::Raw::Zlib IO::Compress::Base::Common IO::Uncompress::Base IO::Uncompress::Adapter::Inflate)) 31# { 32# my $ver = ${ $module . "::VERSION"} ; 33# 34# $bad{$module} = $ver 35# if $ver ne $VERSION; 36# } 37# 38# if (keys %bad) 39# { 40# my $string = join "\n", map { "$_ $bad{$_}" } keys %bad; 41# die caller(0)[0] . "needs version $VERSION mismatch\n$string\n"; 42# } 43#} 44 45sub new 46{ 47 my $class = shift ; 48 my $obj = createSelfTiedObject($class, \$RawInflateError); 49 $obj->_create(undef, 0, @_); 50} 51 52sub rawinflate 53{ 54 my $obj = createSelfTiedObject(undef, \$RawInflateError); 55 return $obj->_inf(@_); 56} 57 58sub getExtraParams 59{ 60 return (); 61} 62 63sub ckParams 64{ 65 my $self = shift ; 66 my $got = shift ; 67 68 return 1; 69} 70 71sub mkUncomp 72{ 73 my $self = shift ; 74 my $got = shift ; 75 76 my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::Inflate::mkUncompObject( 77 $got->value('CRC32'), 78 $got->value('ADLER32'), 79 $got->value('Scan'), 80 ); 81 82 return $self->saveErrorString(undef, $errstr, $errno) 83 if ! defined $obj; 84 85 *$self->{Uncomp} = $obj; 86 87 my $magic = $self->ckMagic() 88 or return 0; 89 90 *$self->{Info} = $self->readHeader($magic) 91 or return undef ; 92 93 return 1; 94 95} 96 97 98sub ckMagic 99{ 100 my $self = shift; 101 102 return $self->_isRaw() ; 103} 104 105sub readHeader 106{ 107 my $self = shift; 108 my $magic = shift ; 109 110 return { 111 'Type' => 'rfc1951', 112 'FingerprintLength' => 0, 113 'HeaderLength' => 0, 114 'TrailerLength' => 0, 115 'Header' => '' 116 }; 117} 118 119sub chkTrailer 120{ 121 return STATUS_OK ; 122} 123 124sub _isRaw 125{ 126 my $self = shift ; 127 128 my $got = $self->_isRawx(@_); 129 130 if ($got) { 131 *$self->{Pending} = *$self->{HeaderPending} ; 132 } 133 else { 134 $self->pushBack(*$self->{HeaderPending}); 135 *$self->{Uncomp}->reset(); 136 } 137 *$self->{HeaderPending} = ''; 138 139 return $got ; 140} 141 142sub _isRawx 143{ 144 my $self = shift ; 145 my $magic = shift ; 146 147 $magic = '' unless defined $magic ; 148 149 my $buffer = ''; 150 151 $self->smartRead(\$buffer, *$self->{BlockSize}) >= 0 152 or return $self->saveErrorString(undef, "No data to read"); 153 154 my $temp_buf = $magic . $buffer ; 155 *$self->{HeaderPending} = $temp_buf ; 156 $buffer = ''; 157 my $status = *$self->{Uncomp}->uncompr(\$temp_buf, \$buffer, $self->smartEof()) ; 158 159 return $self->saveErrorString(undef, *$self->{Uncomp}{Error}, STATUS_ERROR) 160 if $status == STATUS_ERROR; 161 162 $self->pushBack($temp_buf) ; 163 164 return $self->saveErrorString(undef, "unexpected end of file", STATUS_ERROR) 165 if $self->smartEof() && $status != STATUS_ENDSTREAM; 166 167 #my $buf_len = *$self->{Uncomp}->uncompressedBytes(); 168 my $buf_len = length $buffer; 169 170 if ($status == STATUS_ENDSTREAM) { 171 if (*$self->{MultiStream} 172 && (length $temp_buf || ! $self->smartEof())){ 173 *$self->{NewStream} = 1 ; 174 *$self->{EndStream} = 0 ; 175 } 176 else { 177 *$self->{EndStream} = 1 ; 178 } 179 } 180 *$self->{HeaderPending} = $buffer ; 181 *$self->{InflatedBytesRead} = $buf_len ; 182 *$self->{TotalInflatedBytesRead} += $buf_len ; 183 *$self->{Type} = 'rfc1951'; 184 185 $self->saveStatus(STATUS_OK); 186 187 return { 188 'Type' => 'rfc1951', 189 'HeaderLength' => 0, 190 'TrailerLength' => 0, 191 'Header' => '' 192 }; 193} 194 195 196sub inflateSync 197{ 198 my $self = shift ; 199 200 # inflateSync is a no-op in Plain mode 201 return 1 202 if *$self->{Plain} ; 203 204 return 0 if *$self->{Closed} ; 205 #return G_EOF if !length *$self->{Pending} && *$self->{EndStream} ; 206 return 0 if ! length *$self->{Pending} && *$self->{EndStream} ; 207 208 # Disable CRC check 209 *$self->{Strict} = 0 ; 210 211 my $status ; 212 while (1) 213 { 214 my $temp_buf ; 215 216 if (length *$self->{Pending} ) 217 { 218 $temp_buf = *$self->{Pending} ; 219 *$self->{Pending} = ''; 220 } 221 else 222 { 223 $status = $self->smartRead(\$temp_buf, *$self->{BlockSize}) ; 224 return $self->saveErrorString(0, "Error Reading Data") 225 if $status < 0 ; 226 227 if ($status == 0 ) { 228 *$self->{EndStream} = 1 ; 229 return $self->saveErrorString(0, "unexpected end of file", STATUS_ERROR); 230 } 231 } 232 233 $status = *$self->{Uncomp}->sync($temp_buf) ; 234 235 if ($status == STATUS_OK) 236 { 237 *$self->{Pending} .= $temp_buf ; 238 return 1 ; 239 } 240 241 last unless $status == STATUS_ERROR ; 242 } 243 244 return 0; 245} 246 247#sub performScan 248#{ 249# my $self = shift ; 250# 251# my $status ; 252# my $end_offset = 0; 253# 254# $status = $self->scan() 255# #or return $self->saveErrorString(undef, "Error Scanning: $$error_ref", $self->errorNo) ; 256# or return $self->saveErrorString(G_ERR, "Error Scanning: $status") 257# 258# $status = $self->zap($end_offset) 259# or return $self->saveErrorString(G_ERR, "Error Zapping: $status"); 260# #or return $self->saveErrorString(undef, "Error Zapping: $$error_ref", $self->errorNo) ; 261# 262# #(*$obj->{Deflate}, $status) = $inf->createDeflate(); 263# 264## *$obj->{Header} = *$inf->{Info}{Header}; 265## *$obj->{UnCompSize_32bit} = 266## *$obj->{BytesWritten} = *$inf->{UnCompSize_32bit} ; 267## *$obj->{CompSize_32bit} = *$inf->{CompSize_32bit} ; 268# 269# 270## if ( $outType eq 'buffer') 271## { substr( ${ *$self->{Buffer} }, $end_offset) = '' } 272## elsif ($outType eq 'handle' || $outType eq 'filename') { 273## *$self->{FH} = *$inf->{FH} ; 274## delete *$inf->{FH}; 275## *$obj->{FH}->flush() ; 276## *$obj->{Handle} = 1 if $outType eq 'handle'; 277## 278## #seek(*$obj->{FH}, $end_offset, SEEK_SET) 279## *$obj->{FH}->seek($end_offset, SEEK_SET) 280## or return $obj->saveErrorString(undef, $!, $!) ; 281## } 282# 283#} 284 285sub scan 286{ 287 my $self = shift ; 288 289 return 1 if *$self->{Closed} ; 290 return 1 if !length *$self->{Pending} && *$self->{EndStream} ; 291 292 my $buffer = '' ; 293 my $len = 0; 294 295 $len = $self->_raw_read(\$buffer, 1) 296 while ! *$self->{EndStream} && $len >= 0 ; 297 298 #return $len if $len < 0 ? $len : 0 ; 299 return $len < 0 ? 0 : 1 ; 300} 301 302sub zap 303{ 304 my $self = shift ; 305 306 my $headerLength = *$self->{Info}{HeaderLength}; 307 my $block_offset = $headerLength + *$self->{Uncomp}->getLastBlockOffset(); 308 $_[0] = $headerLength + *$self->{Uncomp}->getEndOffset(); 309 #printf "# End $_[0], headerlen $headerLength \n";; 310 #printf "# block_offset $block_offset %x\n", $block_offset; 311 my $byte ; 312 ( $self->smartSeek($block_offset) && 313 $self->smartRead(\$byte, 1) ) 314 or return $self->saveErrorString(0, $!, $!); 315 316 #printf "#byte is %x\n", unpack('C*',$byte); 317 *$self->{Uncomp}->resetLastBlockByte($byte); 318 #printf "#to byte is %x\n", unpack('C*',$byte); 319 320 ( $self->smartSeek($block_offset) && 321 $self->smartWrite($byte) ) 322 or return $self->saveErrorString(0, $!, $!); 323 324 #$self->smartSeek($end_offset, 1); 325 326 return 1 ; 327} 328 329sub createDeflate 330{ 331 my $self = shift ; 332 my ($def, $status) = *$self->{Uncomp}->createDeflateStream( 333 -AppendOutput => 1, 334 -WindowBits => - MAX_WBITS, 335 -CRC32 => *$self->{Params}->value('CRC32'), 336 -ADLER32 => *$self->{Params}->value('ADLER32'), 337 ); 338 339 return wantarray ? ($status, $def) : $def ; 340} 341 342 3431; 344 345__END__ 346 347 348=head1 NAME 349 350IO::Uncompress::RawInflate - Read RFC 1951 files/buffers 351 352=head1 SYNOPSIS 353 354 use IO::Uncompress::RawInflate qw(rawinflate $RawInflateError) ; 355 356 my $status = rawinflate $input => $output [,OPTS] 357 or die "rawinflate failed: $RawInflateError\n"; 358 359 my $z = new IO::Uncompress::RawInflate $input [OPTS] 360 or die "rawinflate failed: $RawInflateError\n"; 361 362 $status = $z->read($buffer) 363 $status = $z->read($buffer, $length) 364 $status = $z->read($buffer, $length, $offset) 365 $line = $z->getline() 366 $char = $z->getc() 367 $char = $z->ungetc() 368 $char = $z->opened() 369 370 $status = $z->inflateSync() 371 372 $data = $z->trailingData() 373 $status = $z->nextStream() 374 $data = $z->getHeaderInfo() 375 $z->tell() 376 $z->seek($position, $whence) 377 $z->binmode() 378 $z->fileno() 379 $z->eof() 380 $z->close() 381 382 $RawInflateError ; 383 384 # IO::File mode 385 386 <$z> 387 read($z, $buffer); 388 read($z, $buffer, $length); 389 read($z, $buffer, $length, $offset); 390 tell($z) 391 seek($z, $position, $whence) 392 binmode($z) 393 fileno($z) 394 eof($z) 395 close($z) 396 397=head1 DESCRIPTION 398 399This module provides a Perl interface that allows the reading of 400files/buffers that conform to RFC 1951. 401 402For writing RFC 1951 files/buffers, see the companion module IO::Compress::RawDeflate. 403 404=head1 Functional Interface 405 406A top-level function, C<rawinflate>, is provided to carry out 407"one-shot" uncompression between buffers and/or files. For finer 408control over the uncompression process, see the L</"OO Interface"> 409section. 410 411 use IO::Uncompress::RawInflate qw(rawinflate $RawInflateError) ; 412 413 rawinflate $input => $output [,OPTS] 414 or die "rawinflate failed: $RawInflateError\n"; 415 416The functional interface needs Perl5.005 or better. 417 418=head2 rawinflate $input => $output [, OPTS] 419 420C<rawinflate> expects at least two parameters, C<$input> and C<$output>. 421 422=head3 The C<$input> parameter 423 424The parameter, C<$input>, is used to define the source of 425the compressed data. 426 427It can take one of the following forms: 428 429=over 5 430 431=item A filename 432 433If the C<$input> parameter is a simple scalar, it is assumed to be a 434filename. This file will be opened for reading and the input data 435will be read from it. 436 437=item A filehandle 438 439If the C<$input> parameter is a filehandle, the input data will be 440read from it. 441The string '-' can be used as an alias for standard input. 442 443=item A scalar reference 444 445If C<$input> is a scalar reference, the input data will be read 446from C<$$input>. 447 448=item An array reference 449 450If C<$input> is an array reference, each element in the array must be a 451filename. 452 453The input data will be read from each file in turn. 454 455The complete array will be walked to ensure that it only 456contains valid filenames before any data is uncompressed. 457 458=item An Input FileGlob string 459 460If C<$input> is a string that is delimited by the characters "<" and ">" 461C<rawinflate> will assume that it is an I<input fileglob string>. The 462input is the list of files that match the fileglob. 463 464If the fileglob does not match any files ... 465 466See L<File::GlobMapper|File::GlobMapper> for more details. 467 468=back 469 470If the C<$input> parameter is any other type, C<undef> will be returned. 471 472=head3 The C<$output> parameter 473 474The parameter C<$output> is used to control the destination of the 475uncompressed data. This parameter can take one of these forms. 476 477=over 5 478 479=item A filename 480 481If the C<$output> parameter is a simple scalar, it is assumed to be a 482filename. This file will be opened for writing and the uncompressed 483data will be written to it. 484 485=item A filehandle 486 487If the C<$output> parameter is a filehandle, the uncompressed data 488will be written to it. 489The string '-' can be used as an alias for standard output. 490 491=item A scalar reference 492 493If C<$output> is a scalar reference, the uncompressed data will be 494stored in C<$$output>. 495 496=item An Array Reference 497 498If C<$output> is an array reference, the uncompressed data will be 499pushed onto the array. 500 501=item An Output FileGlob 502 503If C<$output> is a string that is delimited by the characters "<" and ">" 504C<rawinflate> will assume that it is an I<output fileglob string>. The 505output is the list of files that match the fileglob. 506 507When C<$output> is an fileglob string, C<$input> must also be a fileglob 508string. Anything else is an error. 509 510=back 511 512If the C<$output> parameter is any other type, C<undef> will be returned. 513 514=head2 Notes 515 516When C<$input> maps to multiple compressed files/buffers and C<$output> is 517a single file/buffer, after uncompression C<$output> will contain a 518concatenation of all the uncompressed data from each of the input 519files/buffers. 520 521=head2 Optional Parameters 522 523Unless specified below, the optional parameters for C<rawinflate>, 524C<OPTS>, are the same as those used with the OO interface defined in the 525L</"Constructor Options"> section below. 526 527=over 5 528 529=item C<< AutoClose => 0|1 >> 530 531This option applies to any input or output data streams to 532C<rawinflate> that are filehandles. 533 534If C<AutoClose> is specified, and the value is true, it will result in all 535input and/or output filehandles being closed once C<rawinflate> has 536completed. 537 538This parameter defaults to 0. 539 540=item C<< BinModeOut => 0|1 >> 541 542When writing to a file or filehandle, set C<binmode> before writing to the 543file. 544 545Defaults to 0. 546 547=item C<< Append => 0|1 >> 548 549The behaviour of this option is dependent on the type of output data 550stream. 551 552=over 5 553 554=item * A Buffer 555 556If C<Append> is enabled, all uncompressed data will be append to the end of 557the output buffer. Otherwise the output buffer will be cleared before any 558uncompressed data is written to it. 559 560=item * A Filename 561 562If C<Append> is enabled, the file will be opened in append mode. Otherwise 563the contents of the file, if any, will be truncated before any uncompressed 564data is written to it. 565 566=item * A Filehandle 567 568If C<Append> is enabled, the filehandle will be positioned to the end of 569the file via a call to C<seek> before any uncompressed data is 570written to it. Otherwise the file pointer will not be moved. 571 572=back 573 574When C<Append> is specified, and set to true, it will I<append> all uncompressed 575data to the output data stream. 576 577So when the output is a filehandle it will carry out a seek to the eof 578before writing any uncompressed data. If the output is a filename, it will be opened for 579appending. If the output is a buffer, all uncompressed data will be appened to 580the existing buffer. 581 582Conversely when C<Append> is not specified, or it is present and is set to 583false, it will operate as follows. 584 585When the output is a filename, it will truncate the contents of the file 586before writing any uncompressed data. If the output is a filehandle 587its position will not be changed. If the output is a buffer, it will be 588wiped before any uncompressed data is output. 589 590Defaults to 0. 591 592=item C<< MultiStream => 0|1 >> 593 594This option is a no-op. 595 596=item C<< TrailingData => $scalar >> 597 598Returns the data, if any, that is present immediately after the compressed 599data stream once uncompression is complete. 600 601This option can be used when there is useful information immediately 602following the compressed data stream, and you don't know the length of the 603compressed data stream. 604 605If the input is a buffer, C<trailingData> will return everything from the 606end of the compressed data stream to the end of the buffer. 607 608If the input is a filehandle, C<trailingData> will return the data that is 609left in the filehandle input buffer once the end of the compressed data 610stream has been reached. You can then use the filehandle to read the rest 611of the input file. 612 613Don't bother using C<trailingData> if the input is a filename. 614 615If you know the length of the compressed data stream before you start 616uncompressing, you can avoid having to use C<trailingData> by setting the 617C<InputLength> option. 618 619=back 620 621=head2 Examples 622 623To read the contents of the file C<file1.txt.1951> and write the 624uncompressed data to the file C<file1.txt>. 625 626 use strict ; 627 use warnings ; 628 use IO::Uncompress::RawInflate qw(rawinflate $RawInflateError) ; 629 630 my $input = "file1.txt.1951"; 631 my $output = "file1.txt"; 632 rawinflate $input => $output 633 or die "rawinflate failed: $RawInflateError\n"; 634 635To read from an existing Perl filehandle, C<$input>, and write the 636uncompressed data to a buffer, C<$buffer>. 637 638 use strict ; 639 use warnings ; 640 use IO::Uncompress::RawInflate qw(rawinflate $RawInflateError) ; 641 use IO::File ; 642 643 my $input = new IO::File "<file1.txt.1951" 644 or die "Cannot open 'file1.txt.1951': $!\n" ; 645 my $buffer ; 646 rawinflate $input => \$buffer 647 or die "rawinflate failed: $RawInflateError\n"; 648 649To uncompress all files in the directory "/my/home" that match "*.txt.1951" and store the compressed data in the same directory 650 651 use strict ; 652 use warnings ; 653 use IO::Uncompress::RawInflate qw(rawinflate $RawInflateError) ; 654 655 rawinflate '</my/home/*.txt.1951>' => '</my/home/#1.txt>' 656 or die "rawinflate failed: $RawInflateError\n"; 657 658and if you want to compress each file one at a time, this will do the trick 659 660 use strict ; 661 use warnings ; 662 use IO::Uncompress::RawInflate qw(rawinflate $RawInflateError) ; 663 664 for my $input ( glob "/my/home/*.txt.1951" ) 665 { 666 my $output = $input; 667 $output =~ s/.1951// ; 668 rawinflate $input => $output 669 or die "Error compressing '$input': $RawInflateError\n"; 670 } 671 672=head1 OO Interface 673 674=head2 Constructor 675 676The format of the constructor for IO::Uncompress::RawInflate is shown below 677 678 my $z = new IO::Uncompress::RawInflate $input [OPTS] 679 or die "IO::Uncompress::RawInflate failed: $RawInflateError\n"; 680 681Returns an C<IO::Uncompress::RawInflate> object on success and undef on failure. 682The variable C<$RawInflateError> will contain an error message on failure. 683 684If you are running Perl 5.005 or better the object, C<$z>, returned from 685IO::Uncompress::RawInflate can be used exactly like an L<IO::File|IO::File> filehandle. 686This means that all normal input file operations can be carried out with 687C<$z>. For example, to read a line from a compressed file/buffer you can 688use either of these forms 689 690 $line = $z->getline(); 691 $line = <$z>; 692 693The mandatory parameter C<$input> is used to determine the source of the 694compressed data. This parameter can take one of three forms. 695 696=over 5 697 698=item A filename 699 700If the C<$input> parameter is a scalar, it is assumed to be a filename. This 701file will be opened for reading and the compressed data will be read from it. 702 703=item A filehandle 704 705If the C<$input> parameter is a filehandle, the compressed data will be 706read from it. 707The string '-' can be used as an alias for standard input. 708 709=item A scalar reference 710 711If C<$input> is a scalar reference, the compressed data will be read from 712C<$$output>. 713 714=back 715 716=head2 Constructor Options 717 718The option names defined below are case insensitive and can be optionally 719prefixed by a '-'. So all of the following are valid 720 721 -AutoClose 722 -autoclose 723 AUTOCLOSE 724 autoclose 725 726OPTS is a combination of the following options: 727 728=over 5 729 730=item C<< AutoClose => 0|1 >> 731 732This option is only valid when the C<$input> parameter is a filehandle. If 733specified, and the value is true, it will result in the file being closed once 734either the C<close> method is called or the IO::Uncompress::RawInflate object is 735destroyed. 736 737This parameter defaults to 0. 738 739=item C<< MultiStream => 0|1 >> 740 741Allows multiple concatenated compressed streams to be treated as a single 742compressed stream. Decompression will stop once either the end of the 743file/buffer is reached, an error is encountered (premature eof, corrupt 744compressed data) or the end of a stream is not immediately followed by the 745start of another stream. 746 747This parameter defaults to 0. 748 749=item C<< Prime => $string >> 750 751This option will uncompress the contents of C<$string> before processing the 752input file/buffer. 753 754This option can be useful when the compressed data is embedded in another 755file/data structure and it is not possible to work out where the compressed 756data begins without having to read the first few bytes. If this is the 757case, the uncompression can be I<primed> with these bytes using this 758option. 759 760=item C<< Transparent => 0|1 >> 761 762If this option is set and the input file/buffer is not compressed data, 763the module will allow reading of it anyway. 764 765In addition, if the input file/buffer does contain compressed data and 766there is non-compressed data immediately following it, setting this option 767will make this module treat the whole file/bufffer as a single data stream. 768 769This option defaults to 1. 770 771=item C<< BlockSize => $num >> 772 773When reading the compressed input data, IO::Uncompress::RawInflate will read it in 774blocks of C<$num> bytes. 775 776This option defaults to 4096. 777 778=item C<< InputLength => $size >> 779 780When present this option will limit the number of compressed bytes read 781from the input file/buffer to C<$size>. This option can be used in the 782situation where there is useful data directly after the compressed data 783stream and you know beforehand the exact length of the compressed data 784stream. 785 786This option is mostly used when reading from a filehandle, in which case 787the file pointer will be left pointing to the first byte directly after the 788compressed data stream. 789 790This option defaults to off. 791 792=item C<< Append => 0|1 >> 793 794This option controls what the C<read> method does with uncompressed data. 795 796If set to 1, all uncompressed data will be appended to the output parameter 797of the C<read> method. 798 799If set to 0, the contents of the output parameter of the C<read> method 800will be overwritten by the uncompressed data. 801 802Defaults to 0. 803 804=item C<< Strict => 0|1 >> 805 806This option is a no-op. 807 808=back 809 810=head2 Examples 811 812TODO 813 814=head1 Methods 815 816=head2 read 817 818Usage is 819 820 $status = $z->read($buffer) 821 822Reads a block of compressed data (the size the the compressed block is 823determined by the C<Buffer> option in the constructor), uncompresses it and 824writes any uncompressed data into C<$buffer>. If the C<Append> parameter is 825set in the constructor, the uncompressed data will be appended to the 826C<$buffer> parameter. Otherwise C<$buffer> will be overwritten. 827 828Returns the number of uncompressed bytes written to C<$buffer>, zero if eof 829or a negative number on error. 830 831=head2 read 832 833Usage is 834 835 $status = $z->read($buffer, $length) 836 $status = $z->read($buffer, $length, $offset) 837 838 $status = read($z, $buffer, $length) 839 $status = read($z, $buffer, $length, $offset) 840 841Attempt to read C<$length> bytes of uncompressed data into C<$buffer>. 842 843The main difference between this form of the C<read> method and the 844previous one, is that this one will attempt to return I<exactly> C<$length> 845bytes. The only circumstances that this function will not is if end-of-file 846or an IO error is encountered. 847 848Returns the number of uncompressed bytes written to C<$buffer>, zero if eof 849or a negative number on error. 850 851=head2 getline 852 853Usage is 854 855 $line = $z->getline() 856 $line = <$z> 857 858Reads a single line. 859 860This method fully supports the use of of the variable C<$/> (or 861C<$INPUT_RECORD_SEPARATOR> or C<$RS> when C<English> is in use) to 862determine what constitutes an end of line. Paragraph mode, record mode and 863file slurp mode are all supported. 864 865=head2 getc 866 867Usage is 868 869 $char = $z->getc() 870 871Read a single character. 872 873=head2 ungetc 874 875Usage is 876 877 $char = $z->ungetc($string) 878 879=head2 inflateSync 880 881Usage is 882 883 $status = $z->inflateSync() 884 885TODO 886 887=head2 getHeaderInfo 888 889Usage is 890 891 $hdr = $z->getHeaderInfo(); 892 @hdrs = $z->getHeaderInfo(); 893 894This method returns either a hash reference (in scalar context) or a list 895or hash references (in array context) that contains information about each 896of the header fields in the compressed data stream(s). 897 898=head2 tell 899 900Usage is 901 902 $z->tell() 903 tell $z 904 905Returns the uncompressed file offset. 906 907=head2 eof 908 909Usage is 910 911 $z->eof(); 912 eof($z); 913 914Returns true if the end of the compressed input stream has been reached. 915 916=head2 seek 917 918 $z->seek($position, $whence); 919 seek($z, $position, $whence); 920 921Provides a sub-set of the C<seek> functionality, with the restriction 922that it is only legal to seek forward in the input file/buffer. 923It is a fatal error to attempt to seek backward. 924 925The C<$whence> parameter takes one the usual values, namely SEEK_SET, 926SEEK_CUR or SEEK_END. 927 928Returns 1 on success, 0 on failure. 929 930=head2 binmode 931 932Usage is 933 934 $z->binmode 935 binmode $z ; 936 937This is a noop provided for completeness. 938 939=head2 opened 940 941 $z->opened() 942 943Returns true if the object currently refers to a opened file/buffer. 944 945=head2 autoflush 946 947 my $prev = $z->autoflush() 948 my $prev = $z->autoflush(EXPR) 949 950If the C<$z> object is associated with a file or a filehandle, this method 951returns the current autoflush setting for the underlying filehandle. If 952C<EXPR> is present, and is non-zero, it will enable flushing after every 953write/print operation. 954 955If C<$z> is associated with a buffer, this method has no effect and always 956returns C<undef>. 957 958B<Note> that the special variable C<$|> B<cannot> be used to set or 959retrieve the autoflush setting. 960 961=head2 input_line_number 962 963 $z->input_line_number() 964 $z->input_line_number(EXPR) 965 966Returns the current uncompressed line number. If C<EXPR> is present it has 967the effect of setting the line number. Note that setting the line number 968does not change the current position within the file/buffer being read. 969 970The contents of C<$/> are used to to determine what constitutes a line 971terminator. 972 973=head2 fileno 974 975 $z->fileno() 976 fileno($z) 977 978If the C<$z> object is associated with a file or a filehandle, C<fileno> 979will return the underlying file descriptor. Once the C<close> method is 980called C<fileno> will return C<undef>. 981 982If the C<$z> object is is associated with a buffer, this method will return 983C<undef>. 984 985=head2 close 986 987 $z->close() ; 988 close $z ; 989 990Closes the output file/buffer. 991 992For most versions of Perl this method will be automatically invoked if 993the IO::Uncompress::RawInflate object is destroyed (either explicitly or by the 994variable with the reference to the object going out of scope). The 995exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In 996these cases, the C<close> method will be called automatically, but 997not until global destruction of all live objects when the program is 998terminating. 999 1000Therefore, if you want your scripts to be able to run on all versions 1001of Perl, you should call C<close> explicitly and not rely on automatic 1002closing. 1003 1004Returns true on success, otherwise 0. 1005 1006If the C<AutoClose> option has been enabled when the IO::Uncompress::RawInflate 1007object was created, and the object is associated with a file, the 1008underlying file will also be closed. 1009 1010=head2 nextStream 1011 1012Usage is 1013 1014 my $status = $z->nextStream(); 1015 1016Skips to the next compressed data stream in the input file/buffer. If a new 1017compressed data stream is found, the eof marker will be cleared and C<$.> 1018will be reset to 0. 1019 1020Returns 1 if a new stream was found, 0 if none was found, and -1 if an 1021error was encountered. 1022 1023=head2 trailingData 1024 1025Usage is 1026 1027 my $data = $z->trailingData(); 1028 1029Returns the data, if any, that is present immediately after the compressed 1030data stream once uncompression is complete. It only makes sense to call 1031this method once the end of the compressed data stream has been 1032encountered. 1033 1034This option can be used when there is useful information immediately 1035following the compressed data stream, and you don't know the length of the 1036compressed data stream. 1037 1038If the input is a buffer, C<trailingData> will return everything from the 1039end of the compressed data stream to the end of the buffer. 1040 1041If the input is a filehandle, C<trailingData> will return the data that is 1042left in the filehandle input buffer once the end of the compressed data 1043stream has been reached. You can then use the filehandle to read the rest 1044of the input file. 1045 1046Don't bother using C<trailingData> if the input is a filename. 1047 1048If you know the length of the compressed data stream before you start 1049uncompressing, you can avoid having to use C<trailingData> by setting the 1050C<InputLength> option in the constructor. 1051 1052=head1 Importing 1053 1054No symbolic constants are required by this IO::Uncompress::RawInflate at present. 1055 1056=over 5 1057 1058=item :all 1059 1060Imports C<rawinflate> and C<$RawInflateError>. 1061Same as doing this 1062 1063 use IO::Uncompress::RawInflate qw(rawinflate $RawInflateError) ; 1064 1065=back 1066 1067=head1 EXAMPLES 1068 1069=head2 Working with Net::FTP 1070 1071See L<IO::Uncompress::RawInflate::FAQ|IO::Uncompress::RawInflate::FAQ/"Compressed files and Net::FTP"> 1072 1073=head1 SEE ALSO 1074 1075L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress> 1076 1077L<Compress::Zlib::FAQ|Compress::Zlib::FAQ> 1078 1079L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>, 1080L<Archive::Tar|Archive::Tar>, 1081L<IO::Zlib|IO::Zlib> 1082 1083For RFC 1950, 1951 and 1952 see 1084F<http://www.faqs.org/rfcs/rfc1950.html>, 1085F<http://www.faqs.org/rfcs/rfc1951.html> and 1086F<http://www.faqs.org/rfcs/rfc1952.html> 1087 1088The I<zlib> compression library was written by Jean-loup Gailly 1089F<gzip@prep.ai.mit.edu> and Mark Adler F<madler@alumni.caltech.edu>. 1090 1091The primary site for the I<zlib> compression library is 1092F<http://www.zlib.org>. 1093 1094The primary site for gzip is F<http://www.gzip.org>. 1095 1096=head1 AUTHOR 1097 1098This module was written by Paul Marquess, F<pmqs@cpan.org>. 1099 1100=head1 MODIFICATION HISTORY 1101 1102See the Changes file. 1103 1104=head1 COPYRIGHT AND LICENSE 1105 1106Copyright (c) 2005-2010 Paul Marquess. All rights reserved. 1107 1108This program is free software; you can redistribute it and/or 1109modify it under the same terms as Perl itself. 1110 1111