diff --git a/dlls/d3dx9_36/tests/xfile.c b/dlls/d3dx9_36/tests/xfile.c index 3ab30a99662..6c29f5e3a3b 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 d54ef0fd88a..afc0def92da 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; }