[*] Redo AuIO::ReadAll(IStreamReader *that, Memory::ByteBuffer &buffer, ...)
[+] EStreamError::eErrorByteBuffer [+] EStreamError::eErrorOutOfMemory
This commit is contained in:
parent
4b38f205d1
commit
076e255432
@ -14,6 +14,8 @@ namespace Aurora::IO
|
||||
eErrorEndOfStream,
|
||||
eErrorStreamNotOpen,
|
||||
eErrorStreamInterrupted,
|
||||
eErrorHandleClosed
|
||||
eErrorHandleClosed,
|
||||
eErrorOutOfMemory,
|
||||
eErrorByteBuffer
|
||||
);
|
||||
}
|
@ -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<bool> bBreakOnFirstMismatchLength = true);
|
||||
}
|
||||
|
||||
#include "IStreamReader.inl" // ReadAll utility
|
@ -9,34 +9,64 @@
|
||||
|
||||
namespace Aurora::IO
|
||||
{
|
||||
inline EStreamError ReadAll(IStreamReader *that, Memory::ByteBuffer &buffer)
|
||||
inline EStreamError ReadAll(IStreamReader *that, Memory::ByteBuffer &buffer, AuOptional<bool> 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();
|
||||
if (buffer.HasStreamError())
|
||||
{
|
||||
return EStreamError::eErrorByteBuffer;
|
||||
}
|
||||
|
||||
while ((ret = that->Read(Memory::MemoryViewStreamWrite(temp, len))) == EStreamError::eErrorNone)
|
||||
while (true)
|
||||
{
|
||||
if (len == 0)
|
||||
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(temp, len);
|
||||
buffer.Write(next.ptr, uBytesRead);
|
||||
|
||||
if (len != kBufferSize)
|
||||
if (bBreakOnFirstMismatchLength.value_or(true) &&
|
||||
uBytesRead != next.length)
|
||||
{
|
||||
bDoublebreak = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (uBytesRead == 0 ||
|
||||
bDoublebreak)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (buffer.HasStreamError())
|
||||
{
|
||||
return EStreamError::eErrorByteBuffer;
|
||||
}
|
||||
|
||||
if (ret == EStreamError::eErrorEndOfStream)
|
||||
{
|
||||
return EStreamError::eErrorNone;
|
||||
|
Loading…
Reference in New Issue
Block a user