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