Skip to content
Browse files

Use protobuf's Gzip streams

This reverts commit 63459ed.
  • Loading branch information...
1 parent a4dd2fe commit b0e05776f153cb8e8ab0b80c4f2bf37081088503 @andersk andersk committed with keithw
Showing with 29 additions and 69 deletions.
  1. +0 −2 configure.ac
  2. +1 −1 src/network/Makefile.am
  3. +0 −32 src/network/compressor.cc
  4. +0 −28 src/network/compressor.h
  5. +28 −6 src/network/transportfragment.cc
View
2 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.])])
View
2 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
View
32 src/network/compressor.cc
@@ -1,32 +0,0 @@
-#include <zlib.h>
-
-#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<const unsigned char *>( input.data() ),
- input.size() ) );
- return string( reinterpret_cast<char *>( buffer ), len );
-}
-
-string Compressor::uncompress_str( const string &input )
-{
- long unsigned int len = BUFFER_SIZE;
- dos_assert( Z_OK == uncompress( buffer, &len,
- reinterpret_cast<const unsigned char *>( input.data() ),
- input.size() ) );
- return string( reinterpret_cast<char *>( buffer ), len );
-}
-
-/* construct on first use */
-Compressor & Network::get_compressor( void )
-{
- static Compressor the_compressor;
- return the_compressor;
-}
View
28 src/network/compressor.h
@@ -1,28 +0,0 @@
-#ifndef COMPRESSOR_H
-#define COMPRESSOR_H
-
-#include <string>
-
-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
View
34 src/network/transportfragment.cc
@@ -17,13 +17,15 @@
*/
#include <assert.h>
+#include <google/protobuf/io/gzip_stream.h>
+#include <google/protobuf/io/zero_copy_stream_impl.h>
#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<Fragment> 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<Fragment> ret;

0 comments on commit b0e0577

Please sign in to comment.
Something went wrong with that request. Please try again.