From b0e05776f153cb8e8ab0b80c4f2bf37081088503 Mon Sep 17 00:00:00 2001 From: Anders Kaseorg Date: Wed, 16 May 2012 00:21:36 -0400 Subject: [PATCH] Use protobuf's Gzip streams This reverts commit 63459ed1c7db060b44c3ef639bd07c806ea3f737. --- configure.ac | 2 -- src/network/Makefile.am | 2 +- src/network/compressor.cc | 32 ------------------------------ src/network/compressor.h | 28 -------------------------- src/network/transportfragment.cc | 34 ++++++++++++++++++++++++++------ 5 files changed, 29 insertions(+), 69 deletions(-) delete mode 100644 src/network/compressor.cc delete mode 100644 src/network/compressor.h diff --git a/configure.ac b/configure.ac index a177aad..3151992 100644 --- a/configure.ac +++ b/configure.ac @@ -158,8 +158,6 @@ AS_IF([test x"$with_utempter" != xno], [AC_MSG_WARN([Unable to find libutempter; utmp entries will not be made.])], [AC_MSG_ERROR([--with-utempter was given but libutempter was not found.])])])]) -AC_SEARCH_LIBS([compress], [z], , [AC_MSG_ERROR([Unable to find zlib.])]) - # Checks for header files. AC_CHECK_HEADERS([arpa/inet.h fcntl.h langinfo.h limits.h locale.h netinet/in.h stddef.h stdint.h inttypes.h stdlib.h string.h sys/ioctl.h sys/resource.h sys/socket.h sys/stat.h sys/time.h termios.h unistd.h wchar.h wctype.h], [], [AC_MSG_ERROR([Missing required header file.])]) diff --git a/src/network/Makefile.am b/src/network/Makefile.am index 3143cc4..2768e6e 100644 --- a/src/network/Makefile.am +++ b/src/network/Makefile.am @@ -3,4 +3,4 @@ AM_CXXFLAGS = $(WARNING_CXXFLAGS) $(PICKY_CXXFLAGS) $(HARDEN_CFLAGS) $(MISC_CXXF noinst_LIBRARIES = libmoshnetwork.a -libmoshnetwork_a_SOURCES = network.cc network.h networktransport.cc networktransport.h transportfragment.cc transportfragment.h transportsender.cc transportsender.h transportstate.h compressor.cc compressor.h +libmoshnetwork_a_SOURCES = network.cc network.h networktransport.cc networktransport.h transportfragment.cc transportfragment.h transportsender.cc transportsender.h transportstate.h diff --git a/src/network/compressor.cc b/src/network/compressor.cc deleted file mode 100644 index 37c95c5..0000000 --- a/src/network/compressor.cc +++ /dev/null @@ -1,32 +0,0 @@ -#include - -#include "compressor.h" -#include "dos_assert.h" - -using namespace Network; -using namespace std; - -string Compressor::compress_str( const string &input ) -{ - long unsigned int len = BUFFER_SIZE; - dos_assert( Z_OK == compress( buffer, &len, - reinterpret_cast( input.data() ), - input.size() ) ); - return string( reinterpret_cast( buffer ), len ); -} - -string Compressor::uncompress_str( const string &input ) -{ - long unsigned int len = BUFFER_SIZE; - dos_assert( Z_OK == uncompress( buffer, &len, - reinterpret_cast( input.data() ), - input.size() ) ); - return string( reinterpret_cast( buffer ), len ); -} - -/* construct on first use */ -Compressor & Network::get_compressor( void ) -{ - static Compressor the_compressor; - return the_compressor; -} diff --git a/src/network/compressor.h b/src/network/compressor.h deleted file mode 100644 index ffeca99..0000000 --- a/src/network/compressor.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef COMPRESSOR_H -#define COMPRESSOR_H - -#include - -namespace Network { - class Compressor { - private: - static const int BUFFER_SIZE = 2048 * 2048; /* effective limit on terminal size */ - - unsigned char *buffer; - - public: - Compressor() : buffer( NULL ) { buffer = new unsigned char[ BUFFER_SIZE ]; } - ~Compressor() { if ( buffer ) { delete[] buffer; } } - - std::string compress_str( const std::string &input ); - std::string uncompress_str( const std::string &input ); - - /* unused */ - Compressor( const Compressor & ); - Compressor & operator=( const Compressor & ); - }; - - Compressor & get_compressor( void ); -} - -#endif diff --git a/src/network/transportfragment.cc b/src/network/transportfragment.cc index 2aeffd5..53eae91 100644 --- a/src/network/transportfragment.cc +++ b/src/network/transportfragment.cc @@ -17,13 +17,15 @@ */ #include +#include +#include #include "byteorder.h" #include "transportfragment.h" #include "transportinstruction.pb.h" -#include "compressor.h" #include "fatal_assert.h" +using namespace google::protobuf::io; using namespace Network; using namespace TransportBuffers; @@ -115,15 +117,24 @@ Instruction FragmentAssembly::get_assembly( void ) { assert( fragments_arrived == fragments_total ); - string encoded; - + ZeroCopyInputStream **streams = new ZeroCopyInputStream *[fragments_total]; for ( int i = 0; i < fragments_total; i++ ) { assert( fragments.at( i ).initialized ); - encoded += fragments.at( i ).contents; + streams[i] = new ArrayInputStream( fragments.at( i ).contents.data(), + fragments.at( i ).contents.size() ); } Instruction ret; - fatal_assert( ret.ParseFromString( get_compressor().uncompress_str( encoded ) ) ); + { + ConcatenatingInputStream stream( streams, fragments_total ); + GzipInputStream gzip_stream( &stream, GzipInputStream::ZLIB ); + fatal_assert( ret.ParseFromZeroCopyStream( &gzip_stream ) ); + } + + for ( int i = 0; i < fragments_total; i++ ) { + delete streams[i]; + } + delete[] streams; fragments.clear(); fragments_arrived = 0; @@ -158,7 +169,18 @@ vector Fragmenter::make_fragments( const Instruction &inst, int MTU ) last_instruction = inst; last_MTU = MTU; - string payload = get_compressor().compress_str( inst.SerializeAsString() ); + string payload; + { + StringOutputStream stream( &payload ); + GzipOutputStream::Options gzip_options; + gzip_options.format = GzipOutputStream::ZLIB; + GzipOutputStream gzip_stream( &stream, gzip_options ); + fatal_assert( inst.SerializeToZeroCopyStream( &gzip_stream ) ); + if ( !gzip_stream.Close() ) { + throw std::string( "zlib error: " ) + gzip_stream.ZlibErrorMessage(); + } + } + uint16_t fragment_num = 0; vector ret;