Christian Costa : d3dx9_36: Implement ID3DXFileImpl_RegisterTemplates + tests.
Module: wine Branch: master Commit: b742b98c55cb775066768b7f86b883cc1ca9ce3a URL: http://source.winehq.org/git/wine.git/?a=commit;h=b742b98c55cb775066768b7f86... Author: Christian Costa <titan.costa(a)gmail.com> Date: Fri Jan 4 09:45:08 2013 +0100 d3dx9_36: Implement ID3DXFileImpl_RegisterTemplates + tests. --- dlls/d3dx9_36/tests/xfile.c | 59 ++++++++++++++++++++++++++++++++++++++++--- dlls/d3dx9_36/xfile.c | 48 +++++++++++++++++++++++++++++++++- 2 files changed, 101 insertions(+), 6 deletions(-) diff --git a/dlls/d3dx9_36/tests/xfile.c b/dlls/d3dx9_36/tests/xfile.c index 5500949..08a2ae1 100644 --- a/dlls/d3dx9_36/tests/xfile.c +++ b/dlls/d3dx9_36/tests/xfile.c @@ -20,16 +20,67 @@ #include "d3dx9.h" #include "d3dx9xof.h" -START_TEST(xfile) +char templates_bad_file_type1[] = +"xOf 0302txt 0064\n"; + +char templates_bad_file_version[] = +"xof 0102txt 0064\n"; + +char templates_bad_file_type2[] = +"xof 0302foo 0064\n"; + +char templates_bad_file_float_size[] = +"xof 0302txt 0050\n"; + +char templates_parse_error[] = +"xof 0302txt 0064" +"foobar;\n"; + +char templates[] = +"xof 0302txt 0064" +"template Header" +"{" +"<3D82AB43-62DA-11CF-AB39-0020AF71E433>" +"WORD major;" +"WORD minor;" +"DWORD flags;" +"}\n"; + + +void test_templates(void) { - ID3DXFile *file; + ID3DXFile *d3dxfile; HRESULT ret; ret = D3DXFileCreate(NULL); ok(ret == E_POINTER, "D3DXCreateFile returned %#x, expected %#x\n", ret, E_POINTER); - ret = D3DXFileCreate(&file); + ret = D3DXFileCreate(&d3dxfile); ok(ret == S_OK, "D3DXCreateFile failed with %#x\n", ret); - file->lpVtbl->Release(file); + ret = d3dxfile->lpVtbl->RegisterTemplates(d3dxfile, (const void *)templates_bad_file_type1, (SIZE_T)(sizeof(templates_bad_file_type1) - 1)); + ok(ret == D3DXFERR_BADFILETYPE, "RegisterTemplates returned %#x, expected %#x\n", ret, D3DXFERR_BADFILETYPE); + + ret = d3dxfile->lpVtbl->RegisterTemplates(d3dxfile, (const void *)templates_bad_file_version, (SIZE_T)(sizeof(templates_bad_file_version) - 1)); + ok(ret == D3DXFERR_BADFILEVERSION, "RegisterTemplates returned %#x, expected %#x\n", ret, D3DXFERR_BADFILEVERSION); + + ret = d3dxfile->lpVtbl->RegisterTemplates(d3dxfile, (const void *)templates_bad_file_type2, (SIZE_T)(sizeof(templates_bad_file_type2) - 1)); + ok(ret == D3DXFERR_BADFILETYPE, "RegisterTemplates returned %#x, expected %#x\n", ret, D3DXFERR_BADFILETYPE); + + ret = d3dxfile->lpVtbl->RegisterTemplates(d3dxfile, (const void *)templates_bad_file_float_size, (SIZE_T)(sizeof(templates_bad_file_float_size) - 1)); + ok(ret == D3DXFERR_BADFILEFLOATSIZE, "RegisterTemplates returned %#x, expected %#x\n", ret, D3DXFERR_BADFILEFLOATSIZE); + + ret = d3dxfile->lpVtbl->RegisterTemplates(d3dxfile, (const void *)templates_parse_error, (SIZE_T)(sizeof(templates_parse_error) - 1)); + todo_wine ok(ret == D3DXFERR_PARSEERROR, "RegisterTemplates returned %#x, expected %#x\n", ret, D3DXFERR_PARSEERROR); + + ret = d3dxfile->lpVtbl->RegisterTemplates(d3dxfile, (const void *)templates, (SIZE_T)(sizeof(templates) - 1)); + ok(ret == S_OK, "RegisterTemplates with %#x\n", ret); + + d3dxfile->lpVtbl->Release(d3dxfile); +} + + +START_TEST(xfile) +{ + test_templates(); } diff --git a/dlls/d3dx9_36/xfile.c b/dlls/d3dx9_36/xfile.c index ba04857..5d4d6aa 100644 --- a/dlls/d3dx9_36/xfile.c +++ b/dlls/d3dx9_36/xfile.c @@ -21,12 +21,33 @@ #include "d3dx9.h" #include "d3dx9xof.h" +#undef MAKE_DDHRESULT +#include "dxfile.h" WINE_DEFAULT_DEBUG_CHANNEL(d3dx); +HRESULT error_dxfile_to_d3dxfile(HRESULT error) +{ + switch (error) + { + case DXFILEERR_BADFILETYPE: + return D3DXFERR_BADFILETYPE; + case DXFILEERR_BADFILEVERSION: + return D3DXFERR_BADFILEVERSION; + case DXFILEERR_BADFILEFLOATSIZE: + return D3DXFERR_BADFILEFLOATSIZE; + case DXFILEERR_PARSEERROR: + return D3DXFERR_PARSEERROR; + default: + FIXME("Cannot map error %#x\n", error); + return E_FAIL; + } +} + typedef struct { ID3DXFile ID3DXFile_iface; LONG ref; + IDirectXFile *dxfile; } ID3DXFileImpl; @@ -75,7 +96,10 @@ static ULONG WINAPI ID3DXFileImpl_Release(ID3DXFile *iface) TRACE("(%p)->(): new ref %d\n", iface, ref); if (!ref) + { + IDirectXFile_Release(This->dxfile); HeapFree(GetProcessHeap(), 0, This); + } return ref; } @@ -101,9 +125,19 @@ static HRESULT WINAPI ID3DXFileImpl_CreateSaveObject(ID3DXFile *iface, const voi static HRESULT WINAPI ID3DXFileImpl_RegisterTemplates(ID3DXFile *iface, const void *data, SIZE_T size) { - FIXME("(%p)->(%p, %lu): stub\n", iface, data, size); + ID3DXFileImpl *This = impl_from_ID3DXFile(iface); + HRESULT ret; - return E_NOTIMPL; + TRACE("(%p)->(%p, %lu)\n", iface, data, size); + + ret = IDirectXFile_RegisterTemplates(This->dxfile, (void*)data, size); + if (ret != DXFILE_OK) + { + WARN("Error %#x\n", ret); + return error_dxfile_to_d3dxfile(ret); + } + + return S_OK; } @@ -129,6 +163,7 @@ static const ID3DXFileVtbl ID3DXFile_Vtbl = HRESULT WINAPI D3DXFileCreate(ID3DXFile **d3dxfile) { ID3DXFileImpl *object; + HRESULT ret; TRACE("(%p)\n", d3dxfile); @@ -141,6 +176,15 @@ HRESULT WINAPI D3DXFileCreate(ID3DXFile **d3dxfile) if (!object) return E_OUTOFMEMORY; + ret = DirectXFileCreate(&object->dxfile); + if (ret != S_OK) + { + HeapFree(GetProcessHeap(), 0, object); + if (ret == E_OUTOFMEMORY) + return ret; + return E_FAIL; + } + object->ID3DXFile_iface.lpVtbl = &ID3DXFile_Vtbl; object->ref = 1;
participants (1)
-
Alexandre Julliard