1 // OffsetStream.cpp
2
3 #include "StdAfx.h"
4
5 #include "../../Common/Defs.h"
6
7 #include "OffsetStream.h"
8
Init(IOutStream * stream,UInt64 offset)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
Write(const void * data,UInt32 size,UInt32 * processedSize)16 STDMETHODIMP COffsetOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
17 {
18 return _stream->Write(data, size, processedSize);
19 }
20
Seek(Int64 offset,UInt32 seekOrigin,UInt64 * newPosition)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
SetSize(UInt64 newSize)36 STDMETHODIMP COffsetOutStream::SetSize(UInt64 newSize)
37 {
38 return _stream->SetSize(_offset + newSize);
39 }
40