/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuNetSocketOverlappedOperation.NT.hpp Date: 2022-8-17 Author: Reece ***/ #pragma once namespace Aurora::IO::Net { struct NetInterface; struct NetWorker; struct Socket; struct SocketOverlappedOperation : AuIO::IIOSimpleEventListener { SocketOverlappedOperation(bool bMultipleTrigger = false); OVERLAPPED overlapped {}; AuSPtr pSocket {}; AuSPtr pEvent; AuUInt uOsError {}; bool bMultipleTrigger {}; bool FinishOperation(const AuSPtr &that, const AuSPtr &pWorker, bool bReturnCode); bool FinishOperationEx(const AuSPtr &that, const AuSPtr &pWorker, bool bReturnCode, DWORD dwCode); NetError ToError(); virtual void OnIOTick() override; virtual void OnIOComplete() override; virtual void OnIOFailure() override; virtual void OnOverlappedComplete() = 0; virtual void OnOverlappedFailure(const NetError &error) = 0; bool HasFailed(); AuUInt ToOsError(); bool HasComplete(); bool IsValid(); private: bool bHasFlipped {}; }; }