package PerlIO::via::Bzip2; use 5.008000; use strict; use warnings; use Compress::Bzip2 (); our $VERSION = '0.02'; my $Buf_Size = 8192; # Default (de)compression parameters, see Compress::Bzip2 for details. my $Level = 1; # Compression level 1..9 # Get and set (de)compression level (0..9) sub level { $Level = $_[1] if $_[1]; $Level; } sub import { my ($class, %args) = @_; $class->level($args{level}); } sub PUSHED { my ($class, $mode, $fh) = @_; my $self = { buf => '', mode => $mode, }; if ($mode eq 'r') { $self->{stream} = Compress::Bzip2::decompress_init() or return -1; } elsif ($mode eq 'w') { $self->{stream} = Compress::Bzip2::compress_init(level => $Level) or return -1; } else { return -1; } return bless $self => $class; } sub FILL { my ($self, $fh) = @_; my ($data); my $stream = $self->{stream}; if ($stream and (read($fh, $data, $Buf_Size) > 0)) { return $stream->add($data); } elsif ($stream) { $self->{stream} = undef; return $stream->finish; } else { return; } } sub WRITE { my ($self, $buf, $fh) = @_; my $data = $self->{stream}->add($buf); return if not defined $data; return (print {$fh} $data) ? 1 : 0; } sub FLUSH { my ($self, $fh) = @_; return 0 if $self->{mode} eq 'r'; my $data = $self->{stream}->finish; if ($data) { return (print {$fh} $data) ? 0 : -1; } return 0; } 1; __END__ =head1 NAME PerlIO::via::Bzip2 - PerlIO layer for Bzip2 (de)compression =head1 SYNOPSIS use PerlIO::via::Bzip2; # or use PerlIO::via::Bzip2 level => 9; # Maximum compression # Read a bzip2 compressed file from disk. open(my $fh, "<:via(Bzip2)", "compressed_file"); my $uncompressed_data = <$fh>; # Compress data on-the-fly to a bzip2 compressed file on disk. open(my $fh, ">:via(Bzip2)", "compressed_file"); print {$fh} $uncompressed_data; # Set compression level PerlIO::via::Bzip2->level(5); open(my $fh, ">:via(Bzip2)", "compressed_file"); print {$fh} $uncompressed_data; =head1 DESCRIPTION This module implements a PerlIO layer which will let you handle bzip2 compressed files transparently. =head2 Class Methods =over 4 =item level([$level]) level sets or returns the compression level of the bzip2 library. It ranges from 1 (least compression, most efficient memory use) to 9 (best compression, most memory usage). This parameter can also be set during using library import, using C<< use PerlIO::via::Bzip2 level => $level >>. =back =head1 BUGS Using binmode() on an opened file for compression will pop (remove) the layer. =head1 PREREQUISITES This module requires Compress::Bzip2 version 1.03. =head1 SEE ALSO L, L =head1 AUTHOR Arjen Laarhoven, Earjen@cpan.orgE =head1 COPYRIGHT AND LICENSE Copyright (C) 2005 by Arjen Laarhoven This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut