a59ecefacd0d90ace0b88e37d233e7939f4fdf7e
[coreboot.git] / payloads / bayou / util / pbuilder / lzma / C / 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 \r
9 #ifndef _NO_EXCEPTIONS\r
10 class CInBufferException\r
11 {\r
12 public:\r
13   HRESULT ErrorCode;\r
14   CInBufferException(HRESULT errorCode): ErrorCode(errorCode) {}\r
15 };\r
16 #endif\r
17 \r
18 class CInBuffer\r
19 {\r
20   Byte *_buffer;\r
21   Byte *_bufferLimit;\r
22   Byte *_bufferBase;\r
23   CMyComPtr<ISequentialInStream> _stream;\r
24   UInt64 _processedSize;\r
25   UInt32 _bufferSize;\r
26   bool _wasFinished;\r
27 \r
28   bool ReadBlock();\r
29   Byte ReadBlock2();\r
30 \r
31 public:\r
32   #ifdef _NO_EXCEPTIONS\r
33   HRESULT ErrorCode;\r
34   #endif\r
35 \r
36   CInBuffer();\r
37   ~CInBuffer() { Free(); }\r
38 \r
39   bool Create(UInt32 bufferSize);\r
40   void Free();\r
41   \r
42   void SetStream(ISequentialInStream *stream);\r
43   void Init();\r
44   void ReleaseStream() { _stream.Release(); }\r
45 \r
46   bool ReadByte(Byte &b)\r
47   {\r
48     if(_buffer >= _bufferLimit)\r
49       if(!ReadBlock())\r
50         return false;\r
51     b = *_buffer++;\r
52     return true;\r
53   }\r
54   Byte ReadByte()\r
55   {\r
56     if(_buffer >= _bufferLimit)\r
57       return ReadBlock2();\r
58     return *_buffer++;\r
59   }\r
60   void ReadBytes(void *data, UInt32 size, UInt32 &processedSize)\r
61   {\r
62     for(processedSize = 0; processedSize < size; processedSize++)\r
63       if (!ReadByte(((Byte *)data)[processedSize]))\r
64         return;\r
65   }\r
66   bool ReadBytes(void *data, UInt32 size)\r
67   {\r
68     UInt32 processedSize;\r
69     ReadBytes(data, size, processedSize);\r
70     return (processedSize == size);\r
71   }\r
72   UInt64 GetProcessedSize() const { return _processedSize + (_buffer - _bufferBase); }\r
73   bool WasFinished() const { return _wasFinished; }\r
74 };\r
75 \r
76 #endif\r