/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: IOAdapterCompression.cpp Date: 2022-6-6 Author: Reece ***/ #include #include #include "IOAdapterCompression.hpp" namespace Aurora::IO { CompressionStreamReader::CompressionStreamReader(const AuSPtr &compressionStream) : compressionStream(compressionStream) { } EStreamError CompressionStreamReader::IsOpen() { return this->errored_ ? EStreamError::eErrorEndOfStream : EStreamError::eErrorNone; } EStreamError CompressionStreamReader::Read(const Memory::MemoryViewStreamWrite ¶meters) { auto pair = this->compressionStream->ReadEx(parameters, true); if (pair == AuStreamReadWrittenPair_t{}) { this->errored_ = true; return EStreamError::eErrorEndOfStream; } parameters.outVariable = pair.second; return EStreamError::eErrorNone; } void CompressionStreamReader::Close() { } CompressionSeekingReader::CompressionSeekingReader(const AuSPtr &compressionStream) : compressionStream(compressionStream) { } EStreamError CompressionSeekingReader::IsOpen() { return this->errored_ ? EStreamError::eErrorEndOfStream : EStreamError::eErrorNone; } EStreamError CompressionSeekingReader::ArbitraryRead(AuUInt offset, const Memory::MemoryViewStreamWrite ¶meters) { if (this->offset != offset) { if (this->offset > offset) { if (!this->compressionStream->GoBackByProcessedN(this->offset - offset)) { SysPushErrorIO("Negative compression seek out of bounds"); return EStreamError::eErrorStreamInterrupted; } } else { if (!this->compressionStream->GoForwardByProcessedN(offset - this->offset)) { SysPushErrorIO("Positive compression seek out of bounds"); return EStreamError::eErrorStreamInterrupted; } } this->offset = offset; } auto pair = this->compressionStream->ReadEx(parameters, true); if (pair == AuStreamReadWrittenPair_t {}) { this->errored_ = true; return EStreamError::eErrorEndOfStream; } this->offset += pair.second; parameters.outVariable = pair.second; return EStreamError::eErrorNone; } void CompressionSeekingReader::Close() { } AUKN_SYM AuSPtr NewCompressionReadAdapter(const AuSPtr &compresionStream) { return AuMakeShared(compresionStream); } AUKN_SYM AuSPtr NewCompressionSeekingAdapter(const AuSPtr &compresionStream) { return AuMakeShared(compresionStream); } }