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