File Coverage

blib/lib/POE/Filter/Zlib/Stream.pm
Criterion Covered Total %
statement 71 83 85.5
branch 17 26 65.3
condition 2 3 66.6
subroutine 11 12 91.6
pod 6 6 100.0
total 107 130 82.3


line stmt bran cond sub pod time code
1             package POE::Filter::Zlib::Stream;
2              
3 4     4   21596 use strict;
  4         8  
  4         131  
4 4     4   20 use warnings;
  4         7  
  4         86  
5 4     4   19 use Carp;
  4         6  
  4         368  
6 4     4   3843 use Compress::Raw::Zlib qw(Z_OK Z_STREAM_END Z_FINISH Z_SYNC_FLUSH);
  4         21144  
  4         492  
7 4     4   43 use vars qw($VERSION);
  4         6  
  4         228  
8 4     4   20 use base qw(POE::Filter);
  4         7  
  4         3850  
9              
10             $VERSION = '2.02';
11              
12             sub new {
13 7     7 1 1261 my $type = shift;
14 7 50       33 croak "$type requires an even number of parameters" if @_ % 2;
15 7         16 my $buffer = { @_ };
16 7         15 $buffer->{ lc $_ } = delete $buffer->{ $_ } for keys %{ $buffer };
  7         44  
17 7         19 $buffer->{BUFFER} = '';
18 7 100       75 delete $buffer->{deflateopts} unless ref ( $buffer->{deflateopts} ) eq 'HASH';
19 7         12 $buffer->{d} = Compress::Raw::Zlib::Deflate->new( %{ $buffer->{deflateopts} } );
  7         53  
20 7 50       4346 unless ( $buffer->{d} ) {
21 0         0 warn "Failed to create deflate stream\n";
22 0         0 return;
23             }
24 7 50       31 delete $buffer->{inflateopts} unless ref ( $buffer->{inflateopts} ) eq 'HASH';
25 7         15 $buffer->{i} = Compress::Raw::Zlib::Inflate->new ( %{ $buffer->{inflateopts} } );
  7         53  
26 7 50       1774 unless ( $buffer->{i} ) {
27 0         0 warn "Failed to create inflate stream\n";
28 0         0 return;
29             }
30 7 100       23 if (not defined $buffer->{flushtype}) {
31 3         19 $buffer->{flushtype} = Z_SYNC_FLUSH;
32             }
33 7         102 return bless $buffer, $type;
34             }
35              
36             # use inherited get() from POE::Filter
37              
38             sub get_one_start {
39 10     10 1 135 my ($self, $raw_lines) = @_;
40 10         19 $self->{BUFFER} .= join '', @{ $raw_lines };
  10         37  
41             }
42              
43             sub get_one {
44 32     32 1 492 my $self = shift;
45              
46 32 100       97 return [ ] unless length $self->{BUFFER};
47 20         26 my ($status, $out);
48 20         211 $status = $self->{i}->inflate( \$self->{BUFFER}, $out );
49              
50 20 50 66     57 unless ( $status == Z_OK or $status == Z_STREAM_END ) {
51 0         0 warn "Couldn\'t inflate buffer\n";
52 0         0 return [ ];
53             }
54 20 100       294 if ($status == Z_STREAM_END) {
55 17         52 $self->{i} = Compress::Raw::Zlib::Inflate->new ( %{ $self->{inflateopts} } );
  17         63  
56             }
57 20         3528 return [ $out ];
58             }
59              
60             sub get_pending {
61 0     0 1 0 my $self = shift;
62 0 0       0 return $self->{BUFFER} ? [ $self->{BUFFER} ] : undef;
63             }
64              
65             sub put {
66 10     10 1 7783 my ($self, $events) = @_;
67 10         21 my $raw_lines = [];
68              
69 10         23 foreach my $event (@$events) {
70 22         57 my ($dstat, $dout);
71 22         167 $dstat = $self->{d}->deflate( $event, $dout );
72 22 50       79 unless ( $dstat == Z_OK ) {
73 0         0 warn "(data) Couldn\'t deflate: $event\n($dstat)";
74 0         0 next;
75             }
76 22         140 my ($fout,$fstat);
77 22         460 $fstat = $self->{d}->flush( $fout, $self->{flushtype} );
78 22 50       58 unless ( $fstat == Z_OK ) {
79 0         0 warn "(flush) Couldn\'t flush/deflate: $event\n";
80 0         0 next;
81             }
82 22 100       122 if ($self->{flushtype} == Z_FINISH) {
83 17         66 $self->{d} = Compress::Raw::Zlib::Deflate->new ( %{ $self->{deflateopts} } );
  17         60  
84             }
85 22         7653 push @$raw_lines, $dout . $fout;
86             }
87 10         56 return $raw_lines;
88             }
89              
90             sub clone {
91 2     2 1 13 my $self = shift;
92 2         6 my $nself = { };
93 2         4 $nself->{$_} = $self->{$_} for keys %{ $self };
  2         39  
94 2         24 $nself->{d} = Compress::Raw::Zlib::Deflate->new( %{ $nself->{deflateopts} } );
  2         13  
95 2         1185 $nself->{i} = Compress::Raw::Zlib::Inflate->new( %{ $nself->{inflateopts} } );
  2         11  
96 2         585 $nself->{BUFFER} = '';
97 2         11 return bless $nself, ref $self;
98             }
99              
100             1;
101              
102             __END__