1a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver// InBuffer.cpp 2a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver 3a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver#include "StdAfx.h" 4a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver 5a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver#include "../../../C/Alloc.h" 6a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver 7a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver#include "InBuffer.h" 8a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver 9a8e05220c14778d93c97911044ff5124aadbd77cBen GruverCInBuffer::CInBuffer(): 10a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver _buffer(0), 11a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver _bufferLimit(0), 12a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver _bufferBase(0), 13a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver _stream(0), 14a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver _bufferSize(0) 15a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver{} 16a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver 17a8e05220c14778d93c97911044ff5124aadbd77cBen Gruverbool CInBuffer::Create(UInt32 bufferSize) 18a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver{ 19a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver const UInt32 kMinBlockSize = 1; 20a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver if (bufferSize < kMinBlockSize) 21a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver bufferSize = kMinBlockSize; 22a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver if (_bufferBase != 0 && _bufferSize == bufferSize) 23a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver return true; 24a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver Free(); 25a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver _bufferSize = bufferSize; 26a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver _bufferBase = (Byte *)::MidAlloc(bufferSize); 27a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver return (_bufferBase != 0); 28a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver} 29a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver 30a8e05220c14778d93c97911044ff5124aadbd77cBen Gruvervoid CInBuffer::Free() 31a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver{ 32a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver ::MidFree(_bufferBase); 33a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver _bufferBase = 0; 34a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver} 35a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver 36a8e05220c14778d93c97911044ff5124aadbd77cBen Gruvervoid CInBuffer::SetStream(ISequentialInStream *stream) 37a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver{ 38a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver _stream = stream; 39a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver} 40f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver 41a8e05220c14778d93c97911044ff5124aadbd77cBen Gruvervoid 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