From baf31e32d0e9a436792ccd2543cfbf14313bb37b Mon Sep 17 00:00:00 2001 From: Jamie Reece Wilson Date: Sat, 2 Dec 2023 16:40:58 +0000 Subject: [PATCH] [+] IFileStream::ToStreamReader() [+] IFileStreamToStreamWriter() [+] IProcess::ToStreamReader(EStandardHandle stream) [+] IProcess::ToStreamWriter() --- Include/Aurora/IO/FS/IFileStream.hpp | 30 ++++++++++++++------- Include/Aurora/Processes/IProcess.hpp | 12 +++++++++ Source/IO/FS/FileStream.NT.cpp | 17 ++++++++++++ Source/IO/FS/FileStream.NT.hpp | 5 ++++ Source/IO/FS/FileStream.Unix.cpp | 18 ++++++++++++- Source/IO/FS/FileStream.Unix.hpp | 5 ++++ Source/Processes/AuProcess.NT.cpp | 39 +++++++++++++++++++++++++++ Source/Processes/AuProcess.NT.hpp | 3 +++ Source/Processes/AuProcess.Unix.cpp | 39 +++++++++++++++++++++++++++ Source/Processes/AuProcess.Unix.hpp | 3 +++ 10 files changed, 160 insertions(+), 11 deletions(-) diff --git a/Include/Aurora/IO/FS/IFileStream.hpp b/Include/Aurora/IO/FS/IFileStream.hpp index b7248d42..73e2af6f 100644 --- a/Include/Aurora/IO/FS/IFileStream.hpp +++ b/Include/Aurora/IO/FS/IFileStream.hpp @@ -15,58 +15,68 @@ namespace Aurora::IO::FS * @brief Read memoryview from the filestream at an auto-incrementing offset * @param parameters * @return - */ + */ virtual bool Read(const Memory::MemoryViewStreamWrite ¶meters) = 0; /** * @brief Writes memoryview to the filestream at an auto-incrementing offset * @param parameters * @return - */ + */ virtual bool Write(const Memory::MemoryViewStreamRead ¶meters) = 0; /** * @brief Returns the length of the file * @return - */ + */ virtual AuUInt64 GetLength() = 0; /** * @brief Returns the offset of the internal streams * @return - */ + */ virtual AuUInt64 GetOffset() = 0; /** * @brief Updates the stream pointer * @param offset * @return - */ + */ virtual bool SetOffset(AuUInt64 offset) = 0; /** * @brief Flush read/write streams - */ + */ virtual void Flush() = 0; /** * @brief Termiantes/truncates the file at the current offset - */ + */ virtual void WriteEoS() = 0; /** * @brief Close IFileStream resource - */ + */ virtual void Close() = 0; /** * @brief Indicates that the file should automatically be deleted upon destruction of the stream - */ + */ virtual void MakeTemporary() = 0; /** * @brief Returns the IO handle backing the file stream, if available. - */ + */ virtual AuSPtr GetHandle() = 0; + + /** + * @brief + */ + virtual IO::IStreamReader *ToStreamReader() = 0; + + /** + * @brief + */ + virtual IO::IStreamWriter *ToStreamWriter() = 0; }; } \ No newline at end of file diff --git a/Include/Aurora/Processes/IProcess.hpp b/Include/Aurora/Processes/IProcess.hpp index e44fdfe5..d4f7ca0d 100644 --- a/Include/Aurora/Processes/IProcess.hpp +++ b/Include/Aurora/Processes/IProcess.hpp @@ -106,5 +106,17 @@ namespace Aurora::Processes * @return */ virtual AuSPtr GetErrorStreamHandle() = 0; + + /** + * @brief + * @return + */ + virtual AuSPtr ToStreamReader(EStandardHandle stream) = 0; + + /** + * @brief + * @return + */ + virtual AuSPtr ToStreamWriter() = 0; }; } \ No newline at end of file diff --git a/Source/IO/FS/FileStream.NT.cpp b/Source/IO/FS/FileStream.NT.cpp index 7edb4b69..1fec8e22 100644 --- a/Source/IO/FS/FileStream.NT.cpp +++ b/Source/IO/FS/FileStream.NT.cpp @@ -16,6 +16,13 @@ namespace Aurora::IO::FS { static const AuUInt64 kFileCopyBlock = 0xFFFF * 128; + WinFileStream::WinFileStream() : + reader_(AuUnsafeRaiiToShared(this)), + writer_(AuUnsafeRaiiToShared(this)) + { + + } + WinFileStream::~WinFileStream() { Close(); @@ -432,6 +439,16 @@ namespace Aurora::IO::FS return this->pHandle_; } + IO::IStreamReader *WinFileStream::ToStreamReader() + { + return &this->reader_; + } + + IO::IStreamWriter *WinFileStream::ToStreamWriter() + { + return &this->writer_; + } + HANDLE WinFileStream::GetWin32Handle(bool bReadOnly) { if (auto pHandle = this->pHandle_) diff --git a/Source/IO/FS/FileStream.NT.hpp b/Source/IO/FS/FileStream.NT.hpp index 67b27341..9fd2ed43 100644 --- a/Source/IO/FS/FileStream.NT.hpp +++ b/Source/IO/FS/FileStream.NT.hpp @@ -13,6 +13,7 @@ namespace Aurora::IO::FS { struct WinFileStream : IFileStream { + WinFileStream(); ~WinFileStream(); void Init(AuSPtr pHandle); @@ -27,6 +28,8 @@ namespace Aurora::IO::FS void WriteEoS() override; void MakeTemporary() override; AuSPtr GetHandle() override; + IO::IStreamReader *ToStreamReader() override; + IO::IStreamWriter *ToStreamWriter() override; HANDLE GetWin32Handle(bool bReadOnly = false); @@ -34,6 +37,8 @@ namespace Aurora::IO::FS AuSPtr pHandle_; bool bShouldDelete {}; HANDLE hEventHandle_ { INVALID_HANDLE_VALUE }; + AuFS::FileReader reader_; + AuFS::FileWriter writer_; }; } #endif \ No newline at end of file diff --git a/Source/IO/FS/FileStream.Unix.cpp b/Source/IO/FS/FileStream.Unix.cpp index f940e16a..415258d6 100755 --- a/Source/IO/FS/FileStream.Unix.cpp +++ b/Source/IO/FS/FileStream.Unix.cpp @@ -118,7 +118,13 @@ namespace Aurora::IO::FS return true; } - + + PosixFileStream::PosixFileStream() : + reader_(AuUnsafeRaiiToShared(this)), + writer_(AuUnsafeRaiiToShared(this)) + { + + } PosixFileStream::~PosixFileStream() { @@ -416,6 +422,16 @@ namespace Aurora::IO::FS return this->pHandle_; } + IO::IStreamReader *PosixFileStream::ToStreamReader() + { + return &this->reader_; + } + + IO::IStreamWriter *PosixFileStream::ToStreamWriter() + { + return &this->writer_; + } + AUKN_SYM AuSPtr OpenBlockingFileStreamFromHandle(AuSPtr pIOHandle) { auto pStream = AuMakeShared(); diff --git a/Source/IO/FS/FileStream.Unix.hpp b/Source/IO/FS/FileStream.Unix.hpp index 79fd38cc..6c0914cf 100644 --- a/Source/IO/FS/FileStream.Unix.hpp +++ b/Source/IO/FS/FileStream.Unix.hpp @@ -19,6 +19,7 @@ namespace Aurora::IO::FS struct PosixFileStream : IFileStream { + PosixFileStream(); ~PosixFileStream(); bool Init(AuSPtr pHandle); @@ -33,6 +34,8 @@ namespace Aurora::IO::FS void WriteEoS() override; void MakeTemporary() override; AuSPtr GetHandle() override; + IO::IStreamReader *ToStreamReader() override; + IO::IStreamWriter *ToStreamWriter() override; int GetUnixHandle(); private: @@ -40,6 +43,8 @@ namespace Aurora::IO::FS AuString path_; AuThreadPrimitives::SpinLock spinlock_; bool bMadeTemporary {}; + AuFS::FileReader reader_; + AuFS::FileWriter writer_; }; } #endif \ No newline at end of file diff --git a/Source/Processes/AuProcess.NT.cpp b/Source/Processes/AuProcess.NT.cpp index a98cbbbd..63043320 100644 --- a/Source/Processes/AuProcess.NT.cpp +++ b/Source/Processes/AuProcess.NT.cpp @@ -506,6 +506,45 @@ namespace Aurora::Processes return this->fsErrorHandle_; } + AuSPtr ProcessImpl::ToStreamReader(EStandardHandle stream) + { + if (stream == EStandardHandle::eErrorStream) + { + if (auto pThat = this->GetErrorStreamHandle()) + { + if (auto pThat2 = AuFS::OpenBlockingFileStreamFromHandle(pThat)) + { + return { pThat2, pThat2->ToStreamReader() }; + } + } + } + else + { + if (auto pThat = this->GetOutputAndInputHandles()) + { + if (auto pThat2 = AuFS::OpenBlockingFileStreamFromHandle(pThat)) + { + return { pThat2, pThat2->ToStreamReader() }; + } + } + } + + return {}; + } + + AuSPtr ProcessImpl::ToStreamWriter() + { + if (auto pThat = this->GetErrorStreamHandle()) + { + if (auto pThat2 = AuFS::OpenBlockingFileStreamFromHandle(pThat)) + { + return { pThat2, pThat2->ToStreamWriter() }; + } + } + + return {}; + } + bool ProcessImpl::Start() { if (this->process_ != INVALID_HANDLE_VALUE) diff --git a/Source/Processes/AuProcess.NT.hpp b/Source/Processes/AuProcess.NT.hpp index a22ee925..73b783dc 100644 --- a/Source/Processes/AuProcess.NT.hpp +++ b/Source/Processes/AuProcess.NT.hpp @@ -38,6 +38,9 @@ namespace Aurora::Processes AuSPtr GetOutputAndInputHandles() override; AuSPtr GetErrorStreamHandle() override; + AuSPtr ToStreamReader(EStandardHandle stream) override; + AuSPtr ToStreamWriter() override; + bool Start() override; bool Init(); diff --git a/Source/Processes/AuProcess.Unix.cpp b/Source/Processes/AuProcess.Unix.cpp index 861c5899..867799b5 100644 --- a/Source/Processes/AuProcess.Unix.cpp +++ b/Source/Processes/AuProcess.Unix.cpp @@ -481,6 +481,45 @@ namespace Aurora::Processes return this->fsErrorHandle_; } + AuSPtr ProcessImpl::ToStreamReader(EStandardHandle stream) + { + if (stream == EStandardHandle::eErrorStream) + { + if (auto pThat = this->GetErrorStreamHandle()) + { + if (auto pThat2 = AuFS::OpenBlockingFileStreamFromHandle(pThat)) + { + return { pThat2, pThat2->ToStreamReader() }; + } + } + } + else + { + if (auto pThat = this->GetOutputAndInputHandles()) + { + if (auto pThat2 = AuFS::OpenBlockingFileStreamFromHandle(pThat)) + { + return { pThat2, pThat2->ToStreamReader() }; + } + } + } + + return {}; + } + + AuSPtr ProcessImpl::ToStreamWriter() + { + if (auto pThat = this->GetErrorStreamHandle()) + { + if (auto pThat2 = AuFS::OpenBlockingFileStreamFromHandle(pThat)) + { + return { pThat2, pThat2->ToStreamWriter() }; + } + } + + return {}; + } + void ProcessImpl::ForkMain() { { diff --git a/Source/Processes/AuProcess.Unix.hpp b/Source/Processes/AuProcess.Unix.hpp index 6382a9fd..5beacc74 100644 --- a/Source/Processes/AuProcess.Unix.hpp +++ b/Source/Processes/AuProcess.Unix.hpp @@ -49,6 +49,9 @@ namespace Aurora::Processes AuSPtr GetOutputAndInputHandles() override; AuSPtr GetErrorStreamHandle() override; + AuSPtr ToStreamReader(EStandardHandle stream) override; + AuSPtr ToStreamWriter() override; + bool Start() override; bool Init();