/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuBaseStream.hpp Date: 2022-2-14 Author: Reece ***/ #pragma once #include "AuIngestableReadBase.hpp" #include namespace Aurora::Compression { struct BaseStream : ICompressionStream, protected IngestableReadBase { inline BaseStream(AuUInt32 bufferSize = 4096 * 64) : _outbufferOwned(bufferSize, true), uBufferSize_(bufferSize), reader_(AuUnsafeRaiiToShared(this)) { SetBuffer({}); } inline virtual ~BaseStream() {} virtual bool Init(const AuSPtr &reader) = 0; virtual AuUInt32 GetAvailableProcessedBytes() override; virtual AuStreamReadWrittenPair_t ReadEx(const AuMemoryViewWrite & /*opt*/ destination, bool bIngestUntilEOS) override; virtual AuUInt32 Read(const AuMemoryViewWrite & /*opt*/ destination) override; virtual bool GoBackByProcessedN(AuUInt32 dwOffset) override; virtual bool GoForwardByProcessedN(AuUInt32 dwOffset) override; virtual AuUInt32 GetInternalBufferSize() override; virtual AuOptional GetLastError() override; virtual AuOptional GetLastErrorString() override; void SetLastError(int i, const AuString &str); void SetLastError(int i); bool Write(const void *pDest, AuUInt32 dwLength); bool Write2(const void *pDest, AuUInt32 dwLength); AuPair GetDOutPair(); virtual AuStreamReadWrittenPair_t Ingest(AuUInt32 bytesFromUnprocessedInputSource) override; virtual bool Flush() override; virtual bool Finish() override; virtual IO::IStreamReader *ToStreamReader() override; bool IsValid(); AuSPtr GetBuffer(); void SetBuffer(const AuSPtr &pBuffer); AuSPtr GetWeakBuffer(); void SetWeakBuffer(const AuSPtr &pBuffer); void InitByDesc(CompressInfo &info); void InitByDesc(DecompressInfo &info); protected: virtual AuStreamReadWrittenPair_t Ingest_s(AuUInt32 dwBytesFromUnprocessedInputSource) = 0; IO::Adapters::CompressionStreamReader reader_; AuSPtr pOutputBuffer_; AuWPtr wpInBuffer_; AuSPtr pOutputBufferInterface_; AuSPtr pFallbackTempBuffer_; Memory::ByteBuffer _outbufferOwned; AuThreadPrimitives::SpinLock _spinlock; AuUInt32 uBufferSize_; AuOptional optLastError_; AuString optLastErrorString_; }; } #include "AuIngestableReadBase.inl"