/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuNetSocketChannelOutput.hpp Date: 2022-8-32 Author: Reece ***/ #pragma once #include "AuNetWriteQueue.hpp" namespace Aurora::IO::Net { struct SocketBase; struct NtAsyncNetworkTransaction; struct SocketChannelOutput : IAsyncFinishedSubscriber { SocketChannelOutput(SocketBase *pParent, const AuSPtr &stream); bool IsValid(); AuSPtr ToWriteTransaction(); AuSPtr AsWritableByteBuffer(); void ScheduleOutOfFrameWrite(); // Write outbound shit void SchedWriteTick(); void SendIfData(); bool WriteTickLocked(); void WriteTick(); void OnEndOfReadTick(); void OnAsyncFileOpFinished(AuUInt64 offset, AuUInt32 length) override; bool bShutdownOnComplete {}; AuByteBuffer &GetByteBuffer(); bool CanResize(); private: SocketBase * pParent_; AuSPtr pNetWriteTransaction_; void * pOutSendPointer_ {}; AuByteBuffer outputBuffer_; NetWriteQueue outputWriteQueue_; AuThreadPrimitives::SpinLock lock_; }; }