[2/4] d3drm: Partial implementation for [Add/Delete]Child (try 2)

André Hentschel nerv at dawncrow.de
Thu Jan 19 15:00:21 CST 2012


---
 dlls/d3drm/frame.c       |   58 ++++++++++++++++++++++++++++++++++++---------
 dlls/d3drm/tests/d3drm.c |   27 ++++++++++++++-------
 2 files changed, 64 insertions(+), 21 deletions(-)

diff --git a/dlls/d3drm/frame.c b/dlls/d3drm/frame.c
index 7c0d97a..de5b39a 100644
--- a/dlls/d3drm/frame.c
+++ b/dlls/d3drm/frame.c
@@ -29,11 +29,13 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
 
-typedef struct {
+typedef struct IDirect3DRMFrameImpl IDirect3DRMFrameImpl;
+struct IDirect3DRMFrameImpl {
     IDirect3DRMFrame2 IDirect3DRMFrame2_iface;
     IDirect3DRMFrame3 IDirect3DRMFrame3_iface;
     LONG ref;
-} IDirect3DRMFrameImpl;
+    IDirect3DRMFrameImpl *parent;
+};
 
 static inline IDirect3DRMFrameImpl *impl_from_IDirect3DRMFrame2(IDirect3DRMFrame2 *iface)
 {
@@ -184,10 +186,18 @@ static HRESULT WINAPI IDirect3DRMFrame2Impl_AddChild(IDirect3DRMFrame2* iface,
                                                      LPDIRECT3DRMFRAME child)
 {
     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    IDirect3DRMFrameImpl *ChildImpl = impl_from_IDirect3DRMFrame2((LPDIRECT3DRMFRAME2)child);
 
-    FIXME("(%p/%p)->(%p): stub\n", iface, This, child);
+    FIXME("(%p/%p)->(%p): partial stub\n", iface, This, child);
 
-    return E_NOTIMPL;
+    if (!child)
+        return D3DRMERR_BADOBJECT;
+
+    if (!ChildImpl->parent)
+        IDirect3DRMFrame_AddRef(child);
+    ChildImpl->parent = This;
+
+    return D3DRM_OK;
 }
 
 static HRESULT WINAPI IDirect3DRMFrame2Impl_AddLight(IDirect3DRMFrame2* iface,
@@ -460,13 +470,21 @@ static HRESULT WINAPI IDirect3DRMFrame2Impl_Move(IDirect3DRMFrame2* iface, D3DVA
 }
 
 static HRESULT WINAPI IDirect3DRMFrame2Impl_DeleteChild(IDirect3DRMFrame2* iface,
-                                                        LPDIRECT3DRMFRAME frame)
+                                                        LPDIRECT3DRMFRAME child)
 {
     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    IDirect3DRMFrameImpl *ChildImpl = impl_from_IDirect3DRMFrame2((LPDIRECT3DRMFRAME2)child);
 
-    FIXME("(%p/%p)->(%p): stub\n", iface, This, frame);
+    FIXME("(%p/%p)->(%p): partial stub\n", iface, This, child);
 
-    return E_NOTIMPL;
+    if (!child)
+        return D3DRMERR_BADOBJECT;
+
+    if (ChildImpl->parent)
+        IDirect3DRMFrame_Release(child);
+    ChildImpl->parent = NULL;
+
+    return D3DRM_OK;
 }
 
 static HRESULT WINAPI IDirect3DRMFrame2Impl_DeleteLight(IDirect3DRMFrame2* iface,
@@ -1045,10 +1063,18 @@ static HRESULT WINAPI IDirect3DRMFrame3Impl_AddChild(IDirect3DRMFrame3* iface,
                                                      LPDIRECT3DRMFRAME3 child)
 {
     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
+    IDirect3DRMFrameImpl *ChildImpl = impl_from_IDirect3DRMFrame3(child);
 
-    FIXME("(%p/%p)->(%p): stub\n", iface, This, child);
+    FIXME("(%p/%p)->(%p): partial stub\n", iface, This, child);
 
-    return E_NOTIMPL;
+    if (!child)
+        return D3DRMERR_BADOBJECT;
+
+    if (!ChildImpl->parent)
+        IDirect3DRMFrame_AddRef(child);
+    ChildImpl->parent = This;
+
+    return D3DRM_OK;
 }
 
 static HRESULT WINAPI IDirect3DRMFrame3Impl_AddLight(IDirect3DRMFrame3* iface,
@@ -1312,13 +1338,21 @@ static HRESULT WINAPI IDirect3DRMFrame3Impl_Move(IDirect3DRMFrame3* iface, D3DVA
 }
 
 static HRESULT WINAPI IDirect3DRMFrame3Impl_DeleteChild(IDirect3DRMFrame3* iface,
-                                                        LPDIRECT3DRMFRAME3 frame)
+                                                        LPDIRECT3DRMFRAME3 child)
 {
     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
+    IDirect3DRMFrameImpl *ChildImpl = impl_from_IDirect3DRMFrame3(child);
 
-    FIXME("(%p/%p)->(%p): stub\n", iface, This, frame);
+    FIXME("(%p/%p)->(%p): partial stub\n", iface, This, child);
 
-    return E_NOTIMPL;
+    if (!child)
+        return D3DRMERR_BADOBJECT;
+
+    if (ChildImpl->parent)
+        IDirect3DRMFrame_Release(child);
+    ChildImpl->parent = NULL;
+
+    return D3DRM_OK;
 }
 
 static HRESULT WINAPI IDirect3DRMFrame3Impl_DeleteLight(IDirect3DRMFrame3* iface,
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index f021e2c..168e664 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -270,19 +270,28 @@ static void test_Frame(void)
         IDirect3DRMFrameArray_Release(pArray);
     }
 
-    /* Add child to first parent */
     hr = IDirect3DRM_CreateFrame(pD3DRM, NULL, &pFrameP1);
     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr);
 
+    /* [Add/Delete]Child with NULL pointer */
+    hr = IDirect3DRMFrame_AddChild(pFrameP1, NULL);
+    ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameP1, 1);
+
+    hr = IDirect3DRMFrame_DeleteChild(pFrameP1, NULL);
+    ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (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);
 
     hr = IDirect3DRMFrame_AddChild(pFrameP1, pFrameC);
