File Coverage

blib/lib/IO/Uncompress/RawInflate.pm
Criterion Covered Total %
statement 112 117 95.7
branch 34 48 70.8
condition 12 24 50.0
subroutine 21 21 100.0
pod 3 12 25.0
total 182 222 81.9


line stmt bran cond sub pod time code
1             package IO::Uncompress::RawInflate ;
2             # for RFC1951
3              
4 84     84   6790 use strict ;
  84         160  
  84         2207  
5 84     84   362 use warnings;
  84         149  
  84         1683  
6 84     84   364 use bytes;
  84         146  
  84         340  
7              
8 84     84   2233 use Compress::Raw::Zlib 2.206 ;
  84         1412  
  84         18079  
9 84     84   564 use IO::Compress::Base::Common 2.206 qw(:Status );
  84         1170  
  84         8899  
10              
11 84     84   20878 use IO::Uncompress::Base 2.206 ;
  84         1451  
  84         4002  
12 84     84   17586 use IO::Uncompress::Adapter::Inflate 2.206 ;
  84         1330  
  84         107808  
13              
14             require Exporter ;
15             our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, %DEFLATE_CONSTANTS, $RawInflateError);
16              
17             $VERSION = '2.206';
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 ;
24             push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
25             Exporter::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              
45             sub new
46             {
47 273     273 1 40705 my $class = shift ;
48 273         943 my $obj = IO::Compress::Base::Common::createSelfTiedObject($class, \$RawInflateError);
49 273         934 $obj->_create(undef, 0, @_);
50             }
51              
52             sub rawinflate
53             {
54 66     66 1 43633 my $obj = IO::Compress::Base::Common::createSelfTiedObject(undef, \$RawInflateError);
55 66         188 return $obj->_inf(@_);
56             }
57              
58             sub getExtraParams
59             {
60 322     322 0 1986 return ();
61             }
62              
63             sub ckParams
64             {
65 330     330 0 503 my $self = shift ;
66 330         405 my $got = shift ;
67              
68 330         734 return 1;
69             }
70              
71             sub mkUncomp
72             {
73 1143     1143 0 1749 my $self = shift ;
74 1143         1514 my $got = shift ;
75              
76 1143         2317 my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::Inflate::mkUncompObject(
77             $got->getValue('crc32'),
78             $got->getValue('adler32'),
79             $got->getValue('scan'),
80             );
81              
82 1143 50       2862 return $self->saveErrorString(undef, $errstr, $errno)
83             if ! defined $obj;
84              
85 1143         2339 *$self->{Uncomp} = $obj;
86              
87 1143 100       2875 my $magic = $self->ckMagic()
88             or return 0;
89              
90 967 100       2381 *$self->{Info} = $self->readHeader($magic)
91             or return undef ;
92              
93 942         2673 return 1;
94              
95             }
96              
97              
98             sub ckMagic
99             {
100 2096     2096 0 3103 my $self = shift;
101              
102 2096         4160 return $self->_isRaw() ;
103             }
104              
105             sub readHeader
106             {
107 883     883 0 1332 my $self = shift;
108 883         1109 my $magic = shift ;
109              
110             return {
111 883         3802 'Type' => 'rfc1951',
112             'FingerprintLength' => 0,
113             'HeaderLength' => 0,
114             'TrailerLength' => 0,
115             'Header' => ''
116             };
117             }
118              
119             sub chkTrailer
120             {
121 4     4 0 13 return STATUS_OK ;
122             }
123              
124             sub _isRaw
125             {
126 2096     2096   2856 my $self = shift ;
127              
128 2096         4495 my $got = $self->_isRawx(@_);
129              
130 2096 100       4013 if ($got) {
131 883         1667 *$self->{Pending} = *$self->{HeaderPending} ;
132             }
133             else {
134 1213         3490 $self->pushBack(*$self->{HeaderPending});
135 1213         2978 *$self->{Uncomp}->reset();
136             }
137 2096         3446 *$self->{HeaderPending} = '';
138              
139 2096         4875 return $got ;
140             }
141              
142             sub _isRawx
143             {
144 2096     2096   2875 my $self = shift ;
145 2096         5196 my $magic = shift ;
146              
147 2096 50       4606 $magic = '' unless defined $magic ;
148              
149 2096         3084 my $buffer = '';
150              
151 2096 50       6768 $self->smartRead(\$buffer, *$self->{BlockSize}) >= 0
152             or return $self->saveErrorString(undef, "No data to read");
153              
154 2096         4562 my $temp_buf = $magic . $buffer ;
155 2096         4463 *$self->{HeaderPending} = $temp_buf ;
156 2096         2987 $buffer = '';
157 2096         5696 my $status = *$self->{Uncomp}->uncompr(\$temp_buf, \$buffer, $self->smartEof()) ;
158              
159 2096 100       9482 return $self->saveErrorString(undef, *$self->{Uncomp}{Error}, STATUS_ERROR)
160             if $status == STATUS_ERROR;
161              
162 920         2555 $self->pushBack($temp_buf) ;
163              
164 920 100 100     2102 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 883         1510 my $buf_len = length $buffer;
169              
170 883 100       1625 if ($status == STATUS_ENDSTREAM) {
171 876 100 66     2725 if (*$self->{MultiStream}
      100        
172             && (length $temp_buf || ! $self->smartEof())){
173 234         380 *$self->{NewStream} = 1 ;
174 234         417 *$self->{EndStream} = 0 ;
175             }
176             else {
177 642         1167 *$self->{EndStream} = 1 ;
178             }
179             }
180 883         1753 *$self->{HeaderPending} = $buffer ;
181 883         1454 *$self->{InflatedBytesRead} = $buf_len ;
182 883         1310 *$self->{TotalInflatedBytesRead} += $buf_len ;
183 883         1376 *$self->{Type} = 'rfc1951';
184              
185 883         2212 $self->saveStatus(STATUS_OK);
186              
187             return {
188 883         3246 'Type' => 'rfc1951',
189             'HeaderLength' => 0,
190             'TrailerLength' => 0,
191             'Header' => ''
192             };
193             }
194              
195              
196             sub inflateSync
197             {
198 16     16 1 691 my $self = shift ;
199              
200             # inflateSync is a no-op in Plain mode
201             return 1
202 16 100       61 if *$self->{Plain} ;
203              
204 12 100       46 return 0 if *$self->{Closed} ;
205             #return G_EOF if !length *$self->{Pending} && *$self->{EndStream} ;
206 8 0 33     28 return 0 if ! length *$self->{Pending} && *$self->{EndStream} ;
207              
208             # Disable CRC check
209 8         19 *$self->{Strict} = 0 ;
210              
211 8         23 my $status ;
212 8         13 while (1)
213             {
214 1188         1331 my $temp_buf ;
215              
216 1188 100       1784 if (length *$self->{Pending} )
217             {
218 8         18 $temp_buf = *$self->{Pending} ;
219 8         28 *$self->{Pending} = '';
220             }
221             else
222             {
223 1180         2158 $status = $self->smartRead(\$temp_buf, *$self->{BlockSize}) ;
224 1180 50       1856 return $self->saveErrorString(0, "Error Reading Data")
225             if $status < 0 ;
226              
227 1180 100       1777 if ($status == 0 ) {
228 4         11 *$self->{EndStream} = 1 ;
229 4         17 return $self->saveErrorString(0, "unexpected end of file", STATUS_ERROR);
230             }
231             }
232              
233 1184         2044 $status = *$self->{Uncomp}->sync($temp_buf) ;
234              
235 1184 100       4522 if ($status == STATUS_OK)
236             {
237 4         12 *$self->{Pending} .= $temp_buf ;
238 4         15 return 1 ;
239             }
240              
241 1180 50       1812 last unless $status == STATUS_ERROR ;
242             }
243              
244 0         0 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              
285             sub scan
286             {
287 60     60 0 109 my $self = shift ;
288              
289 60 50       141 return 1 if *$self->{Closed} ;
290 60 50 33     327 return 1 if !length *$self->{Pending} && *$self->{EndStream} ;
291              
292 0         0 my $buffer = '' ;
293 0         0 my $len = 0;
294              
295             $len = $self->_raw_read(\$buffer, 1)
296 0   0     0 while ! *$self->{EndStream} && $len >= 0 ;
297              
298             #return $len if $len < 0 ? $len : 0 ;
299 0 0       0 return $len < 0 ? 0 : 1 ;
300             }
301              
302             sub zap
303             {
304 60     60 0 99 my $self = shift ;
305              
306 60         113 my $headerLength = *$self->{Info}{HeaderLength};
307 60         208 my $block_offset = $headerLength + *$self->{Uncomp}->getLastBlockOffset();
308 60         185 $_[0] = $headerLength + *$self->{Uncomp}->getEndOffset();
309             #printf "# End $_[0], headerlen $headerLength \n";;
310             #printf "# block_offset $block_offset %x\n", $block_offset;
311 60         104 my $byte ;
312 60 50 33     176 ( $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 60         257 *$self->{Uncomp}->resetLastBlockByte($byte);
318             #printf "#to byte is %x\n", unpack('C*',$byte);
319              
320 60 50 33     146 ( $self->smartSeek($block_offset) &&
321             $self->smartWrite($byte) )
322             or return $self->saveErrorString(0, $!, $!);
323              
324             #$self->smartSeek($end_offset, 1);
325              
326 60         1806 return 1 ;
327             }
328              
329             sub createDeflate
330             {
331 60     60 0 117 my $self = shift ;
332             my ($def, $status) = *$self->{Uncomp}->createDeflateStream(
333             -AppendOutput => 1,
334             -WindowBits => - MAX_WBITS,
335             -CRC32 => *$self->{Params}->getValue('crc32'),
336 60         205 -ADLER32 => *$self->{Params}->getValue('adler32'),
337             );
338              
339 60 50       395 return wantarray ? ($status, $def) : $def ;
340             }
341              
342              
343             1;
344              
345             __END__