Reece Wilson
83ee24014f
[+] IProtocolPiece::Remove [+] IProtocolPiece::ToNextWriter [+] IProtocolPiece::GetNextPieceBuffer
70 lines
1.7 KiB
C++
70 lines
1.7 KiB
C++
/***
|
|
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
|
|
|
File: ProtocolPiece.cpp
|
|
Date: 2022-8-24
|
|
Author: Reece
|
|
***/
|
|
#include "Protocol.hpp"
|
|
#include "ProtocolPiece.hpp"
|
|
#include "ProtocolStack.hpp"
|
|
#include "IProtocolNext.hpp"
|
|
|
|
namespace Aurora::IO::Protocol
|
|
{
|
|
AuSPtr<IStreamWriter> ProtocolPiece::ToNextWriter()
|
|
{
|
|
if (this->pParent->pTopPiece.get() == this)
|
|
{
|
|
if (this->pParent->pDrainBuffer)
|
|
{
|
|
return AuMakeShared<Buffered::BlobWriter>(this->pParent->pDrainBuffer);
|
|
}
|
|
}
|
|
|
|
return this->pNext ?
|
|
this->pNext->pWriteInteface->GetStreamWriter() :
|
|
this->pOuputWriter;
|
|
}
|
|
|
|
void ProtocolPiece::Remove()
|
|
{
|
|
auto &pBottomPiece = this->pParent->pBottomPiece;
|
|
|
|
// fix chain
|
|
AuSPtr<IProtocolPiece> pLast;
|
|
auto pCurrent = pBottomPiece;
|
|
while (true)
|
|
{
|
|
if (!pCurrent)
|
|
{
|
|
break;
|
|
}
|
|
|
|
if (pCurrent.get() == this)
|
|
{
|
|
AuReinterpretCast<ProtocolPiece>(pLast)->pNext = pCurrent->pNext;
|
|
break;
|
|
}
|
|
|
|
pLast = pCurrent;
|
|
pCurrent = pCurrent->pNext;
|
|
}
|
|
|
|
// fix head pointers
|
|
if (this->pParent->pTopPiece.get() == this)
|
|
{
|
|
this->pParent->pTopPiece = AuReinterpretCast<ProtocolPiece>(pLast);
|
|
}
|
|
|
|
if (this->pParent->pBottomPiece.get() == this)
|
|
{
|
|
this->pParent->pBottomPiece = this->pNext;
|
|
}
|
|
}
|
|
|
|
AuSPtr<Memory::ByteBuffer> ProtocolPiece::GetNextPieceBuffer()
|
|
{
|
|
return AuSPtr<AuByteBuffer>(AuSharedFromThis(), &this->outputBuffer);
|
|
}
|
|
} |