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