1 // StreamObjects.h
2 
3 #ifndef __STREAMOBJECTS_H
4 #define __STREAMOBJECTS_H
5 
6 #include "../../Common/DynamicBuffer.h"
7 #include "../../Common/MyCom.h"
8 #include "../IStream.h"
9 
10 class CSequentialInStreamImp:
11   public ISequentialInStream,
12   public CMyUnknownImp
13 {
14   const Byte *_dataPointer;
15   size_t _size;
16   size_t _pos;
17 
18 public:
Init(const Byte * dataPointer,size_t size)19   void Init(const Byte *dataPointer, size_t size)
20   {
21     _dataPointer = dataPointer;
22     _size = size;
23     _pos = 0;
24   }
25 
26   MY_UNKNOWN_IMP
27 
28   STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
29 };
30 
31 
32 class CWriteBuffer
33 {
34   CByteDynamicBuffer _buffer;
35   size_t _size;
36 public:
CWriteBuffer()37   CWriteBuffer(): _size(0) {}
Init()38   void Init() { _size = 0;  }
39   void Write(const void *data, size_t size);
GetSize()40   size_t GetSize() const { return _size; }
GetBuffer()41   const CByteDynamicBuffer& GetBuffer() const { return _buffer; }
42 };
43 
44 class CSequentialOutStreamImp:
45   public ISequentialOutStream,
46   public CMyUnknownImp
47 {
48   CWriteBuffer _writeBuffer;
49 public:
Init()50   void Init() { _writeBuffer.Init(); }
GetSize()51   size_t GetSize() const { return _writeBuffer.GetSize(); }
GetBuffer()52   const CByteDynamicBuffer& GetBuffer() const { return _writeBuffer.GetBuffer(); }
53 
54   MY_UNKNOWN_IMP
55 
56   STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
57 };
58 
59 class CSequentialOutStreamImp2:
60   public ISequentialOutStream,
61   public CMyUnknownImp
62 {
63   Byte *_buffer;
64 public:
65   size_t _size;
66   size_t _pos;
67 
Init(Byte * buffer,size_t size)68   void Init(Byte *buffer, size_t size)
69   {
70     _buffer = buffer;
71     _pos = 0;
72     _size = size;
73   }
74 
75   MY_UNKNOWN_IMP
76 
77   STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
78 };
79 
80 class CSequentialInStreamSizeCount:
81   public ISequentialInStream,
82   public CMyUnknownImp
83 {
84   CMyComPtr<ISequentialInStream> _stream;
85   UInt64 _size;
86 public:
Init(ISequentialInStream * stream)87   void Init(ISequentialInStream *stream)
88   {
89     _stream = stream;
90     _size = 0;
91   }
GetSize()92   UInt64 GetSize() const { return _size; }
93 
94   MY_UNKNOWN_IMP
95 
96   STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
97 };
98 
99 class CSequentialInStreamRollback:
100   public ISequentialInStream,
101   public CMyUnknownImp
102 {
103   CMyComPtr<ISequentialInStream> _stream;
104   Byte *_buffer;
105   size_t _bufferSize;
106   UInt64 _size;
107 
108   size_t _currentSize;
109   size_t _currentPos;
110 public:
CSequentialInStreamRollback(size_t bufferSize)111   CSequentialInStreamRollback(size_t bufferSize):
112     _bufferSize(bufferSize),
113     _buffer(0)
114   {
115     _buffer = new Byte[bufferSize];
116   }
~CSequentialInStreamRollback()117   ~CSequentialInStreamRollback()
118   {
119     delete _buffer;
120   }
121 
Init(ISequentialInStream * stream)122   void Init(ISequentialInStream *stream)
123   {
124     _stream = stream;
125     _size = 0;
126     _currentSize = 0;
127     _currentPos = 0;
128   }
GetSize()129   UInt64 GetSize() const { return _size; }
130 
131   MY_UNKNOWN_IMP
132 
133   STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
134   HRESULT Rollback(size_t rollbackSize);
135 };
136 
137 class CSequentialOutStreamSizeCount:
138   public ISequentialOutStream,
139   public CMyUnknownImp
140 {
141   CMyComPtr<ISequentialOutStream> _stream;
142   UInt64 _size;
143 public:
Init(ISequentialOutStream * stream)144   void Init(ISequentialOutStream *stream)
145   {
146     _stream = stream;
147     _size = 0;
148   }
GetSize()149   UInt64 GetSize() const { return _size; }
150 
151   MY_UNKNOWN_IMP
152 
153   STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
154 };
155 
156 #endif
157