From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/metadatahandler.c | 17 +++++++++++++---- dlls/windowscodecs/tests/metadata.c | 2 -- 2 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/dlls/windowscodecs/metadatahandler.c b/dlls/windowscodecs/metadatahandler.c index eb69903d589..3218f763ca9 100644 --- a/dlls/windowscodecs/metadatahandler.c +++ b/dlls/windowscodecs/metadatahandler.c @@ -43,6 +43,7 @@ typedef struct MetadataHandler { DWORD item_count; DWORD persist_options; IStream *stream; + ULARGE_INTEGER origin; CRITICAL_SECTION lock; } MetadataHandler;
@@ -510,15 +511,20 @@ static HRESULT WINAPI MetadataHandler_LoadEx(IWICPersistStream *iface, HRESULT hr = S_OK; MetadataItem *new_items=NULL; DWORD item_count=0; + LARGE_INTEGER move;
TRACE("(%p,%p,%s,%lx)\n", iface, stream, debugstr_guid(pguidPreferredVendor), dwPersistOptions);
EnterCriticalSection(&This->lock);
+ This->origin.QuadPart = 0; if (stream) { - hr = This->vtable->fnLoad(stream, pguidPreferredVendor, dwPersistOptions, - &new_items, &item_count); + move.QuadPart = 0; + hr = IStream_Seek(stream, move, STREAM_SEEK_CUR, &This->origin); + if (SUCCEEDED(hr)) + hr = This->vtable->fnLoad(stream, pguidPreferredVendor, dwPersistOptions, + &new_items, &item_count); }
if (This->stream) @@ -597,8 +603,11 @@ static HRESULT WINAPI metadatahandler_stream_provider_GetStream(IWICStreamProvid
if (handler->stream) { - *stream = handler->stream; - IStream_AddRef(*stream); + if (SUCCEEDED(hr = IStream_Seek(handler->stream, *(LARGE_INTEGER *)&handler->origin, STREAM_SEEK_SET, NULL))) + { + *stream = handler->stream; + IStream_AddRef(*stream); + } } else { diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index b3cb16527af..edfff5fc8d0 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -5132,7 +5132,6 @@ static void test_metadata_App1(void) move.QuadPart = 0; hr = IStream_Seek(ifd_stream, move, STREAM_SEEK_CUR, &pos); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(pos.QuadPart == 8, "Unexpected position %s.\n", wine_dbgstr_longlong(pos.QuadPart));
hr = CoCreateInstance(&CLSID_WICIfdMetadataReader, NULL, CLSCTX_INPROC_SERVER, @@ -5158,7 +5157,6 @@ static void test_metadata_App1(void) /* GetStream() is what triggers position reset. */ hr = IStream_Seek(ifd_stream, move, STREAM_SEEK_CUR, &pos); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(pos.QuadPart == 8, "Unexpected position %s.\n", wine_dbgstr_longlong(pos.QuadPart));
hr = IWICComponentFactory_CreateMetadataWriterFromReader(factory, reader2, NULL, &writer);