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 11struct COutBufferException: public CSystemException 12{ 13 COutBufferException(HRESULT errorCode): CSystemException(errorCode) {} 14}; 15#endif 16 17class COutBuffer 18{ 19protected: 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(); 31public: 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 65