3 #ifndef __LIMITED_STREAMS_H
\r
4 #define __LIMITED_STREAMS_H
\r
6 #include "../../Common/MyCom.h"
\r
7 #include "../../Common/MyVector.h"
\r
8 #include "../IStream.h"
\r
10 class CLimitedSequentialInStream:
\r
11 public ISequentialInStream,
\r
12 public CMyUnknownImp
\r
14 CMyComPtr<ISequentialInStream> _stream;
\r
19 void SetStream(ISequentialInStream *stream) { _stream = stream; }
\r
20 void ReleaseStream() { _stream.Release(); }
\r
21 void Init(UInt64 streamSize)
\r
25 _wasFinished = false;
\r
30 STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
\r
31 UInt64 GetSize() const { return _pos; }
\r
32 bool WasFinished() const { return _wasFinished; }
\r
35 class CLimitedInStream:
\r
37 public CMyUnknownImp
\r
39 CMyComPtr<IInStream> _stream;
\r
43 UInt64 _startOffset;
\r
45 HRESULT SeekToPhys() { return _stream->Seek(_physPos, STREAM_SEEK_SET, NULL); }
\r
47 void SetStream(IInStream *stream) { _stream = stream; }
\r
48 HRESULT InitAndSeek(UInt64 startOffset, UInt64 size)
\r
50 _startOffset = startOffset;
\r
51 _physPos = startOffset;
\r
54 return SeekToPhys();
\r
57 MY_UNKNOWN_IMP1(IInStream)
\r
59 STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
\r
60 STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
\r
62 HRESULT SeekToStart() { return Seek(0, STREAM_SEEK_SET, NULL); }
\r
65 class CClusterInStream:
\r
67 public CMyUnknownImp
\r
73 CMyComPtr<IInStream> Stream;
\r
77 CRecordVector<UInt32> Vector;
\r
79 HRESULT SeekToPhys() { return Stream->Seek(_physPos, STREAM_SEEK_SET, NULL); }
\r
81 HRESULT InitAndSeek()
\r
85 _physPos = StartOffset;
\r
86 if (Vector.Size() > 0)
\r
88 _physPos = StartOffset + (Vector[0] << BlockSizeLog);
\r
89 return SeekToPhys();
\r
94 MY_UNKNOWN_IMP1(IInStream)
\r
96 STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
\r
97 STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
\r
100 HRESULT CreateLimitedInStream(IInStream *inStream, UInt64 pos, UInt64 size, ISequentialInStream **resStream);
\r
102 class CLimitedSequentialOutStream:
\r
103 public ISequentialOutStream,
\r
104 public CMyUnknownImp
\r
106 CMyComPtr<ISequentialOutStream> _stream;
\r
109 bool _overflowIsAllowed;
\r
112 STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
\r
113 void SetStream(ISequentialOutStream *stream) { _stream = stream; }
\r
114 void ReleaseStream() { _stream.Release(); }
\r
115 void Init(UInt64 size, bool overflowIsAllowed = false)
\r
119 _overflowIsAllowed = overflowIsAllowed;
\r
121 bool IsFinishedOK() const { return (_size == 0 && !_overflow); }
\r
122 UInt64 GetRem() const { return _size; }
\r