1 // OffsetStream.cpp 2 3 #include "StdAfx.h" 4 5 #include "../../Common/Defs.h" 6 7 #include "OffsetStream.h" 8 9 HRESULT COffsetOutStream::Init(IOutStream *stream, UInt64 offset) 10 { 11 _offset = offset; 12 _stream = stream; 13 return _stream->Seek(offset, STREAM_SEEK_SET, NULL); 14 } 15 16 STDMETHODIMP COffsetOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) 17 { 18 return _stream->Write(data, size, processedSize); 19 } 20 21 STDMETHODIMP COffsetOutStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) 22 { 23 UInt64 absoluteNewPosition; 24 if (seekOrigin == STREAM_SEEK_SET) 25 { 26 if (offset < 0) 27 return HRESULT_WIN32_ERROR_NEGATIVE_SEEK; 28 offset += _offset; 29 } 30 HRESULT result = _stream->Seek(offset, seekOrigin, &absoluteNewPosition); 31 if (newPosition) 32 *newPosition = absoluteNewPosition - _offset; 33 return result; 34 } 35 36 STDMETHODIMP COffsetOutStream::SetSize(UInt64 newSize) 37 { 38 return _stream->SetSize(_offset + newSize); 39 } 40