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