From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/metadataquery.c | 38 ++++++++++++++++++++--------- dlls/windowscodecs/tests/metadata.c | 11 --------- 2 files changed, 27 insertions(+), 22 deletions(-)
diff --git a/dlls/windowscodecs/metadataquery.c b/dlls/windowscodecs/metadataquery.c index e3225d8d361..1fd75bbff00 100644 --- a/dlls/windowscodecs/metadataquery.c +++ b/dlls/windowscodecs/metadataquery.c @@ -533,7 +533,7 @@ static HRESULT parser_set_top_level_metadata_handler(struct query_handler *query
/* Root component has to be an object within block collection, it's located using {CLSID, index} pair. */ if (comp->id.vt != VT_CLSID) - return E_UNEXPECTED; + return WINCODEC_ERR_INVALIDQUERYREQUEST;
hr = IWICMetadataBlockReader_GetCount(query_handler->object.block_reader, &count); if (hr != S_OK) return hr; @@ -669,14 +669,9 @@ static HRESULT parse_query(struct query_handler *query_handler, const WCHAR *que if (SUCCEEDED(parser->hr)) { parser->last = &parser->components[parser->count - 1]; - if (parser->last->handler) - return S_OK; - - if (parser->count < 2) - return parser->hr = WINCODEC_ERR_INVALIDQUERYREQUEST; + parser->prev = parser->count > 1 ? &parser->components[parser->count - 2] : NULL;
- parser->prev = &parser->components[parser->count - 2]; - if (!parser->prev->handler) + if (!parser->last->handler && !(parser->prev && parser->prev->handler)) return parser->hr = WINCODEC_ERR_INVALIDQUERYREQUEST; }
@@ -873,11 +868,32 @@ static HRESULT WINAPI query_handler_SetMetadataByName(IWICMetadataQueryWriter *i return S_OK; }
-static HRESULT WINAPI query_handler_RemoveMetadataByName(IWICMetadataQueryWriter *iface, LPCWSTR name) +static HRESULT WINAPI query_handler_RemoveMetadataByName(IWICMetadataQueryWriter *iface, const WCHAR *query) { - FIXME("iface %p, name %s stub.\n", iface, debugstr_w(name)); + struct query_handler *handler = impl_from_IWICMetadataQueryWriter(iface); + struct query_component *last, *prev; + struct query_parser parser; + HRESULT hr;
- return E_NOTIMPL; + TRACE("iface %p, name %s.\n", iface, debugstr_w(query)); + + if (!query) + return E_INVALIDARG; + + if (SUCCEEDED(hr = parse_query(handler, query, &parser))) + { + last = parser.last; + prev = parser.prev; + + if (is_block_handler(handler) && parser.count == 1) + hr = IWICMetadataBlockWriter_RemoveWriterByIndex(handler->object.block_writer, last->index); + else + hr = IWICMetadataWriter_RemoveValue(prev->writer, &last->schema, &last->id); + } + + parser_cleanup(&parser); + + return hr; }
static IWICMetadataQueryWriterVtbl query_handler_vtbl = diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index 6265e7814e2..ba8f1771875 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -6089,45 +6089,34 @@ static void test_RemoveMetadataByName(void)
/* Item does not exist. */ hr = IWICMetadataQueryWriter_RemoveMetadataByName(query_writer, NULL); - todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); hr = IWICMetadataQueryWriter_RemoveMetadataByName(query_writer, L"/app1/ifd/exif/{ushort=513}"); - todo_wine ok(hr == WINCODEC_ERR_PROPERTYNOTFOUND, "Unexpected hr %#lx.\n", hr); hr = IWICMetadataQueryWriter_RemoveMetadataByName(query_writer, L"/app1/ifd/exif/ifd"); - todo_wine ok(hr == WINCODEC_ERR_PROPERTYNOTFOUND, "Unexpected hr %#lx.\n", hr); hr = IWICMetadataQueryWriter_RemoveMetadataByName(query_writer, L"/app1/ifd/exif/invalid"); - todo_wine ok(hr == WINCODEC_ERR_PROPERTYNOTFOUND, "Unexpected hr %#lx.\n", hr); hr = IWICMetadataQueryWriter_RemoveMetadataByName(query_writer, L"/app1/invalid/exif"); - todo_wine ok(hr == WINCODEC_ERR_PROPERTYNOTFOUND, "Unexpected hr %#lx.\n", hr);
/* Removing terminal item. */ hr = IWICMetadataQueryWriter_RemoveMetadataByName(query_writer, L"/app1/ifd/exif/{ushort=512}"); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); PropVariantInit(&value); hr = IWICMetadataQueryWriter_GetMetadataByName(query_writer, L"/app1/ifd/exif/{ushort=512}", &value); - todo_wine ok(hr == WINCODEC_ERR_PROPERTYNOTFOUND, "Unexpected hr %#lx.\n", hr);
/* Remove at handler level. */ hr = IWICMetadataQueryWriter_RemoveMetadataByName(query_writer, L"/app1/ifd"); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
PropVariantInit(&value); hr = IWICMetadataQueryWriter_GetMetadataByName(query_writer, L"/app1/ifd", &value); - todo_wine ok(hr == WINCODEC_ERR_PROPERTYNOTFOUND, "Unexpected hr %#lx.\n", hr); /* At root */ hr = IWICMetadataQueryWriter_RemoveMetadataByName(query_writer, L"/"); - todo_wine ok(hr == WINCODEC_ERR_INVALIDQUERYREQUEST, "Unexpected hr %#lx.\n", hr); hr = IWICMetadataQueryWriter_RemoveMetadataByName(query_writer, L"/app1"); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
IWICMetadataQueryWriter_Release(query_writer);