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