/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuProtocolStack.hpp Date: 2022-8-24 Author: Reece ***/ #pragma once #include "../AuIOPipeProcessor.hpp" #include "AuProtocolStackSpecialReader.hpp" #include "AuProtocolStackSpecialWriter.hpp" namespace Aurora::IO::Protocol { struct ProtocolPiece; struct ProtocolStack : IProtocolStack, AuEnableSharedFromThis { ProtocolStack(); ~ProtocolStack(); void Terminate(); bool DoTick() override; bool DoTick(const AuSPtr &read, const AuSPtr &pPiece); bool DoTickEx(bool bPermitRead = true); bool TryReadMore(bool bForce = false); AuSPtr AppendInterceptor(const AuSPtr &pInterceptor, AuUInt uOutputBufferSize) override; AuSPtr AppendInterceptorEx(const AuSPtr &pInterceptor, AuUInt uOutputBufferSize) override; AuSPtr AppendSingleFrameProcessor(const AuSPtr &pInterceptorEx) override; AuSPtr AppendSingleFrameProcessorEx(const AuSPtr &pInterceptorEx, AuUInt uOutputBufferSize) override; AuSPtr PrependInterceptor(const AuSPtr &pInterceptor, AuUInt uOutputBufferSize) override; AuSPtr PrependInterceptorEx(const AuSPtr &pInterceptor, AuUInt uOutputBufferSize) override; AuSPtr PrependSingleFrameProcessor(const AuSPtr &pInterceptorEx) override; AuSPtr PrependSingleFrameProcessorEx(const AuSPtr &pInterceptorEx, AuUInt uOutputBufferSize) override; AuSPtr AppendInterceptorDynamicBuffer(const AuSPtr &pInterceptorEx, AuUInt uOutputBufferSize, AuUInt uOutputBufferSizeMax) override; AuSPtr PrependInterceptorDynamicBuffer(const AuSPtr &pInterceptorEx, AuUInt uOutputBufferSize, AuUInt uOutputBufferSizeMax) override; AuSPtr PrependSingleFrameProcessorDynamicBuffer(const AuSPtr &pInterceptorEx, AuUInt uOutputBufferSize, AuUInt uOutputBufferSizeMax) override; AuSPtr AppendSingleFrameProcessorDynamicBuffer(const AuSPtr &pInterceptorEx, AuUInt uOutputBufferSize, AuUInt uOutputBufferSizeMax) override; AuSPtr AddEndInterceptor(const AuSPtr &pInterceptor) override; void Destroy() override; AuSPtr AddInterceptorWhere(bool bPrepend, const AuSPtr &pInterceptor, AuUInt uOutputBufferSize); AuSPtr AddInterceptorWhereEx(bool bPrepend, const AuSPtr &pInterceptor, AuUInt uOutputBufferSize, bool bMultipleTick, AuOptional uMax = {}); AuSPtr AsStreamWriter() override; AuSPtr AsWritableByteBuffer() override; AuSPtr AsStreamReader() override; AuSPtr AsReadableByteBuffer() override; AuList> GetArrayOfInterceptors() override; AuSPtr GetInterceptorAtIndex(AuUInt32 uIndex) override; bool IsValid() override; EProtocolStackCreateType eType; bool bDead {}; bool bStreamReaderFlagAdhocRead {}; bool bStreamReaderFlagAdhocPump {}; AuSPtr pSourceBufer; bool bOwnsSource {}; AuSPtr pDrainBuffer; AuSPtr pBottomPiece; AuSPtr pTopPiece; bool bWrittenEnd {}; AuWPtr pPipeWork; bool bKillPipeOnFirstRootLevelFalse {}; AuSPtr pStreamReaderCache; AuSPtr pStreamWriterCache; AuSPtr pStreamReaderAsInputSource; AuUInt uPreferredFragmentSize {}; SpecialReader readView; SpecialWriter writeView; AuRenterableMutex mutex; void DiscardAllocCaches(); }; }