From aed6a4a4f89182b193e3492919406825f715c3a6 Mon Sep 17 00:00:00 2001 From: Christian Costa Date: Mon, 1 Mar 2010 09:36:25 +0100 Subject: [PATCH] d3dxof: Fix file types checks + tests. --- dlls/d3dxof/d3dxof.c | 41 +++++++++++++------ dlls/d3dxof/tests/d3dxof.c | 82 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 13 deletions(-) diff --git a/dlls/d3dxof/d3dxof.c b/dlls/d3dxof/d3dxof.c index eccdf983eaf..4d183d65ba0 100644 --- a/dlls/d3dxof/d3dxof.c +++ b/dlls/d3dxof/d3dxof.c @@ -42,6 +42,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3dxof); #define XOFFILE_FORMAT_VERSION_303 MAKEFOUR('0','3','0','3') #define XOFFILE_FORMAT_BINARY MAKEFOUR('b','i','n',' ') #define XOFFILE_FORMAT_TEXT MAKEFOUR('t','x','t',' ') +#define XOFFILE_FORMAT_BINARY_MSZIP MAKEFOUR('b','z','i','p') +#define XOFFILE_FORMAT_TEXT_MSZIP MAKEFOUR('t','z','i','p') #define XOFFILE_FORMAT_COMPRESSED MAKEFOUR('c','m','p',' ') #define XOFFILE_FORMAT_FLOAT_BITS_32 MAKEFOUR('0','0','3','2') #define XOFFILE_FORMAT_FLOAT_BITS_64 MAKEFOUR('0','0','6','4') @@ -58,6 +60,15 @@ static HRESULT IDirectXFileDataReferenceImpl_Create(IDirectXFileDataReferenceImp static HRESULT IDirectXFileEnumObjectImpl_Create(IDirectXFileEnumObjectImpl** ppObj); static HRESULT IDirectXFileSaveObjectImpl_Create(IDirectXFileSaveObjectImpl** ppObj); +/* FOURCC to string conversion for debug messages */ +const char *debugstr_fourcc(DWORD fourcc) +{ + if (!fourcc) return "'null'"; + return wine_dbg_sprintf ("\'%c%c%c%c\'", + (char)(fourcc), (char)(fourcc >> 8), + (char)(fourcc >> 16), (char)(fourcc >> 24)); +} + HRESULT IDirectXFileImpl_Create(IUnknown* pUnkOuter, LPVOID* ppObj) { IDirectXFileImpl* object; @@ -247,16 +258,18 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV goto error; } - if ((header[2] != XOFFILE_FORMAT_BINARY) && (header[2] != XOFFILE_FORMAT_TEXT) && (header[2] != XOFFILE_FORMAT_COMPRESSED)) + if ((header[2] != XOFFILE_FORMAT_BINARY) && (header[2] != XOFFILE_FORMAT_TEXT) && + (header[2] != XOFFILE_FORMAT_BINARY_MSZIP) && (header[2] != XOFFILE_FORMAT_TEXT_MSZIP)) { + WARN("File type %s unknown\n", debugstr_fourcc(header[2])); hr = DXFILEERR_BADFILETYPE; goto error; } - if (header[2] == XOFFILE_FORMAT_COMPRESSED) + if ((header[2] == XOFFILE_FORMAT_BINARY_MSZIP) || (header[2] == XOFFILE_FORMAT_TEXT_MSZIP)) { - FIXME("Compressed formats not supported yet\n"); - hr = DXFILEERR_BADVALUE; + FIXME("Compressed format %s not supported yet\n", debugstr_fourcc(header[2])); + hr = DXFILEERR_BADALLOC; goto error; } @@ -381,19 +394,21 @@ static HRESULT WINAPI IDirectXFileImpl_RegisterTemplates(IDirectXFile* iface, LP read_bytes(&buf, &token_header, 4); - if ((token_header != XOFFILE_FORMAT_BINARY) && (token_header != XOFFILE_FORMAT_TEXT) && (token_header != XOFFILE_FORMAT_COMPRESSED)) + if ((token_header != XOFFILE_FORMAT_BINARY) && (token_header != XOFFILE_FORMAT_TEXT) && + (token_header != XOFFILE_FORMAT_BINARY_MSZIP) && (token_header != XOFFILE_FORMAT_TEXT_MSZIP)) + { + WARN("File type %s unknown\n", debugstr_fourcc(token_header)); return DXFILEERR_BADFILETYPE; + } + + if ((token_header == XOFFILE_FORMAT_BINARY_MSZIP) || (token_header == XOFFILE_FORMAT_TEXT_MSZIP)) + { + FIXME("Compressed format %s not supported yet\n", debugstr_fourcc(token_header)); + return DXFILEERR_BADALLOC; + } if (token_header == XOFFILE_FORMAT_TEXT) - { buf.txt = TRUE; - } - - if (token_header == XOFFILE_FORMAT_COMPRESSED) - { - FIXME("Compressed formats not supported yet\n"); - return DXFILEERR_BADVALUE; - } read_bytes(&buf, &token_header, 4); diff --git a/dlls/d3dxof/tests/d3dxof.c b/dlls/d3dxof/tests/d3dxof.c index dd1abca27e5..11982295ada 100644 --- a/dlls/d3dxof/tests/d3dxof.c +++ b/dlls/d3dxof/tests/d3dxof.c @@ -53,6 +53,13 @@ char object[] = "1; 2; 3;\n" "}\n"; +char empty_txt_file[] = "xof 0302txt 0064"; +char empty_bin_file[] = "xof 0302bin 0064"; +char empty_tzip_file[] = "xof 0302tzip0064"; +char empty_bzip_file[] = "xof 0302bzip0064"; +char empty_cmp_file[] = "xof 0302cmp 0064"; +char empty_xxxx_file[] = "xof 0302xxxx0064"; + static void init_function_pointers(void) { /* We have to use LoadLibrary as no d3dxof functions are referenced directly */ @@ -190,6 +197,80 @@ static void test_CreateEnumObject(void) ok(ref == 0, "Got refcount %d, expected 0\n", ref); } +static void test_file_types(void) +{ + HRESULT hr; + LPDIRECTXFILE dxfile = NULL; + LPDIRECTXFILEENUMOBJECT enum_object; + DXFILELOADMEMORY lminfo; + + if (!pDirectXFileCreate) + { + win_skip("DirectXFileCreate is not available\n"); + return; + } + + hr = pDirectXFileCreate(&dxfile); + ok(hr == DXFILE_OK, "DirectXFileCreate: %x\n", hr); + if (!dxfile) + { + skip("Couldn't create DirectXFile interface\n"); + return; + } + + hr = IDirectXFile_RegisterTemplates(dxfile, empty_txt_file, strlen(empty_txt_file)); + ok(hr == DXFILE_OK, "IDirectXFileImpl_RegisterTemplates: %x\n", hr); + + hr = IDirectXFile_RegisterTemplates(dxfile, empty_bin_file, strlen(empty_bin_file)); + ok(hr == DXFILE_OK, "IDirectXFileImpl_RegisterTemplates: %x\n", hr); + + hr = IDirectXFile_RegisterTemplates(dxfile, empty_tzip_file, strlen(empty_tzip_file)); + ok(hr == DXFILEERR_BADALLOC, "IDirectXFileImpl_RegisterTemplates: %x\n", hr); + + hr = IDirectXFile_RegisterTemplates(dxfile, empty_bzip_file, strlen(empty_bzip_file)); + ok(hr == DXFILEERR_BADALLOC, "IDirectXFileImpl_RegisterTemplates: %x\n", hr); + + hr = IDirectXFile_RegisterTemplates(dxfile, empty_cmp_file, strlen(empty_cmp_file)); + ok(hr == DXFILEERR_BADFILETYPE, "IDirectXFileImpl_RegisterTemplates: %x\n", hr); + + hr = IDirectXFile_RegisterTemplates(dxfile, empty_xxxx_file, strlen(empty_xxxx_file)); + ok(hr == DXFILEERR_BADFILETYPE, "IDirectXFileImpl_RegisterTemplates: %x\n", hr); + + lminfo.lpMemory = empty_txt_file; + lminfo.dSize = strlen(empty_txt_file); + hr = IDirectXFile_CreateEnumObject(dxfile, &lminfo, DXFILELOAD_FROMMEMORY, &enum_object); + ok(hr == DXFILE_OK, "IDirectXFile_CreateEnumObject: %x\n", hr); + if (hr == DXFILE_OK) IDirectXFileEnumObject_Release(enum_object); + + lminfo.lpMemory = empty_bin_file; + lminfo.dSize = strlen(empty_bin_file); + hr = IDirectXFile_CreateEnumObject(dxfile, &lminfo, DXFILELOAD_FROMMEMORY, &enum_object); + ok(hr == DXFILE_OK, "IDirectXFile_CreateEnumObject: %x\n", hr); + if (hr == DXFILE_OK) IDirectXFileEnumObject_Release(enum_object); + + lminfo.lpMemory = empty_tzip_file; + lminfo.dSize = strlen(empty_tzip_file); + hr = IDirectXFile_CreateEnumObject(dxfile, &lminfo, DXFILELOAD_FROMMEMORY, &enum_object); + ok(hr == DXFILEERR_BADALLOC, "IDirectXFile_CreateEnumObject: %x\n", hr); + + lminfo.lpMemory = empty_bzip_file; + lminfo.dSize = strlen(empty_bzip_file); + hr = IDirectXFile_CreateEnumObject(dxfile, &lminfo, DXFILELOAD_FROMMEMORY, &enum_object); + ok(hr == DXFILEERR_BADALLOC, "IDirectXFile_CreateEnumObject: %x\n", hr); + + lminfo.lpMemory = empty_cmp_file; + lminfo.dSize = strlen(empty_cmp_file); + hr = IDirectXFile_CreateEnumObject(dxfile, &lminfo, DXFILELOAD_FROMMEMORY, &enum_object); + ok(hr == DXFILEERR_BADFILETYPE, "IDirectXFile_CreateEnumObject: %x\n", hr); + + lminfo.lpMemory = empty_xxxx_file; + lminfo.dSize = strlen(empty_xxxx_file); + hr = IDirectXFile_CreateEnumObject(dxfile, &lminfo, DXFILELOAD_FROMMEMORY, &enum_object); + ok(hr == DXFILEERR_BADFILETYPE, "IDirectXFile_CreateEnumObject: %x\n", hr); + + IDirectXFile_Release(dxfile); +} + /* Set it to 1 to expand the string when dumping the object. This is useful 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 @@ -364,6 +445,7 @@ START_TEST(d3dxof) test_refcount(); test_CreateEnumObject(); + test_file_types(); test_dump(); FreeLibrary(hd3dxof);