From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/imgfactory.c | 14 ++++------ dlls/windowscodecs/metadataquery.c | 37 ++++++++++++++++++++++++++ dlls/windowscodecs/tests/metadata.c | 8 +----- dlls/windowscodecs/wincodecs_private.h | 4 +++ 4 files changed, 47 insertions(+), 16 deletions(-)
diff --git a/dlls/windowscodecs/imgfactory.c b/dlls/windowscodecs/imgfactory.c index 8de1d370a38..29f91e6cbbd 100644 --- a/dlls/windowscodecs/imgfactory.c +++ b/dlls/windowscodecs/imgfactory.c @@ -1020,12 +1020,11 @@ static HRESULT WINAPI ImagingFactory_CreateQueryWriter(IWICImagingFactory2 *ifac }
static HRESULT WINAPI ImagingFactory_CreateQueryWriterFromReader(IWICImagingFactory2 *iface, - IWICMetadataQueryReader *pIQueryReader, const GUID *pguidVendor, - IWICMetadataQueryWriter **ppIQueryWriter) + IWICMetadataQueryReader *query_reader, const GUID *vendor, IWICMetadataQueryWriter **query_writer) { - FIXME("(%p,%p,%s,%p): stub\n", iface, pIQueryReader, debugstr_guid(pguidVendor), - ppIQueryWriter); - return E_NOTIMPL; + TRACE("(%p,%p,%s,%p)\n", iface, query_reader, debugstr_guid(vendor), query_writer); + + return create_metadata_query_writer_from_reader(query_reader, vendor, query_writer); }
static HRESULT WINAPI ImagingFactory_CreateImageEncoder(IWICImagingFactory2 *iface, ID2D1Device *device, IWICImageEncoder **encoder) @@ -1633,9 +1632,6 @@ static HRESULT WINAPI ComponentFactory_CreateMetadataWriter(IWICComponentFactory return create_metadata_writer(format, vendor, options, writer); }
-static HRESULT create_metadata_writer_from_reader(IWICMetadataReader *reader, const GUID *vendor, - IWICMetadataWriter **out_writer); - static HRESULT metadata_writer_copy_items_from_reader(IWICMetadataWriter *writer, const GUID *vendor, IWICMetadataReader *reader) { IWICMetadataReader *sub_reader; @@ -1684,7 +1680,7 @@ static HRESULT metadata_writer_copy_items_from_reader(IWICMetadataWriter *writer return hr; }
-static HRESULT create_metadata_writer_from_reader(IWICMetadataReader *reader, const GUID *vendor, +HRESULT create_metadata_writer_from_reader(IWICMetadataReader *reader, const GUID *vendor, IWICMetadataWriter **out_writer) { IWICStreamProvider *stream_provider = NULL; diff --git a/dlls/windowscodecs/metadataquery.c b/dlls/windowscodecs/metadataquery.c index 43b9a782581..62456047593 100644 --- a/dlls/windowscodecs/metadataquery.c +++ b/dlls/windowscodecs/metadataquery.c @@ -1223,6 +1223,18 @@ static IWICMetadataQueryWriterVtbl query_handler_vtbl = query_handler_RemoveMetadataByName, };
+static struct query_handler *unsafe_impl_from_IWICMetadataQueryReader(IWICMetadataQueryReader *iface) +{ + if (!iface) + return NULL; + if (iface->lpVtbl != (IWICMetadataQueryReaderVtbl *)&query_handler_vtbl) + { + WARN("External query reader implementations are not supported.\n"); + return NULL; + } + return CONTAINING_RECORD(iface, struct query_handler, IWICMetadataQueryWriter_iface); +} + static HRESULT create_query_handler(IUnknown *block_handler, enum metadata_object_type object_type, const WCHAR *root, IWICMetadataQueryWriter **ret) { @@ -1289,6 +1301,31 @@ HRESULT MetadataQueryWriter_CreateInstance(IWICMetadataWriter *writer, IWICMetad return create_query_handler((IUnknown *)writer, WRITER, NULL, out); }
+HRESULT create_metadata_query_writer_from_reader(IWICMetadataQueryReader *query_reader, const GUID *vendor, + IWICMetadataQueryWriter **query_writer) +{ + struct query_handler *query_reader_obj = unsafe_impl_from_IWICMetadataQueryReader(query_reader); + IWICMetadataWriter *writer; + HRESULT hr; + + *query_writer = NULL; + + if (!query_reader_obj) + return E_FAIL; + + if (is_block_handler(query_reader_obj)) + return WINCODEC_ERR_UNEXPECTEDMETADATATYPE; + + hr = create_metadata_writer_from_reader(query_reader_obj->object.reader, vendor, &writer); + if (SUCCEEDED(hr)) + { + hr = create_query_handler((IUnknown *)writer, WRITER, NULL, query_writer); + IWICMetadataWriter_Release(writer); + } + + return hr; +} + static const struct { const GUID *guid; diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index 994f9647d33..9717015a153 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -6009,7 +6009,6 @@ static void test_CreateQueryWriterFromReader(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IWICComponentFactory_CreateQueryWriterFromReader(factory, query_reader, NULL, &query_writer); - todo_wine ok(hr == WINCODEC_ERR_UNEXPECTEDMETADATATYPE, "Unexpected hr %#lx.\n", hr);
PropVariantInit(&value); @@ -6067,7 +6066,6 @@ if (hr == S_OK)
hr = IWICComponentFactory_CreateQueryWriterFromReader(factory, (IWICMetadataQueryReader *)query_writer, NULL, &query_writer2); - todo_wine ok(hr == WINCODEC_ERR_UNEXPECTEDMETADATATYPE, "Unexpected hr %#lx.\n", hr); IWICMetadataQueryWriter_Release(query_writer);
@@ -6077,10 +6075,8 @@ if (hr == S_OK)
hr = IWICComponentFactory_CreateQueryWriterFromReader(factory, (IWICMetadataQueryReader *)query_writer, NULL, &query_writer2); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (hr == S_OK) - IWICMetadataQueryWriter_Release(query_writer2); + IWICMetadataQueryWriter_Release(query_writer2); if (query_writer) IWICMetadataQueryWriter_Release(query_writer);
@@ -6103,7 +6099,6 @@ if (hr == S_OK) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IWICComponentFactory_CreateQueryWriterFromReader(factory, query_reader, &GUID_VendorMicrosoft, &query_writer); - todo_wine ok(hr == WINCODEC_ERR_UNEXPECTEDMETADATATYPE, "Unexpected hr %#lx.\n", hr);
IWICMetadataQueryReader_Release(query_reader); @@ -6118,7 +6113,6 @@ if (hr == S_OK) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IWICComponentFactory_CreateQueryWriterFromReader(factory, query_reader, &GUID_VendorMicrosoft, &query_writer); - todo_wine ok(hr == WINCODEC_ERR_UNEXPECTEDMETADATATYPE, "Unexpected hr %#lx.\n", hr); IWICMetadataQueryReader_Release(query_reader);
diff --git a/dlls/windowscodecs/wincodecs_private.h b/dlls/windowscodecs/wincodecs_private.h index 156b013a53f..9cf842721f7 100644 --- a/dlls/windowscodecs/wincodecs_private.h +++ b/dlls/windowscodecs/wincodecs_private.h @@ -344,6 +344,10 @@ HRESULT create_metadata_reader(REFGUID format, const GUID *vendor, DWORD options IWICMetadataReader **reader); HRESULT create_metadata_writer(REFGUID format, const GUID *vendor, DWORD options, IWICMetadataWriter **writer); +HRESULT create_metadata_query_writer_from_reader(IWICMetadataQueryReader *query_reader, const GUID *vendor, + IWICMetadataQueryWriter **query_writer); +HRESULT create_metadata_writer_from_reader(IWICMetadataReader *reader, const GUID *vendor, + IWICMetadataWriter **writer);
struct encoder_funcs;