Zebediah Figura : strmbase: Standardize aggregation of the seeking passthrough object.

Alexandre Julliard julliard at winehq.org
Fri Mar 13 15:24:43 CDT 2020


Module: wine
Branch: master
Commit: d30fd37176ba659c94596c36b438605b2ae6a25c
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=d30fd37176ba659c94596c36b438605b2ae6a25c

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Thu Mar 12 21:34:07 2020 -0500

strmbase: Standardize aggregation of the seeking passthrough object.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/quartz/tests/passthrough.c |   6 +--
 dlls/strmbase/pospass.c         | 112 ++++++++--------------------------------
 2 files changed, 25 insertions(+), 93 deletions(-)

diff --git a/dlls/quartz/tests/passthrough.c b/dlls/quartz/tests/passthrough.c
index 6042bc7f5a..ce7365928e 100644
--- a/dlls/quartz/tests/passthrough.c
+++ b/dlls/quartz/tests/passthrough.c
@@ -103,7 +103,7 @@ static void test_aggregation(void)
 
     hr = ISeekingPassThru_QueryInterface(passthrough, &IID_IUnknown, (void **)&unk2);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
-    todo_wine ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2);
+    ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2);
 
     hr = ISeekingPassThru_QueryInterface(passthrough, &IID_ISeekingPassThru, (void **)&passthrough2);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
@@ -119,8 +119,8 @@ static void test_aggregation(void)
 
     ISeekingPassThru_Release(passthrough);
     ref = IUnknown_Release(unk);
-    todo_wine ok(!ref, "Got unexpected refcount %d.\n", ref);
-    todo_wine ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref);
+    ok(!ref, "Got unexpected refcount %d.\n", ref);
+    ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref);
 }
 
 START_TEST(passthrough)
diff --git a/dlls/strmbase/pospass.c b/dlls/strmbase/pospass.c
index 148d4fae3c..6920b37865 100644
--- a/dlls/strmbase/pospass.c
+++ b/dlls/strmbase/pospass.c
@@ -36,8 +36,6 @@ typedef struct PassThruImpl {
     LONG ref;
     IUnknown * outer_unk;
     IPin * pin;
-    BOOL bUnkOuterValid;
-    BOOL bAggregatable;
     BOOL renderer;
     CRITICAL_SECTION time_cs;
     BOOL timevalid;
@@ -70,9 +68,6 @@ static HRESULT WINAPI SeekInner_QueryInterface(IUnknown * iface,
     PassThruImpl *This = impl_from_IUnknown_inner(iface);
     TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppvObj);
 
-    if (This->bAggregatable)
-        This->bUnkOuterValid = TRUE;
-
     if (IsEqualGUID(&IID_IUnknown, riid))
     {
         *ppvObj = &(This->IUnknown_inner);
@@ -127,74 +122,25 @@ static const IUnknownVtbl IInner_VTable =
     SeekInner_Release
 };
 
-/* Generic functions for aggregation */
-static HRESULT SeekOuter_QueryInterface(PassThruImpl *This, REFIID riid, LPVOID *ppv)
-{
-    if (This->bAggregatable)
-        This->bUnkOuterValid = TRUE;
-
-    if (This->outer_unk)
-    {
-        if (This->bAggregatable)
-            return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
-
-        if (IsEqualIID(riid, &IID_IUnknown))
-        {
-            HRESULT hr;
-
-            IUnknown_AddRef(&This->IUnknown_inner);
-            hr = IUnknown_QueryInterface(&This->IUnknown_inner, riid, ppv);
-            IUnknown_Release(&This->IUnknown_inner);
-            This->bAggregatable = TRUE;
-            return hr;
-        }
-
-        *ppv = NULL;
-        return E_NOINTERFACE;
-    }
-
-    return IUnknown_QueryInterface(&This->IUnknown_inner, riid, ppv);
-}
-
-static ULONG SeekOuter_AddRef(PassThruImpl *This)
-{
-    if (This->outer_unk && This->bUnkOuterValid)
-        return IUnknown_AddRef(This->outer_unk);
-    return IUnknown_AddRef(&This->IUnknown_inner);
-}
-
-static ULONG SeekOuter_Release(PassThruImpl *This)
-{
-    if (This->outer_unk && This->bUnkOuterValid)
-        return IUnknown_Release(This->outer_unk);
-    return IUnknown_Release(&This->IUnknown_inner);
-}
-
-static HRESULT WINAPI SeekingPassThru_QueryInterface(ISeekingPassThru *iface, REFIID riid, LPVOID *ppvObj)
+static HRESULT WINAPI SeekingPassThru_QueryInterface(ISeekingPassThru *iface, REFIID iid, void **out)
 {
-    PassThruImpl *This = impl_from_ISeekingPassThru(iface);
-
-    TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppvObj);
+    PassThruImpl *passthrough = impl_from_ISeekingPassThru(iface);
 
-    return SeekOuter_QueryInterface(This, riid, ppvObj);
+    return IUnknown_QueryInterface(passthrough->outer_unk, iid, out);
 }
 
 static ULONG WINAPI SeekingPassThru_AddRef(ISeekingPassThru *iface)
 {
-    PassThruImpl *This = impl_from_ISeekingPassThru(iface);
+    PassThruImpl *passthrough = impl_from_ISeekingPassThru(iface);
 
-    TRACE("(%p/%p)->()\n", This, iface);
-
-    return SeekOuter_AddRef(This);
+    return IUnknown_AddRef(passthrough->outer_unk);
 }
 
 static ULONG WINAPI SeekingPassThru_Release(ISeekingPassThru *iface)
 {
-    PassThruImpl *This = impl_from_ISeekingPassThru(iface);
+    PassThruImpl *passthrough = impl_from_ISeekingPassThru(iface);
 
-    TRACE("(%p/%p)->()\n", This, iface);
-
-    return SeekOuter_Release(This);
+    return IUnknown_Release(passthrough->outer_unk);
 }
 
 static HRESULT WINAPI SeekingPassThru_Init(ISeekingPassThru *iface, BOOL renderer, IPin *pin)
