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