[PATCH] mfplat: Implement MFGetService()
Nikolay Sivov
nsivov at codeweavers.com
Wed Dec 20 08:42:23 CST 2017
Signed-off-by: Nikolay Sivov <nsivov at 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);")
--
2.15.1
More information about the wine-devel
mailing list