22#include <com/sun/star/packages/zip/ZipConstants.hpp>
25using namespace com::sun::star::packages::zip::ZipConstants;
64 virtual void doWork()
override;
68 : threadTaskTag(
comphelper::ThreadPool::createThreadTaskTag())
71 , zlibLevel(nSetLevel)
78 const css::uno::Reference<css::io::XInputStream>& xInStream,
79 std::function<
void(
const css::uno::Sequence<sal_Int8>&, sal_Int32)> aProcessInputFunc,
80 std::function<
void(
const css::uno::Sequence<sal_Int8>&, sal_Int32)> aProcessOutputFunc)
88 bool firstTask =
true;
90 while (xInStream->available() > 0)
92 sal_Int64 inputBytes = xInStream->readBytes(
inBuffer, batchSize);
93 aProcessInputFunc(
inBuffer, inputBytes);
96 bool lastBatch = xInStream->available() <= 0;
97 sal_Int64 bytesPending = inputBytes;
98 while (bytesPending > 0)
100 sal_Int64 taskSize = std::min(
MaxBlockSize, bytesPending);
101 bytesPending -= taskSize;
102 bool lastTask = lastBatch && !bytesPending;
104 std::make_unique<Task>(
this, sequence++, taskSize, firstTask, lastTask));
110 assert(bytesPending == 0);
116 assert(inputBytes == batchSize);
127 sal_Int64 batchOutputSize = 0;
129 batchOutputSize += buffer.size();
131 css::uno::Sequence<sal_Int8> outBuffer(batchOutputSize);
133 auto pos = outBuffer.getArray();
136 pos = std::copy(buffer.begin(), buffer.end(),
pos);
146 inBuffer = uno::Sequence<sal_Int8>();
151#define deflateInit2 z_deflateInit2
152#define deflateBound z_deflateBound
153#define deflateSetDictionary z_deflateSetDictionary
154#define deflate z_deflate
155#define deflateEnd z_deflateEnd
168 SAL_WARN(
"package.threadeddeflate",
"deflateInit2() failed");
178 unsigned char* inBufferPtr =
reinterpret_cast<unsigned char*
>(
183 assert(MAX_WBITS == 15);
187 deflateSetDictionary(&
stream, inBufferPtr + myInBufferStart - 32768, 32768);
191 unsigned char* prevBufferPtr =
reinterpret_cast<unsigned char*
>(
196 stream.next_in = inBufferPtr + myInBufferStart;
199 stream.avail_out = outputMaxSize;
204 assert(
stream.avail_in == 0);
205 if (
lastTask ? res == Z_STREAM_END : res == Z_OK)
207 sal_Int64 outSize = outputMaxSize -
stream.avail_out;
212 SAL_WARN(
"package.threadeddeflate",
"deflate() failed");
Task(ThreadedDeflater *deflater_, int sequence_, int blockSize_, bool firstTask_, bool lastTask_)
virtual void doWork() override
ThreadedDeflater * deflater
Parallel compression a stream using the libz deflate algorithm.
ThreadedDeflater(sal_Int32 nSetLevel)
~ThreadedDeflater() COVERITY_NOEXCEPT_FALSE
css::uno::Sequence< sal_Int8 > inBuffer
void processDeflatedBuffers()
std::shared_ptr< comphelper::ThreadTaskTag > threadTaskTag
css::uno::Sequence< sal_Int8 > prevDataBlock
void deflateWrite(const css::uno::Reference< css::io::XInputStream > &xInStream, std::function< void(const css::uno::Sequence< sal_Int8 > &, sal_Int32)> aProcessInputFunc, std::function< void(const css::uno::Sequence< sal_Int8 > &, sal_Int32)> aProcessOutputFunc)
std::function< void(const css::uno::Sequence< sal_Int8 > &, sal_Int32)> maProcessOutputFunc
std::vector< std::vector< sal_Int8 > > outBuffers
static ThreadPool & getSharedOptimalPool()
void waitUntilDone(const std::shared_ptr< ThreadTaskTag > &, bool bJoin=true)
void pushTask(std::unique_ptr< ThreadTask > pTask)
sal_Int32 getWorkerCount() const
ThreadTask(std::shared_ptr< ThreadTaskTag > pTag)
#define SAL_WARN(area, stream)
const sal_Int64 MaxBlockSize