/*** 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 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 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; 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}; AuSPtr hasClient_; private: HANDLE serverHandle_ {INVALID_HANDLE_VALUE}; IPCHandle ipcHandle_; AuSPtr fsHandle_; AuSPtr fsStream_; AuSPtr lshasConnection_; bool bFirstTime {true}; }; }