|
1 // InBuffer.cpp |
|
2 |
|
3 #include "StdAfx.h" |
|
4 |
|
5 #include "InBuffer.h" |
|
6 |
|
7 #include "../../Common/Alloc.h" |
|
8 |
|
9 CInBuffer::CInBuffer(): |
|
10 _buffer(0), |
|
11 _bufferLimit(0), |
|
12 _bufferBase(0), |
|
13 _stream(0), |
|
14 _bufferSize(0) |
|
15 {} |
|
16 |
|
17 bool CInBuffer::Create(UInt32 bufferSize) |
|
18 { |
|
19 const UInt32 kMinBlockSize = 1; |
|
20 if (bufferSize < kMinBlockSize) |
|
21 bufferSize = kMinBlockSize; |
|
22 if (_bufferBase != 0 && _bufferSize == bufferSize) |
|
23 return true; |
|
24 Free(); |
|
25 _bufferSize = bufferSize; |
|
26 _bufferBase = (Byte *)::MidAlloc(bufferSize); |
|
27 return (_bufferBase != 0); |
|
28 } |
|
29 |
|
30 void CInBuffer::Free() |
|
31 { |
|
32 ::MidFree(_bufferBase); |
|
33 _bufferBase = 0; |
|
34 } |
|
35 |
|
36 void CInBuffer::SetStream(ISequentialInStream *stream) |
|
37 { |
|
38 _stream = stream; |
|
39 } |
|
40 |
|
41 void 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 |
|
52 bool 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 |
|
75 Byte CInBuffer::ReadBlock2() |
|
76 { |
|
77 if(!ReadBlock()) |
|
78 return 0xFF; |
|
79 return *_buffer++; |
|
80 } |