Christian Costa : d3dxof: Start implementing IDirectXFile_CreateEnumObject.

Alexandre Julliard julliard at winehq.org
Wed Sep 3 07:43:37 CDT 2008


Module: wine
Branch: master
Commit: 675327c031b6acc1f4cfa3aa20b13816ad52c2c7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=675327c031b6acc1f4cfa3aa20b13816ad52c2c7

Author: Christian Costa <titan.costa at wanadoo.fr>
Date:   Mon Sep  1 22:55:44 2008 +0200

d3dxof: Start implementing IDirectXFile_CreateEnumObject.

---

 dlls/d3dxof/d3dxof.c         |   85 ++++++++++++++++++++++++++++++++++++++++--
 dlls/d3dxof/d3dxof_private.h |    2 +
 2 files changed, 83 insertions(+), 4 deletions(-)

diff --git a/dlls/d3dxof/d3dxof.c b/dlls/d3dxof/d3dxof.c
index ade39e4..494907c 100644
--- a/dlls/d3dxof/d3dxof.c
+++ b/dlls/d3dxof/d3dxof.c
@@ -161,33 +161,110 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV
   IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
   IDirectXFileEnumObjectImpl* object;
   HRESULT hr;
+  DWORD header[4];
+  DWORD size;
+  HANDLE hFile = INVALID_HANDLE_VALUE;
 
-  FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, pvSource, dwLoadOptions, ppEnumObj);
+  FIXME("(%p/%p)->(%p,%x,%p) partial stub!\n", This, iface, pvSource, dwLoadOptions, ppEnumObj);
+
+  if (!ppEnumObj)
+    return DXFILEERR_BADVALUE;
 
   if (dwLoadOptions == DXFILELOAD_FROMFILE)
   {
-    HANDLE hFile;
     TRACE("Open source file '%s'\n", (char*)pvSource);
+
     hFile = CreateFileA((char*)pvSource, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
     if (hFile == INVALID_HANDLE_VALUE)
     {
       TRACE("File '%s' not found\n", (char*)pvSource);
       return DXFILEERR_FILENOTFOUND;
     }
-    CloseHandle(hFile);
+
+    if (!ReadFile(hFile, header, 16, &size, NULL))
+    {
+      hr = DXFILEERR_BADVALUE;
+      goto error;
+    }
+
+    if (size < 16)
+    {
+      hr = DXFILEERR_BADFILETYPE;
+      goto error;
+    }
+
+    if (TRACE_ON(d3dxof))
+    {
+      char string[17];
+      memcpy(string, header, 16);
+      string[16] = 0;
+      TRACE("header = '%s'\n", string);
+    }
   }
   else
   {
     FIXME("Source type %d is not handled yet\n", dwLoadOptions);
+    hr = DXFILEERR_NOTDONEYET;
+    goto error;
+  }
+
+  if (header[0] != XOFFILE_FORMAT_MAGIC)
+  {
+    hr = DXFILEERR_BADFILETYPE;
+    goto error;
+  }
+
+  if (header[1] != XOFFILE_FORMAT_VERSION)
+  {
+    hr = DXFILEERR_BADFILEVERSION;
+    goto error;
   }
 
+  if ((header[2] != XOFFILE_FORMAT_BINARY) && (header[2] != XOFFILE_FORMAT_TEXT) && (header[2] != XOFFILE_FORMAT_COMPRESSED))
+  {
+    hr = DXFILEERR_BADFILETYPE;
+    goto error;
+  }
+
+  if (header[2] == XOFFILE_FORMAT_TEXT)
+  {
+    FIXME("Binary format not supported yet\n");
+    hr = DXFILEERR_NOTDONEYET;
+    goto error;
+  }
+
+  if (header[2] == XOFFILE_FORMAT_COMPRESSED)
+  {
+    FIXME("Compressed formats not supported yet");
+    hr = DXFILEERR_BADVALUE;
+    goto error;
+  }
+
+  if ((header[3] != XOFFILE_FORMAT_FLOAT_BITS_32) && (header[3] != XOFFILE_FORMAT_FLOAT_BITS_64))
+  {
+    hr = DXFILEERR_BADFILEFLOATSIZE;
+    goto error;
+  }
+
+  TRACE("Header is correct\n");
+
   hr = IDirectXFileEnumObjectImpl_Create(&object);
   if (!SUCCEEDED(hr))
-    return hr;
+    goto error;
+
+  object->source = dwLoadOptions;
+  object->hFile = hFile;
 
   *ppEnumObj = (LPDIRECTXFILEENUMOBJECT)object;
 
   return DXFILE_OK;
+
+error:
+  if (hFile != INVALID_HANDLE_VALUE)
+    CloseHandle(hFile);
+  *ppEnumObj = NULL;
+
+  return hr;
 }
 
 static HRESULT WINAPI IDirectXFileImpl_CreateSaveObject(IDirectXFile* iface, LPCSTR szFileName, DXFILEFORMAT dwFileFormat, LPDIRECTXFILESAVEOBJECT* ppSaveObj)
diff --git a/dlls/d3dxof/d3dxof_private.h b/dlls/d3dxof/d3dxof_private.h
index 9bbf629..2e9964c 100644
--- a/dlls/d3dxof/d3dxof_private.h
+++ b/dlls/d3dxof/d3dxof_private.h
@@ -88,6 +88,8 @@ typedef struct {
 typedef struct {
     IDirectXFileEnumObject lpVtbl;
     LONG ref;
+    DXFILELOADOPTIONS source;
+    HANDLE hFile;
 } IDirectXFileEnumObjectImpl;
 
 typedef struct {




More information about the wine-cvs mailing list