1package IO::Uncompress::Adapter::Inflate; 2 3use strict; 4use warnings; 5use bytes; 6 7use IO::Compress::Base::Common 2.048 qw(:Status); 8use Compress::Raw::Zlib 2.048 qw(Z_OK Z_BUF_ERROR Z_STREAM_END Z_FINISH MAX_WBITS); 9 10our ($VERSION); 11$VERSION = '2.048'; 12 13 14 15sub mkUncompObject 16{ 17 my $crc32 = shift || 1; 18 my $adler32 = shift || 1; 19 my $scan = shift || 0; 20 21 my $inflate ; 22 my $status ; 23 24 if ($scan) 25 { 26 ($inflate, $status) = new Compress::Raw::Zlib::InflateScan 27 #LimitOutput => 1, 28 CRC32 => $crc32, 29 ADLER32 => $adler32, 30 WindowBits => - MAX_WBITS ; 31 } 32 else 33 { 34 ($inflate, $status) = new Compress::Raw::Zlib::Inflate 35 AppendOutput => 1, 36 LimitOutput => 1, 37 CRC32 => $crc32, 38 ADLER32 => $adler32, 39 WindowBits => - MAX_WBITS ; 40 } 41 42 return (undef, "Could not create Inflation object: $status", $status) 43 if $status != Z_OK ; 44 45 return bless {'Inf' => $inflate, 46 'CompSize' => 0, 47 'UnCompSize' => 0, 48 'Error' => '', 49 'ConsumesInput' => 1, 50 } ; 51 52} 53 54sub uncompr 55{ 56 my $self = shift ; 57 my $from = shift ; 58 my $to = shift ; 59 my $eof = shift ; 60 61 my $inf = $self->{Inf}; 62 63 my $status = $inf->inflate($from, $to, $eof); 64 $self->{ErrorNo} = $status; 65 66 if ($status != Z_OK && $status != Z_STREAM_END && $status != Z_BUF_ERROR) 67 { 68 $self->{Error} = "Inflation Error: $status"; 69 return STATUS_ERROR; 70 } 71 72 return STATUS_OK if $status == Z_BUF_ERROR ; # ??? 73 return STATUS_OK if $status == Z_OK ; 74 return STATUS_ENDSTREAM if $status == Z_STREAM_END ; 75 return STATUS_ERROR ; 76} 77 78sub reset 79{ 80 my $self = shift ; 81 $self->{Inf}->inflateReset(); 82 83 return STATUS_OK ; 84} 85 86#sub count 87#{ 88# my $self = shift ; 89# $self->{Inf}->inflateCount(); 90#} 91 92sub crc32 93{ 94 my $self = shift ; 95 $self->{Inf}->crc32(); 96} 97 98sub compressedBytes 99{ 100 my $self = shift ; 101 $self->{Inf}->compressedBytes(); 102} 103 104sub uncompressedBytes 105{ 106 my $self = shift ; 107 $self->{Inf}->uncompressedBytes(); 108} 109 110sub adler32 111{ 112 my $self = shift ; 113 $self->{Inf}->adler32(); 114} 115 116sub sync 117{ 118 my $self = shift ; 119 ( $self->{Inf}->inflateSync(@_) == Z_OK) 120 ? STATUS_OK 121 : STATUS_ERROR ; 122} 123 124 125sub getLastBlockOffset 126{ 127 my $self = shift ; 128 $self->{Inf}->getLastBlockOffset(); 129} 130 131sub getEndOffset 132{ 133 my $self = shift ; 134 $self->{Inf}->getEndOffset(); 135} 136 137sub resetLastBlockByte 138{ 139 my $self = shift ; 140 $self->{Inf}->resetLastBlockByte(@_); 141} 142 143sub createDeflateStream 144{ 145 my $self = shift ; 146 my $deflate = $self->{Inf}->createDeflateStream(@_); 147 return bless {'Def' => $deflate, 148 'CompSize' => 0, 149 'UnCompSize' => 0, 150 'Error' => '', 151 }, 'IO::Compress::Adapter::Deflate'; 152} 153 1541; 155 156 157__END__ 158 159