/*** 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 AddInterceptor(EProtocolWhere eWhere, const AuSPtr &pInterceptor, AuUInt uOutputBufferSize) override; AuSPtr AddInterceptorEx(EProtocolWhere eWhere, const AuSPtr &pInterceptor, AuUInt uOutputBufferSize) override; AuSPtr AddSingleFrameProcessor(EProtocolWhere eWhere, const AuSPtr &pInterceptorEx) override; AuSPtr AddSingleFrameProcessorEx(EProtocolWhere eWhere, const AuSPtr &pInterceptorEx, AuUInt uOutputBufferSize) override; AuSPtr AddInterceptorDynamicBuffer(EProtocolWhere eWhere, const AuSPtr &pInterceptorEx, AuUInt uOutputBufferSize, AuUInt uOutputBufferSizeMax) override; AuSPtr AddSingleFrameProcessorDynamicBuffer(EProtocolWhere eWhere, const AuSPtr &pInterceptorEx, AuUInt uOutputBufferSize, AuUInt uOutputBufferSizeMax) override; AuSPtr AddEndInterceptor(const AuSPtr &pInterceptor) override; void Destroy() override; AuSPtr AddInterceptorWhere(EProtocolWhere eWhere, const AuSPtr &pInterceptor, AuUInt uOutputBufferSize); AuSPtr AddInterceptorWhereEx(EProtocolWhere eWhere, 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(); }; }