Mercurial > vba-linux
view 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 source
1 // InBuffer.cpp3 #include "StdAfx.h"5 #include "InBuffer.h"7 extern "C"8 {9 #include "../../../C/Alloc.h"10 }12 CInBuffer::CInBuffer():13 _buffer(0),14 _bufferLimit(0),15 _bufferBase(0),16 _stream(0),17 _bufferSize(0)18 {}20 bool CInBuffer::Create(UInt32 bufferSize)21 {22 const UInt32 kMinBlockSize = 1;23 if (bufferSize < kMinBlockSize)24 bufferSize = kMinBlockSize;25 if (_bufferBase != 0 && _bufferSize == bufferSize)26 return true;27 Free();28 _bufferSize = bufferSize;29 _bufferBase = (Byte *)::MidAlloc(bufferSize);30 return (_bufferBase != 0);31 }33 void CInBuffer::Free()34 {35 ::MidFree(_bufferBase);36 _bufferBase = 0;37 }39 void CInBuffer::SetStream(ISequentialInStream *stream)40 {41 _stream = stream;42 }44 void CInBuffer::Init()45 {46 _processedSize = 0;47 _buffer = _bufferBase;48 _bufferLimit = _buffer;49 _wasFinished = false;50 #ifdef _NO_EXCEPTIONS51 ErrorCode = S_OK;52 #endif53 }55 bool CInBuffer::ReadBlock()56 {57 #ifdef _NO_EXCEPTIONS58 if (ErrorCode != S_OK)59 return false;60 #endif61 if (_wasFinished)62 return false;63 _processedSize += (_buffer - _bufferBase);64 UInt32 numProcessedBytes;65 HRESULT result = _stream->Read(_bufferBase, _bufferSize, &numProcessedBytes);66 #ifdef _NO_EXCEPTIONS67 ErrorCode = result;68 #else69 if (result != S_OK)70 throw CInBufferException(result);71 #endif72 _buffer = _bufferBase;73 _bufferLimit = _buffer + numProcessedBytes;74 _wasFinished = (numProcessedBytes == 0);75 return (!_wasFinished);76 }78 Byte CInBuffer::ReadBlock2()79 {80 if(!ReadBlock())81 return 0xFF;82 return *_buffer++;83 }