1package IO::Uncompress::RawInflate ; 2# for RFC1951 3 4use strict ; 5use warnings; 6use bytes; 7 8use Compress::Raw::Zlib 2.084 ; 9use IO::Compress::Base::Common 2.084 qw(:Status ); 10 11use IO::Uncompress::Base 2.084 ; 12use IO::Uncompress::Adapter::Inflate 2.084 ; 13 14require Exporter ; 15our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, %DEFLATE_CONSTANTS, $RawInflateError); 16 17$VERSION = '2.084'; 18$RawInflateError = ''; 19 20@ISA = qw(IO::Uncompress::Base Exporter); 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 = IO::Compress::Base::Common::createSelfTiedObject($class, \$RawInflateError); 49 $obj->_create(undef, 0, @_); 50} 51 52sub rawinflate 53{ 54 my $obj = IO::Compress::Base::Common::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->getValue('crc32'), 78 $got->getValue('adler32'), 79 $got->getValue('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}->getValue('crc32'), 336 -ADLER32 => *$self->{Params}->getValue('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_filename_or_reference => $output_filename_or_reference [,OPTS] 414 or die "rawinflate failed: $RawInflateError\n"; 415 416The functional interface needs Perl5.005 or better. 417 418=head2 rawinflate $input_filename_or_reference => $output_filename_or_reference [, OPTS] 419 420C<rawinflate> expects at least two parameters, 421C<$input_filename_or_reference> and C<$output_filename_or_reference>. 422 423=head3 The C<$input_filename_or_reference> parameter 424 425The parameter, C<$input_filename_or_reference>, is used to define the 426source of the compressed data. 427 428It can take one of the following forms: 429 430=over 5 431 432=item A filename 433 434If the <$input_filename_or_reference> parameter is a simple scalar, it is 435assumed to be a filename. This file will be opened for reading and the 436input data will be read from it. 437 438=item A filehandle 439 440If the C<$input_filename_or_reference> parameter is a filehandle, the input 441data will be read from it. The string '-' can be used as an alias for 442standard input. 443 444=item A scalar reference 445 446If C<$input_filename_or_reference> is a scalar reference, the input data 447will be read from C<$$input_filename_or_reference>. 448 449=item An array reference 450 451If C<$input_filename_or_reference> is an array reference, each element in 452the array must be a filename. 453 454The input data will be read from each file in turn. 455 456The complete array will be walked to ensure that it only 457contains valid filenames before any data is uncompressed. 458 459=item An Input FileGlob string 460 461If C<$input_filename_or_reference> is a string that is delimited by the 462characters "<" and ">" C<rawinflate> will assume that it is an 463I<input fileglob string>. The input is the list of files that match the 464fileglob. 465 466See L<File::GlobMapper|File::GlobMapper> for more details. 467 468=back 469 470If the C<$input_filename_or_reference> parameter is any other type, 471C<undef> will be returned. 472 473=head3 The C<$output_filename_or_reference> parameter 474 475The parameter C<$output_filename_or_reference> is used to control the 476destination of the uncompressed data. This parameter can take one of 477these forms. 478 479=over 5 480 481=item A filename 482 483If the C<$output_filename_or_reference> parameter is a simple scalar, it is 484assumed to be a filename. This file will be opened for writing and the 485uncompressed data will be written to it. 486 487=item A filehandle 488 489If the C<$output_filename_or_reference> parameter is a filehandle, the 490uncompressed data will be written to it. The string '-' can be used as 491an alias for standard output. 492 493=item A scalar reference 494 495If C<$output_filename_or_reference> is a scalar reference, the 496uncompressed data will be stored in C<$$output_filename_or_reference>. 497 498=item An Array Reference 499 500If C<$output_filename_or_reference> is an array reference, 501the uncompressed data will be pushed onto the array. 502 503=item An Output FileGlob 504 505If C<$output_filename_or_reference> is a string that is delimited by the 506characters "<" and ">" C<rawinflate> will assume that it is an 507I<output fileglob string>. The output is the list of files that match the 508fileglob. 509 510When C<$output_filename_or_reference> is an fileglob string, 511C<$input_filename_or_reference> must also be a fileglob string. Anything 512else is an error. 513 514See L<File::GlobMapper|File::GlobMapper> for more details. 515 516=back 517 518If the C<$output_filename_or_reference> parameter is any other type, 519C<undef> will be returned. 520 521=head2 Notes 522 523When C<$input_filename_or_reference> maps to multiple compressed 524files/buffers and C<$output_filename_or_reference> is 525a single file/buffer, after uncompression C<$output_filename_or_reference> will contain a 526concatenation of all the uncompressed data from each of the input 527files/buffers. 528 529=head2 Optional Parameters 530 531Unless specified below, the optional parameters for C<rawinflate>, 532C<OPTS>, are the same as those used with the OO interface defined in the 533L</"Constructor Options"> section below. 534 535=over 5 536 537=item C<< AutoClose => 0|1 >> 538 539This option applies to any input or output data streams to 540C<rawinflate> that are filehandles. 541 542If C<AutoClose> is specified, and the value is true, it will result in all 543input and/or output filehandles being closed once C<rawinflate> has 544completed. 545 546This parameter defaults to 0. 547 548=item C<< BinModeOut => 0|1 >> 549 550This option is now a no-op. All files will be written in binmode. 551 552=item C<< Append => 0|1 >> 553 554The behaviour of this option is dependent on the type of output data 555stream. 556 557=over 5 558 559=item * A Buffer 560 561If C<Append> is enabled, all uncompressed data will be append to the end of 562the output buffer. Otherwise the output buffer will be cleared before any 563uncompressed data is written to it. 564 565=item * A Filename 566 567If C<Append> is enabled, the file will be opened in append mode. Otherwise 568the contents of the file, if any, will be truncated before any uncompressed 569data is written to it. 570 571=item * A Filehandle 572 573If C<Append> is enabled, the filehandle will be positioned to the end of 574the file via a call to C<seek> before any uncompressed data is 575written to it. Otherwise the file pointer will not be moved. 576 577=back 578 579When C<Append> is specified, and set to true, it will I<append> all uncompressed 580data to the output data stream. 581 582So when the output is a filehandle it will carry out a seek to the eof 583before writing any uncompressed data. If the output is a filename, it will be opened for 584appending. If the output is a buffer, all uncompressed data will be 585appended to the existing buffer. 586 587Conversely when C<Append> is not specified, or it is present and is set to 588false, it will operate as follows. 589 590When the output is a filename, it will truncate the contents of the file 591before writing any uncompressed data. If the output is a filehandle 592its position will not be changed. If the output is a buffer, it will be 593wiped before any uncompressed data is output. 594 595Defaults to 0. 596 597=item C<< MultiStream => 0|1 >> 598 599This option is a no-op. 600 601=item C<< TrailingData => $scalar >> 602 603Returns the data, if any, that is present immediately after the compressed 604data stream once uncompression is complete. 605 606This option can be used when there is useful information immediately 607following the compressed data stream, and you don't know the length of the 608compressed data stream. 609 610If the input is a buffer, C<trailingData> will return everything from the 611end of the compressed data stream to the end of the buffer. 612 613If the input is a filehandle, C<trailingData> will return the data that is 614left in the filehandle input buffer once the end of the compressed data 615stream has been reached. You can then use the filehandle to read the rest 616of the input file. 617 618Don't bother using C<trailingData> if the input is a filename. 619 620If you know the length of the compressed data stream before you start 621uncompressing, you can avoid having to use C<trailingData> by setting the 622C<InputLength> option. 623 624=back 625 626=head2 Examples 627 628To read the contents of the file C<file1.txt.1951> and write the 629uncompressed data to the file C<file1.txt>. 630 631 use strict ; 632 use warnings ; 633 use IO::Uncompress::RawInflate qw(rawinflate $RawInflateError) ; 634 635 my $input = "file1.txt.1951"; 636 my $output = "file1.txt"; 637 rawinflate $input => $output 638 or die "rawinflate failed: $RawInflateError\n"; 639 640To read from an existing Perl filehandle, C<$input>, and write the 641uncompressed data to a buffer, C<$buffer>. 642 643 use strict ; 644 use warnings ; 645 use IO::Uncompress::RawInflate qw(rawinflate $RawInflateError) ; 646 use IO::File ; 647 648 my $input = new IO::File "<file1.txt.1951" 649 or die "Cannot open 'file1.txt.1951': $!\n" ; 650 my $buffer ; 651 rawinflate $input => \$buffer 652 or die "rawinflate failed: $RawInflateError\n"; 653 654To uncompress all files in the directory "/my/home" that match "*.txt.1951" and store the compressed data in the same directory 655 656 use strict ; 657 use warnings ; 658 use IO::Uncompress::RawInflate qw(rawinflate $RawInflateError) ; 659 660 rawinflate '</my/home/*.txt.1951>' => '</my/home/#1.txt>' 661 or die "rawinflate failed: $RawInflateError\n"; 662 663and if you want to compress each file one at a time, this will do the trick 664 665 use strict ; 666 use warnings ; 667 use IO::Uncompress::RawInflate qw(rawinflate $RawInflateError) ; 668 669 for my $input ( glob "/my/home/*.txt.1951" ) 670 { 671 my $output = $input; 672 $output =~ s/.1951// ; 673 rawinflate $input => $output 674 or die "Error compressing '$input': $RawInflateError\n"; 675 } 676 677=head1 OO Interface 678 679=head2 Constructor 680 681The format of the constructor for IO::Uncompress::RawInflate is shown below 682 683 my $z = new IO::Uncompress::RawInflate $input [OPTS] 684 or die "IO::Uncompress::RawInflate failed: $RawInflateError\n"; 685 686Returns an C<IO::Uncompress::RawInflate> object on success and undef on failure. 687The variable C<$RawInflateError> will contain an error message on failure. 688 689If you are running Perl 5.005 or better the object, C<$z>, returned from 690IO::Uncompress::RawInflate can be used exactly like an L<IO::File|IO::File> filehandle. 691This means that all normal input file operations can be carried out with 692C<$z>. For example, to read a line from a compressed file/buffer you can 693use either of these forms 694 695 $line = $z->getline(); 696 $line = <$z>; 697 698The mandatory parameter C<$input> is used to determine the source of the 699compressed data. This parameter can take one of three forms. 700 701=over 5 702 703=item A filename 704 705If the C<$input> parameter is a scalar, it is assumed to be a filename. This 706file will be opened for reading and the compressed data will be read from it. 707 708=item A filehandle 709 710If the C<$input> parameter is a filehandle, the compressed data will be 711read from it. 712The string '-' can be used as an alias for standard input. 713 714=item A scalar reference 715 716If C<$input> is a scalar reference, the compressed data will be read from 717C<$$input>. 718 719=back 720 721=head2 Constructor Options 722 723The option names defined below are case insensitive and can be optionally 724prefixed by a '-'. So all of the following are valid 725 726 -AutoClose 727 -autoclose 728 AUTOCLOSE 729 autoclose 730 731OPTS is a combination of the following options: 732 733=over 5 734 735=item C<< AutoClose => 0|1 >> 736 737This option is only valid when the C<$input> parameter is a filehandle. If 738specified, and the value is true, it will result in the file being closed once 739either the C<close> method is called or the IO::Uncompress::RawInflate object is 740destroyed. 741 742This parameter defaults to 0. 743 744=item C<< MultiStream => 0|1 >> 745 746Allows multiple concatenated compressed streams to be treated as a single 747compressed stream. Decompression will stop once either the end of the 748file/buffer is reached, an error is encountered (premature eof, corrupt 749compressed data) or the end of a stream is not immediately followed by the 750start of another stream. 751 752This parameter defaults to 0. 753 754=item C<< Prime => $string >> 755 756This option will uncompress the contents of C<$string> before processing the 757input file/buffer. 758 759This option can be useful when the compressed data is embedded in another 760file/data structure and it is not possible to work out where the compressed 761data begins without having to read the first few bytes. If this is the 762case, the uncompression can be I<primed> with these bytes using this 763option. 764 765=item C<< Transparent => 0|1 >> 766 767If this option is set and the input file/buffer is not compressed data, 768the module will allow reading of it anyway. 769 770In addition, if the input file/buffer does contain compressed data and 771there is non-compressed data immediately following it, setting this option 772will make this module treat the whole file/buffer as a single data stream. 773 774This option defaults to 1. 775 776=item C<< BlockSize => $num >> 777 778When reading the compressed input data, IO::Uncompress::RawInflate will read it in 779blocks of C<$num> bytes. 780 781This option defaults to 4096. 782 783=item C<< InputLength => $size >> 784 785When present this option will limit the number of compressed bytes read 786from the input file/buffer to C<$size>. This option can be used in the 787situation where there is useful data directly after the compressed data 788stream and you know beforehand the exact length of the compressed data 789stream. 790 791This option is mostly used when reading from a filehandle, in which case 792the file pointer will be left pointing to the first byte directly after the 793compressed data stream. 794 795This option defaults to off. 796 797=item C<< Append => 0|1 >> 798 799This option controls what the C<read> method does with uncompressed data. 800 801If set to 1, all uncompressed data will be appended to the output parameter 802of the C<read> method. 803 804If set to 0, the contents of the output parameter of the C<read> method 805will be overwritten by the uncompressed data. 806 807Defaults to 0. 808 809=item C<< Strict => 0|1 >> 810 811This option is a no-op. 812 813=back 814 815=head2 Examples 816 817TODO 818 819=head1 Methods 820 821=head2 read 822 823Usage is 824 825 $status = $z->read($buffer) 826 827Reads a block of compressed data (the size of the compressed block is 828determined by the C<Buffer> option in the constructor), uncompresses it and 829writes any uncompressed data into C<$buffer>. If the C<Append> parameter is 830set in the constructor, the uncompressed data will be appended to the 831C<$buffer> parameter. Otherwise C<$buffer> will be overwritten. 832 833Returns the number of uncompressed bytes written to C<$buffer>, zero if eof 834or a negative number on error. 835 836=head2 read 837 838Usage is 839 840 $status = $z->read($buffer, $length) 841 $status = $z->read($buffer, $length, $offset) 842 843 $status = read($z, $buffer, $length) 844 $status = read($z, $buffer, $length, $offset) 845 846Attempt to read C<$length> bytes of uncompressed data into C<$buffer>. 847 848The main difference between this form of the C<read> method and the 849previous one, is that this one will attempt to return I<exactly> C<$length> 850bytes. The only circumstances that this function will not is if end-of-file 851or an IO error is encountered. 852 853Returns the number of uncompressed bytes written to C<$buffer>, zero if eof 854or a negative number on error. 855 856=head2 getline 857 858Usage is 859 860 $line = $z->getline() 861 $line = <$z> 862 863Reads a single line. 864 865This method fully supports the use of the variable C<$/> (or 866C<$INPUT_RECORD_SEPARATOR> or C<$RS> when C<English> is in use) to 867determine what constitutes an end of line. Paragraph mode, record mode and 868file slurp mode are all supported. 869 870=head2 getc 871 872Usage is 873 874 $char = $z->getc() 875 876Read a single character. 877 878=head2 ungetc 879 880Usage is 881 882 $char = $z->ungetc($string) 883 884=head2 inflateSync 885 886Usage is 887 888 $status = $z->inflateSync() 889 890TODO 891 892=head2 getHeaderInfo 893 894Usage is 895 896 $hdr = $z->getHeaderInfo(); 897 @hdrs = $z->getHeaderInfo(); 898 899This method returns either a hash reference (in scalar context) or a list 900or hash references (in array context) that contains information about each 901of the header fields in the compressed data stream(s). 902 903=head2 tell 904 905Usage is 906 907 $z->tell() 908 tell $z 909 910Returns the uncompressed file offset. 911 912=head2 eof 913 914Usage is 915 916 $z->eof(); 917 eof($z); 918 919Returns true if the end of the compressed input stream has been reached. 920 921=head2 seek 922 923 $z->seek($position, $whence); 924 seek($z, $position, $whence); 925 926Provides a sub-set of the C<seek> functionality, with the restriction 927that it is only legal to seek forward in the input file/buffer. 928It is a fatal error to attempt to seek backward. 929 930Note that the implementation of C<seek> in this module does not provide 931true random access to a compressed file/buffer. It works by uncompressing 932data from the current offset in the file/buffer until it reaches the 933uncompressed offset specified in the parameters to C<seek>. For very small 934files this may be acceptable behaviour. For large files it may cause an 935unacceptable delay. 936 937The C<$whence> parameter takes one the usual values, namely SEEK_SET, 938SEEK_CUR or SEEK_END. 939 940Returns 1 on success, 0 on failure. 941 942=head2 binmode 943 944Usage is 945 946 $z->binmode 947 binmode $z ; 948 949This is a noop provided for completeness. 950 951=head2 opened 952 953 $z->opened() 954 955Returns true if the object currently refers to a opened file/buffer. 956 957=head2 autoflush 958 959 my $prev = $z->autoflush() 960 my $prev = $z->autoflush(EXPR) 961 962If the C<$z> object is associated with a file or a filehandle, this method 963returns the current autoflush setting for the underlying filehandle. If 964C<EXPR> is present, and is non-zero, it will enable flushing after every 965write/print operation. 966 967If C<$z> is associated with a buffer, this method has no effect and always 968returns C<undef>. 969 970B<Note> that the special variable C<$|> B<cannot> be used to set or 971retrieve the autoflush setting. 972 973=head2 input_line_number 974 975 $z->input_line_number() 976 $z->input_line_number(EXPR) 977 978Returns the current uncompressed line number. If C<EXPR> is present it has 979the effect of setting the line number. Note that setting the line number 980does not change the current position within the file/buffer being read. 981 982The contents of C<$/> are used to determine what constitutes a line 983terminator. 984 985=head2 fileno 986 987 $z->fileno() 988 fileno($z) 989 990If the C<$z> object is associated with a file or a filehandle, C<fileno> 991will return the underlying file descriptor. Once the C<close> method is 992called C<fileno> will return C<undef>. 993 994If the C<$z> object is associated with a buffer, this method will return 995C<undef>. 996 997=head2 close 998 999 $z->close() ; 1000 close $z ; 1001 1002Closes the output file/buffer. 1003 1004For most versions of Perl this method will be automatically invoked if 1005the IO::Uncompress::RawInflate object is destroyed (either explicitly or by the 1006variable with the reference to the object going out of scope). The 1007exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In 1008these cases, the C<close> method will be called automatically, but 1009not until global destruction of all live objects when the program is 1010terminating. 1011 1012Therefore, if you want your scripts to be able to run on all versions 1013of Perl, you should call C<close> explicitly and not rely on automatic 1014closing. 1015 1016Returns true on success, otherwise 0. 1017 1018If the C<AutoClose> option has been enabled when the IO::Uncompress::RawInflate 1019object was created, and the object is associated with a file, the 1020underlying file will also be closed. 1021 1022=head2 nextStream 1023 1024Usage is 1025 1026 my $status = $z->nextStream(); 1027 1028Skips to the next compressed data stream in the input file/buffer. If a new 1029compressed data stream is found, the eof marker will be cleared and C<$.> 1030will be reset to 0. 1031 1032Returns 1 if a new stream was found, 0 if none was found, and -1 if an 1033error was encountered. 1034 1035=head2 trailingData 1036 1037Usage is 1038 1039 my $data = $z->trailingData(); 1040 1041Returns the data, if any, that is present immediately after the compressed 1042data stream once uncompression is complete. It only makes sense to call 1043this method once the end of the compressed data stream has been 1044encountered. 1045 1046This option can be used when there is useful information immediately 1047following the compressed data stream, and you don't know the length of the 1048compressed data stream. 1049 1050If the input is a buffer, C<trailingData> will return everything from the 1051end of the compressed data stream to the end of the buffer. 1052 1053If the input is a filehandle, C<trailingData> will return the data that is 1054left in the filehandle input buffer once the end of the compressed data 1055stream has been reached. You can then use the filehandle to read the rest 1056of the input file. 1057 1058Don't bother using C<trailingData> if the input is a filename. 1059 1060If you know the length of the compressed data stream before you start 1061uncompressing, you can avoid having to use C<trailingData> by setting the 1062C<InputLength> option in the constructor. 1063 1064=head1 Importing 1065 1066No symbolic constants are required by this IO::Uncompress::RawInflate at present. 1067 1068=over 5 1069 1070=item :all 1071 1072Imports C<rawinflate> and C<$RawInflateError>. 1073Same as doing this 1074 1075 use IO::Uncompress::RawInflate qw(rawinflate $RawInflateError) ; 1076 1077=back 1078 1079=head1 EXAMPLES 1080 1081=head2 Working with Net::FTP 1082 1083See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP"> 1084 1085=head1 SEE ALSO 1086 1087L<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::Lzip>, L<IO::Uncompress::UnLzip>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Compress::Zstd>, L<IO::Uncompress::UnZstd>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress> 1088 1089L<IO::Compress::FAQ|IO::Compress::FAQ> 1090 1091L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>, 1092L<Archive::Tar|Archive::Tar>, 1093L<IO::Zlib|IO::Zlib> 1094 1095For RFC 1950, 1951 and 1952 see 1096L<http://www.faqs.org/rfcs/rfc1950.html>, 1097L<http://www.faqs.org/rfcs/rfc1951.html> and 1098L<http://www.faqs.org/rfcs/rfc1952.html> 1099 1100The I<zlib> compression library was written by Jean-loup Gailly 1101C<gzip@prep.ai.mit.edu> and Mark Adler C<madler@alumni.caltech.edu>. 1102 1103The primary site for the I<zlib> compression library is 1104L<http://www.zlib.org>. 1105 1106The primary site for gzip is L<http://www.gzip.org>. 1107 1108=head1 AUTHOR 1109 1110This module was written by Paul Marquess, C<pmqs@cpan.org>. 1111 1112=head1 MODIFICATION HISTORY 1113 1114See the Changes file. 1115 1116=head1 COPYRIGHT AND LICENSE 1117 1118Copyright (c) 2005-2019 Paul Marquess. All rights reserved. 1119 1120This program is free software; you can redistribute it and/or 1121modify it under the same terms as Perl itself. 1122 1123