Paul Gofman : windowscodecs: Return stub IEnumString from mqr_GetEnumerator().
Alexandre Julliard
julliard at winehq.org
Fri Nov 26 15:46:29 CST 2021
Module: wine
Branch: master
Commit: 3b3394bc8e5a8ecdb7992b6e023c0da833203c2f
URL: https://source.winehq.org/git/wine.git/?a=commit;h=3b3394bc8e5a8ecdb7992b6e023c0da833203c2f
Author: Paul Gofman <pgofman at 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 at codeweavers.com>
Signed-off-by: Esme Povirk <esme at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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,
More information about the wine-cvs
mailing list