view src/win32/7zip/7z/CPP/7zip/Common/InBuffer.h @ 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.h
3 #ifndef __INBUFFER_H
4 #define __INBUFFER_H
6 #include "../IStream.h"
7 #include "../../Common/MyCom.h"
8 #include "../../Common/MyException.h"
10 #ifndef _NO_EXCEPTIONS
11 struct CInBufferException: public CSystemException
12 {
13 CInBufferException(HRESULT errorCode): CSystemException(errorCode) {}
14 };
15 #endif
17 class CInBuffer
18 {
19 Byte *_buffer;
20 Byte *_bufferLimit;
21 Byte *_bufferBase;
22 CMyComPtr<ISequentialInStream> _stream;
23 UInt64 _processedSize;
24 UInt32 _bufferSize;
25 bool _wasFinished;
27 bool ReadBlock();
28 Byte ReadBlock2();
30 public:
31 #ifdef _NO_EXCEPTIONS
32 HRESULT ErrorCode;
33 #endif
35 CInBuffer();
36 ~CInBuffer() { Free(); }
38 bool Create(UInt32 bufferSize);
39 void Free();
41 void SetStream(ISequentialInStream *stream);
42 void Init();
43 void ReleaseStream() { _stream.Release(); }
45 bool ReadByte(Byte &b)
46 {
47 if (_buffer >= _bufferLimit)
48 if (!ReadBlock())
49 return false;
50 b = *_buffer++;
51 return true;
52 }
53 Byte ReadByte()
54 {
55 if (_buffer >= _bufferLimit)
56 return ReadBlock2();
57 return *_buffer++;
58 }
59 UInt32 ReadBytes(Byte *buf, UInt32 size)
60 {
61 if ((UInt32)(_bufferLimit - _buffer) >= size)
62 {
63 for (UInt32 i = 0; i < size; i++)
64 buf[i] = _buffer[i];
65 _buffer += size;
66 return size;
67 }
68 for (UInt32 i = 0; i < size; i++)
69 {
70 if (_buffer >= _bufferLimit)
71 if (!ReadBlock())
72 return i;
73 buf[i] = *_buffer++;
74 }
75 return size;
76 }
77 UInt64 GetProcessedSize() const { return _processedSize + (_buffer - _bufferBase); }
78 bool WasFinished() const { return _wasFinished; }
79 };
81 #endif