/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuIPCPipe.NT.hpp Date: 2022-4-15 Author: Reece ***/ #pragma once #include "IPC.hpp" #include #include #include "AuIPCPipeWriter.hpp" #include "AuIPCPipeReader.hpp" namespace Aurora::IO::FS { struct NtAsyncFileStream; } namespace Aurora::IO::IPC { struct IPCHasConnectionEvent; struct IPCHandle; struct IPCPipeImpl : IPCPipe, Loop::LSHandle, AuEnableSharedFromThis { IPCPipeImpl(HANDLE clientHandle, HANDLE serverHandle, const IPCHandle &handle); ~IPCPipeImpl(); PROXY_INTERNAL_INTERFACE_(LSHandle::) virtual AuSPtr NewAsyncTransaction() override; virtual AuSPtr GetCurrentSharedDuplexHandles() override; virtual AuSPtr AsReadChannelIsOpen() override; virtual AuSPtr AsReadChannelHasData() override; virtual bool Read(const Memory::MemoryViewStreamWrite &write, bool nonblocking) override; virtual bool Write(const Memory::MemoryViewStreamRead &read) override; virtual AuString ExportToString() override; virtual AuSPtr ToFileStream() override; virtual AuSPtr ToStreamReader() override; virtual AuSPtr ToStreamWriter() override; bool IsSignaled() override; bool WaitOn(AuUInt32 timeout) override; Loop::ELoopSource GetType() override; HANDLE GetPipeHandle(); HANDLE GetConnectHandle(); void OnEndOfReadStream(); void TryConnect(); OVERLAPPED overlapped {}; HANDLE clientHandle_ {INVALID_HANDLE_VALUE}; bool bDead {}; AuSPtr hasClient_; private: HANDLE serverHandle_ {INVALID_HANDLE_VALUE}; IPCHandle ipcHandle_; AuSPtr fsHandle_; AuSPtr fsStream_; AuSPtr lshasConnection_; bool bFirstTime {true}; AuSPtr fsBlockingStream_; IPCPipeReader pipeReader_; IPCPipeWriter pipeWriter_; }; }