AuroraRuntime/Source/IO/TLS/TLSProtocolSend.cpp

66 lines
1.8 KiB
C++

/***
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
File: TLSProtocolSend.cpp
Date: 2022-8-24
Author: Reece
***/
#include "TLS.hpp"
#include "TLSContext.hpp"
namespace Aurora::IO::TLS
{
TLSProtocolSend::TLSProtocolSend(TLSContext *pParent) :
pParent_(pParent)
{
}
bool TLSProtocolSend::OnDataAvailable(const AuSPtr<Memory::ByteBuffer> &pReadInByteBuffer,
const AuSPtr<Memory::ByteBuffer> &pWriteOutByteBuffer,
const AuSPtr<Protocol::IProtocolPiece> &pProtocolPiece)
{
if (!this->pParent_->bIsAlive)
{
return true;
}
if (pReadInByteBuffer->writePtr == pReadInByteBuffer->readPtr)
{
return true;
}
while (pReadInByteBuffer->writePtr != pReadInByteBuffer->readPtr)
{
auto pDest = pReadInByteBuffer->GetNextLinearRead();
const AuUInt8 *pBase { pDest.ToPointer() };
AuUInt uCount { pDest.length };
if (!uCount)
{
return true;
}
int iRet = ::mbedtls_ssl_write(&this->pParent_->ssl,
pBase,
uCount);
if ((iRet == MBEDTLS_ERR_SSL_WANT_READ) ||
(iRet == MBEDTLS_ERR_SSL_WANT_WRITE))
{
return true;
}
if (iRet < 0)
{
this->pParent_->iFatalError = iRet;
SysPushErrorNet("{}", iRet);
this->pParent_->OnFatal();
return false;
}
pReadInByteBuffer->readPtr += iRet;
}
return true;
}
}