/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuNetStream.NT.hpp Date: 2022-8-17 Author: Reece ***/ #pragma once #include #include #include #include namespace Aurora::IO::Net { struct SocketBase; struct NtAsyncNetworkTransaction : IAsyncTransaction, CompletionGroup::ICompletionGroupWorkItem, AuEnableSharedFromThis { NtAsyncNetworkTransaction(SocketBase *pSocket); ~NtAsyncNetworkTransaction(); bool StartRead(AuUInt64 offset, const AuMemoryViewWrite &memoryView) override; bool StartWrite(AuUInt64 offset, const AuMemoryViewRead &memoryView) override; bool CompleteEx(AuUInt completeRoutine, bool bForce = false); bool Complete() override; bool HasFailed() override; bool HasErrorCode(); AuUInt GetOSErrorCode() override; bool HasCompleted() override; AuUInt32 GetLastPacketLength() override; void SetCallback(const AuSPtr &sub) override; bool Wait(AuUInt32 timeout) override; AuSPtr NewLoopSource() override; void SetBaseOffset(AuUInt64 uBaseOffset) override; void Reset() override; void MakeSyncable(); void ForceNextWriteWait(); bool IDontWannaUsePorts(); void DispatchCb(AuUInt32 len); void RoutineCallCB(AuUInt32 len); #if defined(__AUHAS_COROUTINES_CO_AWAIT) && defined(AU_LANG_CPP_20_) AuVoidTask RoutineCallCB_(AuUInt32 len); #endif SOCKET GetSocket(); HANDLE GetAlertable(); bool TranslateLastError(bool bReturnValue, bool bForceFail = false); bool HasCompletedForGCWI() override; void CleanupForGCWI() override; bool TryAttachToCompletionGroup(const AuSPtr &pCompletionGroup) override; CompletionGroup::ICompletionGroupWorkHandle *ToCompletionGroupHandle() override; AuSPtr GetCompletionGroup() override; SocketBase * pSocket; OVERLAPPED overlap {}; AuSPtr pWaitable; bool bForceNextWait {}; AuSPtr pPin; AuUInt32 dwLastAbstractStat {}, dwLastAbstractOffset {}, dwLastBytes {}; bool bIsIrredeemable {}; bool bLatch {}; AuUInt32 dwOsErrorCode {}; AuUInt32 dwRecvFlags {}; AuUInt32 dwSendFlags {}; bool bHasFailed {}; AuMemoryViewRead readView; AuMemoryViewWrite writeView; bool bDisallowRecv {}; bool bDisallowSend {}; bool bSendEOSOnce {}; bool bIsWriting {}; bool bDatagramMode {}; AuSPtr pSub; AuSPtr pCompletionGroup_; int iSocketLength {}; NetEndpoint netEndpoint; }; }