00001 #include "filterlzo.h"
00002
00003 namespace n2nc {
00004
00005 FilterLZO::FilterLZO() : Filter("LZO_FILTER","lzo compression module"){
00006 if (lzo_init() != LZO_E_OK){
00007 fprintf(stderr,"internal error - lzo_init() failed !!!\n");
00008 fprintf(stderr,"(this usually indicates a compiler bug - try recompiling\nwithout optimizations, and enable `-DLZO_DEBUG' for diagnostics)\n");
00009 exit( 3 );
00010 }
00011 this->m_tmpbuf = malloc (65535);
00012 this->m_maxoverhead = sizeof(lzoheader_t);
00013 }
00014
00015
00016 FilterLZO::~FilterLZO(){
00017
00018 }
00019
00020 Filter::status_t n2nc::FilterLZO::egress(void * inbuf, void * outbuf, size_t inlen, size_t * outlen){
00021 lzo_uint in_len = inlen ;
00022 lzo_uint out_len;
00023 lzo_uint new_len;
00024 lzoheader_t *phdr ;
00025
00026 lzo1x_1_compress((u_char*)inbuf,in_len,(u_char*)outbuf + sizeof(lzoheader_t),&out_len,this->m_wrkmem);
00027 phdr = (lzoheader_t*)outbuf ;
00028 if (out_len >= inlen){
00029
00030
00031 phdr->p_size = 65535 ;
00032 memcpy((u_char*)outbuf + sizeof(lzoheader_t),inbuf,inlen);
00033 *outlen = inlen + sizeof(lzoheader_t);
00034 std::cerr << "UNCOMPRESSABLE data, outlen: " << out_len << " inlen: " << inlen << std::endl ;
00035 return Filter::FILTER_CONTINUE ;
00036 }
00037 phdr->p_size = out_len ;
00038
00039 *outlen = out_len + sizeof(lzoheader_t);
00040 std::cerr << "COMPRESS data, out_len: " << out_len << " inlen: " << inlen << " ratio: " << (float)out_len / (float)inlen << std::endl ;
00041 return Filter::FILTER_CONTINUE ;
00042 }
00043
00044 Filter::status_t n2nc::FilterLZO::ingress(void * inbuf, void * outbuf, size_t inlen, size_t * outlen){
00045 lzoheader_t *phdr ;
00046 lzo_uint new_len;
00047 phdr = (lzoheader_t*)inbuf ;
00048
00049 if( phdr->p_size == 65535u ){
00050
00051
00052 memcpy(outbuf,(u_char*)inbuf + sizeof(lzoheader_t),inlen - sizeof(lzoheader_t));
00053 *outlen = inlen - sizeof(lzoheader_t);
00054 return Filter::FILTER_CONTINUE ;
00055 }
00056
00057
00058
00059 lzo_memcpy(this->m_in, (u_char*)inbuf + sizeof(lzoheader_t),inlen - sizeof(lzoheader_t)) ;
00060
00061 lzo1x_decompress(m_in,inlen - sizeof(lzoheader_t),(u_char*)outbuf,&new_len,NULL);
00062 *outlen = new_len;
00063 return Filter::FILTER_CONTINUE ;
00064 }
00065
00066
00067 extern "C"
00068 Filter* get_istance(){
00069 return new FilterLZO();
00070 }
00071
00072 extern "C"
00073 int free_istance(Filter *filter){
00074 delete filter ;
00075 }
00076
00077
00078
00079 }
00080
00081