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