[3/4] d3drm: Implement GetParent methods

André Hentschel nerv at dawncrow.de
Thu Jan 19 15:01:05 CST 2012


---
 dlls/d3drm/frame.c       |   22 ++++++++++++++++++----
 dlls/d3drm/tests/d3drm.c |   29 +++++++++++++++++------------
 2 files changed, 35 insertions(+), 16 deletions(-)

diff --git a/dlls/d3drm/frame.c b/dlls/d3drm/frame.c
index de5b39a..338a523 100644
--- a/dlls/d3drm/frame.c
+++ b/dlls/d3drm/frame.c
@@ -318,9 +318,16 @@ static HRESULT WINAPI IDirect3DRMFrame2Impl_GetParent(IDirect3DRMFrame2* iface,
 {
     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
 
-    FIXME("(%p/%p)->(%p): stub\n", iface, This, frame);
+    TRACE("(%p/%p)->(%p)\n", iface, This, frame);
 
-    return E_NOTIMPL;
+    if (!frame)
+        return D3DRMERR_BADVALUE;
+
+    *frame = (IDirect3DRMFrame*)&This->parent->IDirect3DRMFrame2_iface;
+    if (*frame)
+        IDirect3DRMFrame2_AddRef(*frame);
+
+    return D3DRM_OK;
 }
 
 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetPosition(IDirect3DRMFrame2* iface,
@@ -1195,9 +1202,16 @@ static HRESULT WINAPI IDirect3DRMFrame3Impl_GetParent(IDirect3DRMFrame3* iface,
 {
     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
 
-    FIXME("(%p/%p)->(%p): stub\n", iface, This, frame);
+    TRACE("(%p/%p)->(%p)\n", iface, This, frame);
 
-    return E_NOTIMPL;
+    if (!frame)
+        return D3DRMERR_BADVALUE;
+
+    *frame = &This->parent->IDirect3DRMFrame3_iface;
+    if (*frame)
+        IDirect3DRMFrame3_AddRef(*frame);
+
+    return D3DRM_OK;
 }
 
 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetPosition(IDirect3DRMFrame3* iface,
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index 168e664..ebf8acc 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -255,8 +255,8 @@ static void test_Frame(void)
 
     pFrameTmp = (void*)0xdeadbeef;
     hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
-    todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
-    todo_wine ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
+    ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
+    ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
     CHECK_REFCOUNT(pFrameC, 1);
 
     pArray = NULL;
@@ -282,11 +282,16 @@ static void test_Frame(void)
     ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
     CHECK_REFCOUNT(pFrameP1, 1);
 
+    /* GetParent with NULL pointer */
+    hr = IDirect3DRMFrame_GetParent(pFrameP1, NULL);
+    ok(hr == D3DRMERR_BADVALUE, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameP1, 1);
+
     /* Add child to first parent */
     pFrameTmp = (void*)0xdeadbeef;
     hr = IDirect3DRMFrame_GetParent(pFrameP1, &pFrameTmp);
-    todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
-    todo_wine ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
+    ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
+    ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
 
     hr = IDirect3DRMFrame_AddChild(pFrameP1, pFrameC);
     ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
@@ -305,9 +310,9 @@ static void test_Frame(void)
 
     pFrameTmp = (void*)0xdeadbeef;
     hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
-    todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
-    todo_wine ok(pFrameTmp == pFrameP1, "pFrameTmp = %p\n", pFrameTmp);
-    todo_wine CHECK_REFCOUNT(pFrameP1, 2);
+    ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
+    ok(pFrameTmp == pFrameP1, "pFrameTmp = %p\n", pFrameTmp);
+    CHECK_REFCOUNT(pFrameP1, 2);
 
     /* Add child to second parent */
     hr = IDirect3DRM_CreateFrame(pD3DRM, NULL, &pFrameP2);
@@ -339,9 +344,9 @@ static void test_Frame(void)
 
     pFrameTmp = (void*)0xdeadbeef;
     hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
-    todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
-    todo_wine ok(pFrameTmp == pFrameP2, "pFrameTmp = %p\n", pFrameTmp);
-    todo_wine CHECK_REFCOUNT(pFrameP2, 2);
+    ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
+    ok(pFrameTmp == pFrameP2, "pFrameTmp = %p\n", pFrameTmp);
+    CHECK_REFCOUNT(pFrameP2, 2);
     CHECK_REFCOUNT(pFrameC, 2);
 
     /* Add child again */
@@ -376,8 +381,8 @@ static void test_Frame(void)
 
     pFrameTmp = (void*)0xdeadbeef;
     hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
-    todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
-    todo_wine ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
+    ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
+    ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
 
     IDirect3DRMMeshBuilder_Release(pFrameC);
     IDirect3DRMMeshBuilder_Release(pFrameP1);
-- 

Best Regards, André Hentschel
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: Nachrichtenteil als Anhang
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20120119/067366e7/attachment-0001.ksh>


More information about the wine-patches mailing list