[PATCH 4/5] d3dx9_36: Implement ID3DXFileEnumObjectImpl_GetChildren & ID3DXFileEnumObjectImpl_GetChild and add stubbed interface for ID3DXFileData.

Christian Costa titan.costa at gmail.com
Mon Oct 22 14:28:23 CDT 2012


---
 dlls/d3dx9_36/xfile.c |  236 +++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 227 insertions(+), 9 deletions(-)

diff --git a/dlls/d3dx9_36/xfile.c b/dlls/d3dx9_36/xfile.c
index 143a021..ed063be 100644
--- a/dlls/d3dx9_36/xfile.c
+++ b/dlls/d3dx9_36/xfile.c
@@ -35,9 +35,19 @@ typedef struct {
 typedef struct {
     ID3DXFileEnumObject ID3DXFileEnumObject_iface;
     LONG ref;
-    IDirectXFileEnumObject *dxfile_enum_object;
+    ULONG nb_children;
+    LPD3DXFILEDATA *children;
 } ID3DXFileEnumObjectImpl;
 
+typedef struct {
+    ID3DXFileData ID3DXFileData_iface;
+    LONG ref;
+    BOOL reference;
+    LPDIRECTXFILEDATA dxfile_object;
+    ULONG nb_children;
+    LPD3DXFILEDATA *children;
+} ID3DXFileDataImpl;
+
 static inline ID3DXFileImpl *impl_from_ID3DXFile(ID3DXFile *iface)
 {
     return CONTAINING_RECORD(iface, ID3DXFileImpl, ID3DXFile_iface);
@@ -48,6 +58,172 @@ static inline ID3DXFileEnumObjectImpl *impl_from_ID3DXFileEnumObject(ID3DXFileEn
     return CONTAINING_RECORD(iface, ID3DXFileEnumObjectImpl, ID3DXFileEnumObject_iface);
 }
 
+static inline ID3DXFileDataImpl *impl_from_ID3DXFileData(ID3DXFileData *iface)
+{
+    return CONTAINING_RECORD(iface, ID3DXFileDataImpl, ID3DXFileData_iface);
+}
+
+/*** IUnknown methods ***/
+
+static HRESULT WINAPI ID3DXFileDataImpl_QueryInterface(ID3DXFileData *iface, REFIID riid, LPVOID *ret_iface)
+{
+    TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ret_iface);
+
+    if (IsEqualGUID(riid, &IID_IUnknown) ||
+        IsEqualGUID(riid, &IID_ID3DXFileData))
+    {
+        iface->lpVtbl->AddRef(iface);
+        *ret_iface = iface;
+        return S_OK;
+    }
+
+    ERR("(%p)->(%s, %p), not found\n", iface, debugstr_guid(riid), ret_iface);
+    *ret_iface = NULL;
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI ID3DXFileDataImpl_AddRef(ID3DXFileData *iface)
+{
+    ID3DXFileDataImpl *This = impl_from_ID3DXFileData(iface);
+    ULONG ref = InterlockedIncrement(&This->ref);
+
+    TRACE("(%p)->(): new ref %d\n", iface, ref);
+
+    return ref;
+}
+
+static ULONG WINAPI ID3DXFileDataImpl_Release(ID3DXFileData *iface)
+{
+    ID3DXFileDataImpl *This = impl_from_ID3DXFileData(iface);
+    ULONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p)->(): new ref %d\n", iface, ref);
+
+    if (!ref)
+    {
+        IDirectXFileEnumObject_Release(This->dxfile_object);
+        HeapFree(GetProcessHeap(), 0, This);
+    }
+
+    return ref;
+}
+
+
+/*** ID3DXFileData methods ***/
+
+static HRESULT WINAPI ID3DXFileDataImpl_GetEnum(ID3DXFileData *iface, LPD3DXFILEENUMOBJECT *enum_object)
+{
+    FIXME("(%p)->(%p): stub\n", iface, enum_object);
+
+    return E_NOTIMPL;
+}
+
+
+static HRESULT WINAPI ID3DXFileDataImpl_GetName(ID3DXFileData *iface, LPSTR name, SIZE_T *size)
+{
+    FIXME("(%p)->(%p, %p): stub\n", iface, name, size);
+
+    return E_NOTIMPL;
+}
+
+
+static HRESULT WINAPI ID3DXFileDataImpl_GetId(ID3DXFileData *iface, LPGUID guid)
+{
+    FIXME("(%p)->(%p): stub\n", iface, guid);
+
+    return E_NOTIMPL;
+}
+
+
+static HRESULT WINAPI ID3DXFileDataImpl_Lock(ID3DXFileData *iface, SIZE_T *size, LPCVOID *data)
+{
+    FIXME("(%p)->(%p, %p): stub\n", iface, size, data);
+
+    return E_NOTIMPL;
+}
+
+
+static HRESULT WINAPI ID3DXFileDataImpl_Unlock(ID3DXFileData *iface)
+{
+    FIXME("(%p)->(): stub\n", iface);
+
+    return E_NOTIMPL;
+}
+
+
+static HRESULT WINAPI ID3DXFileDataImpl_GetType(ID3DXFileData *iface, GUID* guid)
+{
+    FIXME("(%p)->(%p): stub\n", iface, guid);
+
+    return E_NOTIMPL;
+}
+
+
+static BOOL WINAPI ID3DXFileDataImpl_IsReference(ID3DXFileData *iface)
+{
+    TRACE("(%p)->(): stub\n", iface);
+
+    return E_NOTIMPL;
+}
+
+
+static HRESULT WINAPI ID3DXFileDataImpl_GetChildren(ID3DXFileData *iface, SIZE_T *children)
+{
+    TRACE("(%p)->(%p): stub\n", iface, children);
+
+    return E_NOTIMPL;
+}
+
+
+static HRESULT WINAPI ID3DXFileDataImpl_GetChild(ID3DXFileData *iface, SIZE_T id, LPD3DXFILEDATA *object)
+{
+    TRACE("(%p)->(%lu, %p): stub\n", iface, id, object);
+
+    return E_NOTIMPL;
+}
+
+
+static const ID3DXFileDataVtbl ID3DXFileData_Vtbl =
+{
+    ID3DXFileDataImpl_QueryInterface,
+    ID3DXFileDataImpl_AddRef,
+    ID3DXFileDataImpl_Release,
+    ID3DXFileDataImpl_GetEnum,
+    ID3DXFileDataImpl_GetName,
+    ID3DXFileDataImpl_GetId,
+    ID3DXFileDataImpl_Lock,
+    ID3DXFileDataImpl_Unlock,
+    ID3DXFileDataImpl_GetType,
+    ID3DXFileDataImpl_IsReference,
+    ID3DXFileDataImpl_GetChildren,
+    ID3DXFileDataImpl_GetChild
+};
+
+
+static HRESULT WINAPI ID3DXFileDataImpl_Create(LPDIRECTXFILEOBJECT dxfile_object, ID3DXFileData **ret_iface)
+{
+    ID3DXFileDataImpl* object;
+
+    TRACE("(%p)\n", ret_iface);
+
+    *ret_iface = NULL;
+
+    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ID3DXFileDataImpl));
+    if (!object)
+    {
+        ERR("Out of memory\n");
+        return E_OUTOFMEMORY;
+    }
+
+    object->ID3DXFileData_iface.lpVtbl = &ID3DXFileData_Vtbl;
+    object->ref = 1;
+    object->dxfile_object = (LPDIRECTXFILEDATA)dxfile_object;
+
+    *ret_iface = &object->ID3DXFileData_iface;
+
+    return S_OK;
+}
+
 
 /*** IUnknown methods ***/
 
