Nikolay Sivov : mfplat: Implement MFGetService().

Alexandre Julliard julliard at winehq.org
Wed Dec 20 14:09:21 CST 2017


Module: wine
Branch: master
Commit: 42b04e2cf4561f67e4c8d540ba5ddfdef2bb546e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=42b04e2cf4561f67e4c8d540ba5ddfdef2bb546e

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Dec 20 17:42:23 2017 +0300

mfplat: Implement MFGetService().

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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 2ad2e5d..73cd6aa 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 54fa1f3..deb9057 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 f28c6e0..76e092a 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 2792d38..12b351d 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);")




More information about the wine-cvs mailing list