misc/libphysfs/lzma/CPP/7zip/Common/OutBuffer.h
changeset 13904 99b265e0d1d0
parent 13903 5f819b90d479
child 13905 b172a5d40eee
equal deleted inserted replaced
13903:5f819b90d479 13904:99b265e0d1d0
     1 // OutBuffer.h
       
     2 
       
     3 #ifndef __OUTBUFFER_H
       
     4 #define __OUTBUFFER_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 *_buffer;
       
    21   UInt32 _pos;
       
    22   UInt32 _limitPos;
       
    23   UInt32 _streamPos;
       
    24   UInt32 _bufferSize;
       
    25   CMyComPtr<ISequentialOutStream> _stream;
       
    26   UInt64 _processedSize;
       
    27   Byte  *_buffer2;
       
    28   bool _overDict;
       
    29 
       
    30   HRESULT FlushPart();
       
    31 public:
       
    32   #ifdef _NO_EXCEPTIONS
       
    33   HRESULT ErrorCode;
       
    34   #endif
       
    35 
       
    36   COutBuffer(): _buffer(0), _pos(0), _stream(0), _buffer2(0) {}
       
    37   ~COutBuffer() { Free(); }
       
    38   
       
    39   bool Create(UInt32 bufferSize);
       
    40   void Free();
       
    41 
       
    42   void SetMemStream(Byte *buffer) { _buffer2 = buffer; }
       
    43   void SetStream(ISequentialOutStream *stream);
       
    44   void Init();
       
    45   HRESULT Flush();
       
    46   void FlushWithCheck();
       
    47   void ReleaseStream() {  _stream.Release(); }
       
    48 
       
    49   void WriteByte(Byte b)
       
    50   {
       
    51     _buffer[_pos++] = b;
       
    52     if(_pos == _limitPos)
       
    53       FlushWithCheck();
       
    54   }
       
    55   void WriteBytes(const void *data, size_t size)
       
    56   {
       
    57     for (size_t i = 0; i < size; i++)
       
    58       WriteByte(((const Byte *)data)[i]);
       
    59   }
       
    60 
       
    61   UInt64 GetProcessedSize() const;
       
    62 };
       
    63 
       
    64 #endif