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