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