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