Home | History | Annotate | Download | only in Common
      1 // OutBuffer.h
      2 
      3 #ifndef __OUT_BUFFER_H
      4 #define __OUT_BUFFER_H
      5 
      6 #include "../IStream.h"
      7 #include "../../Common/MyCom.h"
      8 #include "../../Common/MyException.h"
      9 
     10 #ifndef _NO_EXCEPTIONS
     11 struct COutBufferException: public CSystemException
     12 {
     13   COutBufferException(HRESULT errorCode): CSystemException(errorCode) {}
     14 };
     15 #endif
     16 
     17 class COutBuffer
     18 {
     19 protected:
     20   Byte *_buf;
     21   UInt32 _pos;
     22   UInt32 _limitPos;
     23   UInt32 _streamPos;
     24   UInt32 _bufSize;
     25   ISequentialOutStream *_stream;
     26   UInt64 _processedSize;
     27   Byte  *_buf2;
     28   bool _overDict;
     29 
     30   HRESULT FlushPart() throw();
     31 public:
     32   #ifdef _NO_EXCEPTIONS
     33   HRESULT ErrorCode;
     34   #endif
     35 
     36   COutBuffer(): _buf(0), _pos(0), _stream(0), _buf2(0) {}
     37   ~COutBuffer() { Free(); }
     38 
     39   bool Create(UInt32 bufSize) throw();
     40   void Free() throw();
     41 
     42   void SetMemStream(Byte *buf) { _buf2 = buf; }
     43   void SetStream(ISequentialOutStream *stream) { _stream = stream; }
     44   void Init() throw();
     45   HRESULT Flush() throw();
     46   void FlushWithCheck();
     47 
     48   void WriteByte(Byte b)
     49   {
     50     _buf[_pos++] = b;
     51     if (_pos == _limitPos)
     52       FlushWithCheck();
     53   }
     54   void WriteBytes(const void *data, size_t size)
     55   {
     56     for (size_t i = 0; i < size; i++)
     57       WriteByte(((const Byte *)data)[i]);
     58   }
     59 
     60   UInt64 GetProcessedSize() const throw();
     61 };
     62 
     63 #endif
     64