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