Christian Costa : d3dx9_36: Implement ID3DXFileDataImpl_Lock and ID3DXFileDataImpl_Unlock + tests.

Alexandre Julliard julliard at winehq.org
Fri Jan 18 12:07:35 CST 2013


Module: wine
Branch: master
Commit: 45e43dc5d047909609db2d90a1df4a58b390823f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=45e43dc5d047909609db2d90a1df4a58b390823f

Author: Christian Costa <titan.costa at gmail.com>
Date:   Fri Jan 18 08:49:17 2013 +0100

d3dx9_36: Implement ID3DXFileDataImpl_Lock and ID3DXFileDataImpl_Unlock + tests.

---

 dlls/d3dx9_36/tests/xfile.c |   47 +++++++++++++++++++++++++++++++++++++++++++
 dlls/d3dx9_36/xfile.c       |   23 +++++++++++++++++---
 2 files changed, 66 insertions(+), 4 deletions(-)

diff --git a/dlls/d3dx9_36/tests/xfile.c b/dlls/d3dx9_36/tests/xfile.c
index 3ab30a9..6c29f5e 100644
--- a/dlls/d3dx9_36/tests/xfile.c
+++ b/dlls/d3dx9_36/tests/xfile.c
@@ -46,6 +46,12 @@ char templates[] =
 "DWORD flags;"
 "}\n";
 
+static char objects[] =
+"xof 0302txt 0064\n"
+"Header Object\n"
+"{\n"
+"1; 2; 3;\n"
+"}\n";
 
 static void test_templates(void)
 {
@@ -79,8 +85,49 @@ static void test_templates(void)
     d3dxfile->lpVtbl->Release(d3dxfile);
 }
 
+static void test_lock_unlock(void)
+{
+    ID3DXFile *d3dxfile;
+    D3DXF_FILELOADMEMORY memory;
+    ID3DXFileEnumObject *enum_object;
+    ID3DXFileData *data_object;
+    const void *data;
+    SIZE_T size;
+    HRESULT ret;
+
+    ret = D3DXFileCreate(&d3dxfile);
+    ok(ret == S_OK, "D3DXCreateFile failed with %#x\n", ret);
+
+    ret = d3dxfile->lpVtbl->RegisterTemplates(d3dxfile, (const void *)templates, (SIZE_T)(sizeof(templates) - 1));
+    ok(ret == S_OK, "RegisterTemplates failed with %#x\n", ret);
+
+    memory.lpMemory = objects;
+    memory.dSize = sizeof(objects) - 1;
+
+    ret = d3dxfile->lpVtbl->CreateEnumObject(d3dxfile, &memory, D3DXF_FILELOAD_FROMMEMORY, &enum_object);
+    ok(ret == S_OK, "CreateEnumObject failed with %#x\n", ret);
+
+    ret = enum_object->lpVtbl->GetChild(enum_object, 0, &data_object);
+    ok(ret == S_OK, "GetChild failed with %#x\n", ret);
+
+    ret = data_object->lpVtbl->Unlock(data_object);
+    ok(ret == S_OK, "Unlock failed with %#x\n", ret);
+    ret = data_object->lpVtbl->Lock(data_object, &size, &data);
+    ok(ret == S_OK, "Lock failed with %#x\n", ret);
+    ret = data_object->lpVtbl->Lock(data_object, &size, &data);
+    ok(ret == S_OK, "Lock failed with %#x\n", ret);
+    ret = data_object->lpVtbl->Unlock(data_object);
+    ok(ret == S_OK, "Unlock failed with %#x\n", ret);
+    ret = data_object->lpVtbl->Unlock(data_object);
+    ok(ret == S_OK, "Unlock failed with %#x\n", ret);
+
+    data_object->lpVtbl->Release(data_object);
+    enum_object->lpVtbl->Release(enum_object);
+    d3dxfile->lpVtbl->Release(d3dxfile);
+}
 
 START_TEST(xfile)
 {
     test_templates();
+    test_lock_unlock();
 }
diff --git a/dlls/d3dx9_36/xfile.c b/dlls/d3dx9_36/xfile.c
index d54ef0f..afc0def 100644
--- a/dlls/d3dx9_36/xfile.c
+++ b/dlls/d3dx9_36/xfile.c
@@ -178,17 +178,32 @@ static HRESULT WINAPI ID3DXFileDataImpl_GetId(ID3DXFileData *iface, GUID *guid)
 
 static HRESULT WINAPI ID3DXFileDataImpl_Lock(ID3DXFileData *iface, SIZE_T *size, const void **data)
 {
-    FIXME("(%p)->(%p, %p): stub\n", iface, size, data);
+    ID3DXFileDataImpl *This = impl_from_ID3DXFileData(iface);
+    DWORD dxfile_size;
+    HRESULT ret;
 
-    return E_NOTIMPL;
+    TRACE("(%p)->(%p, %p)\n", iface, size, data);
+
+    if (!size || !data)
+        return E_POINTER;
+
+    ret = IDirectXFileData_GetData(This->dxfile_data, NULL, &dxfile_size, (void**)data);
+    if (ret != DXFILE_OK)
+        return error_dxfile_to_d3dxfile(ret);
+
+    *size = dxfile_size;
+
+    return S_OK;
 }
 
 
 static HRESULT WINAPI ID3DXFileDataImpl_Unlock(ID3DXFileData *iface)
 {
-    FIXME("(%p)->(): stub\n", iface);
+    TRACE("(%p)->()\n", iface);
 
-    return E_NOTIMPL;
+    /* Nothing to do */
+
+    return S_OK;
 }
 
 




More information about the wine-cvs mailing list