Mercurial > vba-linux
comparison src/win32/7zip/7z/CPP/7zip/Common/InBuffer.cpp @ 1:f9f4f1b99eed
importing src directory
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 03 Mar 2012 10:31:27 -0600 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:8ced16adf2e1 | 1:f9f4f1b99eed |
---|---|
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 } |