Upload 2.0.2
[physicsfs] / lzma / CPP / 7zip / Common / InBuffer.cpp
1 // InBuffer.cpp
2
3 #include "StdAfx.h"
4
5 #include "InBuffer.h"
6
7 extern "C"
8 {
9   #include "../../../C/Alloc.h"
10 }
11
12 CInBuffer::CInBuffer(): 
13   _buffer(0), 
14   _bufferLimit(0), 
15   _bufferBase(0), 
16   _stream(0),
17   _bufferSize(0)
18 {}
19
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 }
32
33 void CInBuffer::Free()
34 {
35   ::MidFree(_bufferBase);
36   _bufferBase = 0;
37 }
38
39 void CInBuffer::SetStream(ISequentialInStream *stream)
40 {
41   _stream = stream;
42 }
43
44 void CInBuffer::Init()
45 {
46   _processedSize = 0;
47   _buffer = _bufferBase;
48   _bufferLimit = _buffer;
49   _wasFinished = false;
50   #ifdef _NO_EXCEPTIONS
51   ErrorCode = S_OK;
52   #endif
53 }
54
55 bool CInBuffer::ReadBlock()
56 {
57   #ifdef _NO_EXCEPTIONS
58   if (ErrorCode != S_OK)
59     return false;
60   #endif
61   if (_wasFinished)
62     return false;
63   _processedSize += (_buffer - _bufferBase);
64   UInt32 numProcessedBytes;
65   HRESULT result = _stream->Read(_bufferBase, _bufferSize, &numProcessedBytes);
66   #ifdef _NO_EXCEPTIONS
67   ErrorCode = result;
68   #else
69   if (result != S_OK)
70     throw CInBufferException(result);
71   #endif
72   _buffer = _bufferBase;
73   _bufferLimit = _buffer + numProcessedBytes;
74   _wasFinished = (numProcessedBytes == 0);
75   return (!_wasFinished);
76 }
77
78 Byte CInBuffer::ReadBlock2()
79 {
80   if(!ReadBlock())
81     return 0xFF;
82   return *_buffer++;
83 }