Mercurial > vba-linux
diff src/win32/7zip/7z/CPP/7zip/Common/InBuffer.cpp @ 1:f9f4f1b99eed
importing src directory
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 03 Mar 2012 10:31:27 -0600 |
parents | |
children |
line wrap: on
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/win32/7zip/7z/CPP/7zip/Common/InBuffer.cpp Sat Mar 03 10:31:27 2012 -0600 1.3 @@ -0,0 +1,83 @@ 1.4 +// InBuffer.cpp 1.5 + 1.6 +#include "StdAfx.h" 1.7 + 1.8 +#include "InBuffer.h" 1.9 + 1.10 +extern "C" 1.11 +{ 1.12 + #include "../../../C/Alloc.h" 1.13 +} 1.14 + 1.15 +CInBuffer::CInBuffer(): 1.16 + _buffer(0), 1.17 + _bufferLimit(0), 1.18 + _bufferBase(0), 1.19 + _stream(0), 1.20 + _bufferSize(0) 1.21 +{} 1.22 + 1.23 +bool CInBuffer::Create(UInt32 bufferSize) 1.24 +{ 1.25 + const UInt32 kMinBlockSize = 1; 1.26 + if (bufferSize < kMinBlockSize) 1.27 + bufferSize = kMinBlockSize; 1.28 + if (_bufferBase != 0 && _bufferSize == bufferSize) 1.29 + return true; 1.30 + Free(); 1.31 + _bufferSize = bufferSize; 1.32 + _bufferBase = (Byte *)::MidAlloc(bufferSize); 1.33 + return (_bufferBase != 0); 1.34 +} 1.35 + 1.36 +void CInBuffer::Free() 1.37 +{ 1.38 + ::MidFree(_bufferBase); 1.39 + _bufferBase = 0; 1.40 +} 1.41 + 1.42 +void CInBuffer::SetStream(ISequentialInStream *stream) 1.43 +{ 1.44 + _stream = stream; 1.45 +} 1.46 + 1.47 +void CInBuffer::Init() 1.48 +{ 1.49 + _processedSize = 0; 1.50 + _buffer = _bufferBase; 1.51 + _bufferLimit = _buffer; 1.52 + _wasFinished = false; 1.53 + #ifdef _NO_EXCEPTIONS 1.54 + ErrorCode = S_OK; 1.55 + #endif 1.56 +} 1.57 + 1.58 +bool CInBuffer::ReadBlock() 1.59 +{ 1.60 + #ifdef _NO_EXCEPTIONS 1.61 + if (ErrorCode != S_OK) 1.62 + return false; 1.63 + #endif 1.64 + if (_wasFinished) 1.65 + return false; 1.66 + _processedSize += (_buffer - _bufferBase); 1.67 + UInt32 numProcessedBytes; 1.68 + HRESULT result = _stream->Read(_bufferBase, _bufferSize, &numProcessedBytes); 1.69 + #ifdef _NO_EXCEPTIONS 1.70 + ErrorCode = result; 1.71 + #else 1.72 + if (result != S_OK) 1.73 + throw CInBufferException(result); 1.74 + #endif 1.75 + _buffer = _bufferBase; 1.76 + _bufferLimit = _buffer + numProcessedBytes; 1.77 + _wasFinished = (numProcessedBytes == 0); 1.78 + return (!_wasFinished); 1.79 +} 1.80 + 1.81 +Byte CInBuffer::ReadBlock2() 1.82 +{ 1.83 + if(!ReadBlock()) 1.84 + return 0xFF; 1.85 + return *_buffer++; 1.86 +}