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