11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
17PROMEKI_NAMESPACE_BEGIN
52class BufferedIODevice :
public IODevice {
53 PROMEKI_OBJECT(BufferedIODevice, IODevice)
59 BufferedIODevice(ObjectBase *parent =
nullptr);
62 virtual ~BufferedIODevice();
76 int64_t read(
void *data, int64_t maxSize)
override;
85 int64_t bytesAvailable()
const override;
98 Error setReadBuffer(Buffer &&buf);
104 const Buffer &readBuffer()
const {
return _readBuf; }
110 size_t readBufferSize()
const {
return _readBuf.availSize(); }
121 Buffer readLine(
size_t maxLength = 0);
134 Buffer readBytes(
size_t maxBytes);
143 bool canReadLine()
const;
153 int64_t peek(
void *buf,
size_t maxBytes)
const;
162 Buffer peek(
size_t maxBytes)
const;
174 void setUnbuffered(
bool enable);
180 bool isUnbuffered()
const {
return _unbuffered; }
195 int64_t write(
const void *data, int64_t maxSize)
override;
205 void flush()
override;
215 void setWriteBuffered(
bool enable);
221 bool isWriteBuffered()
const {
return _writeBuffered; }
227 size_t writeBufferCapacity()
const {
return _writeBufCapacity; }
238 void setWriteBufferCapacity(
size_t bytes);
250 virtual int64_t readFromDevice(
void *data, int64_t maxSize) = 0;
264 virtual int64_t writeToDevice(
const void *data, int64_t maxSize) = 0;
274 virtual int64_t deviceBytesAvailable()
const;
286 size_t bufferedBytesUnconsumed()
const {
return _readBufFill - _readBufPos; }
299 size_t bufferedBytesPending()
const {
return _writeBuf.size(); }
307 void ensureReadBuffer();
315 void resetReadBuffer();
319 static constexpr size_t DefaultReadBufSize = 8192;
322 static constexpr size_t DefaultWriteBufSize = 8192;
324 bool _unbuffered =
false;
326 size_t _readBufPos = 0;
327 size_t _readBufFill = 0;
328 bool _bufferAllocated =
false;
330 bool _writeBuffered =
false;
331 size_t _writeBufCapacity = DefaultWriteBufSize;
332 List<char> _writeBuf;
338 int64_t fillBuffer();
343 void compactBuffer();