diff options
Diffstat (limited to 'common')
-rw-r--r-- | common/stream.cpp | 7 | ||||
-rw-r--r-- | common/substream.h | 19 |
2 files changed, 26 insertions, 0 deletions
diff --git a/common/stream.cpp b/common/stream.cpp index e870e68b2d..a785ac5164 100644 --- a/common/stream.cpp +++ b/common/stream.cpp @@ -242,6 +242,13 @@ bool SeekableSubReadStream::seek(int32 offset, int whence) { return ret; } +uint32 SafeSubReadStream::read(void *dataPtr, uint32 dataSize) { + // Make sure the parent stream is at the right position + seek(0, SEEK_CUR); + + return SeekableSubReadStream::read(dataPtr, dataSize); +} + #pragma mark - diff --git a/common/substream.h b/common/substream.h index ecf11c54c9..8b83dbda2e 100644 --- a/common/substream.h +++ b/common/substream.h @@ -102,6 +102,25 @@ public: } }; +/** + * A seekable substream that removes the exclusivity demand required by the + * normal SeekableSubReadStream, at the cost of seek()ing the parent stream + * before each read(). + * + * More than one SafeSubReadStream to the same parent stream can be used + * at the same time; they won't mess up each other. They will, however, + * reposition the parent stream, so don't depend on its position to be + * the same after a read() or seek() on one of its SafeSubReadStream. + */ +class SafeSubReadStream : public SeekableSubReadStream { +public: + SafeSubReadStream(SeekableReadStream *parentStream, uint32 begin, uint32 end, DisposeAfterUse::Flag disposeParentStream = DisposeAfterUse::NO) : + SeekableSubReadStream(parentStream, begin, end, disposeParentStream) { + } + + virtual uint32 read(void *dataPtr, uint32 dataSize); +}; + } // End of namespace Common |