[PATCH 4/5] d3dx9_36: Implement ID3DXFileEnumObjectImpl_GetChildren & ID3DXFileEnumObjectImpl_GetChild and add stubbed interface for ID3DXFileData. (try 2)
Christian Costa
titan.costa at gmail.com
Mon Oct 22 16:57:28 CDT 2012
---
dlls/d3dx9_36/xfile.c | 235 +++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 227 insertions(+), 8 deletions(-)
diff --git a/dlls/d3dx9_36/xfile.c b/dlls/d3dx9_36/xfile.c
index ee2ed17..3ade434 100644
--- a/dlls/d3dx9_36/xfile.c
+++ b/dlls/d3dx9_36/xfile.c
@@ -35,9 +35,20 @@ typedef struct {
typedef struct {
ID3DXFileEnumObject ID3DXFileEnumObject_iface;
LONG ref;
- IDirectXFileEnumObject *dxfile_enum_object;
+ ULONG nb_children;
+ ID3DXFileData **children;
} ID3DXFileEnumObjectImpl;
+typedef struct {
+ ID3DXFileData ID3DXFileData_iface;
+ LONG ref;
+ BOOL reference;
+ IDirectXFileData *dxfile_object;
+ ULONG nb_children;
+ ID3DXFileData **children;
+} ID3DXFileDataImpl;
+
+
static inline ID3DXFileImpl* impl_from_ID3DXFile(ID3DXFile *iface)
{
return CONTAINING_RECORD(iface, ID3DXFileImpl, ID3DXFile_iface);
@@ -48,6 +59,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, void **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, ID3DXFileEnumObject **enum_object)
+{
+ FIXME("(%p)->(%p): stub\n", iface, enum_object);
+
+ return E_NOTIMPL;
+}
+
+
+static HRESULT WINAPI ID3DXFileDataImpl_GetName(ID3DXFileData *iface, char *name, SIZE_T *size)
+{
+ FIXME("(%p)->(%p, %p): stub\n", iface, name, size);
+
+ return E_NOTIMPL;
+}
+
+
+static HRESULT WINAPI ID3DXFileDataImpl_GetId(ID3DXFileData *iface, GUID *guid)
+{
+ FIXME("(%p)->(%p): stub\n", iface, guid);
+
+ return E_NOTIMPL;
+}
+
+
+static HRESULT WINAPI ID3DXFileDataImpl_Lock(ID3DXFileData *iface, SIZE_T *size, const void **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, ID3DXFileData **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(IDirectXFileObject *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 = (IDirectXFileData*)dxfile_object;
+
+ *ret_iface = &object->ID3DXFileData_iface;
+
+ return S_OK;
+}
+
/*** IUnknown methods ***/
@@ -87,7 +264,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 +288,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, ID3DXFileData **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 +398,8 @@ static HRESULT WINAPI ID3DXFileImpl_CreateEnumObject(ID3DXFile *iface, const voi
DXFILELOADRESOURCE dxfile_resource;
DXFILELOADMEMORY dxfile_memory;
ID3DXFileEnumObjectImpl *object;
+ IDirectXFileEnumObject *dxfile_enum_object;
+ IDirectXFileData *data_object;
HRESULT ret;
TRACE("(%p)->(%p, %x, %p)\n", iface, source, options, enum_object);
@@ -254,15 +446,42 @@ static HRESULT WINAPI ID3DXFileImpl_CreateEnumObject(ID3DXFile *iface, const voi
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(ID3DXFileData*) * (object->nb_children + 1));
+ else
+ object->children = HeapAlloc(GetProcessHeap(), 0, sizeof(ID3DXFileData*));
+ if (!object->children)
+ {
+ ret = E_OUTOFMEMORY;
+ break;
+ }
+ ret = ID3DXFileDataImpl_Create((IDirectXFileObject*)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