/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: Async.NT.hpp Date: 2021-9-13 Author: Reece ***/ #pragma once namespace Aurora::IO::IPC { struct IPCPipeImpl; } namespace Aurora::IO::FS { struct FileHandle { ~FileHandle(); bool Init(const AuString &path, EFileOpenMode openMode, bool directIO, EFileAdvisoryLockLevel lock); void Init(HANDLE read, HANDLE write); HANDLE handle {INVALID_HANDLE_VALUE}, writeHandle {INVALID_HANDLE_VALUE}; AuString path; bool readOnly; bool directIO; bool bNoOwns { false }; bool bWriteLock { false }; bool bReadLock { false }; }; struct NtAsyncFileStream : IAsyncFileStream { AuSPtr NewTransaction() override; bool BlockingTruncate(AuUInt64 length) override; bool BlockingRead(AuUInt64 offset, const Memory::MemoryViewStreamWrite ¶meters) override; bool BlockingWrite(AuUInt64 offset, const Memory::MemoryViewStreamRead ¶meters) override; void Init(const AuSPtr &handle); AuSPtr GetHandle(); private: AuSPtr handle_; }; struct NtAsyncFileTransaction : IAsyncTransaction, AuEnableSharedFromThis { ~NtAsyncFileTransaction(); bool Init(const AuSPtr &handle); void ResetAIO(); bool StartRead(AuUInt64 offset, const AuSPtr &memoryView) override; bool StartWrite(AuUInt64 offset, const AuSPtr &memoryView) override; bool isIrredeemable_ {}; bool Complete() override; bool CompleteEx(AuUInt completeRoutine, bool bForce = false); bool Failed() override; AuUInt GetOSErrorCode() override; AuUInt32 GetLastPacketLength() override; void SetCallback(const AuSPtr &sub) override; bool Wait(AuUInt32 timeout) override; AuSPtr NewLoopSource() override; void Reset(); bool IDontWannaUsePorts(); void DispatchCb(AuUInt32 len); HANDLE GetHandle(); AuSPtr GetFileHandle(); OVERLAPPED overlap {}; HANDLE event = INVALID_HANDLE_VALUE; AuSPtr pPin; AuUInt32 dwLastAbstractStat {}, dwLastAbstractOffset {}; bool bLatch {}; AuUInt32 dwLastBytes {}; AuUInt32 dwOsErrorCode {}; bool bHasFailed {}; AuWPtr pNtIpcPipeImpl; AuSPtr pMemoryHold; private: AuSPtr pHandle_; AuSPtr pSub_; }; }