Module: wine Branch: master Commit: 3b3394bc8e5a8ecdb7992b6e023c0da833203c2f URL: https://source.winehq.org/git/wine.git/?a=commit;h=3b3394bc8e5a8ecdb7992b6e0...
Author: Paul Gofman pgofman@codeweavers.com Date: Wed Nov 24 15:04:14 2021 +0300
windowscodecs: Return stub IEnumString from mqr_GetEnumerator().
Based on a patch by Fabian Maurer.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51748 Signed-off-by: Paul Gofman pgofman@codeweavers.com Signed-off-by: Esme Povirk esme@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/windowscodecs/metadataquery.c | 120 +++++++++++++++++++++++++++++++++++-- 1 file changed, 116 insertions(+), 4 deletions(-)
diff --git a/dlls/windowscodecs/metadataquery.c b/dlls/windowscodecs/metadataquery.c index 29ec6fd5160..7ef2c10cf07 100644 --- a/dlls/windowscodecs/metadataquery.c +++ b/dlls/windowscodecs/metadataquery.c @@ -596,14 +596,126 @@ static HRESULT WINAPI mqr_GetMetadataByName(IWICMetadataQueryReader *iface, LPCW return hr; }
-static HRESULT WINAPI mqr_GetEnumerator(IWICMetadataQueryReader *iface, - IEnumString **ppIEnumString) +struct string_enumerator { - QueryReader *This = impl_from_IWICMetadataQueryReader(iface); - FIXME("(%p,%p)\n", This, ppIEnumString); + IEnumString IEnumString_iface; + LONG ref; +}; + +static struct string_enumerator *impl_from_IEnumString(IEnumString *iface) +{ + return CONTAINING_RECORD(iface, struct string_enumerator, IEnumString_iface); +} + +static HRESULT WINAPI string_enumerator_QueryInterface(IEnumString *iface, REFIID riid, void **ppv) +{ + struct string_enumerator *this = impl_from_IEnumString(iface); + + TRACE("iface %p, riid %s, ppv %p.\n", iface, debugstr_guid(riid), ppv); + + if (IsEqualGUID(riid, &IID_IEnumString) || IsEqualGUID(riid, &IID_IUnknown)) + *ppv = &this->IEnumString_iface; + else + { + WARN("Unknown riid %s.\n", debugstr_guid(riid)); + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef(&this->IEnumString_iface); + return S_OK; +} + +static ULONG WINAPI string_enumerator_AddRef(IEnumString *iface) +{ + struct string_enumerator *this = impl_from_IEnumString(iface); + ULONG ref = InterlockedIncrement(&this->ref); + + TRACE("iface %p, ref %u.\n", iface, ref); + + return ref; +} + +static ULONG WINAPI string_enumerator_Release(IEnumString *iface) +{ + struct string_enumerator *this = impl_from_IEnumString(iface); + ULONG ref = InterlockedDecrement(&this->ref); + + TRACE("iface %p, ref %u.\n", iface, ref); + + if (!ref) + free(this); + + return ref; +} + +static HRESULT WINAPI string_enumerator_Next(IEnumString *iface, ULONG count, LPOLESTR *strings, ULONG *ret) +{ + FIXME("iface %p, count %u, strings %p, ret %p stub.\n", iface, count, strings, ret); + + if (!strings || !ret) + return E_INVALIDARG; + + *ret = 0; + return count ? S_FALSE : S_OK; +} + +static HRESULT WINAPI string_enumerator_Reset(IEnumString *iface) +{ + TRACE("iface %p.\n", iface); + + return S_OK; +} + +static HRESULT WINAPI string_enumerator_Skip(IEnumString *iface, ULONG count) +{ + FIXME("iface %p, count %u stub.\n", iface, count); + + return count ? S_FALSE : S_OK; +} + +static HRESULT WINAPI string_enumerator_Clone(IEnumString *iface, IEnumString **out) +{ + FIXME("iface %p, out %p stub.\n", iface, out); + + *out = NULL; return E_NOTIMPL; }
+static const IEnumStringVtbl string_enumerator_vtbl = +{ + string_enumerator_QueryInterface, + string_enumerator_AddRef, + string_enumerator_Release, + string_enumerator_Next, + string_enumerator_Skip, + string_enumerator_Reset, + string_enumerator_Clone +}; + +static HRESULT string_enumerator_create(IEnumString **enum_string) +{ + struct string_enumerator *object; + + if (!(object = calloc(1, sizeof(*object)))) + return E_OUTOFMEMORY; + + object->IEnumString_iface.lpVtbl = &string_enumerator_vtbl; + object->ref = 1; + + *enum_string = &object->IEnumString_iface; + + return S_OK; +} + +static HRESULT WINAPI mqr_GetEnumerator(IWICMetadataQueryReader *iface, + IEnumString **enum_string) +{ + TRACE("iface %p, enum_string %p.\n", iface, enum_string); + + return string_enumerator_create(enum_string); +} + static IWICMetadataQueryReaderVtbl mqr_vtbl = { mqr_QueryInterface, mqr_AddRef,