[PATCH] d3dx9_36: Fix ID3DXFileDataImpl_GetName + add some tests.
Christian Costa
titan.costa at gmail.com
Wed May 15 18:09:01 CDT 2013
---
dlls/d3dx9_36/tests/xfile.c | 83 +++++++++++++++++++++++++++++++++++++++++++
dlls/d3dx9_36/xfile.c | 15 +++++++-
2 files changed, 96 insertions(+), 2 deletions(-)
diff --git a/dlls/d3dx9_36/tests/xfile.c b/dlls/d3dx9_36/tests/xfile.c
index 49c96ea..4ac521b 100644
--- a/dlls/d3dx9_36/tests/xfile.c
+++ b/dlls/d3dx9_36/tests/xfile.c
@@ -55,6 +55,13 @@ static char objects[] =
"1; 2; 3;\n"
"}\n";
+static char object_noname[] =
+"xof 0302txt 0064\n"
+"Header\n"
+"{\n"
+"1; 2; 3;\n"
+"}\n";
+
static void test_templates(void)
{
ID3DXFile *d3dxfile;
@@ -128,6 +135,81 @@ static void test_lock_unlock(void)
d3dxfile->lpVtbl->Release(d3dxfile);
}
+static void test_getname(void)
+{
+ ID3DXFile *d3dxfile;
+ D3DXF_FILELOADMEMORY memory;
+ ID3DXFileEnumObject *enum_object;
+ ID3DXFileData *data_object;
+ SIZE_T length;
+ char name[100];
+ HRESULT ret;
+
+ ret = D3DXFileCreate(&d3dxfile);
+ ok(ret == S_OK, "D3DXCreateFile failed with %#x\n", ret);
+
+ ret = d3dxfile->lpVtbl->RegisterTemplates(d3dxfile, templates, sizeof(templates) - 1);
+ ok(ret == S_OK, "RegisterTemplates failed with %#x\n", ret);
+
+ /* Check object with name */
+ memory.lpMemory = objects;
+ memory.dSize = sizeof(objects) - 1;
+ ret = d3dxfile->lpVtbl->CreateEnumObject(d3dxfile, &memory, D3DXF_FILELOAD_FROMMEMORY, &enum_object);
+ ok(ret == S_OK, "CreateEnumObject failed with %#x\n", ret);
+ ret = enum_object->lpVtbl->GetChild(enum_object, 0, &data_object);
+ ok(ret == S_OK, "GetChild failed with %#x\n", ret);
+
+ ret = data_object->lpVtbl->GetName(data_object, NULL, NULL);
+ ok(ret == D3DXFERR_BADVALUE, "GetName returned %#x, expected %#x\n", ret, D3DXFERR_BADVALUE);
+ ret = data_object->lpVtbl->GetName(data_object, name, NULL);
+ ok(ret == D3DXFERR_BADVALUE, "GetName returned %#x, expected %#x\n", ret, D3DXFERR_BADVALUE);
+ ret = data_object->lpVtbl->GetName(data_object, NULL, &length);
+ ok(ret == S_OK, "GetName failed with %#x\n", ret);
+ ok(length == 7, "Returned length should be 7 instead of %ld\n", length);
+ length = sizeof(name);
+ ret = data_object->lpVtbl->GetName(data_object, name, &length);
+ ok(ret == S_OK, "GetName failed with %#x\n", ret);
+ ok(length == 7, "Returned length should be 7 instead of %ld\n", length);
+ ok(!strcmp(name, "Object"), "Returned string should be 'Object' intead of '%s'\n", name);
+ length = 3;
+ ret = data_object->lpVtbl->GetName(data_object, name, &length);
+ ok(ret== D3DXFERR_BADVALUE, "GetName returned %#x, expected %#x\n", ret, D3DXFERR_BADVALUE);
+
+ data_object->lpVtbl->Release(data_object);
+ enum_object->lpVtbl->Release(enum_object);
+
+ /* Check object without name */
+ memory.lpMemory = object_noname;
+ memory.dSize = sizeof(object_noname) - 1;
+ ret = d3dxfile->lpVtbl->CreateEnumObject(d3dxfile, &memory, D3DXF_FILELOAD_FROMMEMORY, &enum_object);
+ ok(ret == S_OK, "CreateEnumObject failed with %#x\n", ret);
+ ret = enum_object->lpVtbl->GetChild(enum_object, 0, &data_object);
+ ok(ret == S_OK, "GetChild failed with %#x\n", ret);
+
+ /* Contrary to d3dxof, d3dx9_36 returns an empty string with a null byte when no name is available.
+ * If the input size is 0, it returns a length of 1 without touching the buffer */
+ ret = data_object->lpVtbl->GetName(data_object, NULL, &length);
+ ok(ret == S_OK, "GetName failed with %#x\n", ret);
+ ok(length == 1, "Returned length should be 1 instead of %ld\n", length);
+ length = 0;
+ name[0] = 0x7f;
+ ret = data_object->lpVtbl->GetName(data_object, name, &length);
+ ok(ret == S_OK, "GetName failed with %#x\n", ret);
+ ok(length == 1, "Returned length should be 1 instead of %ld\n", length);
+ ok(name[0] == 0x7f, "First character is %#x instead of 0x7f\n", name[0]);
+ length = sizeof(name);
+ name[0] = 0x7f;
+ ret = data_object->lpVtbl->GetName(data_object, name, &length);
+ ok(ret == S_OK, "GetName failed with %#x\n", ret);
+ ok(length == 1, "Returned length should be 1 instead of %ld\n", length);
+ ok(name[0] == 0, "First character is %#x instead of 0x00\n", name[0]);
+
+ data_object->lpVtbl->Release(data_object);
+ enum_object->lpVtbl->Release(enum_object);
+ d3dxfile->lpVtbl->Release(d3dxfile);
+
+}
+
static inline void debugstr_guid(char* buf, const GUID *id)
{
sprintf(buf, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
@@ -278,5 +360,6 @@ START_TEST(xfile)
{
test_templates();
test_lock_unlock();
+ test_getname();
test_dump();
}
diff --git a/dlls/d3dx9_36/xfile.c b/dlls/d3dx9_36/xfile.c
index 81f9da3..9c57277 100644
--- a/dlls/d3dx9_36/xfile.c
+++ b/dlls/d3dx9_36/xfile.c
@@ -38,6 +38,8 @@ static HRESULT error_dxfile_to_d3dxfile(HRESULT error)
return D3DXFERR_BADFILEFLOATSIZE;
case DXFILEERR_PARSEERROR:
return D3DXFERR_PARSEERROR;
+ case DXFILEERR_BADVALUE:
+ return D3DXFERR_BADVALUE;
default:
FIXME("Cannot map error %#x\n", error);
return E_FAIL;
@@ -151,8 +153,8 @@ static HRESULT WINAPI ID3DXFileDataImpl_GetName(ID3DXFileData *iface, char *name
TRACE("(%p)->(%p, %p)\n", iface, name, size);
- if (!name || !size)
- return E_POINTER;
+ if (!size)
+ return D3DXFERR_BADVALUE;
dxfile_size = *size;
@@ -160,6 +162,15 @@ static HRESULT WINAPI ID3DXFileDataImpl_GetName(ID3DXFileData *iface, char *name
if (ret != DXFILE_OK)
return error_dxfile_to_d3dxfile(ret);
+ if (!dxfile_size)
+ {
+ /* Contrary to d3dxof, d3dx9_36 returns an empty string with a null byte when no name is available.
+ * If the input size is 0, it returns a length of 1 without touching the buffer */
+ dxfile_size = 1;
+ if (name && *size)
+ name[0] = 0;
+ }
+
*size = dxfile_size;
return S_OK;
More information about the wine-patches
mailing list