AuroraRuntime/Source/IO/IPC/AuIPCPipe.NT.hpp

77 lines
2.3 KiB
C++

/***
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 <Source/IO/IPC/AuIPCHandle.hpp>
#include <Source/IO/Loop/LSHandle.hpp>
#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>
{
IPCPipeImpl(HANDLE clientHandle, HANDLE serverHandle, const IPCHandle &handle);
~IPCPipeImpl();
PROXY_INTERNAL_INTERFACE_(LSHandle::)
virtual AuSPtr<IO::IAsyncTransaction> NewAsyncTransaction() override;
virtual AuSPtr<IO::IIOHandle> GetCurrentSharedDuplexHandles() override;
virtual AuSPtr<Loop::ILoopSource> AsReadChannelIsOpen() override;
virtual AuSPtr<Loop::ILoopSource> 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<IO::FS::IFileStream> ToFileStream() override;
virtual AuSPtr<IStreamReader> ToStreamReader() override;
virtual AuSPtr<IStreamWriter> 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<Loop::ILSEvent> hasClient_;
private:
HANDLE serverHandle_ {INVALID_HANDLE_VALUE};
IPCHandle ipcHandle_;
AuSPtr<IO::IIOHandle> fsHandle_;
AuSPtr<IO::FS::NtAsyncFileStream> fsStream_;
AuSPtr<IPCHasConnectionEvent> lshasConnection_;
bool bFirstTime {true};
AuSPtr<IO::FS::IFileStream> fsBlockingStream_;
IPCPipeReader pipeReader_;
IPCPipeWriter pipeWriter_;
};
}