[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