00001 #include "filterbz2.h"
00002
00003 namespace n2nc {
00004
00005 FilterBZ2::FilterBZ2() : Filter("BZ2_FILTER","bzip2 compression filter"){
00006 this->m_maxoverhead = sizeof(bz2header_t) ;
00007 }
00008
00009
00010 FilterBZ2::~FilterBZ2(){
00011 }
00012
00013 Filter::status_t n2nc::FilterBZ2::egress(void * inbuf, void * outbuf, size_t inlen, size_t * outlen){
00014 bz2header_t *phdr ;
00015 size_t _outlen = (2024 * 1.01) + 600 ;
00016
00017 BZ2_bzBuffToBuffCompress((char*)outbuf + sizeof(bz2header_t),&_outlen,(char*)inbuf,inlen,9,4,30);
00018
00019 phdr = (bz2header_t*)outbuf ;
00020 if (_outlen >= inlen){
00021
00022 phdr->p_size = 65535 ;
00023 memcpy((u_char*)outbuf + sizeof(bz2header_t),inbuf,inlen);
00024 *outlen = inlen + sizeof(bz2header_t);
00025 std::cerr << "INCOMPRESSIBLE data, outlen: " << _outlen << " inlen: " << inlen << std::endl ;
00026 return Filter::FILTER_CONTINUE ;
00027 }
00028 phdr->p_size = _outlen ;
00029 *outlen = _outlen + sizeof(bz2header_t);
00030 std::cerr << "COMPRESS data, out_len: " << _outlen << " inlen: " << inlen << " ratio: " << (float)_outlen / (float)inlen << std::endl ;
00031 return Filter::FILTER_CONTINUE ;
00032
00033 }
00034
00035 Filter::status_t n2nc::FilterBZ2::ingress(void * inbuf, void * outbuf, size_t inlen, size_t * outlen){
00036 bz2header_t *phdr ;
00037 size_t _outlen = (2024 * 1.01) + 600 ;
00038 int retval ;
00039 phdr = (bz2header_t*)inbuf ;
00040 if(phdr->p_size == 65535u){
00041 memcpy(outbuf,(u_char*)inbuf + sizeof(bz2header_t),inlen - sizeof(bz2header_t));
00042 *outlen = inlen - sizeof(bz2header_t);
00043 return Filter::FILTER_CONTINUE ;
00044 }
00045
00046 retval = BZ2_bzBuffToBuffDecompress((char*)outbuf,&_outlen,(char*)inbuf + sizeof(bz2header_t),inlen - sizeof(bz2header_t),0,4);
00047 if (retval != BZ_OK){
00048 std::cerr << "DECOMPRESS FAIL, inlen: " << inlen << " _outlen: " << _outlen << std::endl ;
00049 return Filter::FILTER_DROP ;
00050 }
00051 *outlen = _outlen ;
00052 std::cerr << "DECOMPRESS data, out_len: " << _outlen << " inlen: " << inlen << " ratio: " << (float)_outlen / (float)inlen << std::endl ;
00053 return Filter::FILTER_CONTINUE ;
00054
00055 }
00056
00057 extern "C"
00058 Filter* get_istance(){
00059 return new FilterBZ2();
00060 }
00061
00062 extern "C"
00063 int free_istance(Filter *filter){
00064 delete filter ;
00065 }
00066
00067
00068 }
00069
00070