From 076e2554320c009d48fee7b93fa590cd4e22af46 Mon Sep 17 00:00:00 2001 From: Jamie Reece Wilson Date: Tue, 24 Oct 2023 11:27:20 +0100 Subject: [PATCH] [*] Redo AuIO::ReadAll(IStreamReader *that, Memory::ByteBuffer &buffer, ...) [+] EStreamError::eErrorByteBuffer [+] EStreamError::eErrorOutOfMemory --- Include/Aurora/IO/EStreamError.hpp | 4 +- Include/Aurora/IO/IStreamReader.hpp | 2 +- Include/Aurora/IO/IStreamReader.inl | 62 +++++++++++++++++++++-------- 3 files changed, 50 insertions(+), 18 deletions(-) diff --git a/Include/Aurora/IO/EStreamError.hpp b/Include/Aurora/IO/EStreamError.hpp index e29659f5..b5398e52 100644 --- a/Include/Aurora/IO/EStreamError.hpp +++ b/Include/Aurora/IO/EStreamError.hpp @@ -14,6 +14,8 @@ namespace Aurora::IO eErrorEndOfStream, eErrorStreamNotOpen, eErrorStreamInterrupted, - eErrorHandleClosed + eErrorHandleClosed, + eErrorOutOfMemory, + eErrorByteBuffer ); } \ No newline at end of file diff --git a/Include/Aurora/IO/IStreamReader.hpp b/Include/Aurora/IO/IStreamReader.hpp index 5054475d..44560f11 100644 --- a/Include/Aurora/IO/IStreamReader.hpp +++ b/Include/Aurora/IO/IStreamReader.hpp @@ -15,7 +15,7 @@ namespace Aurora::IO AUI_METHOD(void, Close, ()) ); - inline EStreamError ReadAll(IStreamReader* that, Memory::ByteBuffer& buffer); + inline EStreamError ReadAll(IStreamReader* that, Memory::ByteBuffer& buffer, AuOptional bBreakOnFirstMismatchLength = true); } #include "IStreamReader.inl" // ReadAll utility \ No newline at end of file diff --git a/Include/Aurora/IO/IStreamReader.inl b/Include/Aurora/IO/IStreamReader.inl index b984be37..b3f3bc97 100644 --- a/Include/Aurora/IO/IStreamReader.inl +++ b/Include/Aurora/IO/IStreamReader.inl @@ -9,32 +9,62 @@ namespace Aurora::IO { - inline EStreamError ReadAll(IStreamReader *that, Memory::ByteBuffer &buffer) + inline EStreamError ReadAll(IStreamReader *that, Memory::ByteBuffer &buffer, AuOptional bBreakOnFirstMismatchLength) { - static const int kBufferSize = 2048; + static const int kBufferSize = 8192; - AuUInt len; EStreamError ret; - AuUInt8 temp[kBufferSize]; - - len = kBufferSize; ret = EStreamError::eErrorEndOfStream; - buffer = Memory::NewResizableBuffer(); - - while ((ret = that->Read(Memory::MemoryViewStreamWrite(temp, len))) == EStreamError::eErrorNone) + if (buffer.HasStreamError()) { - if (len == 0) + return EStreamError::eErrorByteBuffer; + } + + while (true) + { + AuUInt uBytesRead {}; + bool bDoublebreak {}; + + auto next = buffer.GetNextLinearWrite(); + if (!next) + { + next = buffer.GetOrAllocateLinearWriteable(kBufferSize); + } + + if (!next) + { + return EStreamError::eErrorOutOfMemory; + } + + while ((ret = that->Read(Memory::MemoryViewStreamWrite(next, uBytesRead))) == EStreamError::eErrorNone) + { + if (uBytesRead == 0) + { + bDoublebreak = true; + break; + } + + buffer.Write(next.ptr, uBytesRead); + + if (bBreakOnFirstMismatchLength.value_or(true) && + uBytesRead != next.length) + { + bDoublebreak = true; + break; + } + } + + if (uBytesRead == 0 || + bDoublebreak) { break; } + } - buffer.Write(temp, len); - - if (len != kBufferSize) - { - break; - } + if (buffer.HasStreamError()) + { + return EStreamError::eErrorByteBuffer; } if (ret == EStreamError::eErrorEndOfStream)