michael@0: // StreamObjects.h michael@0: michael@0: #ifndef __STREAMOBJECTS_H michael@0: #define __STREAMOBJECTS_H michael@0: michael@0: #include "../../Common/DynamicBuffer.h" michael@0: #include "../../Common/MyCom.h" michael@0: #include "../IStream.h" michael@0: michael@0: class CSequentialInStreamImp: michael@0: public ISequentialInStream, michael@0: public CMyUnknownImp michael@0: { michael@0: const Byte *_dataPointer; michael@0: size_t _size; michael@0: size_t _pos; michael@0: michael@0: public: michael@0: void Init(const Byte *dataPointer, size_t size) michael@0: { michael@0: _dataPointer = dataPointer; michael@0: _size = size; michael@0: _pos = 0; michael@0: } michael@0: michael@0: MY_UNKNOWN_IMP michael@0: michael@0: STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); michael@0: }; michael@0: michael@0: michael@0: class CWriteBuffer michael@0: { michael@0: CByteDynamicBuffer _buffer; michael@0: size_t _size; michael@0: public: michael@0: CWriteBuffer(): _size(0) {} michael@0: void Init() { _size = 0; } michael@0: void Write(const void *data, size_t size); michael@0: size_t GetSize() const { return _size; } michael@0: const CByteDynamicBuffer& GetBuffer() const { return _buffer; } michael@0: }; michael@0: michael@0: class CSequentialOutStreamImp: michael@0: public ISequentialOutStream, michael@0: public CMyUnknownImp michael@0: { michael@0: CWriteBuffer _writeBuffer; michael@0: public: michael@0: void Init() { _writeBuffer.Init(); } michael@0: size_t GetSize() const { return _writeBuffer.GetSize(); } michael@0: const CByteDynamicBuffer& GetBuffer() const { return _writeBuffer.GetBuffer(); } michael@0: michael@0: MY_UNKNOWN_IMP michael@0: michael@0: STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); michael@0: }; michael@0: michael@0: class CSequentialOutStreamImp2: michael@0: public ISequentialOutStream, michael@0: public CMyUnknownImp michael@0: { michael@0: Byte *_buffer; michael@0: public: michael@0: size_t _size; michael@0: size_t _pos; michael@0: michael@0: void Init(Byte *buffer, size_t size) michael@0: { michael@0: _buffer = buffer; michael@0: _pos = 0; michael@0: _size = size; michael@0: } michael@0: michael@0: MY_UNKNOWN_IMP michael@0: michael@0: STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); michael@0: }; michael@0: michael@0: class CSequentialInStreamSizeCount: michael@0: public ISequentialInStream, michael@0: public CMyUnknownImp michael@0: { michael@0: CMyComPtr _stream; michael@0: UInt64 _size; michael@0: public: michael@0: void Init(ISequentialInStream *stream) michael@0: { michael@0: _stream = stream; michael@0: _size = 0; michael@0: } michael@0: UInt64 GetSize() const { return _size; } michael@0: michael@0: MY_UNKNOWN_IMP michael@0: michael@0: STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); michael@0: }; michael@0: michael@0: class CSequentialInStreamRollback: michael@0: public ISequentialInStream, michael@0: public CMyUnknownImp michael@0: { michael@0: CMyComPtr _stream; michael@0: Byte *_buffer; michael@0: size_t _bufferSize; michael@0: UInt64 _size; michael@0: michael@0: size_t _currentSize; michael@0: size_t _currentPos; michael@0: public: michael@0: CSequentialInStreamRollback(size_t bufferSize): michael@0: _bufferSize(bufferSize), michael@0: _buffer(0) michael@0: { michael@0: _buffer = new Byte[bufferSize]; michael@0: } michael@0: ~CSequentialInStreamRollback() michael@0: { michael@0: delete _buffer; michael@0: } michael@0: michael@0: void Init(ISequentialInStream *stream) michael@0: { michael@0: _stream = stream; michael@0: _size = 0; michael@0: _currentSize = 0; michael@0: _currentPos = 0; michael@0: } michael@0: UInt64 GetSize() const { return _size; } michael@0: michael@0: MY_UNKNOWN_IMP michael@0: michael@0: STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); michael@0: HRESULT Rollback(size_t rollbackSize); michael@0: }; michael@0: michael@0: class CSequentialOutStreamSizeCount: michael@0: public ISequentialOutStream, michael@0: public CMyUnknownImp michael@0: { michael@0: CMyComPtr _stream; michael@0: UInt64 _size; michael@0: public: michael@0: void Init(ISequentialOutStream *stream) michael@0: { michael@0: _stream = stream; michael@0: _size = 0; michael@0: } michael@0: UInt64 GetSize() const { return _size; } michael@0: michael@0: MY_UNKNOWN_IMP michael@0: michael@0: STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); michael@0: }; michael@0: michael@0: #endif