1package IO::Compress::Adapter::LZO ;
2
3use strict;
4use warnings;
5use bytes;
6
7use IO::Compress::Base::Common  2.101 qw(:Status);
8use Compress::LZO qw(crc32 adler32);
9
10our ($VERSION);
11$VERSION = '2.101';
12
13sub mkCompObject
14{
15    my $blocksize = shift ;
16    my $optimize = shift ;
17    my $minimal = shift ;
18
19
20    return bless {
21                  'Buffer'     => '',
22                  'BlockSize'  => $blocksize,
23                  'Optimize'   => $optimize,
24                  'CRC'        => ! $minimal,
25                  'Error'      => '',
26                  'ErrorNo'    => 0,
27                  'CompBytes'  => 0,
28                  'UnCompBytes'=> 0,
29                 } ;
30}
31
32sub compr
33{
34    my $self = shift ;
35
36    $self->{Buffer} .= ${ $_[0] } ;
37    return $self->writeBlock(\$_[1], 0)
38        if length $self->{Buffer} >= $self->{BlockSize} ;
39
40
41    return STATUS_OK;
42}
43
44sub flush
45{
46    my $self = shift ;
47
48    return STATUS_OK
49        unless length $self->{Buffer};
50
51    return $self->writeBlock(\$_[0], 1);
52}
53
54sub close
55{
56    my $self = shift ;
57
58    return STATUS_OK
59        unless length $self->{Buffer};
60
61    return $self->writeBlock(\$_[0], 1);
62}
63
64sub writeBlock
65{
66    my $self = shift;
67    my $flush = $_[1] ;
68    my $blockSize = $self->{BlockSize} ;
69
70    while (length $self->{Buffer} >= $blockSize) {
71        my $buff = substr($self->{Buffer}, 0, $blockSize);
72        substr($self->{Buffer}, 0, $blockSize) = '';
73        $self->writeOneBlock(\$buff, $_[0]);
74    }
75
76    if ($flush && length $self->{Buffer} ) {
77        $self->writeOneBlock(\$self->{Buffer}, $_[0]);
78        $self->{Buffer} = '';
79    }
80
81    return STATUS_OK;
82}
83
84sub writeOneBlock
85{
86    my $self   = shift;
87    my $buff = shift;
88
89    #my $cmp = Compress::LZO::my_compress($self->{Buffer});
90    my $cmp = Compress::LZO::compress($$buff);
91
92    return STATUS_ERROR
93        unless defined $cmp;
94
95
96    if ($self->{Optimize}) {
97        my $oldLen = length $cmp;
98        $cmp = Compress::LZO::optimize($cmp);
99
100        return STATUS_ERROR
101            if ! defined $cmp || length($cmp) != $oldLen ;
102    }
103
104    $cmp = substr($cmp, 5);
105
106    #$self->{UnCompBytes} += length $self->{Buffer} ;
107    $self->{UnCompBytes} += length $$buff ;
108
109    #if (length($cmp) >= length($self->{Buffer}))
110    if (length($cmp) >= length $$buff)
111    {
112        ${ $_[0] } .= pack("NN", length($$buff), length($$buff) );
113        if ($self->{CRC}) {
114            ${ $_[0] } .= pack("N", adler32($$buff));
115        }
116        ${ $_[0] } .= $$buff;
117        $self->{CompBytes} += length $$buff;
118    }
119    else {
120
121        ${ $_[0] } .= pack("NN", length($$buff), length($cmp));
122        if ($self->{CRC}) {
123            ${ $_[0] } .= pack("NN", adler32($$buff), adler32($cmp));
124        }
125        ${ $_[0] } .= $cmp;
126        $self->{CompBytes} += length $cmp;
127    }
128    #$self->{Buffer} = '';
129
130    return STATUS_OK;
131}
132
133sub reset
134{
135    return STATUS_OK;
136}
137
138sub compressedBytes
139{
140    my $self = shift ;
141    $self->{CompBytes};
142}
143
144sub uncompressedBytes
145{
146    my $self = shift ;
147    $self->{UnCompBytes};
148}
149
150
151
152#sub total_out
153#{
154#    my $self = shift ;
155#    0;
156#}
157
158#sub total_in
159#{
160#    my $self = shift ;
161#    $self->{Def}->total_in();
162#}
163#
164#sub crc32
165#{
166#    my $self = shift ;
167#    $self->{Def}->crc32();
168#}
169#
170#sub adler32
171#{
172#    my $self = shift ;
173#    $self->{Def}->adler32();
174#}
175
176
1771;
178
179__END__
180