1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// StreamObjects.h 2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#ifndef __STREAM_OBJECTS_H 4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#define __STREAM_OBJECTS_H 5baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 6baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../../Common/Buffer.h" 7baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../../Common/MyCom.h" 8baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../IStream.h" 9baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 10baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstruct CReferenceBuf: 11baa3858d3f5d128a5c8466b700098109edcad5f2repo sync public IUnknown, 12baa3858d3f5d128a5c8466b700098109edcad5f2repo sync public CMyUnknownImp 13baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 14baa3858d3f5d128a5c8466b700098109edcad5f2repo sync CByteBuffer Buf; 15baa3858d3f5d128a5c8466b700098109edcad5f2repo sync MY_UNKNOWN_IMP 16baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}; 17baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 18baa3858d3f5d128a5c8466b700098109edcad5f2repo syncclass CBufInStream: 19baa3858d3f5d128a5c8466b700098109edcad5f2repo sync public IInStream, 20baa3858d3f5d128a5c8466b700098109edcad5f2repo sync public CMyUnknownImp 21baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 22baa3858d3f5d128a5c8466b700098109edcad5f2repo sync const Byte *_data; 23baa3858d3f5d128a5c8466b700098109edcad5f2repo sync UInt64 _pos; 24baa3858d3f5d128a5c8466b700098109edcad5f2repo sync size_t _size; 25baa3858d3f5d128a5c8466b700098109edcad5f2repo sync CMyComPtr<IUnknown> _ref; 26baa3858d3f5d128a5c8466b700098109edcad5f2repo syncpublic: 27baa3858d3f5d128a5c8466b700098109edcad5f2repo sync void Init(const Byte *data, size_t size, IUnknown *ref = 0) 28baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 29baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _data = data; 30baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _size = size; 31baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _pos = 0; 32baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _ref = ref; 33baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 34baa3858d3f5d128a5c8466b700098109edcad5f2repo sync void Init(CReferenceBuf *ref) { Init(ref->Buf, ref->Buf.GetCapacity(), ref); } 35baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 36baa3858d3f5d128a5c8466b700098109edcad5f2repo sync MY_UNKNOWN_IMP1(IInStream) 37baa3858d3f5d128a5c8466b700098109edcad5f2repo sync STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); 38baa3858d3f5d128a5c8466b700098109edcad5f2repo sync STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); 39baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}; 40baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 41baa3858d3f5d128a5c8466b700098109edcad5f2repo syncclass CByteDynBuffer 42baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 43baa3858d3f5d128a5c8466b700098109edcad5f2repo sync size_t _capacity; 44baa3858d3f5d128a5c8466b700098109edcad5f2repo sync Byte *_buf; 45baa3858d3f5d128a5c8466b700098109edcad5f2repo syncpublic: 46baa3858d3f5d128a5c8466b700098109edcad5f2repo sync CByteDynBuffer(): _capacity(0), _buf(0) {}; 47baa3858d3f5d128a5c8466b700098109edcad5f2repo sync // there is no copy constructor. So don't copy this object. 48baa3858d3f5d128a5c8466b700098109edcad5f2repo sync ~CByteDynBuffer() { Free(); } 49baa3858d3f5d128a5c8466b700098109edcad5f2repo sync void Free(); 50baa3858d3f5d128a5c8466b700098109edcad5f2repo sync size_t GetCapacity() const { return _capacity; } 51baa3858d3f5d128a5c8466b700098109edcad5f2repo sync operator Byte*() const { return _buf; }; 52baa3858d3f5d128a5c8466b700098109edcad5f2repo sync operator const Byte*() const { return _buf; }; 53baa3858d3f5d128a5c8466b700098109edcad5f2repo sync bool EnsureCapacity(size_t capacity); 54baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}; 55baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 56baa3858d3f5d128a5c8466b700098109edcad5f2repo syncclass CDynBufSeqOutStream: 57baa3858d3f5d128a5c8466b700098109edcad5f2repo sync public ISequentialOutStream, 58baa3858d3f5d128a5c8466b700098109edcad5f2repo sync public CMyUnknownImp 59baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 60baa3858d3f5d128a5c8466b700098109edcad5f2repo sync CByteDynBuffer _buffer; 61baa3858d3f5d128a5c8466b700098109edcad5f2repo sync size_t _size; 62baa3858d3f5d128a5c8466b700098109edcad5f2repo syncpublic: 63baa3858d3f5d128a5c8466b700098109edcad5f2repo sync CDynBufSeqOutStream(): _size(0) {} 64baa3858d3f5d128a5c8466b700098109edcad5f2repo sync void Init() { _size = 0; } 65baa3858d3f5d128a5c8466b700098109edcad5f2repo sync size_t GetSize() const { return _size; } 66baa3858d3f5d128a5c8466b700098109edcad5f2repo sync const Byte *GetBuffer() const { return _buffer; } 67baa3858d3f5d128a5c8466b700098109edcad5f2repo sync void CopyToBuffer(CByteBuffer &dest) const; 68baa3858d3f5d128a5c8466b700098109edcad5f2repo sync Byte *GetBufPtrForWriting(size_t addSize); 69baa3858d3f5d128a5c8466b700098109edcad5f2repo sync void UpdateSize(size_t addSize) { _size += addSize; } 70baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 71baa3858d3f5d128a5c8466b700098109edcad5f2repo sync MY_UNKNOWN_IMP 72baa3858d3f5d128a5c8466b700098109edcad5f2repo sync STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); 73baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}; 74baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 75baa3858d3f5d128a5c8466b700098109edcad5f2repo syncclass CBufPtrSeqOutStream: 76baa3858d3f5d128a5c8466b700098109edcad5f2repo sync public ISequentialOutStream, 77baa3858d3f5d128a5c8466b700098109edcad5f2repo sync public CMyUnknownImp 78baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 79baa3858d3f5d128a5c8466b700098109edcad5f2repo sync Byte *_buffer; 80baa3858d3f5d128a5c8466b700098109edcad5f2repo sync size_t _size; 81baa3858d3f5d128a5c8466b700098109edcad5f2repo sync size_t _pos; 82baa3858d3f5d128a5c8466b700098109edcad5f2repo syncpublic: 83baa3858d3f5d128a5c8466b700098109edcad5f2repo sync void Init(Byte *buffer, size_t size) 84baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 85baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _buffer = buffer; 86baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _pos = 0; 87baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _size = size; 88baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 89baa3858d3f5d128a5c8466b700098109edcad5f2repo sync size_t GetPos() const { return _pos; } 90baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 91baa3858d3f5d128a5c8466b700098109edcad5f2repo sync MY_UNKNOWN_IMP 92baa3858d3f5d128a5c8466b700098109edcad5f2repo sync STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); 93baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}; 94baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 95baa3858d3f5d128a5c8466b700098109edcad5f2repo syncclass CSequentialOutStreamSizeCount: 96baa3858d3f5d128a5c8466b700098109edcad5f2repo sync public ISequentialOutStream, 97baa3858d3f5d128a5c8466b700098109edcad5f2repo sync public CMyUnknownImp 98baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 99baa3858d3f5d128a5c8466b700098109edcad5f2repo sync CMyComPtr<ISequentialOutStream> _stream; 100baa3858d3f5d128a5c8466b700098109edcad5f2repo sync UInt64 _size; 101baa3858d3f5d128a5c8466b700098109edcad5f2repo syncpublic: 102baa3858d3f5d128a5c8466b700098109edcad5f2repo sync void SetStream(ISequentialOutStream *stream) { _stream = stream; } 103baa3858d3f5d128a5c8466b700098109edcad5f2repo sync void Init() { _size = 0; } 104baa3858d3f5d128a5c8466b700098109edcad5f2repo sync UInt64 GetSize() const { return _size; } 105baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 106baa3858d3f5d128a5c8466b700098109edcad5f2repo sync MY_UNKNOWN_IMP 107baa3858d3f5d128a5c8466b700098109edcad5f2repo sync STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); 108baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}; 109baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 110baa3858d3f5d128a5c8466b700098109edcad5f2repo syncclass CCachedInStream: 111baa3858d3f5d128a5c8466b700098109edcad5f2repo sync public IInStream, 112baa3858d3f5d128a5c8466b700098109edcad5f2repo sync public CMyUnknownImp 113baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 114baa3858d3f5d128a5c8466b700098109edcad5f2repo sync UInt64 *_tags; 115baa3858d3f5d128a5c8466b700098109edcad5f2repo sync Byte *_data; 116baa3858d3f5d128a5c8466b700098109edcad5f2repo sync size_t _dataSize; 117baa3858d3f5d128a5c8466b700098109edcad5f2repo sync unsigned _blockSizeLog; 118baa3858d3f5d128a5c8466b700098109edcad5f2repo sync unsigned _numBlocksLog; 119baa3858d3f5d128a5c8466b700098109edcad5f2repo sync UInt64 _size; 120baa3858d3f5d128a5c8466b700098109edcad5f2repo sync UInt64 _pos; 121baa3858d3f5d128a5c8466b700098109edcad5f2repo syncprotected: 122baa3858d3f5d128a5c8466b700098109edcad5f2repo sync virtual HRESULT ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize) = 0; 123baa3858d3f5d128a5c8466b700098109edcad5f2repo syncpublic: 124baa3858d3f5d128a5c8466b700098109edcad5f2repo sync CCachedInStream(): _tags(0), _data(0) {} 125baa3858d3f5d128a5c8466b700098109edcad5f2repo sync virtual ~CCachedInStream() { Free(); } // the destructor must be virtual (release calls it) !!! 126baa3858d3f5d128a5c8466b700098109edcad5f2repo sync void Free(); 127baa3858d3f5d128a5c8466b700098109edcad5f2repo sync bool Alloc(unsigned blockSizeLog, unsigned numBlocksLog); 128baa3858d3f5d128a5c8466b700098109edcad5f2repo sync void Init(UInt64 size); 129baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 130baa3858d3f5d128a5c8466b700098109edcad5f2repo sync MY_UNKNOWN_IMP2(ISequentialInStream, IInStream) 131baa3858d3f5d128a5c8466b700098109edcad5f2repo sync STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); 132baa3858d3f5d128a5c8466b700098109edcad5f2repo sync STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); 133baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}; 134baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 135baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#endif 136