/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuNetSocket.hpp Date: 2022-8-16 Author: Reece ***/ #pragma once #include "AuNetSocketChannel.hpp" #include "AuNetSocketConnectOperation.hpp" namespace Aurora::IO::FS { struct FileHandle; } namespace Aurora::IO::Net { struct NetInterface; struct NetWorker; struct SocketBase; struct SocketConnectOperation; struct SocketServerAcceptReadOperation; struct SocketBase : virtual ISocket, AuEnableSharedFromThis { friend struct SocketServerAcceptReadOperation; SocketBase(struct NetInterface *pInterface, struct NetWorker *pWorker, const AuSPtr &pSocketDriver, AuUInt osHandle); SocketBase(struct NetInterface *pInterface, struct NetWorker *pWorker, const AuSPtr &pSocketDriver, const NetEndpoint &endpoint); SocketBase(struct NetInterface *pInterface, struct NetWorker *pWorker, const AuSPtr &pSocketDriver, const NetSocketConnectMany &connectMany); virtual ~SocketBase(); bool ConnectNext(); bool Connect(const NetEndpoint &endpoint); AuUInt ToPlatformHandle() override; AuSPtr GetUserDriver() override; const NetEndpoint &GetRemoteEndpoint() override; const NetEndpoint &GetLocalEndpoint() override; const NetError &GetError() override; void ConnectFinished(); void ConnectFailed(const NetError &error); void DoMain(); void SendErrorNoStream(const NetError &error); void SendErrorBeginShutdown(const NetError &error); void SendOnData(); virtual AuSPtr ToChannel() override; virtual void Destroy() override; void ShutdownLite(); INetWorker *ToWorker(); NetWorker *ToWorkerEx(); bool SendPreestablish(); void SendEnd(); void SendFinalize(); bool IsValid(); SocketConnectOperation connectOperation; virtual void UpdateNagleAnyThread(bool bDisableNagle) = 0; virtual void FinishConstructAsync() = 0; virtual bool PrepareConnectOperations() = 0; virtual bool MakeNonblocking() = 0; virtual bool UpdateLocalEndpoint() = 0; virtual bool UpdateRemoteEndpoint() = 0; virtual bool TryBindAnyLocal() = 0; virtual bool ConnectOverlapped() = 0; virtual bool ConnectNonblocking() = 0; virtual bool ConnectBlocking() = 0; virtual void CloseSocket() = 0; AuUInt endpointSize_ {}; bool bHasFinalized_ {}; protected: AuUInt osHandle_; NetEndpoint remoteEndpoint_; NetEndpoint localEndpoint_; bool bForceFailConstruct_ {}; bool bHasRemoteMany_ {}; NetSocketConnectMany connectMany_; NetWorker *pWorker_; NetInterface *pInterface_; SocketChannel socketChannel_; AuSPtr pSocketDriver_; AuSPtr osHandleOwner_; NetError error_; bool bHasEnded {}; bool bHasErrored_ {}; bool bHasConnected_ {}; }; } #if defined(AURORA_IS_MODERNNT_DERIVED) #include "AuNetSocket.NT.hpp" #else #include "AuNetSocket.Unix.hpp" #endif