• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 {
COutBufferExceptionCOutBufferException13   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 
COutBuffer()36   COutBuffer(): _buffer(0), _pos(0), _stream(0), _buffer2(0) {}
~COutBuffer()37   ~COutBuffer() { Free(); }
38 
39   bool Create(UInt32 bufferSize);
40   void Free();
41 
SetMemStream(Byte * buffer)42   void SetMemStream(Byte *buffer) { _buffer2 = buffer; }
43   void SetStream(ISequentialOutStream *stream);
44   void Init();
45   HRESULT Flush();
46   void FlushWithCheck();
ReleaseStream()47   void ReleaseStream() {  _stream.Release(); }
48 
WriteByte(Byte b)49   void WriteByte(Byte b)
50   {
51     _buffer[_pos++] = b;
52     if(_pos == _limitPos)
53       FlushWithCheck();
54   }
WriteBytes(const void * data,size_t size)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
65