Sane C++ Libraries
C++ Platform Abstraction Libraries
Loading...
Searching...
No Matches
ZLibTransformStreams.h
1// Copyright (c) Stefano Cristiano
2// SPDX-License-Identifier: MIT
3#pragma once
4#include "AsyncStreams.h"
5#include "Internal/ZLibStream.h"
6
7namespace SC
8{
10{
12 ZLibStream stream;
13
14 private:
15 size_t consumedInputBytes = 0;
16
17 virtual Result asyncWrite(AsyncBufferView::ID bufferID, Function<void(AsyncBufferView::ID)> cb) override;
18 virtual bool canEndWritable() override;
19};
20
21template <typename T_AsyncEventLoop>
23{
25 {
26 asyncWork.work.template bind<AsyncZLibTransformStreamT, &AsyncZLibTransformStreamT::work>(*this);
27 asyncWork.callback.template bind<AsyncZLibTransformStreamT, &AsyncZLibTransformStreamT::afterWork>(*this);
28 }
29
30 ZLibStream stream;
31
32 typename T_AsyncEventLoop::LoopWork asyncWork;
33
34 void setEventLoop(T_AsyncEventLoop& loop) { eventLoop = &loop; }
35
36 private:
37 T_AsyncEventLoop* eventLoop = nullptr;
38
39 virtual Result onProcess(Span<const char> input, Span<char> output) override
40 {
41 SC_ASYNC_STREAMS_ASSERT_RELEASE(not finalizing);
42 savedInput = input;
43 savedOutput = output;
44 finalizing = false;
45 if (eventLoop == nullptr)
46 return Result::Error(AsyncStreamsResultCategory, AsyncStreamsError::AsyncEventLoopMissing);
47 return asyncWork.start(*eventLoop);
48 }
49
50 virtual Result onFinalize(Span<char> output) override
51 {
52 // Intentionally not resetting savedInput, that can contain leftover data to process
53 savedOutput = output;
54 finalizing = true;
55 if (eventLoop == nullptr)
56 return Result::Error(AsyncStreamsResultCategory, AsyncStreamsError::AsyncEventLoopMissing);
57 return asyncWork.start(*eventLoop);
58 }
59
60 void afterWork(typename T_AsyncEventLoop::LoopWork::Result&)
61 {
62 if (finalizing)
63 {
64 AsyncTransformStream::afterFinalize(savedOutput, streamEnded);
65 }
66 else
67 {
68 AsyncTransformStream::afterProcess(savedInput, savedOutput);
69 }
70 }
71
72 Result work()
73 {
74 return finalizing ? stream.finalize(savedOutput, streamEnded) : stream.process(savedInput, savedOutput);
75 }
76
77 bool finalizing = false;
78 bool streamEnded = false;
79
80 Span<const char> savedInput;
81 Span<char> savedOutput;
82};
83
84} // namespace SC
Definition AsyncStreams.h:67
A stream that can both produce and consume buffers.
Definition AsyncStreams.h:495
A duplex stream that produces new buffers transforming received buffers.
Definition AsyncStreams.h:506
Definition ZLibTransformStreams.h:23
Definition ZLibTransformStreams.h:10