/*** 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 &pReadInByteBuffer, const AuSPtr &pWriteOutByteBuffer) { 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; } }