/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuNetSocketChannel.hpp Date: 2022-8-16 Author: Reece ***/ #pragma once #include "AuNetWriteQueue.hpp" #include "AuNetSocketChannelInput.hpp" #include "AuNetSocketChannelOutput.hpp" #include "AuSocketStats.hpp" namespace Aurora::IO::Net { struct SocketBase; struct NtAsyncNetworkTransaction; struct SocketChannel : ISocketChannel { SocketChannel(SocketBase *pParent); bool IsValid(); AuSPtr ToParent() override; void ScheduleOutOfFrameWrite() override; AuSPtr ToReadTransaction() override; AuSPtr ToWriteTransaction() override; bool SpecifyTCPNoDelay(bool bFuckNagle) override; bool SpecifyTransactionsHaveIOFence(bool bAllocateFence) override; bool SpecifyBufferSize(AuUInt uBytes, const AuSPtr> &pCallbackOptional) override; bool SpecifyOutputBufferSize(AuUInt uBytes, const AuSPtr> &pCallbackOptional) override; bool SpecifyInputBufferSize(AuUInt uBytes, const AuSPtr> &pCallbackOptional) override; bool SpecifyManualWrite(bool bEnableDirectAIOWrite) override; bool SpecifyManualRead(bool bEnableDirectAIORead) override; bool SpecifyPerTickAsyncReadLimit(AuUInt uBytes) override; bool GetCurrentTCPNoDelay() override; AuUInt GetInputBufferSize() override; AuUInt GetOutputBufferSize() override; AuSPtr AsStreamReader() override; AuSPtr AsReadableByteBuffer() override; AuSPtr AsStreamWriter() override; AuSPtr AsWritableByteBuffer() override; AuSPtr NewProtocolRecvStack() override; AuSPtr NewProtocolSendStack() override; void SpecifyRecvProtocol(const AuSPtr &pRecvProtocol) override; void SpecifySendProtocol(const AuSPtr &pSendProtocol) override; AuSPtr GetRecvStats() override; AuSPtr GetSendStats() override; SocketStats & GetSendStatsEx(); SocketStats & GetRecvStatsEx(); void Establish(); void DoBufferResizeOnThread(bool bInput, bool bOutput, AuUInt uBytes, const AuSPtr> &pCallbackOptional); SocketChannelOutput outputChannel; SocketChannelInput inputChannel; bool bIsManualRead {}; bool bIsManualWrite {}; bool bIsEstablished {}; bool bTcpNoDelay {}; AuUInt uBytesToFlip { 0 }; AuUInt uBytesInputBuffer { 0 }; AuUInt uBytesOutputBuffer { 0 }; AuSPtr pRecvProtocol; AuSPtr pSendProtocol; private: SocketBase * pParent_; SocketStats sendStats_; SocketStats recvStats_; }; }