rlm@1: // InBuffer.cpp rlm@1: rlm@1: #include "StdAfx.h" rlm@1: rlm@1: #include "InBuffer.h" rlm@1: rlm@1: extern "C" rlm@1: { rlm@1: #include "../../../C/Alloc.h" rlm@1: } rlm@1: rlm@1: CInBuffer::CInBuffer(): rlm@1: _buffer(0), rlm@1: _bufferLimit(0), rlm@1: _bufferBase(0), rlm@1: _stream(0), rlm@1: _bufferSize(0) rlm@1: {} rlm@1: rlm@1: bool CInBuffer::Create(UInt32 bufferSize) rlm@1: { rlm@1: const UInt32 kMinBlockSize = 1; rlm@1: if (bufferSize < kMinBlockSize) rlm@1: bufferSize = kMinBlockSize; rlm@1: if (_bufferBase != 0 && _bufferSize == bufferSize) rlm@1: return true; rlm@1: Free(); rlm@1: _bufferSize = bufferSize; rlm@1: _bufferBase = (Byte *)::MidAlloc(bufferSize); rlm@1: return (_bufferBase != 0); rlm@1: } rlm@1: rlm@1: void CInBuffer::Free() rlm@1: { rlm@1: ::MidFree(_bufferBase); rlm@1: _bufferBase = 0; rlm@1: } rlm@1: rlm@1: void CInBuffer::SetStream(ISequentialInStream *stream) rlm@1: { rlm@1: _stream = stream; rlm@1: } rlm@1: rlm@1: void CInBuffer::Init() rlm@1: { rlm@1: _processedSize = 0; rlm@1: _buffer = _bufferBase; rlm@1: _bufferLimit = _buffer; rlm@1: _wasFinished = false; rlm@1: #ifdef _NO_EXCEPTIONS rlm@1: ErrorCode = S_OK; rlm@1: #endif rlm@1: } rlm@1: rlm@1: bool CInBuffer::ReadBlock() rlm@1: { rlm@1: #ifdef _NO_EXCEPTIONS rlm@1: if (ErrorCode != S_OK) rlm@1: return false; rlm@1: #endif rlm@1: if (_wasFinished) rlm@1: return false; rlm@1: _processedSize += (_buffer - _bufferBase); rlm@1: UInt32 numProcessedBytes; rlm@1: HRESULT result = _stream->Read(_bufferBase, _bufferSize, &numProcessedBytes); rlm@1: #ifdef _NO_EXCEPTIONS rlm@1: ErrorCode = result; rlm@1: #else rlm@1: if (result != S_OK) rlm@1: throw CInBufferException(result); rlm@1: #endif rlm@1: _buffer = _bufferBase; rlm@1: _bufferLimit = _buffer + numProcessedBytes; rlm@1: _wasFinished = (numProcessedBytes == 0); rlm@1: return (!_wasFinished); rlm@1: } rlm@1: rlm@1: Byte CInBuffer::ReadBlock2() rlm@1: { rlm@1: if(!ReadBlock()) rlm@1: return 0xFF; rlm@1: return *_buffer++; rlm@1: }