1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/other-licenses/7zstub/src/7zip/Common/InBuffer.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,80 @@ 1.4 +// InBuffer.cpp 1.5 + 1.6 +#include "StdAfx.h" 1.7 + 1.8 +#include "InBuffer.h" 1.9 + 1.10 +#include "../../Common/Alloc.h" 1.11 + 1.12 +CInBuffer::CInBuffer(): 1.13 + _buffer(0), 1.14 + _bufferLimit(0), 1.15 + _bufferBase(0), 1.16 + _stream(0), 1.17 + _bufferSize(0) 1.18 +{} 1.19 + 1.20 +bool CInBuffer::Create(UInt32 bufferSize) 1.21 +{ 1.22 + const UInt32 kMinBlockSize = 1; 1.23 + if (bufferSize < kMinBlockSize) 1.24 + bufferSize = kMinBlockSize; 1.25 + if (_bufferBase != 0 && _bufferSize == bufferSize) 1.26 + return true; 1.27 + Free(); 1.28 + _bufferSize = bufferSize; 1.29 + _bufferBase = (Byte *)::MidAlloc(bufferSize); 1.30 + return (_bufferBase != 0); 1.31 +} 1.32 + 1.33 +void CInBuffer::Free() 1.34 +{ 1.35 + ::MidFree(_bufferBase); 1.36 + _bufferBase = 0; 1.37 +} 1.38 + 1.39 +void CInBuffer::SetStream(ISequentialInStream *stream) 1.40 +{ 1.41 + _stream = stream; 1.42 +} 1.43 + 1.44 +void CInBuffer::Init() 1.45 +{ 1.46 + _processedSize = 0; 1.47 + _buffer = _bufferBase; 1.48 + _bufferLimit = _buffer; 1.49 + _wasFinished = false; 1.50 + #ifdef _NO_EXCEPTIONS 1.51 + ErrorCode = S_OK; 1.52 + #endif 1.53 +} 1.54 + 1.55 +bool CInBuffer::ReadBlock() 1.56 +{ 1.57 + #ifdef _NO_EXCEPTIONS 1.58 + if (ErrorCode != S_OK) 1.59 + return false; 1.60 + #endif 1.61 + if (_wasFinished) 1.62 + return false; 1.63 + _processedSize += (_buffer - _bufferBase); 1.64 + UInt32 numProcessedBytes; 1.65 + HRESULT result = _stream->Read(_bufferBase, _bufferSize, &numProcessedBytes); 1.66 + #ifdef _NO_EXCEPTIONS 1.67 + ErrorCode = result; 1.68 + #else 1.69 + if (result != S_OK) 1.70 + throw CInBufferException(result); 1.71 + #endif 1.72 + _buffer = _bufferBase; 1.73 + _bufferLimit = _buffer + numProcessedBytes; 1.74 + _wasFinished = (numProcessedBytes == 0); 1.75 + return (!_wasFinished); 1.76 +} 1.77 + 1.78 +Byte CInBuffer::ReadBlock2() 1.79 +{ 1.80 + if(!ReadBlock()) 1.81 + return 0xFF; 1.82 + return *_buffer++; 1.83 +}