Module: wine Branch: master Commit: edd9e8cc5b9ba55276a9e3cd69013f92b63615cf URL: http://source.winehq.org/git/wine.git/?a=commit;h=edd9e8cc5b9ba55276a9e3cd69...
Author: Christian Costa titan.costa@wanadoo.fr Date: Thu Feb 4 08:26:47 2010 +0100
d3drm: Improve IDirect3DRMMeshBuilderImpl_Load and corresponding test.
---
dlls/d3drm/meshbuilder.c | 48 ++++++++++++++++++++++++++++++++++++++++++++- dlls/d3drm/tests/d3drm.c | 34 +++++++++++++++++++++++-------- 2 files changed, 71 insertions(+), 11 deletions(-)
diff --git a/dlls/d3drm/meshbuilder.c b/dlls/d3drm/meshbuilder.c index ecf7d4f..0848920 100644 --- a/dlls/d3drm/meshbuilder.c +++ b/dlls/d3drm/meshbuilder.c @@ -39,8 +39,15 @@ typedef struct { LONG ref; } IDirect3DRMMeshBuilderImpl;
+typedef struct { + WORD major; + WORD minor; + DWORD flags; +} Header; + static const struct IDirect3DRMMeshBuilderVtbl Direct3DRMMeshBuilder_Vtbl;
+static const GUID GUID_Header = { 0x3D82AB43, 0x62DA, 0x11CF, { 0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33 } }; static const GUID GUID_Mesh = { 0x3D82AB44, 0x62DA, 0x11CF, { 0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33 } };
static char templates[] = { @@ -408,6 +415,8 @@ static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_Load(IDirect3DRMMeshBuilder* if LPDIRECTXFILEENUMOBJECT pEnumObject = NULL; LPDIRECTXFILEDATA pData = NULL; const GUID* pGuid; + DWORD size; + Header* pHeader; HRESULT hr; HRESULT ret = D3DRMERR_BADOBJECT;
@@ -431,7 +440,7 @@ static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_Load(IDirect3DRMMeshBuilder* if if (hr != DXFILE_OK) goto end;
- hr = IDirectXFile_RegisterTemplates(pDXFile, templates, sizeof(templates)); + hr = IDirectXFile_RegisterTemplates(pDXFile, templates, strlen(templates)); if (hr != DXFILE_OK) goto end;
@@ -449,12 +458,47 @@ static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_Load(IDirect3DRMMeshBuilder* if
TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
- if (!IsEqualGUID(pGuid, &GUID_Mesh)) + if (!IsEqualGUID(pGuid, &GUID_Header)) { ret = D3DRMERR_BADFILE; goto end; }
+ hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&pHeader); + if ((hr != DXFILE_OK) || (size != sizeof(Header))) + goto end; + + TRACE("Version is %d %d %d\n", pHeader->major, pHeader->minor, pHeader->flags); + + /* Version must be 1.0.x */ + if ((pHeader->major != 1) || (pHeader->minor != 0)) + { + ret = D3DRMERR_BADFILE; + goto end; + } + + IDirectXFileData_Release(pData); + pData = NULL; + + hr = IDirectXFileEnumObject_GetNextDataObject(pEnumObject, &pData); + if (hr != DXFILE_OK) + { + ret = D3DRMERR_NOTFOUND; + goto end; + } + + hr = IDirectXFileData_GetType(pData, &pGuid); + if (hr != DXFILE_OK) + goto end; + + TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid)); + + if (!IsEqualGUID(pGuid, &GUID_Mesh)) + { + ret = D3DRMERR_NOTFOUND; + goto end; + } + ret = D3DRM_OK;
end: diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c index 3a89aa3..d5fb645 100644 --- a/dlls/d3drm/tests/d3drm.c +++ b/dlls/d3drm/tests/d3drm.c @@ -47,19 +47,30 @@ static BOOL InitFunctionPtrs(void) return TRUE; }
-char data_ok[] = +char data_bad_version[] = "xof 0302txt 0064\n" -"Mesh Object\n" +"Header Object\n" "{\n" -"0;\n" -"0;\n" +"1; 2; 3;\n" "}\n";
-char data_bad[] = +char data_no_mesh[] = "xof 0302txt 0064\n" "Header Object\n" "{\n" -"1; 2; 3;\n" +"1; 0; 1;\n" +"}\n"; + +char data_ok[] = +"xof 0302txt 0064\n" +"Header Object\n" +"{\n" +"1; 0; 1;\n" +"}\n" +"Mesh Object\n" +"{\n" +"0;\n" +"0;\n" "}\n";
static void MeshBuilderTest(void) @@ -75,13 +86,18 @@ static void MeshBuilderTest(void) hr = IDirect3DRM_CreateMeshBuilder(pD3DRM, &pMeshBuilder); ok(hr == D3DRM_OK, "Cannot get IDirect3DRMMeshBuilder interface (hr = %x)\n", hr);
- info.lpMemory = data_bad; - info.dSize = sizeof(data_bad); + info.lpMemory = data_bad_version; + info.dSize = strlen(data_bad_version); hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL); ok(hr == D3DRMERR_BADFILE, "Sould have returned D3DRMERR_BADFILE (hr = %x)\n", hr);
+ info.lpMemory = data_no_mesh; + info.dSize = strlen(data_no_mesh); + hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL); + ok(hr == D3DRMERR_NOTFOUND, "Sould have returned D3DRMERR_NOTFOUND (hr = %x)\n", hr); + info.lpMemory = data_ok; - info.dSize = sizeof(data_ok); + info.dSize = strlen(data_ok); hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL); ok(hr == D3DRM_OK, "Cannot load mesh data (hr = %x)\n", hr);