|
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 } |