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   7705 use strict ;
  84         166  
  84         2398  
5 84     84   421 use warnings;
  84         187  
  84         1910  
6 84     84   406 use bytes;
  84         237  
  84         450  
7              
8 84     84   2550 use Compress::Raw::Zlib 2.205 ;
  84         1564  
  84         20546  
9 84     84   618 use IO::Compress::Base::Common 2.205 qw(:Status );
  84         1261  
  84         9744  
10              
11 84     84   24392 use IO::Uncompress::Base 2.205 ;
  84         1559  
  84         4667  
12 84     84   20339 use IO::Uncompress::Adapter::Inflate 2.205 ;
  84         1486  
  84         124079  
13              
14             require Exporter ;
15             our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, %DEFLATE_CONSTANTS, $RawInflateError);
16              
17             $VERSION = '2.205';
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 48215 my $class = shift ;
48 273         982 my $obj = IO::Compress::Base::Common::createSelfTiedObject($class, \$RawInflateError);
49 273         1047 $obj->_create(undef, 0, @_);
50             }
51              
52             sub rawinflate
53             {
54 66     66 1 45441 my $obj = IO::Compress::Base::Common::createSelfTiedObject(undef, \$RawInflateError);
55 66         229 return $obj->_inf(@_);
56             }
57              
58             sub getExtraParams
59             {
60 322     322 0 2241 return ();
61             }
62              
63             sub ckParams
64             {
65 330     330 0 593 my $self = shift ;
66 330         502 my $got = shift ;
67              
68 330         798 return 1;
69             }
70              
71             sub mkUncomp
72             {
73 1143     1143 0 1994 my $self = shift ;
74 1143         1689 my $got = shift ;
75              
76 1143         2681 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       3202 return $self->saveErrorString(undef, $errstr, $errno)
83             if ! defined $obj;
84              
85 1143         2755 *$self->{Uncomp} = $obj;
86              
87 1143 100       3961 my $magic = $self->ckMagic()
88             or return 0;
89              
90 967 100       2767 *$self->{Info} = $self->readHeader($magic)
91             or return undef ;
92              
93 942         3075 return 1;
94              
95             }
96              
97              
98             sub ckMagic
99             {
100 2096     2096 0 3482 my $self = shift;
101              
102 2096         4467 return $self->_isRaw() ;
103             }
104              
105             sub readHeader
106             {
107 883     883 0 1353 my $self = shift;
108 883         1277 my $magic = shift ;
109              
110             return {
111 883         4097 'Type' => 'rfc1951',
112             'FingerprintLength' => 0,
113             'HeaderLength' => 0,
114             'TrailerLength' => 0,
115             'Header' => ''
116             };
117             }
118              
119             sub chkTrailer
120             {
121 4     4 0 18 return STATUS_OK ;
122             }
123              
124             sub _isRaw
125             {
126 2096     2096   3065 my $self = shift ;
127              
128 2096         4795 my $got = $self->_isRawx(@_);
129              
130 2096 100       4478 if ($got) {
131 883         1813 *$self->{Pending} = *$self->{HeaderPending} ;
132             }
133             else {
134 1213         3906 $self->pushBack(*$self->{HeaderPending});
135 1213         3431 *$self->{Uncomp}->reset();
136             }
137 2096         3867 *$self->{HeaderPending} = '';
138              
139 2096         5369 return $got ;
140             }
141              
142             sub _isRawx
143             {
144 2096     2096   3059 my $self = shift ;
145 2096         3091 my $magic = shift ;
146              
147 2096 50       5109 $magic = '' unless defined $magic ;
148              
149 2096         3381 my $buffer = '';
150              
151 2096 50       7202 $self->smartRead(\$buffer, *$self->{BlockSize}) >= 0
152             or return $self->saveErrorString(undef, "No data to read");
153              
154 2096         5162 my $temp_buf = $magic . $buffer ;
155 2096         4689 *$self->{HeaderPending} = $temp_buf ;
156 2096         3342 $buffer = '';
157 2096         6233 my $status = *$self->{Uncomp}->uncompr(\$temp_buf, \$buffer, $self->smartEof()) ;
158              
159 2096 100       10531 return $self->saveErrorString(undef, *$self->{Uncomp}{Error}, STATUS_ERROR)
160             if $status == STATUS_ERROR;
161              
162 920         2838 $self->pushBack($temp_buf) ;
163              
164 920 100 100     2197 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         1680 my $buf_len = length $buffer;
169              
170 883 100       1823 if ($status == STATUS_ENDSTREAM) {
171 876 100 66     2879 if (*$self->{MultiStream}
      100        
172             && (length $temp_buf || ! $self->smartEof())){
173 234         457 *$self->{NewStream} = 1 ;
174 234         407 *$self->{EndStream} = 0 ;
175             }
176             else {
177 642         1215 *$self->{EndStream} = 1 ;
178             }
179             }
180 883         1867 *$self->{HeaderPending} = $buffer ;
181 883         1429 *$self->{InflatedBytesRead} = $buf_len ;
182 883         1426 *$self->{TotalInflatedBytesRead} += $buf_len ;
183 883         1514 *$self->{Type} = 'rfc1951';
184              
185 883         2556 $self->saveStatus(STATUS_OK);
186              
187             return {
188 883         3661 'Type' => 'rfc1951',
189             'HeaderLength' => 0,
190             'TrailerLength' => 0,
191             'Header' => ''
192             };
193             }
194              
195              
196             sub inflateSync
197             {
198 16     16 1 830 my $self = shift ;
199              
200             # inflateSync is a no-op in Plain mode
201             return 1
202 16 100       79 if *$self->{Plain} ;
203              
204 12 100       50 return 0 if *$self->{Closed} ;
205             #return G_EOF if !length *$self->{Pending} && *$self->{EndStream} ;
206 8 0 33     32 return 0 if ! length *$self->{Pending} && *$self->{EndStream} ;
207              
208             # Disable CRC check
209 8         19 *$self->{Strict} = 0 ;
210              
211 8         14 my $status ;
212 8         15 while (1)
213             {
214 1188         1531 my $temp_buf ;
215              
216 1188 100       2011 if (length *$self->{Pending} )
217             {
218 8         32 $temp_buf = *$self->{Pending} ;
219 8         23 *$self->{Pending} = '';
220             }
221             else
222             {
223 1180         2407 $status = $self->smartRead(\$temp_buf, *$self->{BlockSize}) ;
224 1180 50       2286 return $self->saveErrorString(0, "Error Reading Data")
225             if $status < 0 ;
226              
227 1180 100       2052 if ($status == 0 ) {
228 4         25 *$self->{EndStream} = 1 ;
229 4         19 return $self->saveErrorString(0, "unexpected end of file", STATUS_ERROR);
230             }
231             }
232              
233 1184         2299 $status = *$self->{Uncomp}->sync($temp_buf) ;
234              
235 1184 100       5039 if ($status == STATUS_OK)
236             {
237 4         19 *$self->{Pending} .= $temp_buf ;
238 4         25 return 1 ;
239             }
240              
241 1180 50       2085 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 94 my $self = shift ;
288              
289 60 50       152 return 1 if *$self->{Closed} ;
290 60 50 33     333 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 81 my $self = shift ;
305              
306 60         137 my $headerLength = *$self->{Info}{HeaderLength};
307 60         207 my $block_offset = $headerLength + *$self->{Uncomp}->getLastBlockOffset();
308 60         170 $_[0] = $headerLength + *$self->{Uncomp}->getEndOffset();
309             #printf "# End $_[0], headerlen $headerLength \n";;
310             #printf "# block_offset $block_offset %x\n", $block_offset;
311 60         102 my $byte ;
312 60 50 33     174 ( $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         253 *$self->{Uncomp}->resetLastBlockByte($byte);
318             #printf "#to byte is %x\n", unpack('C*',$byte);
319              
320 60 50 33     185 ( $self->smartSeek($block_offset) &&
321             $self->smartWrite($byte) )
322             or return $self->saveErrorString(0, $!, $!);
323              
324             #$self->smartSeek($end_offset, 1);
325              
326 60         1754 return 1 ;
327             }
328              
329             sub createDeflate
330             {
331 60     60 0 102 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         208 -ADLER32 => *$self->{Params}->getValue('adler32'),
337             );
338              
339 60 50       411 return wantarray ? ($status, $def) : $def ;
340             }
341              
342              
343             1;
344              
345             __END__