From 32ab7d298ffac98b687d369e8b9fe87f79b76be9 Mon Sep 17 00:00:00 2001 From: Christian Costa Date: Sun, 14 Dec 2008 18:53:15 +0100 Subject: [PATCH] d3dxof: Add a test to dump an X object data (enabled when objects.txt and templates.txt are present). --- dlls/d3dxof/tests/d3dxof.c | 181 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) diff --git a/dlls/d3dxof/tests/d3dxof.c b/dlls/d3dxof/tests/d3dxof.c index bdc1431034e..4bd52ca8211 100644 --- a/dlls/d3dxof/tests/d3dxof.c +++ b/dlls/d3dxof/tests/d3dxof.c @@ -20,9 +20,19 @@ #define COBJMACROS #include +#include #include "wine/test.h" +#include "initguid.h" #include "dxfile.h" +static inline void debugstr_guid( char* buf, CONST GUID *id ) +{ + sprintf(buf, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", + id->Data1, id->Data2, id->Data3, + id->Data4[0], id->Data4[1], id->Data4[2], id->Data4[3], + id->Data4[4], id->Data4[5], id->Data4[6], id->Data4[7] ); +} + static HMODULE hd3dxof; static HRESULT (WINAPI *pDirectXFileCreate)(LPDIRECTXFILE*); @@ -86,11 +96,182 @@ static void test_d3dxof(void) ok(ref == 0, "Got refcount %ld, expected 1\n", ref); } +/* Set it to 1 to expand the string when dumping the object. This is usefull when there is + * only one string in a sub-object (very common). Use with care, this may lead to a crash. */ +#define EXPAND_STRING 0 + +static void process_data(LPDIRECTXFILEDATA lpDirectXFileData, int* plevel) +{ + HRESULT hr; + char name[100]; + GUID clsid; + CONST GUID* clsid_type = NULL; + char str_clsid[40]; + char str_clsid_type[40]; + DWORD len= 100; + LPDIRECTXFILEOBJECT pChildObj; + int i,k; + int j = 0; + LPBYTE pData; + DWORD size; + + hr = IDirectXFileData_GetId(lpDirectXFileData, &clsid); + ok(hr == DXFILE_OK, "IDirectXFileData_GetId: %x\n", hr); + hr = IDirectXFileData_GetName(lpDirectXFileData, name, &len); + ok(hr == DXFILE_OK, "IDirectXFileData_GetName: %x\n", hr); + hr = IDirectXFileData_GetType(lpDirectXFileData, &clsid_type); + ok(hr == DXFILE_OK, "IDirectXFileData_GetType: %x\n", hr); + hr = IDirectXFileData_GetData(lpDirectXFileData, NULL, &size, (void**)&pData); + ok(hr == DXFILE_OK, "IDirectXFileData_GetData: %x\n", hr); + for (i = 0; i < *plevel; i++) + printf(" "); + debugstr_guid(str_clsid, &clsid); + debugstr_guid(str_clsid_type, clsid_type); + printf("Found object '%s' - %s - %s - %d\n", name, str_clsid, str_clsid_type, size); + + if (EXPAND_STRING && size == 4) + { + char * str = *(char**)pData; + printf("string %s\n", str); + } + else if (size) + { + for (k = 0; k < size; k++) + { + if (k && !(k%16)) + printf("\n"); + printf("%02x ", pData[k]); + } + printf("\n"); + } + (*plevel)++; + while (SUCCEEDED(hr = IDirectXFileData_GetNextObject(lpDirectXFileData, &pChildObj))) + { + LPDIRECTXFILEDATA p1; + LPDIRECTXFILEDATAREFERENCE p2; + LPDIRECTXFILEBINARY p3; + j++; + + hr = IDirectXFileObject_QueryInterface(pChildObj, &IID_IDirectXFileData, (void **) &p1); + if (SUCCEEDED(hr)) + { + for (i = 0; i < *plevel; i++) + printf(" "); + printf("Found Data (%d)\n", j); + process_data(p1, plevel); + IDirectXFileData_Release(p1); + } + hr = IDirectXFileObject_QueryInterface(pChildObj, &IID_IDirectXFileDataReference, (void **) &p2); + if (SUCCEEDED(hr)) + { + LPDIRECTXFILEDATA pfdo; + for (i = 0; i < *plevel; i++) + printf(" "); + printf("Found Data Reference (%d)\n", j); +#if 0 + hr = IDirectXFileDataReference_GetId(lpDirectXFileData, &clsid); + ok(hr == DXFILE_OK, "IDirectXFileData_GetId: %x\n", hr); + hr = IDirectXFileDataReference_GetName(lpDirectXFileData, name, &len); + ok(hr == DXFILE_OK, "IDirectXFileData_GetName: %x\n", hr); +#endif + IDirectXFileDataReference_Resolve(p2, &pfdo); + process_data(pfdo, plevel); + IDirectXFileData_Release(pfdo); + IDirectXFileDataReference_Release(p2); + } + hr = IDirectXFileObject_QueryInterface(pChildObj, &IID_IDirectXFileBinary, (void **) &p3); + if (SUCCEEDED(hr)) + { + for (i = 0; i < *plevel; i++) + printf(" "); + printf("Found Binary (%d)\n", j); + IDirectXFileBinary_Release(p3); + } + } + (*plevel)--; + ok(hr == DXFILE_OK || hr == DXFILEERR_NOMOREOBJECTS, "IDirectXFileData_GetNextObject: %x\n", hr); +} + +static void test_dump(void) +{ + HRESULT hr; + unsigned long ref; + LPDIRECTXFILE lpDirectXFile = NULL; + LPDIRECTXFILEENUMOBJECT lpDirectXFileEnumObject = NULL; + LPDIRECTXFILEDATA lpDirectXFileData = NULL; + HANDLE hFile; + LPVOID pvData = NULL; + DWORD cbSize; + + if (!pDirectXFileCreate) + { + win_skip("DirectXFileCreate is not available\n"); + goto exit; + } + + /* Dump data only if there is an object and a template */ + hFile = CreateFileA("objects.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + if (hFile == INVALID_HANDLE_VALUE) + return; + CloseHandle(hFile); + + hFile = CreateFileA("templates.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + if (hFile == INVALID_HANDLE_VALUE) + return; + + pvData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 10000); + + if (!ReadFile(hFile, pvData, 10000, &cbSize, NULL)) + { + skip("Template file is too big\n"); + goto exit; + } + + printf("Load %d (%d) bytes\n", cbSize, strlen(pvData)); + + hr = pDirectXFileCreate(&lpDirectXFile); + ok(hr == DXFILE_OK, "DirectXFileCreate: %x\n", hr); + if(!lpDirectXFile) + { + skip("Couldn't create DirectXFile interface\n"); + goto exit; + } + + hr = IDirectXFile_RegisterTemplates(lpDirectXFile, pvData, strlen(pvData)); + ok(hr == DXFILE_OK, "IDirectXFileImpl_RegisterTemplates: %x\n", hr); + + hr = IDirectXFile_CreateEnumObject(lpDirectXFile, (LPVOID)"objects.txt", DXFILELOAD_FROMFILE, &lpDirectXFileEnumObject); + ok(hr == DXFILE_OK, "IDirectXFile_CreateEnumObject: %x\n", hr); + + while (SUCCEEDED(hr = IDirectXFileEnumObject_GetNextDataObject(lpDirectXFileEnumObject, &lpDirectXFileData))) + { + int level = 0; + printf("\n"); + process_data(lpDirectXFileData, &level); + IDirectXFileData_Release(lpDirectXFileData); + } + ok(hr == DXFILE_OK || hr == DXFILEERR_NOMOREOBJECTS, "IDirectXFileEnumObject_GetNextDataObject: %x\n", hr); + + ref = IDirectXFile_Release(lpDirectXFileEnumObject); + ok(ref == 0, "Got refcount %ld, expected 0\n", ref); + + ref = IDirectXFile_Release(lpDirectXFile); + ok(ref == 0, "Got refcount %ld, expected 0\n", ref); + + CloseHandle(hFile); + +exit: + + if (pvData) + HeapFree(GetProcessHeap(), 0, pvData); +} + START_TEST(d3dxof) { init_function_pointers(); test_d3dxof(); + test_dump(); FreeLibrary(hd3dxof); } -- 2.11.4.GIT