[PATCH 3/5] d3dx9_36: Implement ID3DXFileImpl_CreateEnumObject with stubbed ID3DXFileEnumObject interface. (try 6)
Christian Costa
titan.costa at gmail.com
Thu Oct 25 16:17:06 CDT 2012
---
dlls/d3dx9_36/xfile.c | 173 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 171 insertions(+), 2 deletions(-)
diff --git a/dlls/d3dx9_36/xfile.c b/dlls/d3dx9_36/xfile.c
index ebaefaf..ae0eda1 100644
--- a/dlls/d3dx9_36/xfile.c
+++ b/dlls/d3dx9_36/xfile.c
@@ -32,12 +32,119 @@ typedef struct {
IDirectXFile *dxfile;
} ID3DXFileImpl;
+typedef struct {
+ ID3DXFileEnumObject ID3DXFileEnumObject_iface;
+ LONG ref;
+} ID3DXFileEnumObjectImpl;
static inline ID3DXFileImpl* impl_from_ID3DXFile(ID3DXFile *iface)
{
return CONTAINING_RECORD(iface, ID3DXFileImpl, ID3DXFile_iface);
}
+static inline ID3DXFileEnumObjectImpl* impl_from_ID3DXFileEnumObject(ID3DXFileEnumObject *iface)
+{
+ return CONTAINING_RECORD(iface, ID3DXFileEnumObjectImpl, ID3DXFileEnumObject_iface);
+}
+
+
+/*** IUnknown methods ***/
+
+static HRESULT WINAPI ID3DXFileEnumObjectImpl_QueryInterface(ID3DXFileEnumObject *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_ID3DXFileEnumObject))
+ {
+ iface->lpVtbl->AddRef(iface);
+ *ret_iface = iface;
+ return S_OK;
+ }
+
+ WARN("(%p)->(%s, %p), not found\n", iface, debugstr_guid(riid), ret_iface);
+ *ret_iface = NULL;
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI ID3DXFileEnumObjectImpl_AddRef(ID3DXFileEnumObject *iface)
+{
+ ID3DXFileEnumObjectImpl *This = impl_from_ID3DXFileEnumObject(iface);
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p)->(): new ref %d\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI ID3DXFileEnumObjectImpl_Release(ID3DXFileEnumObject *iface)
+{
+ ID3DXFileEnumObjectImpl *This = impl_from_ID3DXFileEnumObject(iface);
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p)->(): new ref %d\n", iface, ref);
+
+ if (!ref)
+ HeapFree(GetProcessHeap(), 0, This);
+
+ return ref;
+}
+
+
+/*** ID3DXFileEnumObject methods ***/
+
+static HRESULT WINAPI ID3DXFileEnumObjectImpl_GetFile(ID3DXFileEnumObject *iface, ID3DXFile **file)
+{
+ FIXME("(%p)->(%p): stub\n", iface, file);
+
+ return E_NOTIMPL;
+}
+
+
+static HRESULT WINAPI ID3DXFileEnumObjectImpl_GetChildren(ID3DXFileEnumObject *iface, SIZE_T *children)
+{
+ FIXME("(%p)->(%p): stub\n", iface, children);
+
+ return E_NOTIMPL;
+}
+
+
+static HRESULT WINAPI ID3DXFileEnumObjectImpl_GetChild(ID3DXFileEnumObject *iface, SIZE_T id, ID3DXFileData **object)
+{
+ FIXME("(%p)->(%lu, %p): stub\n", iface, id, object);
+
+ return E_NOTIMPL;
+}
+
+
+static HRESULT WINAPI ID3DXFileEnumObjectImpl_GetDataObjectById(ID3DXFileEnumObject *iface, REFGUID guid, ID3DXFileData **object)
+{
+ FIXME("(%p)->(%s, %p): stub\n", iface, debugstr_guid(guid), object);
+
+ return E_NOTIMPL;
+}
+
+
+static HRESULT WINAPI ID3DXFileEnumObjectImpl_GetDataObjectByName(ID3DXFileEnumObject *iface, const char *name, ID3DXFileData **object)
+{
+ FIXME("(%p)->(%s, %p): stub\n", iface, debugstr_a(name), object);
+
+ return E_NOTIMPL;
+}
+
+
+static const ID3DXFileEnumObjectVtbl ID3DXFileEnumObject_Vtbl =
+{
+ ID3DXFileEnumObjectImpl_QueryInterface,
+ ID3DXFileEnumObjectImpl_AddRef,
+ ID3DXFileEnumObjectImpl_Release,
+ ID3DXFileEnumObjectImpl_GetFile,
+ ID3DXFileEnumObjectImpl_GetChildren,
+ ID3DXFileEnumObjectImpl_GetChild,
+ ID3DXFileEnumObjectImpl_GetDataObjectById,
+ ID3DXFileEnumObjectImpl_GetDataObjectByName
+};
+
/*** IUnknown methods ***/
@@ -91,9 +198,71 @@ static ULONG WINAPI ID3DXFileImpl_Release(ID3DXFile *iface)
static HRESULT WINAPI ID3DXFileImpl_CreateEnumObject(ID3DXFile *iface, const void *source, D3DXF_FILELOADOPTIONS options, ID3DXFileEnumObject **enum_object)
{
- FIXME("(%p)->(%p, %x, %p): stub\n", iface, source, options, enum_object);
+ ID3DXFileImpl *This = impl_from_ID3DXFile(iface);
+ ID3DXFileEnumObjectImpl *object;
+ IDirectXFileEnumObject *dxfile_enum_object;
+ void *dxfile_source;
+ DXFILELOADOPTIONS dxfile_options;
+ DXFILELOADRESOURCE dxfile_resource;
+ DXFILELOADMEMORY dxfile_memory;
+ HRESULT ret;
- return E_NOTIMPL;
+ FIXME("(%p)->(%p, %x, %p): partial stub\n", iface, source, options, enum_object);
+
+ *enum_object = NULL;
+
+ if (options == D3DXF_FILELOAD_FROMFILE)
+ {
+ dxfile_source = (void*)source;
+ dxfile_options = DXFILELOAD_FROMFILE;
+ }
+ else if (options == D3DXF_FILELOAD_FROMRESOURCE)
+ {
+ D3DXF_FILELOADRESOURCE *resource = (D3DXF_FILELOADRESOURCE*)source;
+
+ dxfile_resource.hModule = resource->hModule;
+ dxfile_resource.lpName = resource->lpName;
+ dxfile_resource.lpType = resource->lpType;
+ dxfile_source = &dxfile_resource;
+ dxfile_options = DXFILELOAD_FROMRESOURCE;
+ }
+ else if (options == D3DXF_FILELOAD_FROMMEMORY)
+ {
+ D3DXF_FILELOADMEMORY *memory = (D3DXF_FILELOADMEMORY*)source;
+
+ dxfile_memory.lpMemory = memory->lpMemory;
+ dxfile_memory.dSize = memory->dSize;
+ dxfile_source = &dxfile_memory;
+ dxfile_options = DXFILELOAD_FROMMEMORY;
+ }
+ else
+ {
+ FIXME("Source type %u is not handled yet\n", options);
+ return E_NOTIMPL;
+ }
+
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
+ if (!object)
+ return E_OUTOFMEMORY;
+
+ object->ID3DXFileEnumObject_iface.lpVtbl = &ID3DXFileEnumObject_Vtbl;
+ object->ref = 1;
+
+ ret = IDirectXFile_CreateEnumObject(This->dxfile, dxfile_source, dxfile_options, &dxfile_enum_object);
+
+ if (ret != S_OK)
+ {
+ HeapFree(GetProcessHeap(), 0, object);
+ return ret;
+ }
+
+ /* FIXME: Fill enum object with top level data objects */
+
+ IDirectXFileEnumObject_Release(dxfile_enum_object);
+
+ *enum_object = &object->ID3DXFileEnumObject_iface;
+
+ return S_OK;
}
More information about the wine-patches
mailing list