[PATCH 2/9] mf: Implement MFShutdownObject().

Nikolay Sivov nsivov at codeweavers.com
Mon Mar 4 03:27:19 CST 2019


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mf/main.c     | 18 ++++++++++++++
 dlls/mf/mf.spec    |  2 +-
 dlls/mf/tests/mf.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++
 include/mfidl.idl  | 17 +++++++++++++
 4 files changed, 97 insertions(+), 1 deletion(-)

diff --git a/dlls/mf/main.c b/dlls/mf/main.c
index 73cd6aa3f1..b3573d78af 100644
--- a/dlls/mf/main.c
+++ b/dlls/mf/main.c
@@ -74,3 +74,21 @@ HRESULT WINAPI MFGetService(IUnknown *object, REFGUID service, REFIID riid, void
     IMFGetService_Release(gs);
     return hr;
 }
+
+/***********************************************************************
+ *      MFShutdownObject (mf.@)
+ */
+HRESULT WINAPI MFShutdownObject(IUnknown *object)
+{
+    IMFShutdown *shutdown;
+
+    TRACE("%p.\n", object);
+
+    if (object && SUCCEEDED(IUnknown_QueryInterface(object, &IID_IMFShutdown, (void **)&shutdown)))
+    {
+        IMFShutdown_Shutdown(shutdown);
+        IMFShutdown_Release(shutdown);
+    }
+
+    return S_OK;
+}
diff --git a/dlls/mf/mf.spec b/dlls/mf/mf.spec
index 64f0b1db83..7ec8e57c1f 100644
--- a/dlls/mf/mf.spec
+++ b/dlls/mf/mf.spec
@@ -78,6 +78,6 @@
 @ stub MFGetTopoNodeCurrentType
 @ stub MFReadSequencerSegmentOffset
 @ stub MFRequireProtectedEnvironment
-@ stub MFShutdownObject
+@ stdcall MFShutdownObject(ptr)
 @ stub MFTranscodeGetAudioOutputAvailableTypes
 @ stub MergePropertyStore
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index ba11a27c33..915b851900 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -502,6 +502,66 @@ static void test_topology_loader(void)
     IMFTopoLoader_Release(loader);
 }
 
+static HRESULT WINAPI testshutdown_QueryInterface(IMFShutdown *iface, REFIID riid, void **obj)
+{
+    if (IsEqualIID(riid, &IID_IMFShutdown) ||
+            IsEqualIID(riid, &IID_IUnknown))
+    {
+        *obj = iface;
+        IMFShutdown_AddRef(iface);
+        return S_OK;
+    }
+
+    *obj = NULL;
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI testshutdown_AddRef(IMFShutdown *iface)
+{
+    return 2;
+}
+
+static ULONG WINAPI testshutdown_Release(IMFShutdown *iface)
+{
+    return 1;
+}
+
+static HRESULT WINAPI testshutdown_Shutdown(IMFShutdown *iface)
+{
+    return 0xdead;
+}
+
+static HRESULT WINAPI testshutdown_GetShutdownStatus(IMFShutdown *iface, MFSHUTDOWN_STATUS *status)
+{
+    ok(0, "Unexpected call.\n");
+    return E_NOTIMPL;
+}
+
+static const IMFShutdownVtbl testshutdownvtbl =
+{
+    testshutdown_QueryInterface,
+    testshutdown_AddRef,
+    testshutdown_Release,
+    testshutdown_Shutdown,
+    testshutdown_GetShutdownStatus,
+};
+
+static void test_MFShutdownObject(void)
+{
+    IMFShutdown testshutdown = { &testshutdownvtbl };
+    IUnknown testshutdown2 = { &testservicevtbl };
+    HRESULT hr;
+
+    hr = MFShutdownObject(NULL);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = MFShutdownObject((IUnknown *)&testshutdown);
+    ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr);
+
+    hr = MFShutdownObject(&testshutdown2);
+    ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr);
+}
+
 START_TEST(mf)
 {
     test_topology();
@@ -509,4 +569,5 @@ START_TEST(mf)
     test_MFGetService();
     test_MFCreateSequencerSource();
     test_media_session();
+    test_MFShutdownObject();
 }
diff --git a/include/mfidl.idl b/include/mfidl.idl
index 01e86efc51..be8795c854 100644
--- a/include/mfidl.idl
+++ b/include/mfidl.idl
@@ -329,6 +329,7 @@ cpp_quote("HRESULT WINAPI MFCreateTopoLoader(IMFTopoLoader **loader);")
 cpp_quote("HRESULT WINAPI MFGetSupportedMimeTypes(PROPVARIANT *array);")
 cpp_quote("HRESULT WINAPI MFGetService(IUnknown *object, REFGUID service, REFIID iid, void **obj);")
 cpp_quote("MFTIME  WINAPI MFGetSystemTime(void);")
+cpp_quote("HRESULT WINAPI MFShutdownObject(IUnknown *object);")
 
 [
     object,
@@ -381,6 +382,22 @@ interface IMFMediaSink : IUnknown
     HRESULT Shutdown();
 }
 
+typedef enum _MFSHUTDOWN_STATUS
+{
+    MFSHUTDOWN_INITIATED,
+    MFSHUTDOWN_COMPLETED,
+} MFSHUTDOWN_STATUS;
+
+[
+    object,
+    uuid(97ec2ea4-0e42-4937-97ac-9d6d328824e1)
+]
+interface IMFShutdown : IUnknown
+{
+    HRESULT Shutdown();
+    HRESULT GetShutdownStatus([out] MFSHUTDOWN_STATUS *status);
+}
+
 cpp_quote("#define MF_RESOLUTION_MEDIASOURCE                                           0x00000001")
 cpp_quote("#define MF_RESOLUTION_BYTESTREAM                                            0x00000002")
 cpp_quote("#define MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE 0x00000010")
-- 
2.20.1




More information about the wine-devel mailing list