diff --git a/Base.cpp b/Base.cpp index cb6faf2d..3017d910 100644 --- a/Base.cpp +++ b/Base.cpp @@ -329,10 +329,15 @@ namespace data return ret == Z_STREAM_END || ret < 0; } - void GzipInflator::Inflate (std::stringstream& in, std::ostream& out) + void GzipInflator::Inflate (std::istream& in, std::ostream& out) { - auto str = in.str ().substr (in.tellg ()); - Inflate ((const uint8_t *)str.c_str (), str.length (), out); + uint8_t * buf = new uint8_t[GZIP_CHUNK_SIZE]; + while (!in.eof ()) + { + in.read ((char *)buf, GZIP_CHUNK_SIZE); + Inflate (buf, in.gcount (), out); + } + delete[] buf; } GzipDeflator::GzipDeflator (): m_IsDirty (false) diff --git a/Base.h b/Base.h index 19dc31da..e6f9567d 100644 --- a/Base.h +++ b/Base.h @@ -6,7 +6,6 @@ #include #include #include -#include namespace i2p { @@ -105,7 +104,7 @@ namespace data size_t Inflate (const uint8_t * in, size_t inLen, uint8_t * out, size_t outLen); bool Inflate (const uint8_t * in, size_t inLen, std::ostream& s); // return true when finshed or error, s failbit will be set in case of error - void Inflate (std::stringstream& in, std::ostream& out); + void Inflate (std::istream& in, std::ostream& out); private: