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