AuroraRuntime/Source/IO/Net/AuNetStream.NT.hpp

101 lines
3.2 KiB
C++

/***
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 <Source/IO/Loop/ILoopSourceEx.hpp>
#include <Source/IO/Loop/LSHandle.hpp>
#include <Source/IO/Loop/LSEvent.hpp>
#include <Source/IO/FS/Async.NT.hpp>
namespace Aurora::IO::Net
{
struct SocketBase;
struct NtAsyncNetworkTransaction :
IAsyncTransaction,
CompletionGroup::ICompletionGroupWorkItem,
AuEnableSharedFromThis<NtAsyncNetworkTransaction>
{
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<IAsyncFinishedSubscriber> &sub) override;
bool Wait(AuUInt32 timeout) override;
AuSPtr<AuLoop::ILoopSource> 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<CompletionGroup::ICompletionGroup> &pCompletionGroup) override;
CompletionGroup::ICompletionGroupWorkHandle *ToCompletionGroupHandle() override;
AuSPtr<CompletionGroup::ICompletionGroup> GetCompletionGroup() override;
SocketBase * pSocket;
OVERLAPPED overlap {};
AuSPtr<Loop::ILSEvent> pWaitable;
bool bForceNextWait {};
AuSPtr<NtAsyncNetworkTransaction> 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<IAsyncFinishedSubscriber> pSub;
AuSPtr<CompletionGroup::ICompletionGroup> pCompletionGroup_;
int iSocketLength {};
NetEndpoint netEndpoint;
};
}