Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/core
diff options
context:
space:
mode:
Diffstat (limited to 'source/core')
-rw-r--r--source/core/StarDataStreamDevices.cpp2
-rw-r--r--source/core/StarDataStreamDevices.hpp4
-rw-r--r--source/core/StarZSTDCompression.cpp88
-rw-r--r--source/core/StarZSTDCompression.hpp2
4 files changed, 46 insertions, 50 deletions
diff --git a/source/core/StarDataStreamDevices.cpp b/source/core/StarDataStreamDevices.cpp
index b769167..6cf05ea 100644
--- a/source/core/StarDataStreamDevices.cpp
+++ b/source/core/StarDataStreamDevices.cpp
@@ -132,6 +132,8 @@ void DataStreamBuffer::writeData(char const* data, size_t len) {
DataStreamExternalBuffer::DataStreamExternalBuffer() : m_buffer() {}
+DataStreamExternalBuffer::DataStreamExternalBuffer(ByteArray const& byteArray) : DataStreamExternalBuffer(byteArray.ptr(), byteArray.size()) {}
+
DataStreamExternalBuffer::DataStreamExternalBuffer(DataStreamBuffer const& buffer) : DataStreamExternalBuffer(buffer.ptr(), buffer.size()) {}
DataStreamExternalBuffer::DataStreamExternalBuffer(char const* externalData, size_t len) : DataStreamExternalBuffer() {
diff --git a/source/core/StarDataStreamDevices.hpp b/source/core/StarDataStreamDevices.hpp
index 5d404ab..3f34a72 100644
--- a/source/core/StarDataStreamDevices.hpp
+++ b/source/core/StarDataStreamDevices.hpp
@@ -126,7 +126,9 @@ private:
class DataStreamExternalBuffer : public DataStream {
public:
DataStreamExternalBuffer();
- DataStreamExternalBuffer(DataStreamBuffer const& buffer);
+ explicit DataStreamExternalBuffer(ByteArray const& byteArray);
+ explicit DataStreamExternalBuffer(DataStreamBuffer const& buffer);
+
DataStreamExternalBuffer(DataStreamExternalBuffer const& buffer) = default;
DataStreamExternalBuffer(char const* externalData, size_t len);
diff --git a/source/core/StarZSTDCompression.cpp b/source/core/StarZSTDCompression.cpp
index 733b182..5c66c9a 100644
--- a/source/core/StarZSTDCompression.cpp
+++ b/source/core/StarZSTDCompression.cpp
@@ -7,6 +7,7 @@ CompressionStream::CompressionStream() : m_cStream(ZSTD_createCStream()) {
ZSTD_CCtx_setParameter(m_cStream, ZSTD_c_enableLongDistanceMatching, 1);
ZSTD_CCtx_setParameter(m_cStream, ZSTD_c_windowLog, 24);
ZSTD_initCStream(m_cStream, 2);
+ m_output.resize(ZSTD_CStreamOutSize());
}
CompressionStream::~CompressionStream() { ZSTD_freeCStream(m_cStream); }
@@ -14,39 +15,33 @@ CompressionStream::~CompressionStream() { ZSTD_freeCStream(m_cStream); }
ByteArray CompressionStream::compress(const char* in, size_t inLen) {
size_t const cInSize = ZSTD_CStreamInSize ();
size_t const cOutSize = ZSTD_CStreamOutSize();
- ByteArray output(cOutSize, 0);
- size_t written = 0, read = 0;
- while (read < inLen) {
- ZSTD_inBuffer inBuffer = {in + read, min(cInSize, inLen - read), 0};
- ZSTD_outBuffer outBuffer = {output.ptr() + written, output.size() - written, 0};
- bool finished = false;
- do {
- size_t ret = ZSTD_compressStream2(m_cStream, &outBuffer, &inBuffer, ZSTD_e_flush);
- if (ZSTD_isError(ret)) {
- throw IOException(strf("ZSTD compression error {}", ZSTD_getErrorName(ret)));
- break;
- }
+ ZSTD_inBuffer inBuffer = {in, inLen, 0};
+ size_t written = 0;
+ bool finished = false;
+ do {
+ ZSTD_outBuffer outBuffer = {m_output.ptr() + written, min(cOutSize, m_output.size() - written), 0};
+ size_t ret = ZSTD_compressStream2(m_cStream, &outBuffer, &inBuffer, ZSTD_e_flush);
+ if (ZSTD_isError(ret)) {
+ throw IOException(strf("ZSTD compression error {}", ZSTD_getErrorName(ret)));
+ break;
+ }
- if (outBuffer.pos == outBuffer.size) {
- output.resize(output.size() * 2);
- outBuffer.dst = output.ptr();
- outBuffer.size = output.size();
- continue;
- }
-
- finished = ret == 0 && inBuffer.pos == inBuffer.size;
- } while (!finished);
-
- read += inBuffer.pos;
written += outBuffer.pos;
- }
- output.resize(written);
- return output;
+ if (outBuffer.pos == outBuffer.size) {
+ if (written >= m_output.size())
+ m_output.resize(m_output.size() * 2);
+ continue;
+ }
+
+ finished = ret == 0 && inBuffer.pos == inBuffer.size;
+ } while (!finished);
+ return ByteArray(m_output.ptr(), written);
}
DecompressionStream::DecompressionStream() : m_dStream(ZSTD_createDStream()) {
ZSTD_DCtx_setParameter(m_dStream, ZSTD_d_windowLogMax, 25);
ZSTD_initDStream(m_dStream);
+ m_output.resize(ZSTD_DStreamOutSize());
}
DecompressionStream::~DecompressionStream() { ZSTD_freeDStream(m_dStream); }
@@ -54,31 +49,26 @@ DecompressionStream::~DecompressionStream() { ZSTD_freeDStream(m_dStream); }
ByteArray DecompressionStream::decompress(const char* in, size_t inLen) {
size_t const dInSize = ZSTD_DStreamInSize ();
size_t const dOutSize = ZSTD_DStreamOutSize();
- ByteArray output(dOutSize, 0);
- size_t written = 0, read = 0;
- while (read < inLen) {
- ZSTD_inBuffer inBuffer = {in + read, min(dInSize, inLen - read), 0};
- ZSTD_outBuffer outBuffer = {output.ptr() + written, output.size() - written, 0};
- do {
- size_t ret = ZSTD_decompressStream(m_dStream, &outBuffer, &inBuffer);
- if (ZSTD_isError(ret)) {
- throw IOException(strf("ZSTD decompression error {}", ZSTD_getErrorName(ret)));
- break;
- }
-
- if (outBuffer.pos == outBuffer.size) {
- output.resize(output.size() * 2);
- outBuffer.dst = output.ptr();
- outBuffer.size = output.size();
- continue;
- }
- } while (inBuffer.pos < inBuffer.size);
+ ZSTD_inBuffer inBuffer = {in, inLen, 0};
+ size_t written = 0;
+ bool finished = false;
+ do {
+ ZSTD_outBuffer outBuffer = {m_output.ptr() + written, min(dOutSize, m_output.size() - written), 0};
+ size_t ret = ZSTD_decompressStream(m_dStream, &outBuffer, &inBuffer);
+ if (ZSTD_isError(ret)) {
+ throw IOException(strf("ZSTD decompression error {}", ZSTD_getErrorName(ret)));
+ break;
+ }
- read += inBuffer.pos;
written += outBuffer.pos;
- }
- output.resize(written);
- return output;
+ if (outBuffer.pos == outBuffer.size) {
+ if (written >= m_output.size())
+ m_output.resize(m_output.size() * 2);
+ continue;
+ }
+ finished = inBuffer.pos == inBuffer.size;
+ } while (!finished);
+ return ByteArray(m_output.ptr(), written);
}
} \ No newline at end of file
diff --git a/source/core/StarZSTDCompression.hpp b/source/core/StarZSTDCompression.hpp
index 77719bf..9c296c1 100644
--- a/source/core/StarZSTDCompression.hpp
+++ b/source/core/StarZSTDCompression.hpp
@@ -19,6 +19,7 @@ public:
private:
ZSTD_CStream* m_cStream;
+ ByteArray m_output;
};
inline ByteArray CompressionStream::compress(ByteArray const& in) {
@@ -35,6 +36,7 @@ public:
private:
ZSTD_DStream* m_dStream;
+ ByteArray m_output;
};
inline ByteArray DecompressionStream::decompress(ByteArray const& in) {