Home | History | Annotate | Download | only in Common
      1 // InBuffer.h
      2 
      3 #ifndef __IN_BUFFER_H
      4 #define __IN_BUFFER_H
      5 
      6 #include "../../Common/MyException.h"
      7 #include "../IStream.h"
      8 
      9 #ifndef _NO_EXCEPTIONS
     10 struct CInBufferException: public CSystemException
     11 {
     12   CInBufferException(HRESULT errorCode): CSystemException(errorCode) {}
     13 };
     14 #endif
     15 
     16 class CInBufferBase
     17 {
     18 protected:
     19   Byte *_buf;
     20   Byte *_bufLim;
     21   Byte *_bufBase;
     22 
     23   ISequentialInStream *_stream;
     24   UInt64 _processedSize;
     25   size_t _bufSize; // actually it's number of Bytes for next read. The buf can be larger
     26                    // only up to 32-bits values now are supported!
     27   bool _wasFinished;
     28 
     29   bool ReadBlock();
     30   bool ReadByte_FromNewBlock(Byte &b);
     31   Byte ReadByte_FromNewBlock();
     32 
     33 public:
     34   #ifdef _NO_EXCEPTIONS
     35   HRESULT ErrorCode;
     36   #endif
     37   UInt32 NumExtraBytes;
     38 
     39   CInBufferBase() throw();
     40 
     41   UInt64 GetStreamSize() const { return _processedSize + (_buf - _bufBase); }
     42   UInt64 GetProcessedSize() const { return _processedSize + NumExtraBytes + (_buf - _bufBase); }
     43   bool WasFinished() const { return _wasFinished; }
     44 
     45   void SetStream(ISequentialInStream *stream) { _stream = stream; }
     46 
     47   void SetBuf(Byte *buf, size_t bufSize, size_t end, size_t pos)
     48   {
     49     _bufBase = buf;
     50     _bufSize = bufSize;
     51     _processedSize = 0;
     52     _buf = buf + pos;
     53     _bufLim = buf + end;
     54     _wasFinished = false;
     55     #ifdef _NO_EXCEPTIONS
     56     ErrorCode = S_OK;
     57     #endif
     58     NumExtraBytes = 0;
     59   }
     60 
     61   void Init() throw();
     62 
     63   bool ReadByte(Byte &b)
     64   {
     65     if (_buf >= _bufLim)
     66       return ReadByte_FromNewBlock(b);
     67     b = *_buf++;
     68     return true;
     69   }
     70 
     71   Byte ReadByte()
     72   {
     73     if (_buf >= _bufLim)
     74       return ReadByte_FromNewBlock();
     75     return *_buf++;
     76   }
     77 
     78   size_t ReadBytes(Byte *buf, size_t size);
     79   size_t Skip(size_t size);
     80 };
     81 
     82 class CInBuffer: public CInBufferBase
     83 {
     84 public:
     85   ~CInBuffer() { Free(); }
     86   bool Create(size_t bufSize) throw(); // only up to 32-bits values now are supported!
     87   void Free() throw();
     88 };
     89 
     90 #endif
     91