File Coverage

blib/lib/IO/Uncompress/Adapter/Identity.pm
Criterion Covered Total %
statement 64 89 71.9
branch 21 36 58.3
condition 5 18 27.7
subroutine 9 14 64.2
pod 0 8 0.0
total 99 165 60.0


line stmt bran cond sub pod time code
1             package IO::Uncompress::Adapter::Identity;
2              
3 83     83   1537 use warnings;
  83         170  
  83         4992  
4 83     83   446 use strict;
  83         218  
  83         2051  
5 83     83   388 use bytes;
  83         161  
  83         521  
6              
7 83     83   3289 use IO::Compress::Base::Common 2.220 qw(:Status);
  83         1831  
  83         11518  
8 83     83   39736 use IO::Compress::Zip::Constants ;
  83         292  
  83         23008  
9              
10             our ($VERSION);
11              
12             $VERSION = '2.220';
13              
14 83     83   694 use Compress::Raw::Zlib 2.218 ();
  83         1761  
  83         80596  
15              
16             sub mkUncompObject
17             {
18 77     77 0 142 my $streaming = shift;
19 77         133 my $zip64 = shift;
20              
21 77         175 my $crc32 = 1; #shift ;
22 77         161 my $adler32 = shift;
23              
24 77 100       299 bless { 'CompSize' => U64->new(), # 0,
25             'UnCompSize' => 0,
26             'wantCRC32' => $crc32,
27             'CRC32' => Compress::Raw::Zlib::crc32(''),
28             'wantADLER32'=> $adler32,
29             'ADLER32' => Compress::Raw::Zlib::adler32(''),
30             'ConsumesInput' => 1,
31             'Streaming' => $streaming,
32             'Zip64' => $zip64,
33             'DataHdrSize' => $zip64 ? 24 : 16,
34             'Pending' => '',
35              
36             } ;
37             }
38              
39              
40             sub uncompr
41             {
42 72     72 0 142 my $self = shift;
43 72         144 my $in = $_[0];
44 72         153 my $eof = $_[2];
45              
46 72         128 my $len = length $$in;
47 72         159 my $remainder = '';
48              
49 72 100 66     375 if (defined $$in && $len) {
50              
51 51 100       2317 if ($self->{Streaming}) {
52              
53 25 50       117 if (length $self->{Pending}) {
54 0         0 $$in = $self->{Pending} . $$in ;
55 0         0 $len = length $$in;
56 0         0 $self->{Pending} = '';
57             }
58              
59 25         85 my $ind = index($$in, "\x50\x4b\x07\x08");
60              
61 25 50       103 if ($ind < 0) {
62 0         0 $len = length $$in;
63 0 0 0     0 if ($len >= 3 && substr($$in, -3) eq "\x50\x4b\x07") {
    0 0        
    0 0        
64 0         0 $ind = $len - 3 ;
65             }
66             elsif ($len >= 2 && substr($$in, -2) eq "\x50\x4b") {
67 0         0 $ind = $len - 2 ;
68             }
69             elsif ($len >= 1 && substr($$in, -1) eq "\x50") {
70 0         0 $ind = $len - 1 ;
71             }
72             }
73              
74 25 50       77 if ($ind >= 0) {
75 25         86 $remainder = substr($$in, $ind) ;
76 25         82 substr($$in, $ind) = '' ;
77             }
78             }
79              
80 51 50 66     289 if (length $remainder && length $remainder < $self->{DataHdrSize}) {
    100          
81 0         0 $self->{Pending} = $remainder ;
82 0         0 $remainder = '';
83             }
84             elsif (length $remainder >= $self->{DataHdrSize}) {
85 25         99 my $crc = unpack "V", substr($remainder, 4);
86 25 50       153 if ($crc == Compress::Raw::Zlib::crc32($$in, $self->{CRC32})) {
87 25         53 my ($l1, $l2) ;
88              
89 25 100       67 if ($self->{Zip64}) {
90 12         62 $l1 = U64::newUnpack_V64(substr($remainder, 8));
91 12         46 $l2 = U64::newUnpack_V64(substr($remainder, 16));
92             }
93             else {
94 13         71 $l1 = U64::newUnpack_V32(substr($remainder, 8));
95 13         43 $l2 = U64::newUnpack_V32(substr($remainder, 12));
96             }
97              
98 25         105 my $newLen = $self->{CompSize}->clone();
99 25         110 $newLen->add(length $$in);
100 25 50 33     83 if ($l1->equal($l2) && $l1->equal($newLen) ) {
101 25         88 $eof = 1;
102             }
103             else {
104 0         0 $$in .= substr($remainder, 0, 4) ;
105 0         0 $remainder = substr($remainder, 4);
106             #$self->{Pending} = substr($remainder, 4);
107             #$remainder = '';
108 0         0 $eof = 0;
109             }
110             }
111             else {
112 0         0 $$in .= substr($remainder, 0, 4) ;
113 0         0 $remainder = substr($remainder, 4);
114             #$self->{Pending} = substr($remainder, 4);
115             #$remainder = '';
116 0         0 $eof = 0;
117             }
118             }
119              
120 51 50       156 if (length $$in) {
121 51         288 $self->{CompSize}->add(length $$in) ;
122              
123             $self->{CRC32} = Compress::Raw::Zlib::crc32($$in, $self->{CRC32})
124 51 50       355 if $self->{wantCRC32};
125              
126             $self->{ADLER32} = Compress::Zlib::adler32($$in, $self->{ADLER32})
127 51 50       156 if $self->{wantADLER32};
128             }
129              
130 51         82 ${ $_[1] } .= $$in;
  51         191  
131 51         104 $$in = $remainder;
132             }
133              
134 72 100       242 return STATUS_ENDSTREAM if $eof;
135 26         81 return STATUS_OK ;
136             }
137              
138             sub reset
139             {
140 13     13 0 31 my $self = shift;
141              
142 13         67 $self->{CompSize}->reset();
143 13         30 $self->{UnCompSize} = 0;
144 13         49 $self->{CRC32} = Compress::Raw::Zlib::crc32('');
145 13         48 $self->{ADLER32} = Compress::Raw::Zlib::adler32('');
146              
147 13         32 return STATUS_OK ;
148             }
149              
150             #sub count
151             #{
152             # my $self = shift ;
153             # return $self->{UnCompSize} ;
154             #}
155              
156             sub compressedBytes
157             {
158 0     0 0   my $self = shift ;
159 0           return $self->{CompSize} ;
160             }
161              
162             sub uncompressedBytes
163             {
164 0     0 0   my $self = shift ;
165 0           return $self->{CompSize} ;
166             }
167              
168             sub sync
169             {
170 0     0 0   return STATUS_OK ;
171             }
172              
173             sub crc32
174             {
175 0     0 0   my $self = shift ;
176 0           return $self->{CRC32};
177             }
178              
179             sub adler32
180             {
181 0     0 0   my $self = shift ;
182 0           return $self->{ADLER32};
183             }
184              
185              
186             1;
187              
188             __END__