Signed-off-by: Nikolay Sivov nsivov@codeweavers.com ---
For https://bugs.winehq.org/show_bug.cgi?id=44201
dlls/mf/main.c | 23 ++++++++++ dlls/mf/mf.spec | 2 +- dlls/mf/tests/mf.c | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++++ include/mfidl.idl | 1 + 4 files changed, 153 insertions(+), 1 deletion(-)
diff --git a/dlls/mf/main.c b/dlls/mf/main.c index 2ad2e5d37b..73cd6aa3f1 100644 --- a/dlls/mf/main.c +++ b/dlls/mf/main.c @@ -20,6 +20,8 @@
#include <stdarg.h>
+#define COBJMACROS + #include "windef.h" #include "winbase.h" #include "mfidl.h" @@ -51,3 +53,24 @@ HRESULT WINAPI MFGetSupportedMimeTypes(PROPVARIANT *array)
return E_NOTIMPL; } + +/*********************************************************************** + * MFGetService (mf.@) + */ +HRESULT WINAPI MFGetService(IUnknown *object, REFGUID service, REFIID riid, void **obj) +{ + IMFGetService *gs; + HRESULT hr; + + TRACE("(%p, %s, %s, %p)\n", object, debugstr_guid(service), debugstr_guid(riid), obj); + + if (!object) + return E_POINTER; + + if (FAILED(hr = IUnknown_QueryInterface(object, &IID_IMFGetService, (void **)&gs))) + return hr; + + hr = IMFGetService_GetService(gs, service, riid, obj); + IMFGetService_Release(gs); + return hr; +} diff --git a/dlls/mf/mf.spec b/dlls/mf/mf.spec index 54fa1f3dbe..deb9057153 100644 --- a/dlls/mf/mf.spec +++ b/dlls/mf/mf.spec @@ -72,7 +72,7 @@ @ stub MFCreateWMVEncoderActivate @ stub MFEnumDeviceSources @ stub MFGetMultipleServiceProviders -@ stub MFGetService +@ stdcall MFGetService(ptr ptr ptr ptr) @ stdcall MFGetSupportedMimeTypes(ptr) @ stub MFGetSupportedSchemes @ stub MFGetTopoNodeCurrentType diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index f28c6e048d..76e092aa80 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -26,6 +26,7 @@ #include "windef.h" #include "winbase.h"
+#include "initguid.h" #include "mfidl.h"
#include "wine/test.h" @@ -43,7 +44,134 @@ static void test_topology(void) IMFTopology_Release(topology); }
+static HRESULT WINAPI test_getservice_QI(IMFGetService *iface, REFIID riid, void **obj) +{ + if (IsEqualIID(riid, &IID_IMFGetService) || IsEqualIID(riid, &IID_IUnknown)) + { + *obj = iface; + return S_OK; + } + + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI test_getservice_AddRef(IMFGetService *iface) +{ + return 2; +} + +static ULONG WINAPI test_getservice_Release(IMFGetService *iface) +{ + return 1; +} + +static HRESULT WINAPI test_getservice_GetService(IMFGetService *iface, REFGUID service, REFIID riid, void **obj) +{ + *obj = (void *)0xdeadbeef; + return 0x83eddead; +} + +static const IMFGetServiceVtbl testmfgetservicevtbl = +{ + test_getservice_QI, + test_getservice_AddRef, + test_getservice_Release, + test_getservice_GetService, +}; + +static IMFGetService test_getservice = { &testmfgetservicevtbl }; + +static HRESULT WINAPI testservice_QI(IUnknown *iface, REFIID riid, void **obj) +{ + if (IsEqualIID(riid, &IID_IUnknown)) + { + *obj = iface; + return S_OK; + } + + *obj = NULL; + + if (IsEqualIID(riid, &IID_IMFGetService)) + return 0x82eddead; + + return E_NOINTERFACE; +} + +static HRESULT WINAPI testservice2_QI(IUnknown *iface, REFIID riid, void **obj) +{ + if (IsEqualIID(riid, &IID_IUnknown)) + { + *obj = iface; + return S_OK; + } + + if (IsEqualIID(riid, &IID_IMFGetService)) + { + *obj = &test_getservice; + return S_OK; + } + + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI testservice_AddRef(IUnknown *iface) +{ + return 2; +} + +static ULONG WINAPI testservice_Release(IUnknown *iface) +{ + return 1; +} + +static const IUnknownVtbl testservicevtbl = +{ + testservice_QI, + testservice_AddRef, + testservice_Release, +}; + +static const IUnknownVtbl testservice2vtbl = +{ + testservice2_QI, + testservice_AddRef, + testservice_Release, +}; + +static IUnknown testservice = { &testservicevtbl }; +static IUnknown testservice2 = { &testservice2vtbl }; + +static void test_MFGetService(void) +{ + IUnknown *unk; + HRESULT hr; + + hr = MFGetService(NULL, NULL, NULL, NULL); + ok(hr == E_POINTER, "Unexpected return value %#x.\n", hr); + + unk = (void *)0xdeadbeef; + hr = MFGetService(NULL, NULL, NULL, (void **)&unk); + ok(hr == E_POINTER, "Unexpected return value %#x.\n", hr); + ok(unk == (void *)0xdeadbeef, "Unexpected out object.\n"); + + hr = MFGetService(&testservice, NULL, NULL, NULL); + ok(hr == 0x82eddead, "Unexpected return value %#x.\n", hr); + + unk = (void *)0xdeadbeef; + hr = MFGetService(&testservice, NULL, NULL, (void **)&unk); + ok(hr == 0x82eddead, "Unexpected return value %#x.\n", hr); + ok(unk == (void *)0xdeadbeef, "Unexpected out object.\n"); + + unk = NULL; + hr = MFGetService(&testservice2, NULL, NULL, (void **)&unk); + ok(hr == 0x83eddead, "Unexpected return value %#x.\n", hr); + ok(unk == (void *)0xdeadbeef, "Unexpected out object.\n"); +} + START_TEST(mf) { test_topology(); + test_MFGetService(); } diff --git a/include/mfidl.idl b/include/mfidl.idl index 2792d383db..12b351d87b 100644 --- a/include/mfidl.idl +++ b/include/mfidl.idl @@ -256,3 +256,4 @@ cpp_quote("HRESULT WINAPI MFCreateStreamDescriptor(DWORD identifier, DWORD cMedi cpp_quote(" IMFMediaType **types, IMFStreamDescriptor **descriptor);") cpp_quote("HRESULT WINAPI MFCreateTopology(IMFTopology **topology);") cpp_quote("HRESULT WINAPI MFGetSupportedMimeTypes(PROPVARIANT *array);") +cpp_quote("HRESULT WINAPI MFGetService(IUnknown *object, REFGUID service, REFIID iid, void **obj);")