-    todo_wine ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
+    ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
     CHECK_REFCOUNT(pFrameP1, 1);
-    todo_wine CHECK_REFCOUNT(pFrameC, 2);
+    CHECK_REFCOUNT(pFrameC, 2);
 
     pArray = NULL;
     hr = IDirect3DRMFrame_GetChildren(pFrameP1, &pArray);
@@ -305,8 +314,8 @@ static void test_Frame(void)
     ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr);
 
     hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameC);
-    todo_wine ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
-    todo_wine CHECK_REFCOUNT(pFrameC, 2);
+    ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameC, 2);
 
     pArray = NULL;
     hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
@@ -333,12 +342,12 @@ static void test_Frame(void)
     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);
-    todo_wine CHECK_REFCOUNT(pFrameC, 2);
+    CHECK_REFCOUNT(pFrameC, 2);
 
     /* Add child again */
     hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameC);
-    todo_wine ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
-    todo_wine CHECK_REFCOUNT(pFrameC, 2);
+    ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameC, 2);
 
     pArray = NULL;
     hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
@@ -352,7 +361,7 @@ static void test_Frame(void)
 
     /* Delete child */
     hr = IDirect3DRMFrame_DeleteChild(pFrameP2, pFrameC);
-    todo_wine ok(hr == D3DRM_OK, "Cannot delete child frame (hr = %x)\n", hr);
+    ok(hr == D3DRM_OK, "Cannot delete child frame (hr = %x)\n", hr);
     CHECK_REFCOUNT(pFrameC, 1);
 
     pArray = NULL;
-- 

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/08d24762/attachment.ksh>


More information about the wine-patches mailing list