[PATCH 2/4] d3dxof: Fix file types checks + tests

Christian Costa titan.costa at wanadoo.fr
Mon Mar 1 02:36:25 CST 2010


---

 dlls/d3dxof/d3dxof.c       |   39 ++++++++++++++-------
 dlls/d3dxof/tests/d3dxof.c |   82 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 109 insertions(+), 12 deletions(-)
-------------- next part --------------
diff --git a/dlls/d3dxof/d3dxof.c b/dlls/d3dxof/d3dxof.c
index eccdf98..4d183d6 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,20 +394,22 @@ 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))
-    return DXFILEERR_BADFILETYPE;
-
-  if (token_header == XOFFILE_FORMAT_TEXT)
+  if ((token_header != XOFFILE_FORMAT_BINARY) && (token_header != XOFFILE_FORMAT_TEXT) &&
+      (token_header != XOFFILE_FORMAT_BINARY_MSZIP) && (token_header != XOFFILE_FORMAT_TEXT_MSZIP))
   {
-    buf.txt = TRUE;
+    WARN("File type %s unknown\n", debugstr_fourcc(token_header));
+    return DXFILEERR_BADFILETYPE;
   }
 
-  if (token_header == XOFFILE_FORMAT_COMPRESSED)
+  if ((token_header == XOFFILE_FORMAT_BINARY_MSZIP) || (token_header == XOFFILE_FORMAT_TEXT_MSZIP))
   {
-    FIXME("Compressed formats not supported yet\n");
-    return DXFILEERR_BADVALUE;
+    FIXME("Compressed format %s not supported yet\n", debugstr_fourcc(token_header));
+    return DXFILEERR_BADALLOC;
   }
 
+  if (token_header == XOFFILE_FORMAT_TEXT)
+    buf.txt = TRUE;
+
   read_bytes(&buf, &token_header, 4);
 
   if ((token_header != XOFFILE_FORMAT_FLOAT_BITS_32) && (token_header != XOFFILE_FORMAT_FLOAT_BITS_64))
diff --git a/dlls/d3dxof/tests/d3dxof.c b/dlls/d3dxof/tests/d3dxof.c
index dd1abca..1198229 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);


More information about the wine-patches mailing list