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 class CBufferInStream:
13   public IInStream,
14   public CMyUnknownImp
15 {
16   UInt64 _pos;
17 public:
18   CByteBuffer Buf;
Init()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 
27 struct CReferenceBuf:
28   public IUnknown,
29   public CMyUnknownImp
30 {
31   CByteBuffer Buf;
32   MY_UNKNOWN_IMP
33 };
34 
35 class CBufInStream:
36   public IInStream,
37   public CMyUnknownImp
38 {
39   const Byte *_data;
40   UInt64 _pos;
41   size_t _size;
42   CMyComPtr<IUnknown> _ref;
43 public:
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   }
Init(CReferenceBuf * ref)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 
58 void Create_BufInStream_WithReference(const void *data, size_t size, IUnknown *ref, ISequentialInStream **stream);
59 void Create_BufInStream_WithNewBuffer(const void *data, size_t size, ISequentialInStream **stream);
Create_BufInStream_WithNewBuffer(const CByteBuffer & buf,ISequentialInStream ** stream)60 inline void Create_BufInStream_WithNewBuffer(const CByteBuffer &buf, ISequentialInStream **stream)
61   { Create_BufInStream_WithNewBuffer(buf, buf.Size(), stream); }
62 
63 class CByteDynBuffer
64 {
65   size_t _capacity;
66   Byte *_buf;
67 public:
CByteDynBuffer()68   CByteDynBuffer(): _capacity(0), _buf(0) {};
69   // there is no copy constructor. So don't copy this object.
~CByteDynBuffer()70   ~CByteDynBuffer() { Free(); }
71   void Free() throw();
GetCapacity()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 
78 class CDynBufSeqOutStream:
79   public ISequentialOutStream,
80   public CMyUnknownImp
81 {
82   CByteDynBuffer _buffer;
83   size_t _size;
84 public:
CDynBufSeqOutStream()85   CDynBufSeqOutStream(): _size(0) {}
Init()86   void Init() { _size = 0;  }
GetSize()87   size_t GetSize() const { return _size; }
GetBuffer()88   const Byte *GetBuffer() const { return _buffer; }
89   void CopyToBuffer(CByteBuffer &dest) const;
90   Byte *GetBufPtrForWriting(size_t addSize);
UpdateSize(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 
97 class CBufPtrSeqOutStream:
98   public ISequentialOutStream,
99   public CMyUnknownImp
100 {
101   Byte *_buffer;
102   size_t _size;
103   size_t _pos;
104 public:
Init(Byte * buffer,size_t size)105   void Init(Byte *buffer, size_t size)
106   {
107     _buffer = buffer;
108     _pos = 0;
109     _size = size;
110   }
GetPos()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 
117 class CSequentialOutStreamSizeCount:
118   public ISequentialOutStream,
119   public CMyUnknownImp
120 {
121   CMyComPtr<ISequentialOutStream> _stream;
122   UInt64 _size;
123 public:
SetStream(ISequentialOutStream * stream)124   void SetStream(ISequentialOutStream *stream) { _stream = stream; }
Init()125   void Init() { _size = 0; }
GetSize()126   UInt64 GetSize() const { return _size; }
127 
128   MY_UNKNOWN_IMP1(ISequentialOutStream)
129   STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
130 };
131 
132 class 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;
143 protected:
144   virtual HRESULT ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize) = 0;
145 public:
CCachedInStream()146   CCachedInStream(): _tags(0), _data(0) {}
~CCachedInStream()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