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