Return to InBuffer.cpp CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / elwix / tools / oldlzma / SRC / 7zip / Common |
1.1 misho 1: // InBuffer.cpp 2: 3: #include "StdAfx.h" 4: 5: #include "InBuffer.h" 6: 7: #include "../../Common/Alloc.h" 8: 9: CInBuffer::CInBuffer(): 10: _bufferBase(0), 11: _bufferSize(0), 12: _buffer(0), 13: _bufferLimit(0), 14: _stream(0) 15: {} 16: 17: bool 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 *)::BigAlloc(bufferSize); 27: return (_bufferBase != 0); 28: } 29: 30: void CInBuffer::Free() 31: { 32: BigFree(_bufferBase); 33: _bufferBase = 0; 34: } 35: 36: void CInBuffer::SetStream(ISequentialInStream *stream) 37: { 38: _stream = stream; 39: } 40: 41: void 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: 52: bool 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->ReadPart(_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: }