/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuProtocolPiece.cpp Date: 2022-8-24 Author: Reece ***/ #include "Protocol.hpp" #include "AuProtocolPiece.hpp" #include "AuProtocolStack.hpp" #include "IProtocolNext.hpp" namespace Aurora::IO::Protocol { AuSPtr ProtocolPiece::ToNextWriter() { if (this->pParent->pTopPiece.get() == this) { if (this->pParent->pDrainBuffer) { return AuMakeShared(this->pParent->pDrainBuffer); } } return this->pNext ? this->pNext->pWriteInteface->GetStreamWriter() : this->pOuputWriter; } void ProtocolPiece::Remove() { auto &pBottomPiece = this->pParent->pBottomPiece; // fix chain AuSPtr pLast; auto pCurrent = pBottomPiece; while (true) { if (!pCurrent) { break; } if (pCurrent.get() == this) { AuReinterpretCast(pLast)->pNext = pCurrent->pNext; break; } pLast = pCurrent; pCurrent = pCurrent->pNext; } // fix head pointers if (this->pParent->pTopPiece.get() == this) { this->pParent->pTopPiece = AuReinterpretCast(pLast); } if (this->pParent->pBottomPiece.get() == this) { this->pParent->pBottomPiece = this->pNext; } } AuSPtr ProtocolPiece::GetNextPieceBuffer() { return AuSPtr(AuSharedFromThis(), &this->outputBuffer); } }