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