[PATCH] d3dxof: Enable retrieving a particular member in GetData + tests.

Christian Costa titan.costa at gmail.com
Wed Feb 15 02:53:19 CST 2012


--

Should fix bug 17345.
---
 dlls/d3dxof/d3dxof.c       |   21 ++++++++++++++++-----
 dlls/d3dxof/parsing.c      |    3 +++
 dlls/d3dxof/tests/d3dxof.c |   28 +++++++++++++++++++++++++++-
 3 files changed, 46 insertions(+), 6 deletions(-)

diff --git a/dlls/d3dxof/d3dxof.c b/dlls/d3dxof/d3dxof.c
index 966baa2..3294f92 100644
--- a/dlls/d3dxof/d3dxof.c
+++ b/dlls/d3dxof/d3dxof.c
@@ -616,12 +616,23 @@ static HRESULT WINAPI IDirectXFileDataImpl_GetData(IDirectXFileData* iface, LPCS
 
   if (szMember)
   {
-    FIXME("Specifying a member is not supported yet!\n");
-    return DXFILEERR_BADVALUE;
+    int i;
+    for (i = 0; i < This->pobj->nb_members; i++)
+      if (!strcmp(This->pobj->members[i].name, szMember))
+        break;
+    if (i == This->pobj->nb_members)
+    {
+      WARN("Unknown member '%s'\n", szMember);
+      return DXFILEERR_BADDATAREFERENCE;
+    }
+    *pcbSize = This->pobj->members[i].size;
+    *ppvData = This->pobj->root->pdata + This->pobj->members[i].start;
+  }
+  else
+  {
+    *pcbSize = This->pobj->size;
+    *ppvData = This->pobj->root->pdata + This->pobj->pos_data;
   }
-
-  *pcbSize = This->pobj->size;
-  *ppvData = This->pobj->root->pdata + This->pobj->pos_data;
 
   return DXFILE_OK;
 }
diff --git a/dlls/d3dxof/parsing.c b/dlls/d3dxof/parsing.c
index 5b8b44b..4b9b12f 100644
--- a/dlls/d3dxof/parsing.c
+++ b/dlls/d3dxof/parsing.c
@@ -1149,6 +1149,8 @@ static BOOL parse_object_members_list(parse_buffer * buf)
   int i;
   xtemplate* pt = buf->pxt[buf->level];
 
+  buf->pxo->nb_members = pt->nb_members;
+
   for (i = 0; i < pt->nb_members; i++)
   {
     int k;
@@ -1295,6 +1297,7 @@ static BOOL parse_object_members_list(parse_buffer * buf)
       if ((token != TOKEN_SEMICOLON) && (token != TOKEN_COMMA))
         return FALSE;
     }
+    buf->pxo->members[i].size = buf->cur_pos_data - buf->pxo->members[i].start;
   }
 
   return TRUE;
diff --git a/dlls/d3dxof/tests/d3dxof.c b/dlls/d3dxof/tests/d3dxof.c
index daded96..8ce22b7 100644
--- a/dlls/d3dxof/tests/d3dxof.c
+++ b/dlls/d3dxof/tests/d3dxof.c
@@ -204,12 +204,38 @@ static void test_CreateEnumObject(void)
     hr = IDirectXFileEnumObject_GetNextDataObject(lpdxfeo, &lpdxfd);
     ok(hr == DXFILE_OK, "IDirectXFileEnumObject_GetNextDataObject: %x\n", hr);
 
+    /* Get all data (szMember == NULL) */
     hr = IDirectXFileData_GetData(lpdxfd, NULL, &size, (void**)&pdata);
     ok(hr == DXFILE_OK, "IDirectXFileData_GetData: %x\n", hr);
 
-    ok(size == 8, "Retrieved data size is wrong\n");
+    ok(size == 8, "Retrieved data size is wrong (%u instead of 8)\n", size);
     ok((*((WORD*)pdata) == 1) && (*((WORD*)(pdata+2)) == 2) && (*((DWORD*)(pdata+4)) == 3), "Retrieved data is wrong\n");
 
+    /* Get only "major" member (szMember == "major") */
+    hr = IDirectXFileData_GetData(lpdxfd, "major", &size, (void**)&pdata);
+    ok(hr == DXFILE_OK, "IDirectXFileData_GetData: %x\n", hr);
+
+    ok(size == 2, "Retrieved data size is wrong (%u instead of 2)\n", size);
+    ok(*((WORD*)pdata) == 1, "Retrieved data is wrong (%u instead of 1)\n", *((WORD*)pdata));
+
+    /* Get only "minor" member (szMember == "minor") */
+    hr = IDirectXFileData_GetData(lpdxfd, "minor", &size, (void**)&pdata);
+    ok(hr == DXFILE_OK, "IDirectXFileData_GetData: %x\n", hr);
+
+    ok(size == 2, "Retrieved data size is wrong (%u instead of 2)\n", size);
+    ok(*((WORD*)pdata) == 2, "Retrieved data is wrong (%u instead of 2)\n", *((WORD*)pdata));
+
+    /* Get only "flags" member (szMember == "flags") */
+    hr = IDirectXFileData_GetData(lpdxfd, "flags", &size, (void**)&pdata);
+    ok(hr == DXFILE_OK, "IDirectXFileData_GetData: %x\n", hr);
+
+    ok(size == 4, "Retrieved data size is wrong (%u instead of 4)\n", size);
+    ok(*((WORD*)pdata) == 3, "Retrieved data is wrong (%u instead of 3)\n", *((WORD*)pdata));
+
+    /* Try to get not existing member (szMember == "unknown") */
+    hr = IDirectXFileData_GetData(lpdxfd, "unknow", &size, (void**)&pdata);
+    ok(hr == DXFILEERR_BADDATAREFERENCE, "IDirectXFileData_GetData: %x\n", hr);
+
     ref = IDirectXFileEnumObject_Release(lpdxfeo);
     ok(ref == 0, "Got refcount %d, expected 0\n", ref);
 




More information about the wine-patches mailing list