[PATCH] d3dx9_36: Fill children info into ID3DXFileData object.
Christian Costa
titan.costa at gmail.com
Mon Jan 21 01:41:02 CST 2013
---
dlls/d3dx9_36/xfile.c | 67 +++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 62 insertions(+), 5 deletions(-)
diff --git a/dlls/d3dx9_36/xfile.c b/dlls/d3dx9_36/xfile.c
index afc0def..8020467 100644
--- a/dlls/d3dx9_36/xfile.c
+++ b/dlls/d3dx9_36/xfile.c
@@ -60,7 +60,10 @@ typedef struct {
typedef struct {
ID3DXFileData ID3DXFileData_iface;
LONG ref;
+ BOOL reference;
IDirectXFileData *dxfile_data;
+ ULONG nb_children;
+ ID3DXFileData **children;
} ID3DXFileDataImpl;
@@ -117,6 +120,11 @@ static ULONG WINAPI ID3DXFileDataImpl_Release(ID3DXFileData *iface)
if (!ref)
{
+ ULONG i;
+
+ for (i = 0; i < This->nb_children; i++)
+ (This->children[i])->lpVtbl->Release(This->children[i]);
+ HeapFree(GetProcessHeap(), 0, This->children);
IDirectXFileData_Release(This->dxfile_data);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -266,21 +274,70 @@ static const ID3DXFileDataVtbl ID3DXFileData_Vtbl =
};
-static HRESULT ID3DXFileDataImpl_Create(IDirectXFileData *dxfile_data, ID3DXFileData **ret_iface)
+static HRESULT ID3DXFileDataImpl_Create(IDirectXFileObject *dxfile_object, ID3DXFileData **ret_iface)
{
ID3DXFileDataImpl *object;
+ IDirectXFileObject *data_object;
+ HRESULT ret;
- TRACE("(%p, %p)\n", dxfile_data, ret_iface);
+ TRACE("(%p, %p)\n", dxfile_object, ret_iface);
*ret_iface = NULL;
- object = HeapAlloc(GetProcessHeap(), 0, sizeof(*object));
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
if (!object)
return E_OUTOFMEMORY;
object->ID3DXFileData_iface.lpVtbl = &ID3DXFileData_Vtbl;
object->ref = 1;
- object->dxfile_data = dxfile_data;
+
+ ret = IDirectXFileObject_QueryInterface(dxfile_object, &IID_IDirectXFileData, (void **)&object->dxfile_data);
+ if (FAILED(ret))
+ {
+ IDirectXFileDataReference *reference;
+
+ ret = IDirectXFileObject_QueryInterface(dxfile_object, &IID_IDirectXFileDataReference, (void **)&reference);
+ if (SUCCEEDED(ret))
+ {
+ ret = IDirectXFileDataReference_Resolve(reference, &object->dxfile_data);
+ if (FAILED(ret))
+ {
+ HeapFree(GetProcessHeap(), 0, object);
+ return E_FAIL;
+ }
+ }
+ else
+ {
+ FIXME("Don't known what to do with binary object\n");
+ HeapFree(GetProcessHeap(), 0, object);
+ return E_FAIL;
+ }
+ }
+
+ while (SUCCEEDED(ret = IDirectXFileData_GetNextObject(object->dxfile_data, &data_object)))
+ {
+ if (object->children)
+ object->children = HeapReAlloc(GetProcessHeap(), 0, object->children, sizeof(ID3DXFileData*) * (object->nb_children + 1));
+ else
+ object->children = HeapAlloc(GetProcessHeap(), 0, sizeof(ID3DXFileData*));
+ if (!object->children)
+ {
+ ret = E_OUTOFMEMORY;
+ break;
+ }
+ ret = ID3DXFileDataImpl_Create(data_object, &object->children[object->nb_children]);
+ if (ret != S_OK)
+ break;
+ object->nb_children++;
+ }
+
+ if (ret != DXFILEERR_NOMOREOBJECTS)
+ {
+ (&object->ID3DXFileData_iface)->lpVtbl->Release(&object->ID3DXFileData_iface);
+ return ret;
+ }
+
+ TRACE("Found %u children\n", object->nb_children);
*ret_iface = &object->ID3DXFileData_iface;
@@ -534,7 +591,7 @@ static HRESULT WINAPI ID3DXFileImpl_CreateEnumObject(ID3DXFile *iface, const voi
ret = E_OUTOFMEMORY;
break;
}
- ret = ID3DXFileDataImpl_Create(data_object, &object->children[object->nb_children]);
+ ret = ID3DXFileDataImpl_Create((IDirectXFileObject*)data_object, &object->children[object->nb_children]);
if (ret != S_OK)
break;
object->nb_children++;
More information about the wine-patches
mailing list