d3drm: Improve IDirect3DRMMeshBuilderImpl_Load and corresponding test.

This commit is contained in:
Christian Costa 2010-02-04 08:26:47 +01:00 committed by Alexandre Julliard
parent aafcf1a536
commit edd9e8cc5b
2 changed files with 74 additions and 14 deletions

View File

@ -39,8 +39,15 @@ typedef struct {
LONG ref; LONG ref;
} IDirect3DRMMeshBuilderImpl; } IDirect3DRMMeshBuilderImpl;
typedef struct {
WORD major;
WORD minor;
DWORD flags;
} Header;
static const struct IDirect3DRMMeshBuilderVtbl Direct3DRMMeshBuilder_Vtbl; 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 const GUID GUID_Mesh = { 0x3D82AB44, 0x62DA, 0x11CF, { 0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33 } };
static char templates[] = { static char templates[] = {
@ -408,6 +415,8 @@ static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_Load(IDirect3DRMMeshBuilder* if
LPDIRECTXFILEENUMOBJECT pEnumObject = NULL; LPDIRECTXFILEENUMOBJECT pEnumObject = NULL;
LPDIRECTXFILEDATA pData = NULL; LPDIRECTXFILEDATA pData = NULL;
const GUID* pGuid; const GUID* pGuid;
DWORD size;
Header* pHeader;
HRESULT hr; HRESULT hr;
HRESULT ret = D3DRMERR_BADOBJECT; HRESULT ret = D3DRMERR_BADOBJECT;
@ -431,7 +440,7 @@ static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_Load(IDirect3DRMMeshBuilder* if
if (hr != DXFILE_OK) if (hr != DXFILE_OK)
goto end; goto end;
hr = IDirectXFile_RegisterTemplates(pDXFile, templates, sizeof(templates)); hr = IDirectXFile_RegisterTemplates(pDXFile, templates, strlen(templates));
if (hr != DXFILE_OK) if (hr != DXFILE_OK)
goto end; goto end;
@ -449,12 +458,47 @@ static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_Load(IDirect3DRMMeshBuilder* if
TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid)); TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
if (!IsEqualGUID(pGuid, &GUID_Mesh)) if (!IsEqualGUID(pGuid, &GUID_Header))
{ {
ret = D3DRMERR_BADFILE; ret = D3DRMERR_BADFILE;
goto end; 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; ret = D3DRM_OK;
end: end:

View File

@ -47,21 +47,32 @@ static BOOL InitFunctionPtrs(void)
return TRUE; return TRUE;
} }
char data_ok[] = char data_bad_version[] =
"xof 0302txt 0064\n"
"Mesh Object\n"
"{\n"
"0;\n"
"0;\n"
"}\n";
char data_bad[] =
"xof 0302txt 0064\n" "xof 0302txt 0064\n"
"Header Object\n" "Header Object\n"
"{\n" "{\n"
"1; 2; 3;\n" "1; 2; 3;\n"
"}\n"; "}\n";
char data_no_mesh[] =
"xof 0302txt 0064\n"
"Header Object\n"
"{\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) static void MeshBuilderTest(void)
{ {
HRESULT hr; HRESULT hr;
@ -75,13 +86,18 @@ static void MeshBuilderTest(void)
hr = IDirect3DRM_CreateMeshBuilder(pD3DRM, &pMeshBuilder); hr = IDirect3DRM_CreateMeshBuilder(pD3DRM, &pMeshBuilder);
ok(hr == D3DRM_OK, "Cannot get IDirect3DRMMeshBuilder interface (hr = %x)\n", hr); ok(hr == D3DRM_OK, "Cannot get IDirect3DRMMeshBuilder interface (hr = %x)\n", hr);
info.lpMemory = data_bad; info.lpMemory = data_bad_version;
info.dSize = sizeof(data_bad); info.dSize = strlen(data_bad_version);
hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL); hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
ok(hr == D3DRMERR_BADFILE, "Sould have returned D3DRMERR_BADFILE (hr = %x)\n", hr); 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.lpMemory = data_ok;
info.dSize = sizeof(data_ok); info.dSize = strlen(data_ok);
hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL); hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
ok(hr == D3DRM_OK, "Cannot load mesh data (hr = %x)\n", hr); ok(hr == D3DRM_OK, "Cannot load mesh data (hr = %x)\n", hr);