[PATCH] d3drm: Retreive mesh name at loading time. Implement GetName and SetName. (try 5) (resend)

Christian Costa titan.costa at gmail.com
Tue May 8 15:30:07 CDT 2012


Try 5: Use a growing buffer to store name.
Try 4: Do not recalculate min in GetName. Make SetName accept null pointer. Use debugstr_a in GetName trace.
Try 3: Free name string when releasing object.
Try 2: Remove limit on name length. Use debugstr_a in trace for SetName method.
---
 dlls/d3drm/meshbuilder.c |   95 ++++++++++++++++++++++++++++++++++++++++------
 dlls/d3drm/tests/d3drm.c |   19 +++++++++
 2 files changed, 102 insertions(+), 12 deletions(-)

diff --git a/dlls/d3drm/meshbuilder.c b/dlls/d3drm/meshbuilder.c
index 557a028..ff1069d 100644
--- a/dlls/d3drm/meshbuilder.c
+++ b/dlls/d3drm/meshbuilder.c
@@ -48,6 +48,9 @@ typedef struct {
     IDirect3DRMMeshBuilder2 IDirect3DRMMeshBuilder2_iface;
     IDirect3DRMMeshBuilder3 IDirect3DRMMeshBuilder3_iface;
     LONG ref;
+    char* name;
+    ULONG name_max;
+    ULONG name_size;
     DWORD nb_vertices;
     D3DVECTOR* pVertices;
     DWORD nb_normals;
@@ -344,6 +347,7 @@ static ULONG WINAPI IDirect3DRMMeshBuilder2Impl_Release(IDirect3DRMMeshBuilder2*
 
     if (!ref)
     {
+        HeapFree(GetProcessHeap(), 0, This->name);
         HeapFree(GetProcessHeap(), 0, This->pVertices);
         HeapFree(GetProcessHeap(), 0, This->pNormals);
         HeapFree(GetProcessHeap(), 0, This->pFaceData);
@@ -408,23 +412,23 @@ static DWORD WINAPI IDirect3DRMMeshBuilder2Impl_GetAppData(IDirect3DRMMeshBuilde
 }
 
 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetName(IDirect3DRMMeshBuilder2* iface,
-                                                          LPCSTR pName)
+                                                          LPCSTR name)
 {
     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
 
-    FIXME("(%p)->(%s): stub\n", This, pName);
+    TRACE("(%p)->(%s)\n", This, debugstr_a(name));
 
-    return E_NOTIMPL;
+    return IDirect3DRMMeshBuilder3_SetName(&This->IDirect3DRMMeshBuilder3_iface, name);
 }
 
 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetName(IDirect3DRMMeshBuilder2* iface,
-                                                          LPDWORD lpdwSize, LPSTR lpName)
+                                                          LPDWORD size, LPSTR name)
 {
     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
 
-    FIXME("(%p)->(%p,%p): stub\n", This, lpdwSize, lpName);
+    TRACE("(%p)->(%p,%p)\n", This, size, name);
 
-    return E_NOTIMPL;
+    return IDirect3DRMMeshBuilder3_GetName(&This->IDirect3DRMMeshBuilder3_iface, size, name);
 }
 
 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetClassName(IDirect3DRMMeshBuilder2* iface,
@@ -1002,23 +1006,67 @@ static DWORD WINAPI IDirect3DRMMeshBuilder3Impl_GetAppData(IDirect3DRMMeshBuilde
 }
 
 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetName(IDirect3DRMMeshBuilder3* iface,
-                                                          LPCSTR pName)
+                                                          LPCSTR name)
 {
     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
+    char* string;
+    ULONG length;
 
-    FIXME("(%p)->(%s): stub\n", This, pName);
+    TRACE("(%p)->(%s)\n", This, debugstr_a(name));
 
-    return E_NOTIMPL;
+    if (!name)
+    {
+        This->name_size = 0;
+        return D3DRM_OK;
+    }
+
+    length = strlen(name) + 1;
+
+    if (length > This->name_max)
+    {
+        string = HeapReAlloc(GetProcessHeap(), 0, This->name, length);
+        if (!string)
+            return E_OUTOFMEMORY;
+        This->name = string;
+    }
+
+    strcpy(This->name, name);
+    This->name_size = length;
+
+    return D3DRM_OK;
 }
 
 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetName(IDirect3DRMMeshBuilder3* iface,
-                                                          LPDWORD lpdwSize, LPSTR lpName)
+                                                          LPDWORD size, LPSTR name)
 {
     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
 
-    FIXME("(%p)->(%p,%p): stub\n", This, lpdwSize, lpName);
+    TRACE("(%p)->(%p,%p)\n", This, size, name);
 
-    return E_NOTIMPL;
+    if (!size)
+        return E_POINTER;
+
+    if (!This->name_size)
+    {
+        *size = 0;
+        return D3DRM_OK;
+    }
+
+    if (name)
+    {
+        *size = min(*size, This->name_size);
+        memcpy(name, This->name, *size);
+        /* Make sure we have the terminating 0 in case of truncation */
+        name[*size] = 0;
+        TRACE("Returning name %s\n", debugstr_a(name));
+    }
+    else
+    {
+        *size = This->name_size;
+    }
+
+
+    return D3DRM_OK;
 }
 
 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetClassName(IDirect3DRMMeshBuilder3* iface,
@@ -1052,6 +1100,20 @@ HRESULT load_mesh_data(IDirect3DRMMeshBuilder3* iface, LPDIRECTXFILEDATA pData)
 
     TRACE("(%p)->(%p)\n", This, pData);
 
+    hr = IDirectXFileData_GetName(pData, NULL, &size);
+    if (hr != DXFILE_OK)
+        return hr;
+    if (size)
+    {
+        hr = IDirectXFileData_GetName(pData, This->name, &size);
+        if (hr != DXFILE_OK)
+            return hr;
+    }
+
+    This->name_size = size;
+
+    TRACE("Mesh name is '%s'\n", This->name_size ? This->name : "");
+
     hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&ptr);
     if (hr != DXFILE_OK)
         goto end;
