1// InBuffer.cpp
2
3#include "StdAfx.h"
4
5#include "InBuffer.h"
6
7extern "C"
8{
9  #include "../../../C/Alloc.h"
10}
11
12CInBuffer::CInBuffer():
13  _buffer(0),
14  _bufferLimit(0),
15  _bufferBase(0),
16  _stream(0),
17  _bufferSize(0)
18{}
19
20bool 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
33void CInBuffer::Free()
34{
35  ::MidFree(_bufferBase);
36  _bufferBase = 0;
37}
38
39void CInBuffer::SetStream(ISequentialInStream *stream)
40{
41  _stream = stream;
42}
43
44void 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
55bool 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
78Byte CInBuffer::ReadBlock2()
79{
80  if(!ReadBlock())
81    return 0xFF;
82  return *_buffer++;
83}
84