1// InBuffer.cpp 2 3#include "StdAfx.h" 4 5#include "InBuffer.h" 6 7extern "C" 8{ 9 #include "../../../C/Alloc.h" 10} 11 12CInBuffer::CInBuffer(): 13 _buffer(0), 14 _bufferLimit(0), 15 _bufferBase(0), 16 _stream(0), 17 _bufferSize(0) 18{} 19 20bool CInBuffer::Create(UInt32 bufferSize) 21{ 22 const UInt32 kMinBlockSize = 1; 23 if (bufferSize < kMinBlockSize) 24 bufferSize = kMinBlockSize; 25 if (_bufferBase != 0 && _bufferSize == bufferSize) 26 return true; 27 Free(); 28 _bufferSize = bufferSize; 29 _bufferBase = (Byte *)::MidAlloc(bufferSize); 30 return (_bufferBase != 0); 31} 32 33void CInBuffer::Free() 34{ 35 ::MidFree(_bufferBase); 36 _bufferBase = 0; 37} 38 39void CInBuffer::SetStream(ISequentialInStream *stream) 40{ 41 _stream = stream; 42} 43 44void CInBuffer::Init() 45{ 46 _processedSize = 0; 47 _buffer = _bufferBase; 48 _bufferLimit = _buffer; 49 _wasFinished = false; 50 #ifdef _NO_EXCEPTIONS 51 ErrorCode = S_OK; 52 #endif 53} 54 55bool CInBuffer::ReadBlock() 56{ 57 #ifdef _NO_EXCEPTIONS 58 if (ErrorCode != S_OK) 59 return false; 60 #endif 61 if (_wasFinished) 62 return false; 63 _processedSize += (_buffer - _bufferBase); 64 UInt32 numProcessedBytes; 65 HRESULT result = _stream->Read(_bufferBase, _bufferSize, &numProcessedBytes); 66 #ifdef _NO_EXCEPTIONS 67 ErrorCode = result; 68 #else 69 if (result != S_OK) 70 throw CInBufferException(result); 71 #endif 72 _buffer = _bufferBase; 73 _bufferLimit = _buffer + numProcessedBytes; 74 _wasFinished = (numProcessedBytes == 0); 75 return (!_wasFinished); 76} 77 78Byte CInBuffer::ReadBlock2() 79{ 80 if(!ReadBlock()) 81 return 0xFF; 82 return *_buffer++; 83} 84