// OutBuffer.h #ifndef __OUT_BUFFER_H #define __OUT_BUFFER_H #include "../IStream.h" #include "../../Common/MyCom.h" #include "../../Common/MyException.h" #ifndef _NO_EXCEPTIONS struct COutBufferException: public CSystemException { COutBufferException(HRESULT errorCode): CSystemException(errorCode) {} }; #endif class COutBuffer { protected: Byte *_buf; UInt32 _pos; UInt32 _limitPos; UInt32 _streamPos; UInt32 _bufSize; ISequentialOutStream *_stream; UInt64 _processedSize; Byte *_buf2; bool _overDict; HRESULT FlushPart() throw(); public: #ifdef _NO_EXCEPTIONS HRESULT ErrorCode; #endif COutBuffer(): _buf(0), _pos(0), _stream(0), _buf2(0) {} ~COutBuffer() { Free(); } bool Create(UInt32 bufSize) throw(); void Free() throw(); void SetMemStream(Byte *buf) { _buf2 = buf; } void SetStream(ISequentialOutStream *stream) { _stream = stream; } void Init() throw(); HRESULT Flush() throw(); void FlushWithCheck(); void WriteByte(Byte b) { _buf[_pos++] = b; if (_pos == _limitPos) FlushWithCheck(); } void WriteBytes(const void *data, size_t size) { for (size_t i = 0; i < size; i++) WriteByte(((const Byte *)data)[i]); } UInt64 GetProcessedSize() const throw(); }; #endif