/*** 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; }; 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); 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 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(); // Required for a very evil hack OVERLAPPED overlap_ {}; HANDLE event_ = INVALID_HANDLE_VALUE; AuSPtr pin_; AuUInt32 lastAbstractStat_ {}, lastAbstractOffset_ {}; bool latch_ {}; AuUInt lastBytes {}; AuUInt32 osErrorCode {}; bool hasFailed {}; AuWPtr ntIpcPipeImpl; AuSPtr memoryHold_; private: AuSPtr handle_; AuSPtr sub_; }; }