/*** 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 SocketChannelInput : IIOBufferedStreamAvailable /*read/input stream*/, IIOPipeEventListener, /*read/input stream*/ IAsyncFinishedSubscriber { SocketChannelInput(SocketBase *pParent, const AuSPtr &asyncStream); // void WarmOnEstablish(); void OnEstablish(); void OnReadTick(); AuSPtr AsReadableByteBuffer(); // pipe bool OnDataAvailable(Memory::ByteBuffer &view) override; // listener void OnPipePartialEvent(AuUInt transferred) override; void OnPipeSuccessEvent() override; void OnPipeFailureEvent() override; void OnAsyncFileOpFinished(AuUInt64 offset, AuUInt32 length) override; bool IsValid(); AuSPtr pNetReader; AuSPtr pNetReadTransaction; private: void IncrementWorker(); void DecrementWorker(); bool bDecrementedWorker_ {}; SocketBase *pParent_; }; }