From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/tests/metadata.c | 118 +++++++++++++++++++++++++--- 1 file changed, 108 insertions(+), 10 deletions(-)
diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index 8bb013efb17..59a6f99fd7c 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -76,6 +76,21 @@ static void check_persist_options_(unsigned int line, void *iface_ptr, DWORD exp } }
+static HRESULT get_persist_stream(void *iface_ptr, IStream **stream) +{ + IWICStreamProvider *stream_provider; + IUnknown *iface = iface_ptr; + HRESULT hr = E_UNEXPECTED; + + if (SUCCEEDED(IUnknown_QueryInterface(iface, &IID_IWICStreamProvider, (void **)&stream_provider))) + { + hr = IWICStreamProvider_GetStream(stream_provider, stream); + IWICStreamProvider_Release(stream_provider); + } + + return hr; +} + #define compare_blob(a,b,c) compare_blob_(__LINE__,a,b,c) static void compare_blob_(unsigned int line, const PROPVARIANT *propvar, const char *data, ULONG length) { @@ -1539,12 +1554,13 @@ static void test_create_reader_from_container(void) IWICComponentFactory_Release(factory); }
-static void test_create_reader(void) +static void test_CreateMetadataReader(void) { + IWICPersistStream *persist_stream; IWICComponentFactory *factory; IWICMetadataReader *reader; + IStream *stream, *stream2; LARGE_INTEGER pos; - IStream *stream; UINT count = 0; GUID format; HRESULT hr; @@ -1562,6 +1578,15 @@ static void test_create_reader(void) hr = IWICComponentFactory_CreateMetadataReader(factory, &format, NULL, 0, stream, &reader); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ hr = get_persist_stream(reader, &stream2); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (SUCCEEDED(hr)) + { + ok(stream == stream2, "Unexpected stream.\n"); + IStream_Release(stream2); + } + hr = IWICMetadataReader_GetMetadataFormat(reader, &format); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(IsEqualGUID(&format, &GUID_MetadataFormatUnknown), "Unexpected format %s.\n", wine_dbgstr_guid(&format)); @@ -1575,6 +1600,10 @@ static void test_create_reader(void) NULL, 0, NULL, &reader); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ hr = get_persist_stream(reader, &stream2); + todo_wine + ok(hr == WINCODEC_ERR_STREAMNOTAVAILABLE, "Unexpected hr %#lx.\n", hr); + hr = IWICMetadataReader_GetMetadataFormat(reader, &format); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(IsEqualGUID(&format, &GUID_MetadataFormatChunktEXt), "Unexpected format %s.\n", wine_dbgstr_guid(&format)); @@ -1635,6 +1664,53 @@ static void test_create_reader(void) todo_wine ok(hr == WINCODEC_ERR_BADMETADATAHEADER, "Unexpected hr %#lx.\n", hr);
+ /* With and without caching */ + hr = IStream_Seek(stream, pos, STREAM_SEEK_SET, NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IWICComponentFactory_CreateMetadataReader(factory, &GUID_MetadataFormatChunktEXt, NULL, + WICPersistOptionNoCacheStream, stream, &reader); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IWICMetadataReader_GetCount(reader, &count); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(count == 1, "Unexpected count %u.\n", count); + + hr = get_persist_stream(reader, &stream2); + todo_wine + ok(hr == WINCODEC_ERR_STREAMNOTAVAILABLE, "Unexpected hr %#lx.\n", hr); + + hr = IWICMetadataReader_QueryInterface(reader, &IID_IWICPersistStream, (void **)&persist_stream); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IWICPersistStream_LoadEx(persist_stream, stream, NULL, 0); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = get_persist_stream(reader, &stream2); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (SUCCEEDED(hr)) + { + ok(stream == stream2, "Unexpected stream.\n"); + IStream_Release(stream2); + } + + /* Going from caching to no caching. */ + hr = IStream_Seek(stream, pos, STREAM_SEEK_SET, NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IWICPersistStream_LoadEx(persist_stream, stream, NULL, WICPersistOptionNoCacheStream); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = get_persist_stream(reader, &stream2); + todo_wine + ok(hr == WINCODEC_ERR_STREAMNOTAVAILABLE, "Unexpected hr %#lx.\n", hr); + todo_wine + check_persist_options(reader, WICPersistOptionNoCacheStream); + + IWICPersistStream_Release(persist_stream); + + IWICMetadataReader_Release(reader); + IStream_Release(stream);
IWICComponentFactory_Release(factory); @@ -3854,6 +3930,7 @@ app1_data = static void test_metadata_App1(void) { IWICMetadataReader *reader, *ifd_reader, *exif_reader, *gps_reader; + IStream *app1_stream, *stream2; IWICMetadataWriter *writer; PROPVARIANT id, value; GUID format; @@ -3888,6 +3965,9 @@ static void test_metadata_App1(void) test_reader_container_format(reader, &GUID_ContainerFormatJpeg);
load_stream(reader, (const char *)&app1_data, sizeof(app1_data), 0); + check_persist_options(reader, 0); + hr = get_persist_stream(reader, &app1_stream); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IWICMetadataReader_GetCount(reader, &count); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -3912,6 +3992,10 @@ static void test_metadata_App1(void) hr = IWICMetadataReader_GetMetadataFormat(ifd_reader, &format); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(IsEqualGUID(&format, &GUID_MetadataFormatIfd), "Unexpected format %s.\n", wine_dbgstr_guid(&format)); + check_persist_options(ifd_reader, 0); + + hr = get_persist_stream(ifd_reader, &stream2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IWICMetadataReader_GetCount(ifd_reader, &count); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -3950,6 +4034,16 @@ static void test_metadata_App1(void) PropVariantClear(&value);
/* Exif IFD */ + hr = IWICMetadataReader_GetMetadataFormat(exif_reader, &format); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(IsEqualGUID(&format, &GUID_MetadataFormatExif), "Unexpected format %s.\n", wine_dbgstr_guid(&format)); + check_persist_options(exif_reader, 0); + + hr = get_persist_stream(exif_reader, &stream2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!!stream2 && stream2 != app1_stream, "Unexpected stream.\n"); + IStream_Release(stream2); + hr = IWICMetadataReader_GetCount(exif_reader, &count); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(count == 1, "Unexpected count %u.\n", count); @@ -3977,6 +4071,16 @@ static void test_metadata_App1(void) PropVariantClear(&value);
/* GPS IFD */ + hr = IWICMetadataReader_GetMetadataFormat(gps_reader, &format); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(IsEqualGUID(&format, &GUID_MetadataFormatGps), "Unexpected format %s.\n", wine_dbgstr_guid(&format)); + check_persist_options(gps_reader, 0); + + hr = get_persist_stream(gps_reader, &stream2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!!stream2 && stream2 != app1_stream, "Unexpected stream.\n"); + IStream_Release(stream2); + hr = IWICMetadataReader_GetCount(gps_reader, &count); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(count == 1, "Unexpected count %u.\n", count); @@ -4014,7 +4118,6 @@ static void test_metadata_App1(void)
static void test_CreateMetadataWriterFromReader(void) { - IWICStreamProvider *stream_provider; IWICComponentFactory *factory; IWICMetadataReader *reader; IWICMetadataWriter *writer; @@ -4154,16 +4257,11 @@ static void test_CreateMetadataWriterFromReader(void) check_persist_options(value.punkVal, 0); PropVariantClear(&value);
- hr = IWICMetadataWriter_QueryInterface(writer, &IID_IWICStreamProvider, (void **)&stream_provider); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - hr = IWICStreamProvider_GetStream(stream_provider, &stream2); + hr = get_persist_stream(writer, &stream2); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(stream2 != stream, "Unexpected stream.\n"); IStream_Release(stream2);
- IWICStreamProvider_Release(stream_provider); - IWICMetadataWriter_Release(writer); IWICMetadataReader_Release(reader); IStream_Release(stream); @@ -4301,7 +4399,7 @@ START_TEST(metadata) test_metadata_Exif(); test_metadata_Gps(); test_create_reader_from_container(); - test_create_reader(); + test_CreateMetadataReader(); test_metadata_png(); test_metadata_gif(); test_metadata_LSD();