From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/metadatahandler.c | 32 ++++++++++++++--- dlls/windowscodecs/tests/metadata.c | 48 ++++++++------------------ dlls/windowscodecs/wincodecs_private.h | 1 + 3 files changed, 44 insertions(+), 37 deletions(-)
diff --git a/dlls/windowscodecs/metadatahandler.c b/dlls/windowscodecs/metadatahandler.c index ebb7a08b0b6..d087a0640d7 100644 --- a/dlls/windowscodecs/metadatahandler.c +++ b/dlls/windowscodecs/metadatahandler.c @@ -648,7 +648,7 @@ static const IWICStreamProviderVtbl MetadataHandler_StreamProvider_Vtbl = HRESULT MetadataReader_Create(const MetadataHandlerVtbl *vtable, REFIID iid, void** ppv) { MetadataHandler *This; - HRESULT hr; + HRESULT hr = S_OK;
TRACE("%s\n", debugstr_guid(vtable->clsid));
@@ -666,7 +666,11 @@ HRESULT MetadataReader_Create(const MetadataHandlerVtbl *vtable, REFIID iid, voi InitializeCriticalSectionEx(&This->lock, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO); This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": MetadataHandler.lock");
- hr = IWICMetadataWriter_QueryInterface(&This->IWICMetadataWriter_iface, iid, ppv); + if (This->vtable->fnCreate) + hr = This->vtable->fnCreate(This); + + if (SUCCEEDED(hr)) + hr = IWICMetadataWriter_QueryInterface(&This->IWICMetadataWriter_iface, iid, ppv);
IWICMetadataWriter_Release(&This->IWICMetadataWriter_iface);
@@ -916,10 +920,29 @@ static HRESULT LoadUnknownMetadata(MetadataHandler *handler, IStream *input, con return S_OK; }
+static HRESULT CreateUnknownHandler(MetadataHandler *handler) +{ + MetadataItem *item; + + if (!(item = calloc(1, sizeof(*item)))) + return E_OUTOFMEMORY; + + PropVariantInit(&item->schema); + PropVariantInit(&item->id); + PropVariantInit(&item->value); + item->value.vt = VT_BLOB; + + handler->items = item; + handler->item_count = 1; + + return S_OK; +} + static const MetadataHandlerVtbl UnknownMetadataReader_Vtbl = { .clsid = &CLSID_WICUnknownMetadataReader, - .fnLoad = LoadUnknownMetadata + .fnLoad = LoadUnknownMetadata, + .fnCreate = CreateUnknownHandler, };
HRESULT UnknownMetadataReader_CreateInstance(REFIID iid, void** ppv) @@ -931,7 +954,8 @@ static const MetadataHandlerVtbl UnknownMetadataWriter_Vtbl = { .flags = METADATAHANDLER_IS_WRITER | METADATAHANDLER_FIXED_ITEMS, .clsid = &CLSID_WICUnknownMetadataWriter, - .fnLoad = LoadUnknownMetadata + .fnLoad = LoadUnknownMetadata, + .fnCreate = CreateUnknownHandler, };
HRESULT UnknownMetadataWriter_CreateInstance(REFIID iid, void** ppv) diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index 602d2406be1..022c5b9008f 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -783,20 +783,15 @@ static void test_metadata_unknown(void)
hr = IWICMetadataReader_GetCount(reader, &count); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(count == 1, "Unexpected count %u.\n", count);
PropVariantInit(&value); hr = IWICMetadataReader_GetValueByIndex(reader, 0, NULL, NULL, &value); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (hr == S_OK) - { - ok(value.vt == VT_BLOB, "Unexpected type %d.\n", value.vt); - ok(!value.blob.cbSize, "Unexpected size %lu.\n", value.blob.cbSize); - ok(!value.blob.pBlobData, "Unexpected data pointer %p.\n", value.blob.pBlobData); - PropVariantClear(&value); - } + ok(value.vt == VT_BLOB, "Unexpected type %d.\n", value.vt); + ok(!value.blob.cbSize, "Unexpected size %lu.\n", value.blob.cbSize); + ok(!value.blob.pBlobData, "Unexpected data pointer %p.\n", value.blob.pBlobData); + PropVariantClear(&value);
load_stream(reader, metadata_unknown, sizeof(metadata_unknown), WICPersistOptionDefault);
@@ -915,23 +910,18 @@ static void test_metadata_unknown(void)
hr = IWICMetadataWriter_GetCount(writer, &count); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(count == 1, "Unexpected count %u.\n", count);
PropVariantInit(&schema); PropVariantInit(&id); PropVariantInit(&value); hr = IWICMetadataWriter_GetValueByIndex(writer, 0, &schema, &id, &value); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (hr == S_OK) - { - ok(schema.vt == VT_EMPTY, "Unexpected type %d.\n", schema.vt); - ok(id.vt == VT_EMPTY, "Unexpected type %d.\n", id.vt); - ok(value.vt == VT_BLOB, "Unexpected type %d.\n", value.vt); - ok(!value.blob.cbSize, "Unexpected size %lu.\n", value.blob.cbSize); - ok(!value.blob.pBlobData, "Unexpected data pointer %p.\n", value.blob.pBlobData); - } + ok(schema.vt == VT_EMPTY, "Unexpected type %d.\n", schema.vt); + ok(id.vt == VT_EMPTY, "Unexpected type %d.\n", id.vt); + ok(value.vt == VT_BLOB, "Unexpected type %d.\n", value.vt); + ok(!value.blob.cbSize, "Unexpected size %lu.\n", value.blob.cbSize); + ok(!value.blob.pBlobData, "Unexpected data pointer %p.\n", value.blob.pBlobData);
PropVariantInit(&schema); PropVariantInit(&value); @@ -6779,26 +6769,18 @@ static void test_CreateQueryWriter(void)
PropVariantInit(&value); hr = IWICMetadataQueryWriter_GetMetadataByName(query_writer, L"/", &value); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (hr == S_OK) - { - ok(value.vt == VT_BLOB, "Unexpected value type %u.\n", value.vt); - ok(!value.blob.cbSize, "Unexpected size %lu.\n", value.blob.cbSize); - ok(!value.blob.pBlobData, "Unexpected data pointer %p.\n", value.blob.pBlobData); - PropVariantClear(&value); - } + ok(value.vt == VT_BLOB, "Unexpected value type %u.\n", value.vt); + ok(!value.blob.cbSize, "Unexpected size %lu.\n", value.blob.cbSize); + ok(!value.blob.pBlobData, "Unexpected data pointer %p.\n", value.blob.pBlobData); + PropVariantClear(&value);
hr = IWICMetadataQueryWriter_GetEnumerator(query_writer, &enum_string); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IEnumString_Next(enum_string, 1, &str, &fetched); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (hr == S_OK) - { - ok(!wcscmp(str, L"/{}"), "Unexpected string %s.\n", wine_dbgstr_w(str)); - CoTaskMemFree(str); - } + ok(!wcscmp(str, L"/{}"), "Unexpected string %s.\n", wine_dbgstr_w(str)); + CoTaskMemFree(str); hr = IEnumString_Next(enum_string, 1, &str, &fetched); ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); IEnumString_Release(enum_string); diff --git a/dlls/windowscodecs/wincodecs_private.h b/dlls/windowscodecs/wincodecs_private.h index 5cc86d5d663..690d5e34e58 100644 --- a/dlls/windowscodecs/wincodecs_private.h +++ b/dlls/windowscodecs/wincodecs_private.h @@ -213,6 +213,7 @@ typedef struct _MetadataHandlerVtbl const CLSID *clsid; HRESULT (*fnLoad)(MetadataHandler *handler, IStream *stream, const GUID *preferred_vendor, DWORD persist_options); + HRESULT (*fnCreate)(MetadataHandler *handler); } MetadataHandlerVtbl;
typedef struct MetadataHandler