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 {
COutBufferExceptionCOutBufferException13   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 
COutBuffer()36   COutBuffer(): _buf(0), _pos(0), _stream(0), _buf2(0) {}
~COutBuffer()37   ~COutBuffer() { Free(); }
38 
39   bool Create(UInt32 bufSize) throw();
40   void Free() throw();
41 
SetMemStream(Byte * buf)42   void SetMemStream(Byte *buf) { _buf2 = buf; }
SetStream(ISequentialOutStream * stream)43   void SetStream(ISequentialOutStream *stream) { _stream = stream; }
44   void Init() throw();
45   HRESULT Flush() throw();
46   void FlushWithCheck();
47 
WriteByte(Byte b)48   void WriteByte(Byte b)
49   {
50     _buf[_pos++] = b;
51     if (_pos == _limitPos)
52       FlushWithCheck();
53   }
WriteBytes(const void * data,size_t size)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