1*f6dc9357SAndroid Build Coastguard Worker // StreamObjects.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../C/Alloc.h"
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include "StreamObjects.h"
8*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CBufferInStream::Read (void * data,UInt32 size,UInt32 * processedSize))9*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CBufferInStream::Read(void *data, UInt32 size, UInt32 *processedSize))
10*f6dc9357SAndroid Build Coastguard Worker {
11*f6dc9357SAndroid Build Coastguard Worker if (processedSize)
12*f6dc9357SAndroid Build Coastguard Worker *processedSize = 0;
13*f6dc9357SAndroid Build Coastguard Worker if (size == 0)
14*f6dc9357SAndroid Build Coastguard Worker return S_OK;
15*f6dc9357SAndroid Build Coastguard Worker if (_pos >= Buf.Size())
16*f6dc9357SAndroid Build Coastguard Worker return S_OK;
17*f6dc9357SAndroid Build Coastguard Worker size_t rem = Buf.Size() - (size_t)_pos;
18*f6dc9357SAndroid Build Coastguard Worker if (rem > size)
19*f6dc9357SAndroid Build Coastguard Worker rem = (size_t)size;
20*f6dc9357SAndroid Build Coastguard Worker memcpy(data, (const Byte *)Buf + (size_t)_pos, rem);
21*f6dc9357SAndroid Build Coastguard Worker _pos += rem;
22*f6dc9357SAndroid Build Coastguard Worker if (processedSize)
23*f6dc9357SAndroid Build Coastguard Worker *processedSize = (UInt32)rem;
24*f6dc9357SAndroid Build Coastguard Worker return S_OK;
25*f6dc9357SAndroid Build Coastguard Worker }
26*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CBufferInStream::Seek (Int64 offset,UInt32 seekOrigin,UInt64 * newPosition))27*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CBufferInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition))
28*f6dc9357SAndroid Build Coastguard Worker {
29*f6dc9357SAndroid Build Coastguard Worker switch (seekOrigin)
30*f6dc9357SAndroid Build Coastguard Worker {
31*f6dc9357SAndroid Build Coastguard Worker case STREAM_SEEK_SET: break;
32*f6dc9357SAndroid Build Coastguard Worker case STREAM_SEEK_CUR: offset += _pos; break;
33*f6dc9357SAndroid Build Coastguard Worker case STREAM_SEEK_END: offset += Buf.Size(); break;
34*f6dc9357SAndroid Build Coastguard Worker default: return STG_E_INVALIDFUNCTION;
35*f6dc9357SAndroid Build Coastguard Worker }
36*f6dc9357SAndroid Build Coastguard Worker if (offset < 0)
37*f6dc9357SAndroid Build Coastguard Worker return HRESULT_WIN32_ERROR_NEGATIVE_SEEK;
38*f6dc9357SAndroid Build Coastguard Worker _pos = (UInt64)offset;
39*f6dc9357SAndroid Build Coastguard Worker if (newPosition)
40*f6dc9357SAndroid Build Coastguard Worker *newPosition = (UInt64)offset;
41*f6dc9357SAndroid Build Coastguard Worker return S_OK;
42*f6dc9357SAndroid Build Coastguard Worker }
43*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CBufInStream::Read (void * data,UInt32 size,UInt32 * processedSize))44*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CBufInStream::Read(void *data, UInt32 size, UInt32 *processedSize))
45*f6dc9357SAndroid Build Coastguard Worker {
46*f6dc9357SAndroid Build Coastguard Worker if (processedSize)
47*f6dc9357SAndroid Build Coastguard Worker *processedSize = 0;
48*f6dc9357SAndroid Build Coastguard Worker if (size == 0)
49*f6dc9357SAndroid Build Coastguard Worker return S_OK;
50*f6dc9357SAndroid Build Coastguard Worker if (_pos >= _size)
51*f6dc9357SAndroid Build Coastguard Worker return S_OK;
52*f6dc9357SAndroid Build Coastguard Worker size_t rem = _size - (size_t)_pos;
53*f6dc9357SAndroid Build Coastguard Worker if (rem > size)
54*f6dc9357SAndroid Build Coastguard Worker rem = (size_t)size;
55*f6dc9357SAndroid Build Coastguard Worker memcpy(data, _data + (size_t)_pos, rem);
56*f6dc9357SAndroid Build Coastguard Worker _pos += rem;
57*f6dc9357SAndroid Build Coastguard Worker if (processedSize)
58*f6dc9357SAndroid Build Coastguard Worker *processedSize = (UInt32)rem;
59*f6dc9357SAndroid Build Coastguard Worker return S_OK;
60*f6dc9357SAndroid Build Coastguard Worker }
61*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CBufInStream::Seek (Int64 offset,UInt32 seekOrigin,UInt64 * newPosition))62*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CBufInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition))
63*f6dc9357SAndroid Build Coastguard Worker {
64*f6dc9357SAndroid Build Coastguard Worker switch (seekOrigin)
65*f6dc9357SAndroid Build Coastguard Worker {
66*f6dc9357SAndroid Build Coastguard Worker case STREAM_SEEK_SET: break;
67*f6dc9357SAndroid Build Coastguard Worker case STREAM_SEEK_CUR: offset += _pos; break;
68*f6dc9357SAndroid Build Coastguard Worker case STREAM_SEEK_END: offset += _size; break;
69*f6dc9357SAndroid Build Coastguard Worker default: return STG_E_INVALIDFUNCTION;
70*f6dc9357SAndroid Build Coastguard Worker }
71*f6dc9357SAndroid Build Coastguard Worker if (offset < 0)
72*f6dc9357SAndroid Build Coastguard Worker return HRESULT_WIN32_ERROR_NEGATIVE_SEEK;
73*f6dc9357SAndroid Build Coastguard Worker _pos = (UInt64)offset;
74*f6dc9357SAndroid Build Coastguard Worker if (newPosition)
75*f6dc9357SAndroid Build Coastguard Worker *newPosition = (UInt64)offset;
76*f6dc9357SAndroid Build Coastguard Worker return S_OK;
77*f6dc9357SAndroid Build Coastguard Worker }
78*f6dc9357SAndroid Build Coastguard Worker
Create_BufInStream_WithReference(const void * data,size_t size,IUnknown * ref,ISequentialInStream ** stream)79*f6dc9357SAndroid Build Coastguard Worker void Create_BufInStream_WithReference(const void *data, size_t size, IUnknown *ref, ISequentialInStream **stream)
80*f6dc9357SAndroid Build Coastguard Worker {
81*f6dc9357SAndroid Build Coastguard Worker *stream = NULL;
82*f6dc9357SAndroid Build Coastguard Worker CBufInStream *inStreamSpec = new CBufInStream;
83*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialInStream> streamTemp = inStreamSpec;
84*f6dc9357SAndroid Build Coastguard Worker inStreamSpec->Init((const Byte *)data, size, ref);
85*f6dc9357SAndroid Build Coastguard Worker *stream = streamTemp.Detach();
86*f6dc9357SAndroid Build Coastguard Worker }
87*f6dc9357SAndroid Build Coastguard Worker
Create_BufInStream_WithNewBuffer(const void * data,size_t size,ISequentialInStream ** stream)88*f6dc9357SAndroid Build Coastguard Worker void Create_BufInStream_WithNewBuffer(const void *data, size_t size, ISequentialInStream **stream)
89*f6dc9357SAndroid Build Coastguard Worker {
90*f6dc9357SAndroid Build Coastguard Worker *stream = NULL;
91*f6dc9357SAndroid Build Coastguard Worker CBufferInStream *inStreamSpec = new CBufferInStream;
92*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialInStream> streamTemp = inStreamSpec;
93*f6dc9357SAndroid Build Coastguard Worker inStreamSpec->Buf.CopyFrom((const Byte *)data, size);
94*f6dc9357SAndroid Build Coastguard Worker inStreamSpec->Init();
95*f6dc9357SAndroid Build Coastguard Worker *stream = streamTemp.Detach();
96*f6dc9357SAndroid Build Coastguard Worker }
97*f6dc9357SAndroid Build Coastguard Worker
Free()98*f6dc9357SAndroid Build Coastguard Worker void CByteDynBuffer::Free() throw()
99*f6dc9357SAndroid Build Coastguard Worker {
100*f6dc9357SAndroid Build Coastguard Worker MyFree(_buf);
101*f6dc9357SAndroid Build Coastguard Worker _buf = NULL;
102*f6dc9357SAndroid Build Coastguard Worker _capacity = 0;
103*f6dc9357SAndroid Build Coastguard Worker }
104*f6dc9357SAndroid Build Coastguard Worker
EnsureCapacity(size_t cap)105*f6dc9357SAndroid Build Coastguard Worker bool CByteDynBuffer::EnsureCapacity(size_t cap) throw()
106*f6dc9357SAndroid Build Coastguard Worker {
107*f6dc9357SAndroid Build Coastguard Worker if (cap <= _capacity)
108*f6dc9357SAndroid Build Coastguard Worker return true;
109*f6dc9357SAndroid Build Coastguard Worker const size_t cap2 = _capacity + _capacity / 4;
110*f6dc9357SAndroid Build Coastguard Worker if (cap < cap2)
111*f6dc9357SAndroid Build Coastguard Worker cap = cap2;
112*f6dc9357SAndroid Build Coastguard Worker Byte *buf = (Byte *)MyRealloc(_buf, cap);
113*f6dc9357SAndroid Build Coastguard Worker if (!buf)
114*f6dc9357SAndroid Build Coastguard Worker return false;
115*f6dc9357SAndroid Build Coastguard Worker _buf = buf;
116*f6dc9357SAndroid Build Coastguard Worker _capacity = cap;
117*f6dc9357SAndroid Build Coastguard Worker return true;
118*f6dc9357SAndroid Build Coastguard Worker }
119*f6dc9357SAndroid Build Coastguard Worker
GetBufPtrForWriting(size_t addSize)120*f6dc9357SAndroid Build Coastguard Worker Byte *CDynBufSeqOutStream::GetBufPtrForWriting(size_t addSize)
121*f6dc9357SAndroid Build Coastguard Worker {
122*f6dc9357SAndroid Build Coastguard Worker addSize += _size;
123*f6dc9357SAndroid Build Coastguard Worker if (addSize < _size)
124*f6dc9357SAndroid Build Coastguard Worker return NULL;
125*f6dc9357SAndroid Build Coastguard Worker if (!_buffer.EnsureCapacity(addSize))
126*f6dc9357SAndroid Build Coastguard Worker return NULL;
127*f6dc9357SAndroid Build Coastguard Worker return (Byte *)_buffer + _size;
128*f6dc9357SAndroid Build Coastguard Worker }
129*f6dc9357SAndroid Build Coastguard Worker
CopyToBuffer(CByteBuffer & dest) const130*f6dc9357SAndroid Build Coastguard Worker void CDynBufSeqOutStream::CopyToBuffer(CByteBuffer &dest) const
131*f6dc9357SAndroid Build Coastguard Worker {
132*f6dc9357SAndroid Build Coastguard Worker dest.CopyFrom((const Byte *)_buffer, _size);
133*f6dc9357SAndroid Build Coastguard Worker }
134*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CDynBufSeqOutStream::Write (const void * data,UInt32 size,UInt32 * processedSize))135*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CDynBufSeqOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize))
136*f6dc9357SAndroid Build Coastguard Worker {
137*f6dc9357SAndroid Build Coastguard Worker if (processedSize)
138*f6dc9357SAndroid Build Coastguard Worker *processedSize = 0;
139*f6dc9357SAndroid Build Coastguard Worker if (size == 0)
140*f6dc9357SAndroid Build Coastguard Worker return S_OK;
141*f6dc9357SAndroid Build Coastguard Worker Byte *buf = GetBufPtrForWriting(size);
142*f6dc9357SAndroid Build Coastguard Worker if (!buf)
143*f6dc9357SAndroid Build Coastguard Worker return E_OUTOFMEMORY;
144*f6dc9357SAndroid Build Coastguard Worker memcpy(buf, data, size);
145*f6dc9357SAndroid Build Coastguard Worker UpdateSize(size);
146*f6dc9357SAndroid Build Coastguard Worker if (processedSize)
147*f6dc9357SAndroid Build Coastguard Worker *processedSize = size;
148*f6dc9357SAndroid Build Coastguard Worker return S_OK;
149*f6dc9357SAndroid Build Coastguard Worker }
150*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CBufPtrSeqOutStream::Write (const void * data,UInt32 size,UInt32 * processedSize))151*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CBufPtrSeqOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize))
152*f6dc9357SAndroid Build Coastguard Worker {
153*f6dc9357SAndroid Build Coastguard Worker size_t rem = _size - _pos;
154*f6dc9357SAndroid Build Coastguard Worker if (rem > size)
155*f6dc9357SAndroid Build Coastguard Worker rem = (size_t)size;
156*f6dc9357SAndroid Build Coastguard Worker if (rem != 0)
157*f6dc9357SAndroid Build Coastguard Worker {
158*f6dc9357SAndroid Build Coastguard Worker memcpy(_buffer + _pos, data, rem);
159*f6dc9357SAndroid Build Coastguard Worker _pos += rem;
160*f6dc9357SAndroid Build Coastguard Worker }
161*f6dc9357SAndroid Build Coastguard Worker if (processedSize)
162*f6dc9357SAndroid Build Coastguard Worker *processedSize = (UInt32)rem;
163*f6dc9357SAndroid Build Coastguard Worker return (rem != 0 || size == 0) ? S_OK : E_FAIL;
164*f6dc9357SAndroid Build Coastguard Worker }
165*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CSequentialOutStreamSizeCount::Write (const void * data,UInt32 size,UInt32 * processedSize))166*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CSequentialOutStreamSizeCount::Write(const void *data, UInt32 size, UInt32 *processedSize))
167*f6dc9357SAndroid Build Coastguard Worker {
168*f6dc9357SAndroid Build Coastguard Worker UInt32 realProcessedSize;
169*f6dc9357SAndroid Build Coastguard Worker HRESULT result = _stream->Write(data, size, &realProcessedSize);
170*f6dc9357SAndroid Build Coastguard Worker _size += realProcessedSize;
171*f6dc9357SAndroid Build Coastguard Worker if (processedSize)
172*f6dc9357SAndroid Build Coastguard Worker *processedSize = realProcessedSize;
173*f6dc9357SAndroid Build Coastguard Worker return result;
174*f6dc9357SAndroid Build Coastguard Worker }
175*f6dc9357SAndroid Build Coastguard Worker
176*f6dc9357SAndroid Build Coastguard Worker static const UInt64 kEmptyTag = (UInt64)(Int64)-1;
177*f6dc9357SAndroid Build Coastguard Worker
Free()178*f6dc9357SAndroid Build Coastguard Worker void CCachedInStream::Free() throw()
179*f6dc9357SAndroid Build Coastguard Worker {
180*f6dc9357SAndroid Build Coastguard Worker MyFree(_tags);
181*f6dc9357SAndroid Build Coastguard Worker _tags = NULL;
182*f6dc9357SAndroid Build Coastguard Worker MidFree(_data);
183*f6dc9357SAndroid Build Coastguard Worker _data = NULL;
184*f6dc9357SAndroid Build Coastguard Worker }
185*f6dc9357SAndroid Build Coastguard Worker
Alloc(unsigned blockSizeLog,unsigned numBlocksLog)186*f6dc9357SAndroid Build Coastguard Worker bool CCachedInStream::Alloc(unsigned blockSizeLog, unsigned numBlocksLog) throw()
187*f6dc9357SAndroid Build Coastguard Worker {
188*f6dc9357SAndroid Build Coastguard Worker unsigned sizeLog = blockSizeLog + numBlocksLog;
189*f6dc9357SAndroid Build Coastguard Worker if (sizeLog >= sizeof(size_t) * 8)
190*f6dc9357SAndroid Build Coastguard Worker return false;
191*f6dc9357SAndroid Build Coastguard Worker size_t dataSize = (size_t)1 << sizeLog;
192*f6dc9357SAndroid Build Coastguard Worker if (!_data || dataSize != _dataSize)
193*f6dc9357SAndroid Build Coastguard Worker {
194*f6dc9357SAndroid Build Coastguard Worker MidFree(_data);
195*f6dc9357SAndroid Build Coastguard Worker _data = (Byte *)MidAlloc(dataSize);
196*f6dc9357SAndroid Build Coastguard Worker if (!_data)
197*f6dc9357SAndroid Build Coastguard Worker return false;
198*f6dc9357SAndroid Build Coastguard Worker _dataSize = dataSize;
199*f6dc9357SAndroid Build Coastguard Worker }
200*f6dc9357SAndroid Build Coastguard Worker if (!_tags || numBlocksLog != _numBlocksLog)
201*f6dc9357SAndroid Build Coastguard Worker {
202*f6dc9357SAndroid Build Coastguard Worker MyFree(_tags);
203*f6dc9357SAndroid Build Coastguard Worker _tags = (UInt64 *)MyAlloc(sizeof(UInt64) << numBlocksLog);
204*f6dc9357SAndroid Build Coastguard Worker if (!_tags)
205*f6dc9357SAndroid Build Coastguard Worker return false;
206*f6dc9357SAndroid Build Coastguard Worker _numBlocksLog = numBlocksLog;
207*f6dc9357SAndroid Build Coastguard Worker }
208*f6dc9357SAndroid Build Coastguard Worker _blockSizeLog = blockSizeLog;
209*f6dc9357SAndroid Build Coastguard Worker return true;
210*f6dc9357SAndroid Build Coastguard Worker }
211*f6dc9357SAndroid Build Coastguard Worker
Init(UInt64 size)212*f6dc9357SAndroid Build Coastguard Worker void CCachedInStream::Init(UInt64 size) throw()
213*f6dc9357SAndroid Build Coastguard Worker {
214*f6dc9357SAndroid Build Coastguard Worker _size = size;
215*f6dc9357SAndroid Build Coastguard Worker _pos = 0;
216*f6dc9357SAndroid Build Coastguard Worker const size_t numBlocks = (size_t)1 << _numBlocksLog;
217*f6dc9357SAndroid Build Coastguard Worker for (size_t i = 0; i < numBlocks; i++)
218*f6dc9357SAndroid Build Coastguard Worker _tags[i] = kEmptyTag;
219*f6dc9357SAndroid Build Coastguard Worker }
220*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CCachedInStream::Read (void * data,UInt32 size,UInt32 * processedSize))221*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CCachedInStream::Read(void *data, UInt32 size, UInt32 *processedSize))
222*f6dc9357SAndroid Build Coastguard Worker {
223*f6dc9357SAndroid Build Coastguard Worker if (processedSize)
224*f6dc9357SAndroid Build Coastguard Worker *processedSize = 0;
225*f6dc9357SAndroid Build Coastguard Worker if (size == 0)
226*f6dc9357SAndroid Build Coastguard Worker return S_OK;
227*f6dc9357SAndroid Build Coastguard Worker if (_pos >= _size)
228*f6dc9357SAndroid Build Coastguard Worker return S_OK;
229*f6dc9357SAndroid Build Coastguard Worker
230*f6dc9357SAndroid Build Coastguard Worker {
231*f6dc9357SAndroid Build Coastguard Worker const UInt64 rem = _size - _pos;
232*f6dc9357SAndroid Build Coastguard Worker if (size > rem)
233*f6dc9357SAndroid Build Coastguard Worker size = (UInt32)rem;
234*f6dc9357SAndroid Build Coastguard Worker }
235*f6dc9357SAndroid Build Coastguard Worker
236*f6dc9357SAndroid Build Coastguard Worker while (size != 0)
237*f6dc9357SAndroid Build Coastguard Worker {
238*f6dc9357SAndroid Build Coastguard Worker const UInt64 cacheTag = _pos >> _blockSizeLog;
239*f6dc9357SAndroid Build Coastguard Worker const size_t cacheIndex = (size_t)cacheTag & (((size_t)1 << _numBlocksLog) - 1);
240*f6dc9357SAndroid Build Coastguard Worker Byte *p = _data + (cacheIndex << _blockSizeLog);
241*f6dc9357SAndroid Build Coastguard Worker
242*f6dc9357SAndroid Build Coastguard Worker if (_tags[cacheIndex] != cacheTag)
243*f6dc9357SAndroid Build Coastguard Worker {
244*f6dc9357SAndroid Build Coastguard Worker _tags[cacheIndex] = kEmptyTag;
245*f6dc9357SAndroid Build Coastguard Worker const UInt64 remInBlock = _size - (cacheTag << _blockSizeLog);
246*f6dc9357SAndroid Build Coastguard Worker size_t blockSize = (size_t)1 << _blockSizeLog;
247*f6dc9357SAndroid Build Coastguard Worker if (blockSize > remInBlock)
248*f6dc9357SAndroid Build Coastguard Worker blockSize = (size_t)remInBlock;
249*f6dc9357SAndroid Build Coastguard Worker
250*f6dc9357SAndroid Build Coastguard Worker RINOK(ReadBlock(cacheTag, p, blockSize))
251*f6dc9357SAndroid Build Coastguard Worker
252*f6dc9357SAndroid Build Coastguard Worker _tags[cacheIndex] = cacheTag;
253*f6dc9357SAndroid Build Coastguard Worker }
254*f6dc9357SAndroid Build Coastguard Worker
255*f6dc9357SAndroid Build Coastguard Worker const size_t kBlockSize = (size_t)1 << _blockSizeLog;
256*f6dc9357SAndroid Build Coastguard Worker const size_t offset = (size_t)_pos & (kBlockSize - 1);
257*f6dc9357SAndroid Build Coastguard Worker UInt32 cur = size;
258*f6dc9357SAndroid Build Coastguard Worker const size_t rem = kBlockSize - offset;
259*f6dc9357SAndroid Build Coastguard Worker if (cur > rem)
260*f6dc9357SAndroid Build Coastguard Worker cur = (UInt32)rem;
261*f6dc9357SAndroid Build Coastguard Worker
262*f6dc9357SAndroid Build Coastguard Worker memcpy(data, p + offset, cur);
263*f6dc9357SAndroid Build Coastguard Worker
264*f6dc9357SAndroid Build Coastguard Worker if (processedSize)
265*f6dc9357SAndroid Build Coastguard Worker *processedSize += cur;
266*f6dc9357SAndroid Build Coastguard Worker data = (void *)((const Byte *)data + cur);
267*f6dc9357SAndroid Build Coastguard Worker _pos += cur;
268*f6dc9357SAndroid Build Coastguard Worker size -= cur;
269*f6dc9357SAndroid Build Coastguard Worker }
270*f6dc9357SAndroid Build Coastguard Worker
271*f6dc9357SAndroid Build Coastguard Worker return S_OK;
272*f6dc9357SAndroid Build Coastguard Worker }
273*f6dc9357SAndroid Build Coastguard Worker
274*f6dc9357SAndroid Build Coastguard Worker
Z7_COM7F_IMF(CCachedInStream::Seek (Int64 offset,UInt32 seekOrigin,UInt64 * newPosition))275*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CCachedInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition))
276*f6dc9357SAndroid Build Coastguard Worker {
277*f6dc9357SAndroid Build Coastguard Worker switch (seekOrigin)
278*f6dc9357SAndroid Build Coastguard Worker {
279*f6dc9357SAndroid Build Coastguard Worker case STREAM_SEEK_SET: break;
280*f6dc9357SAndroid Build Coastguard Worker case STREAM_SEEK_CUR: offset += _pos; break;
281*f6dc9357SAndroid Build Coastguard Worker case STREAM_SEEK_END: offset += _size; break;
282*f6dc9357SAndroid Build Coastguard Worker default: return STG_E_INVALIDFUNCTION;
283*f6dc9357SAndroid Build Coastguard Worker }
284*f6dc9357SAndroid Build Coastguard Worker if (offset < 0)
285*f6dc9357SAndroid Build Coastguard Worker return HRESULT_WIN32_ERROR_NEGATIVE_SEEK;
286*f6dc9357SAndroid Build Coastguard Worker _pos = (UInt64)offset;
287*f6dc9357SAndroid Build Coastguard Worker if (newPosition)
288*f6dc9357SAndroid Build Coastguard Worker *newPosition = (UInt64)offset;
289*f6dc9357SAndroid Build Coastguard Worker return S_OK;
290*f6dc9357SAndroid Build Coastguard Worker }
291