@@ -87,7 +263,11 @@ static ULONG WINAPI ID3DXFileEnumObjectImpl_Release(ID3DXFileEnumObject *iface)
 
     if (!ref)
     {
-        IDirectXFileEnumObject_Release(This->dxfile_enum_object);
+        ULONG i;
+
+        for (i = 0; i < This->nb_children; i++)
+            (This->children[i])->lpVtbl->Release(This->children[i]);
+        HeapFree(GetProcessHeap(), 0, This->children);
         HeapFree(GetProcessHeap(), 0, This);
     }
 
@@ -107,17 +287,26 @@ static HRESULT WINAPI ID3DXFileEnumObjectImpl_GetFile(ID3DXFileEnumObject *iface
 
 static HRESULT WINAPI ID3DXFileEnumObjectImpl_GetChildren(ID3DXFileEnumObject *iface, SIZE_T *children)
 {
-    FIXME("(%p)->(%p): stub\n", iface, children);
+    ID3DXFileEnumObjectImpl *This = impl_from_ID3DXFileEnumObject(iface);
 
-    return E_NOTIMPL;
+    TRACE("(%p)->(%p)\n", iface, children);
+
+    *children = This->nb_children;
+
+    return S_OK;
 }
 
 
-static HRESULT WINAPI ID3DXFileEnumObjectImpl_GetChild(ID3DXFileEnumObject *iface, SIZE_T id, LPD3DXFILEDATA* object)
+static HRESULT WINAPI ID3DXFileEnumObjectImpl_GetChild(ID3DXFileEnumObject *iface, SIZE_T id, LPD3DXFILEDATA *object)
 {
-    FIXME("(%p)->(%lu, %p): stub\n", iface, id, object);
+    ID3DXFileEnumObjectImpl *This = impl_from_ID3DXFileEnumObject(iface);
 
-    return E_NOTIMPL;
+    TRACE("(%p)->(%lu, %p)\n", iface, id, object);
+
+    *object = This->children[id];
+    (*object)->lpVtbl->AddRef(*object);
+
+    return S_OK;
 }
 
 
@@ -208,6 +397,8 @@ static HRESULT WINAPI ID3DXFileImpl_CreateEnumObject(ID3DXFile *iface, LPCVOID s
     DXFILELOADRESOURCE dxfile_resource;
     DXFILELOADMEMORY dxfile_memory;
     ID3DXFileEnumObjectImpl *object;
+    LPDIRECTXFILEENUMOBJECT dxfile_enum_object;
+    LPDIRECTXFILEDATA data_object;
     HRESULT ret;
 
     TRACE("(%p)->(%p, %x, %p)\n", iface, source, options, enum_object);
@@ -254,15 +445,42 @@ static HRESULT WINAPI ID3DXFileImpl_CreateEnumObject(ID3DXFile *iface, LPCVOID s
     object->ID3DXFileEnumObject_iface.lpVtbl = &ID3DXFileEnumObject_Vtbl;
     object->ref = 1;
 
-    ret = IDirectXFile_CreateEnumObject(This->dxfile, dxfile_source, dxfile_options, &object->dxfile_enum_object);
+    ret = IDirectXFile_CreateEnumObject(This->dxfile, dxfile_source, dxfile_options, &dxfile_enum_object);
 
     if (ret != S_OK)
     {
-        FIXME("Cannot create enum object\n");
+        ERR("Cannot create enum object\n");
         HeapFree(GetProcessHeap(), 0, object);
         return ret;
     }
 
+    while (SUCCEEDED(ret = IDirectXFileEnumObject_GetNextDataObject(dxfile_enum_object, &data_object)))
+    {
+        if (object->children)
+            object->children = HeapReAlloc(GetProcessHeap(), 0, object->children, sizeof(LPD3DXFILEDATA) * (object->nb_children + 1));
+        else
+            object->children = HeapAlloc(GetProcessHeap(), 0, sizeof(LPD3DXFILEDATA));
+        if (!object->children)
+        {
+            ret = E_OUTOFMEMORY;
+            break;
+        }
+        ret = ID3DXFileDataImpl_Create((LPDIRECTXFILEOBJECT)data_object, &object->children[object->nb_children]);
+        if (ret != S_OK)
+            break;
+        object->nb_children++;
+    }
+
+    IDirectXFileEnumObject_Release(dxfile_enum_object);
+
+    if (ret != DXFILEERR_NOMOREOBJECTS)
+    {
+        (&object->ID3DXFileEnumObject_iface)->lpVtbl->Release(&object->ID3DXFileEnumObject_iface);
+        return ret;
+    }
+
+    TRACE("Found %u children\n", object->nb_children);
+
     *enum_object = &object->ID3DXFileEnumObject_iface;
 
     return S_OK;




More information about the wine-patches mailing list