mirror of
https://github.com/PurpleI2P/i2pd
synced 2024-11-10 00:00:29 +03:00
* Base.cpp : extract gzip classes to separate file
This commit is contained in:
parent
10f3690ede
commit
6350f5e6e8
93
Base.cpp
93
Base.cpp
@ -283,99 +283,6 @@ namespace data
|
|||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
GzipInflator::GzipInflator (): m_IsDirty (false)
|
|
||||||
{
|
|
||||||
memset (&m_Inflator, 0, sizeof (m_Inflator));
|
|
||||||
inflateInit2 (&m_Inflator, MAX_WBITS + 16); // gzip
|
|
||||||
}
|
|
||||||
|
|
||||||
GzipInflator::~GzipInflator ()
|
|
||||||
{
|
|
||||||
inflateEnd (&m_Inflator);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t GzipInflator::Inflate (const uint8_t * in, size_t inLen, uint8_t * out, size_t outLen)
|
|
||||||
{
|
|
||||||
if (m_IsDirty) inflateReset (&m_Inflator);
|
|
||||||
m_IsDirty = true;
|
|
||||||
m_Inflator.next_in = const_cast<uint8_t *>(in);
|
|
||||||
m_Inflator.avail_in = inLen;
|
|
||||||
m_Inflator.next_out = out;
|
|
||||||
m_Inflator.avail_out = outLen;
|
|
||||||
int err;
|
|
||||||
if ((err = inflate (&m_Inflator, Z_NO_FLUSH)) == Z_STREAM_END) {
|
|
||||||
return outLen - m_Inflator.avail_out;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GzipInflator::Inflate (const uint8_t * in, size_t inLen, std::ostream& s)
|
|
||||||
{
|
|
||||||
m_IsDirty = true;
|
|
||||||
uint8_t * out = new uint8_t[GZIP_CHUNK_SIZE];
|
|
||||||
m_Inflator.next_in = const_cast<uint8_t *>(in);
|
|
||||||
m_Inflator.avail_in = inLen;
|
|
||||||
int ret;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
m_Inflator.next_out = out;
|
|
||||||
m_Inflator.avail_out = GZIP_CHUNK_SIZE;
|
|
||||||
ret = inflate (&m_Inflator, Z_NO_FLUSH);
|
|
||||||
if (ret < 0)
|
|
||||||
{
|
|
||||||
inflateEnd (&m_Inflator);
|
|
||||||
s.setstate(std::ios_base::failbit);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
s.write ((char *)out, GZIP_CHUNK_SIZE - m_Inflator.avail_out);
|
|
||||||
}
|
|
||||||
while (!m_Inflator.avail_out); // more data to read
|
|
||||||
delete[] out;
|
|
||||||
return ret == Z_STREAM_END || ret < 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void GzipInflator::Inflate (std::istream& in, std::ostream& 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)
|
|
||||||
{
|
|
||||||
memset (&m_Deflator, 0, sizeof (m_Deflator));
|
|
||||||
deflateInit2 (&m_Deflator, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 15 + 16, 8, Z_DEFAULT_STRATEGY); // 15 + 16 sets gzip
|
|
||||||
}
|
|
||||||
|
|
||||||
GzipDeflator::~GzipDeflator ()
|
|
||||||
{
|
|
||||||
deflateEnd (&m_Deflator);
|
|
||||||
}
|
|
||||||
|
|
||||||
void GzipDeflator::SetCompressionLevel (int level)
|
|
||||||
{
|
|
||||||
deflateParams (&m_Deflator, level, Z_DEFAULT_STRATEGY);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t GzipDeflator::Deflate (const uint8_t * in, size_t inLen, uint8_t * out, size_t outLen)
|
|
||||||
{
|
|
||||||
if (m_IsDirty) deflateReset (&m_Deflator);
|
|
||||||
m_IsDirty = true;
|
|
||||||
m_Deflator.next_in = const_cast<uint8_t *>(in);
|
|
||||||
m_Deflator.avail_in = inLen;
|
|
||||||
m_Deflator.next_out = out;
|
|
||||||
m_Deflator.avail_out = outLen;
|
|
||||||
int err;
|
|
||||||
if ((err = deflate (&m_Deflator, Z_FINISH)) == Z_STREAM_END) {
|
|
||||||
return outLen - m_Deflator.avail_out;
|
|
||||||
} /* else */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
36
Base.h
36
Base.h
@ -4,7 +4,6 @@
|
|||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <zlib.h>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
namespace i2p
|
namespace i2p
|
||||||
@ -93,41 +92,6 @@ namespace data
|
|||||||
uint64_t ll[sz/8];
|
uint64_t ll[sz/8];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const size_t GZIP_CHUNK_SIZE = 16384;
|
|
||||||
class GzipInflator
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
GzipInflator ();
|
|
||||||
~GzipInflator ();
|
|
||||||
|
|
||||||
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::istream& in, std::ostream& out);
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
z_stream m_Inflator;
|
|
||||||
bool m_IsDirty;
|
|
||||||
};
|
|
||||||
|
|
||||||
class GzipDeflator
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
GzipDeflator ();
|
|
||||||
~GzipDeflator ();
|
|
||||||
|
|
||||||
void SetCompressionLevel (int level);
|
|
||||||
size_t Deflate (const uint8_t * in, size_t inLen, uint8_t * out, size_t outLen);
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
z_stream m_Deflator;
|
|
||||||
bool m_IsDirty;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
108
Gzip.cpp
Normal file
108
Gzip.cpp
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2013-2016, The PurpleI2P Project
|
||||||
|
*
|
||||||
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
|
*
|
||||||
|
* See full license text in LICENSE file at top of project tree
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <string.h> /* memset */
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "Gzip.h"
|
||||||
|
|
||||||
|
namespace i2p {
|
||||||
|
namespace data {
|
||||||
|
const size_t GZIP_CHUNK_SIZE = 16384;
|
||||||
|
|
||||||
|
GzipInflator::GzipInflator (): m_IsDirty (false)
|
||||||
|
{
|
||||||
|
memset (&m_Inflator, 0, sizeof (m_Inflator));
|
||||||
|
inflateInit2 (&m_Inflator, MAX_WBITS + 16); // gzip
|
||||||
|
}
|
||||||
|
|
||||||
|
GzipInflator::~GzipInflator ()
|
||||||
|
{
|
||||||
|
inflateEnd (&m_Inflator);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t GzipInflator::Inflate (const uint8_t * in, size_t inLen, uint8_t * out, size_t outLen)
|
||||||
|
{
|
||||||
|
if (m_IsDirty) inflateReset (&m_Inflator);
|
||||||
|
m_IsDirty = true;
|
||||||
|
m_Inflator.next_in = const_cast<uint8_t *>(in);
|
||||||
|
m_Inflator.avail_in = inLen;
|
||||||
|
m_Inflator.next_out = out;
|
||||||
|
m_Inflator.avail_out = outLen;
|
||||||
|
int err;
|
||||||
|
if ((err = inflate (&m_Inflator, Z_NO_FLUSH)) == Z_STREAM_END) {
|
||||||
|
return outLen - m_Inflator.avail_out;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GzipInflator::Inflate (const uint8_t * in, size_t inLen, std::ostream& os)
|
||||||
|
{
|
||||||
|
m_IsDirty = true;
|
||||||
|
uint8_t * out = new uint8_t[GZIP_CHUNK_SIZE];
|
||||||
|
m_Inflator.next_in = const_cast<uint8_t *>(in);
|
||||||
|
m_Inflator.avail_in = inLen;
|
||||||
|
int ret;
|
||||||
|
do {
|
||||||
|
m_Inflator.next_out = out;
|
||||||
|
m_Inflator.avail_out = GZIP_CHUNK_SIZE;
|
||||||
|
ret = inflate (&m_Inflator, Z_NO_FLUSH);
|
||||||
|
if (ret < 0) {
|
||||||
|
inflateEnd (&m_Inflator);
|
||||||
|
os.setstate(std::ios_base::failbit);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
os.write ((char *)out, GZIP_CHUNK_SIZE - m_Inflator.avail_out);
|
||||||
|
} while (!m_Inflator.avail_out); // more data to read
|
||||||
|
delete[] out;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GzipInflator::Inflate (std::istream& in, std::ostream& 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)
|
||||||
|
{
|
||||||
|
memset (&m_Deflator, 0, sizeof (m_Deflator));
|
||||||
|
deflateInit2 (&m_Deflator, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 15 + 16, 8, Z_DEFAULT_STRATEGY); // 15 + 16 sets gzip
|
||||||
|
}
|
||||||
|
|
||||||
|
GzipDeflator::~GzipDeflator ()
|
||||||
|
{
|
||||||
|
deflateEnd (&m_Deflator);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GzipDeflator::SetCompressionLevel (int level)
|
||||||
|
{
|
||||||
|
deflateParams (&m_Deflator, level, Z_DEFAULT_STRATEGY);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t GzipDeflator::Deflate (const uint8_t * in, size_t inLen, uint8_t * out, size_t outLen)
|
||||||
|
{
|
||||||
|
if (m_IsDirty) deflateReset (&m_Deflator);
|
||||||
|
m_IsDirty = true;
|
||||||
|
m_Deflator.next_in = const_cast<uint8_t *>(in);
|
||||||
|
m_Deflator.avail_in = inLen;
|
||||||
|
m_Deflator.next_out = out;
|
||||||
|
m_Deflator.avail_out = outLen;
|
||||||
|
int err;
|
||||||
|
if ((err = deflate (&m_Deflator, Z_FINISH)) == Z_STREAM_END) {
|
||||||
|
return outLen - m_Deflator.avail_out;
|
||||||
|
} /* else */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} // data
|
||||||
|
} // i2p
|
44
Gzip.h
Normal file
44
Gzip.h
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
#ifndef GZIP_H__
|
||||||
|
#define GZIP_H__
|
||||||
|
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
|
namespace i2p {
|
||||||
|
namespace data {
|
||||||
|
class GzipInflator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
GzipInflator ();
|
||||||
|
~GzipInflator ();
|
||||||
|
|
||||||
|
size_t Inflate (const uint8_t * in, size_t inLen, uint8_t * out, size_t outLen);
|
||||||
|
/** @note @a os failbit will be set in case of error */
|
||||||
|
void Inflate (const uint8_t * in, size_t inLen, std::ostream& os);
|
||||||
|
void Inflate (std::istream& in, std::ostream& out);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
z_stream m_Inflator;
|
||||||
|
bool m_IsDirty;
|
||||||
|
};
|
||||||
|
|
||||||
|
class GzipDeflator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
GzipDeflator ();
|
||||||
|
~GzipDeflator ();
|
||||||
|
|
||||||
|
void SetCompressionLevel (int level);
|
||||||
|
size_t Deflate (const uint8_t * in, size_t inLen, uint8_t * out, size_t outLen);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
z_stream m_Deflator;
|
||||||
|
bool m_IsDirty;
|
||||||
|
};
|
||||||
|
} // data
|
||||||
|
} // i2p
|
||||||
|
|
||||||
|
#endif /* GZIP_H__ */
|
@ -1,6 +1,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <zlib.h>
|
|
||||||
#include "I2PEndian.h"
|
#include "I2PEndian.h"
|
||||||
#include "Base.h"
|
#include "Base.h"
|
||||||
#include "Crypto.h"
|
#include "Crypto.h"
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <boost/asio.hpp>
|
#include <boost/asio.hpp>
|
||||||
#include <zlib.h>
|
|
||||||
#include "I2PEndian.h"
|
#include "I2PEndian.h"
|
||||||
#include "Base.h"
|
#include "Base.h"
|
||||||
#include "Crypto.h"
|
#include "Crypto.h"
|
||||||
|
2
NetDb.h
2
NetDb.h
@ -8,7 +8,9 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
#include "Base.h"
|
#include "Base.h"
|
||||||
|
#include "Gzip.h"
|
||||||
#include "FS.h"
|
#include "FS.h"
|
||||||
#include "Queue.h"
|
#include "Queue.h"
|
||||||
#include "I2NPProtocol.h"
|
#include "I2NPProtocol.h"
|
||||||
|
@ -21,6 +21,7 @@ set (LIBI2PD_SRC
|
|||||||
"${CMAKE_SOURCE_DIR}/Config.cpp"
|
"${CMAKE_SOURCE_DIR}/Config.cpp"
|
||||||
"${CMAKE_SOURCE_DIR}/Crypto.cpp"
|
"${CMAKE_SOURCE_DIR}/Crypto.cpp"
|
||||||
"${CMAKE_SOURCE_DIR}/Garlic.cpp"
|
"${CMAKE_SOURCE_DIR}/Garlic.cpp"
|
||||||
|
"${CMAKE_SOURCE_DIR}/Gzip.cpp"
|
||||||
"${CMAKE_SOURCE_DIR}/I2NPProtocol.cpp"
|
"${CMAKE_SOURCE_DIR}/I2NPProtocol.cpp"
|
||||||
"${CMAKE_SOURCE_DIR}/Identity.cpp"
|
"${CMAKE_SOURCE_DIR}/Identity.cpp"
|
||||||
"${CMAKE_SOURCE_DIR}/LeaseSet.cpp"
|
"${CMAKE_SOURCE_DIR}/LeaseSet.cpp"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
LIB_SRC = \
|
LIB_SRC = \
|
||||||
Crypto.cpp Datagram.cpp Garlic.cpp I2NPProtocol.cpp LeaseSet.cpp \
|
Gzip.cpp Crypto.cpp Datagram.cpp Garlic.cpp I2NPProtocol.cpp LeaseSet.cpp \
|
||||||
Log.cpp NTCPSession.cpp NetDb.cpp NetDbRequests.cpp Profiling.cpp \
|
Log.cpp NTCPSession.cpp NetDb.cpp NetDbRequests.cpp Profiling.cpp \
|
||||||
Reseed.cpp RouterContext.cpp RouterInfo.cpp Signature.cpp SSU.cpp \
|
Reseed.cpp RouterContext.cpp RouterInfo.cpp Signature.cpp SSU.cpp \
|
||||||
SSUSession.cpp SSUData.cpp Streaming.cpp Identity.cpp TransitTunnel.cpp \
|
SSUSession.cpp SSUData.cpp Streaming.cpp Identity.cpp TransitTunnel.cpp \
|
||||||
|
Loading…
Reference in New Issue
Block a user