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 }