[PATCH] d3drm: Improve IDirect3DRMMeshBuilderImpl_Load and corresponding test (try 2)

Christian Costa titan.costa at wanadoo.fr
Thu Feb 4 01:26:47 CST 2010


---

 dlls/d3drm/meshbuilder.c |   48 ++++++++++++++++++++++++++++++++++++++++++++--
 dlls/d3drm/tests/d3drm.c |   34 ++++++++++++++++++++++++---------
 2 files changed, 71 insertions(+), 11 deletions(-)
-------------- next part --------------
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);
 


More information about the wine-patches mailing list