@@ -2061,6 +2123,15 @@ HRESULT Direct3DRMMeshBuilder_create(REFIID riid, IUnknown** ppObj)
     object->IDirect3DRMMeshBuilder3_iface.lpVtbl = &Direct3DRMMeshBuilder3_Vtbl;
     object->ref = 1;
 
+    object->name_max = 32;
+    object->name = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->name_max);
+    if (!object)
+    {
+        ERR("Out of memory\n");
+        HeapFree(GetProcessHeap(), 0, object);
+        return E_OUTOFMEMORY;
+    }
+
     if (IsEqualGUID(riid, &IID_IDirect3DRMMeshBuilder3))
         *ppObj = (IUnknown*)&object->IDirect3DRMMeshBuilder3_iface;
     else
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index 6fdc2f7..1aba046 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -172,6 +172,8 @@ static void test_MeshBuilder(void)
     D3DVECTOR v[3];
     D3DVECTOR n[3];
     DWORD f[8];
+    char name[10];
+    DWORD size;
 
     hr = pDirect3DRMCreate(&pD3DRM);
     ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
@@ -194,6 +196,23 @@ static void test_MeshBuilder(void)
     hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
     ok(hr == D3DRM_OK, "Cannot load mesh data (hr = %x)\n", hr);
 
+    size = sizeof(name);
+    hr = IDirect3DRMMeshBuilder_GetName(pMeshBuilder, &size, name);
+    ok(hr == D3DRM_OK, "IDirect3DRMMeshBuilder_GetName returned hr = %x\n", hr);
+    ok(!strcmp(name, "Object"), "Retreived name '%s' instead of 'Object'\n", name);
+    hr = IDirect3DRMMeshBuilder_SetName(pMeshBuilder, NULL);
+    ok(hr == D3DRM_OK, "IDirect3DRMMeshBuilder_SetName returned hr = %x\n", hr);
+    size = sizeof(name);
+    hr = IDirect3DRMMeshBuilder_GetName(pMeshBuilder, &size, name);
+    ok(hr == D3DRM_OK, "IDirect3DRMMeshBuilder_GetName returned hr = %x\n", hr);
+    ok(size == 0, "Size should be 0 instead of %u\n", size);
+    hr = IDirect3DRMMeshBuilder_SetName(pMeshBuilder, "");
+    ok(hr == D3DRM_OK, "IDirect3DRMMeshBuilder_SetName returned hr = %x\n", hr);
+    size = sizeof(name);
+    hr = IDirect3DRMMeshBuilder_GetName(pMeshBuilder, &size, name);
+    ok(hr == D3DRM_OK, "IDirect3DRMMeshBuilder_GetName returned hr = %x\n", hr);
+    ok(!strcmp(name, ""), "Retreived name '%s' instead of ''\n", name);
+
     val = IDirect3DRMMeshBuilder_GetVertexCount(pMeshBuilder);
     ok(val == 4, "Wrong number of vertices %d (must be 4)\n", val);
 




More information about the wine-patches mailing list