@@ -246,9 +192,7 @@ HRESULT WINAPI PosPassThru_Construct(IUnknown *pUnkOuter, LPVOID *ppPassThru)
     if (!fimpl)
         return E_OUTOFMEMORY;
 
-    fimpl->outer_unk = pUnkOuter;
-    fimpl->bUnkOuterValid = FALSE;
-    fimpl->bAggregatable = FALSE;
+    fimpl->outer_unk = pUnkOuter ? pUnkOuter : &fimpl->IUnknown_inner;
     fimpl->IUnknown_inner.lpVtbl = &IInner_VTable;
     fimpl->ISeekingPassThru_iface.lpVtbl = &ISeekingPassThru_Vtbl;
     fimpl->IMediaSeeking_iface.lpVtbl = &IMediaSeekingPassThru_Vtbl;
@@ -261,31 +205,25 @@ HRESULT WINAPI PosPassThru_Construct(IUnknown *pUnkOuter, LPVOID *ppPassThru)
     return S_OK;
 }
 
-static HRESULT WINAPI MediaSeekingPassThru_QueryInterface(IMediaSeeking *iface, REFIID riid, LPVOID *ppvObj)
+static HRESULT WINAPI MediaSeekingPassThru_QueryInterface(IMediaSeeking *iface, REFIID iid, void **out)
 {
-    PassThruImpl *This = impl_from_IMediaSeeking(iface);
+    PassThruImpl *passthrough = impl_from_IMediaSeeking(iface);
 
-    TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppvObj);
-
-    return SeekOuter_QueryInterface(This, riid, ppvObj);
+    return IUnknown_QueryInterface(passthrough->outer_unk, iid, out);
 }
 
 static ULONG WINAPI MediaSeekingPassThru_AddRef(IMediaSeeking *iface)
 {
-    PassThruImpl *This = impl_from_IMediaSeeking(iface);
+    PassThruImpl *passthrough = impl_from_IMediaSeeking(iface);
 
-    TRACE("(%p/%p)->()\n", iface, This);
-
-    return SeekOuter_AddRef(This);
+    return IUnknown_AddRef(passthrough->outer_unk);
 }
 
 static ULONG WINAPI MediaSeekingPassThru_Release(IMediaSeeking *iface)
 {
-    PassThruImpl *This = impl_from_IMediaSeeking(iface);
-
-    TRACE("(%p/%p)->()\n", iface, This);
+    PassThruImpl *passthrough = impl_from_IMediaSeeking(iface);
 
-    return SeekOuter_Release(This);
+    return IUnknown_Release(passthrough->outer_unk);
 }
 
 static HRESULT get_connected(PassThruImpl *This, REFIID riid, LPVOID *ppvObj) {
@@ -644,31 +582,25 @@ static const IMediaSeekingVtbl IMediaSeekingPassThru_Vtbl =
     MediaSeekingPassThru_GetPreroll
 };
 
-static HRESULT WINAPI MediaPositionPassThru_QueryInterface(IMediaPosition *iface, REFIID riid, LPVOID *ppvObj)
+static HRESULT WINAPI MediaPositionPassThru_QueryInterface(IMediaPosition *iface, REFIID iid, void **out)
 {
-    PassThruImpl *This = impl_from_IMediaPosition(iface);
-
-    TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppvObj);
+    PassThruImpl *passthrough = impl_from_IMediaPosition(iface);
 
-    return SeekOuter_QueryInterface(This, riid, ppvObj);
+    return IUnknown_QueryInterface(passthrough->outer_unk, iid, out);
 }
 
 static ULONG WINAPI MediaPositionPassThru_AddRef(IMediaPosition *iface)
 {
-    PassThruImpl *This = impl_from_IMediaPosition(iface);
-
-    TRACE("(%p/%p)->()\n", iface, This);
+    PassThruImpl *passthrough = impl_from_IMediaPosition(iface);
 
-    return SeekOuter_AddRef(This);
+    return IUnknown_AddRef(passthrough->outer_unk);
 }
 
 static ULONG WINAPI MediaPositionPassThru_Release(IMediaPosition *iface)
 {
-    PassThruImpl *This = impl_from_IMediaPosition(iface);
-
-    TRACE("(%p/%p)->()\n", iface, This);
+    PassThruImpl *passthrough = impl_from_IMediaPosition(iface);
 
-    return SeekOuter_Release(This);
+    return IUnknown_Release(passthrough->outer_unk);
 }
 
 static HRESULT WINAPI MediaPositionPassThru_GetTypeInfoCount(IMediaPosition *iface, UINT *count)




More information about the wine-cvs mailing list