1package IO::Compress::Adapter::Lzma ;
2
3use strict;
4use warnings;
5use bytes;
6
7use IO::Compress::Base::Common  2.101 qw(:Status);
8
9use Compress::Raw::Lzma  2.101 qw(LZMA_OK LZMA_STREAM_END) ;
10
11our ($VERSION);
12$VERSION = '2.101';
13
14sub mkCompObject
15{
16    my $Filter = shift ;
17
18    my ($def, $status) =
19    Compress::Raw::Lzma::AloneEncoder->new(AppendOutput => 1,
20                                           Filter => $Filter);
21
22    return (undef, "Could not create AloneEncoder object: $status", $status)
23        if $status != LZMA_OK ;
24
25    return bless {'Def'        => $def,
26                  'Error'      => '',
27                  'ErrorNo'    => 0,
28                 }  ;
29}
30
31sub mkRawZipCompObject
32{
33    my $preset = shift ;
34    my $extreme = shift;
35    my $filter;
36
37
38    if (defined $preset) {
39        $preset |= Compress::Raw::Lzma::LZMA_PRESET_EXTREME()
40            if $extreme;
41        $filter = Lzma::Filter::Lzma1::Preset($preset) ;
42    }
43    else
44      { $filter = Lzma::Filter::Lzma1 }
45
46    my ($def, $status) =
47    Compress::Raw::Lzma::RawEncoder->new(AppendOutput => 1,
48                                         ForZip => 1,
49                                         Filter => $filter,
50                                         #Filter => Lzma::Filter::Lzma1m
51                                         );
52
53    return (undef, "Could not create RawEncoder object: $status", $status)
54        if $status != LZMA_OK ;
55
56    return bless {'Def'        => $def,
57                  'Error'      => '',
58                  'ErrorNo'    => 0,
59                 }  ;
60}
61
62sub compr
63{
64    my $self = shift ;
65
66    my $def   = $self->{Def};
67
68    my $status = $def->code($_[0], $_[1]) ;
69    $self->{ErrorNo} = $status;
70
71    if ($status != LZMA_OK)
72    {
73        $self->{Error} = "Deflate Error: $status";
74        return STATUS_ERROR;
75    }
76
77    #${ $_[1] } .= $out if defined $out;
78
79    return STATUS_OK;
80}
81
82sub flush
83{
84    my $self = shift ;
85
86    my $def   = $self->{Def};
87
88    my $status = $def->flush($_[0]);
89    $self->{ErrorNo} = $status;
90
91    if ($status != LZMA_STREAM_END)
92    {
93        $self->{Error} = "Deflate Error: $status";
94        return STATUS_ERROR;
95    }
96
97    #${ $_[0] } .= $out if defined $out ;
98    return STATUS_OK;
99
100}
101
102sub close
103{
104    my $self = shift ;
105
106    my $def   = $self->{Def};
107
108    my $status = $def->flush($_[0]);
109    $self->{ErrorNo} = $status;
110
111    if ($status != LZMA_STREAM_END)
112    {
113        $self->{Error} = "Deflate Error: $status";
114        return STATUS_ERROR;
115    }
116
117    #${ $_[0] } .= $out if defined $out ;
118    return STATUS_OK;
119
120}
121
122
123sub reset
124{
125    my $self = shift ;
126
127    my $outer = $self->{Outer};
128
129    my ($def, $status) =
130        Compress::Raw::Lzma::AloneEncoder->new(AppendOutput => 1);
131    $self->{ErrorNo} = ($status == LZMA_OK) ? 0 : $status ;
132
133    if ($status != LZMA_OK)
134    {
135        $self->{Error} = "Cannot create Deflate object: $status";
136        return STATUS_ERROR;
137    }
138
139    $self->{Def} = $def;
140
141    return STATUS_OK;
142}
143
144sub compressedBytes
145{
146    my $self = shift ;
147    $self->{Def}->compressedBytes();
148}
149
150sub uncompressedBytes
151{
152    my $self = shift ;
153    $self->{Def}->uncompressedBytes();
154}
155
156#sub total_out
157#{
158#    my $self = shift ;
159#    0;
160#}
161#
162
163#sub total_in
164#{
165#    my $self = shift ;
166#    $self->{Def}->total_in();
167#}
168#
169#sub crc32
170#{
171#    my $self = shift ;
172#    $self->{Def}->crc32();
173#}
174#
175#sub adler32
176#{
177#    my $self = shift ;
178#    $self->{Def}->adler32();
179#}
180
181
1821;
183
184__END__
185