dmloader: COM cleanup for IDirectMusicContainer.

Michael Stefaniuc mstefani at redhat.de
Wed Jun 4 16:34:20 CDT 2014


---
 dlls/dmloader/container.c        | 139 ++++++++++++++++++++++-----------------
 dlls/dmloader/dmloader_private.h |  21 ------
 2 files changed, 80 insertions(+), 80 deletions(-)

diff --git a/dlls/dmloader/container.c b/dlls/dmloader/container.c
index 4fb5f97..8c3c786 100644
--- a/dlls/dmloader/container.c
+++ b/dlls/dmloader/container.c
@@ -27,14 +27,24 @@ WINE_DECLARE_DEBUG_CHANNEL(dmdump);
 #define DMUS_MAX_NAME_SIZE     DMUS_MAX_NAME*sizeof(WCHAR)
 #define DMUS_MAX_FILENAME_SIZE DMUS_MAX_FILENAME*sizeof(WCHAR)
 
-static ULONG WINAPI IDirectMusicContainerImpl_IDirectMusicContainer_AddRef (LPDIRECTMUSICCONTAINER iface);
-static ULONG WINAPI IDirectMusicContainerImpl_IDirectMusicObject_AddRef (LPDIRECTMUSICOBJECT iface);
-static ULONG WINAPI IDirectMusicContainerImpl_IPersistStream_AddRef (LPPERSISTSTREAM iface);
-
 /*****************************************************************************
  * IDirectMusicContainerImpl implementation
  */
-/* IUnknown/IDirectMusicContainer part: */
+typedef struct IDirectMusicContainerImpl {
+    IDirectMusicContainer IDirectMusicContainer_iface;
+    const IDirectMusicObjectVtbl *ObjectVtbl;
+    const IPersistStreamVtbl *PersistStreamVtbl;
+    LONG ref;
+    IStream *pStream;
+    DMUS_IO_CONTAINER_HEADER Header; /* header */
+    struct list *pContainedObjects;  /* data */
+    DMUS_OBJECTDESC Desc;
+} IDirectMusicContainerImpl;
+
+static inline IDirectMusicContainerImpl *impl_from_IDirectMusicContainer(IDirectMusicContainer *iface)
+{
+    return CONTAINING_RECORD(iface, IDirectMusicContainerImpl, IDirectMusicContainer_iface);
+}
 
 static HRESULT destroy_dmcontainer(IDirectMusicContainerImpl *This)
 {
@@ -72,52 +82,59 @@ static HRESULT destroy_dmcontainer(IDirectMusicContainerImpl *This)
 	return S_OK;
 }
 
-static HRESULT WINAPI IDirectMusicContainerImpl_IDirectMusicContainer_QueryInterface (LPDIRECTMUSICCONTAINER iface, REFIID riid, LPVOID *ppobj) {
-	ICOM_THIS_MULTI(IDirectMusicContainerImpl, ContainerVtbl, iface);
-	
-	TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ppobj);
-	if (IsEqualIID (riid, &IID_IUnknown) ||
-		IsEqualIID (riid, &IID_IDirectMusicContainer)) {
-		*ppobj = &This->ContainerVtbl;
-		IDirectMusicContainerImpl_IDirectMusicContainer_AddRef ((LPDIRECTMUSICCONTAINER)&This->ContainerVtbl);
-		return S_OK;
-	} else if (IsEqualIID (riid, &IID_IDirectMusicObject)) {
-		*ppobj = &This->ObjectVtbl;
-		IDirectMusicContainerImpl_IDirectMusicObject_AddRef ((LPDIRECTMUSICOBJECT)&This->ObjectVtbl);		
-		return S_OK;
-	} else if (IsEqualIID (riid, &IID_IPersistStream)) {
-		*ppobj = &This->PersistStreamVtbl;
-		IDirectMusicContainerImpl_IPersistStream_AddRef ((LPPERSISTSTREAM)&This->PersistStreamVtbl);		
-		return S_OK;
-	}
-	
-	WARN(": not found\n");
-	return E_NOINTERFACE;
+static HRESULT WINAPI IDirectMusicContainerImpl_QueryInterface(IDirectMusicContainer *iface, REFIID riid, void **ret_iface)
+{
+    IDirectMusicContainerImpl *This = impl_from_IDirectMusicContainer(iface);
+
+    TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ret_iface);
+
+    if (IsEqualIID (riid, &IID_IUnknown) || IsEqualIID (riid, &IID_IDirectMusicContainer))
+        *ret_iface = &This->IDirectMusicContainer_iface;
+    else if (IsEqualIID (riid, &IID_IDirectMusicObject))
+        *ret_iface = &This->ObjectVtbl;
+    else if (IsEqualIID (riid, &IID_IPersistStream))
+        *ret_iface = &This->PersistStreamVtbl;
+    else {
+        WARN("Unknown interface %s\n", debugstr_dmguid(riid));
+        *ret_iface = NULL;
+        return E_NOINTERFACE;
+    }
+
+    IUnknown_AddRef((IUnknown*)*ret_iface);
+    return S_OK;
 }
 
-static ULONG WINAPI IDirectMusicContainerImpl_IDirectMusicContainer_AddRef (LPDIRECTMUSICCONTAINER iface) {
-	ICOM_THIS_MULTI(IDirectMusicContainerImpl, ContainerVtbl, iface);
-	TRACE("(%p): AddRef from %d\n", This, This->dwRef);
-	return InterlockedIncrement (&This->dwRef);
+static ULONG WINAPI IDirectMusicContainerImpl_AddRef(IDirectMusicContainer *iface)
+{
+    IDirectMusicContainerImpl *This = impl_from_IDirectMusicContainer(iface);
+    LONG ref = InterlockedIncrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+
+    return ref;
 }
 
-static ULONG WINAPI IDirectMusicContainerImpl_IDirectMusicContainer_Release (LPDIRECTMUSICCONTAINER iface) {
-	ICOM_THIS_MULTI(IDirectMusicContainerImpl, ContainerVtbl, iface);
-	
-	DWORD dwRef = InterlockedDecrement (&This->dwRef);
-	TRACE("(%p): ReleaseRef to %d\n", This, dwRef);
-	if (dwRef == 0) {
-                if (This->pStream)
-                        destroy_dmcontainer(This);
-		HeapFree(GetProcessHeap(), 0, This);
-                unlock_module();
-	}
-	
-	return dwRef;
+static ULONG WINAPI IDirectMusicContainerImpl_Release(IDirectMusicContainer *iface)
+{
+    IDirectMusicContainerImpl *This = impl_from_IDirectMusicContainer(iface);
+    LONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+
+    if (!ref) {
+        if (This->pStream)
+            destroy_dmcontainer(This);
+        HeapFree(GetProcessHeap(), 0, This);
+        unlock_module();
+    }
+
+    return ref;
 }
 
-static HRESULT WINAPI IDirectMusicContainerImpl_IDirectMusicContainer_EnumObject (LPDIRECTMUSICCONTAINER iface, REFGUID rguidClass, DWORD dwIndex, LPDMUS_OBJECTDESC pDesc, WCHAR* pwszAlias) {
-	ICOM_THIS_MULTI(IDirectMusicContainerImpl, ContainerVtbl, iface);	
+static HRESULT WINAPI IDirectMusicContainerImpl_EnumObject(IDirectMusicContainer *iface,
+        REFGUID rguidClass, DWORD dwIndex, DMUS_OBJECTDESC *pDesc, WCHAR *pwszAlias)
+{
+	IDirectMusicContainerImpl *This = impl_from_IDirectMusicContainer(iface);
 	struct list *pEntry;
 	LPWINE_CONTAINER_ENTRY pContainedObject;
 	DWORD dwCount = 0;
@@ -155,27 +172,27 @@ static HRESULT WINAPI IDirectMusicContainerImpl_IDirectMusicContainer_EnumObject
 	return S_FALSE;
 }
 
-static const IDirectMusicContainerVtbl DirectMusicContainer_Container_Vtbl = {
-	IDirectMusicContainerImpl_IDirectMusicContainer_QueryInterface,
-	IDirectMusicContainerImpl_IDirectMusicContainer_AddRef,
-	IDirectMusicContainerImpl_IDirectMusicContainer_Release,
-	IDirectMusicContainerImpl_IDirectMusicContainer_EnumObject
+static const IDirectMusicContainerVtbl dmcontainer_vtbl = {
+    IDirectMusicContainerImpl_QueryInterface,
+    IDirectMusicContainerImpl_AddRef,
+    IDirectMusicContainerImpl_Release,
+    IDirectMusicContainerImpl_EnumObject
 };
 
 /* IDirectMusicObject part: */
 static HRESULT WINAPI IDirectMusicContainerImpl_IDirectMusicObject_QueryInterface (LPDIRECTMUSICOBJECT iface, REFIID riid, LPVOID *ppobj) {
 	ICOM_THIS_MULTI(IDirectMusicContainerImpl, ObjectVtbl, iface);
-	return IDirectMusicContainerImpl_IDirectMusicContainer_QueryInterface ((LPDIRECTMUSICCONTAINER)&This->ContainerVtbl, riid, ppobj);
+	return IDirectMusicContainerImpl_QueryInterface(&This->IDirectMusicContainer_iface, riid, ppobj);
 }
 
 static ULONG WINAPI IDirectMusicContainerImpl_IDirectMusicObject_AddRef (LPDIRECTMUSICOBJECT iface) {
 	ICOM_THIS_MULTI(IDirectMusicContainerImpl, ObjectVtbl, iface);
-	return IDirectMusicContainerImpl_IDirectMusicContainer_AddRef ((LPDIRECTMUSICCONTAINER)&This->ContainerVtbl);
+	return IDirectMusicContainer_AddRef(&This->IDirectMusicContainer_iface);
 }
 
 static ULONG WINAPI IDirectMusicContainerImpl_IDirectMusicObject_Release (LPDIRECTMUSICOBJECT iface) {
 	ICOM_THIS_MULTI(IDirectMusicContainerImpl, ObjectVtbl, iface);
-	return IDirectMusicContainerImpl_IDirectMusicContainer_Release ((LPDIRECTMUSICCONTAINER)&This->ContainerVtbl);
+	return IDirectMusicContainerImpl_Release(&This->IDirectMusicContainer_iface);
 }
 
 static HRESULT WINAPI IDirectMusicContainerImpl_IDirectMusicObject_GetDescriptor (LPDIRECTMUSICOBJECT iface, LPDMUS_OBJECTDESC pDesc) {
@@ -439,17 +456,17 @@ static const IDirectMusicObjectVtbl DirectMusicContainer_Object_Vtbl = {
 /* IPersistStream part: */
 static HRESULT WINAPI IDirectMusicContainerImpl_IPersistStream_QueryInterface (LPPERSISTSTREAM iface, REFIID riid, LPVOID *ppobj) {
 	ICOM_THIS_MULTI(IDirectMusicContainerImpl, PersistStreamVtbl, iface);
-	return IDirectMusicContainerImpl_IDirectMusicContainer_QueryInterface ((LPDIRECTMUSICCONTAINER)&This->ContainerVtbl, riid, ppobj);
+	return IDirectMusicContainerImpl_QueryInterface(&This->IDirectMusicContainer_iface, riid, ppobj);
 }
 
 static ULONG WINAPI IDirectMusicContainerImpl_IPersistStream_AddRef (LPPERSISTSTREAM iface) {
 	ICOM_THIS_MULTI(IDirectMusicContainerImpl, PersistStreamVtbl, iface);
-	return IDirectMusicContainerImpl_IDirectMusicContainer_AddRef ((LPDIRECTMUSICCONTAINER)&This->ContainerVtbl);
+	return IDirectMusicContainer_AddRef(&This->IDirectMusicContainer_iface);
 }
 
 static ULONG WINAPI IDirectMusicContainerImpl_IPersistStream_Release (LPPERSISTSTREAM iface) {
 	ICOM_THIS_MULTI(IDirectMusicContainerImpl, PersistStreamVtbl, iface);
-	return IDirectMusicContainerImpl_IDirectMusicContainer_Release ((LPDIRECTMUSICCONTAINER)&This->ContainerVtbl);
+	return IDirectMusicContainerImpl_Release(&This->IDirectMusicContainer_iface);
 }
 
 static HRESULT WINAPI IDirectMusicContainerImpl_IPersistStream_GetClassID (LPPERSISTSTREAM iface, CLSID* pClassID) {
@@ -913,20 +930,24 @@ static const IPersistStreamVtbl DirectMusicContainer_PersistStream_Vtbl = {
 HRESULT WINAPI create_dmcontainer(REFIID lpcGUID, void **ppobj)
 {
 	IDirectMusicContainerImpl* obj;
+        HRESULT hr;
 
 	obj = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicContainerImpl));
 	if (NULL == obj) {
 		*ppobj = NULL;
 		return E_OUTOFMEMORY;
 	}
-	obj->ContainerVtbl = &DirectMusicContainer_Container_Vtbl;
+        obj->IDirectMusicContainer_iface.lpVtbl = &dmcontainer_vtbl;
 	obj->ObjectVtbl = &DirectMusicContainer_Object_Vtbl;
 	obj->PersistStreamVtbl = &DirectMusicContainer_PersistStream_Vtbl;
-	obj->dwRef = 0; /* will be inited by QueryInterface */
+        obj->ref = 1;
 	obj->pContainedObjects = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(struct list));
 	list_init (obj->pContainedObjects);
 
 	lock_module();
 
-	return IDirectMusicContainerImpl_IDirectMusicContainer_QueryInterface ((LPDIRECTMUSICCONTAINER)&obj->ContainerVtbl, lpcGUID, ppobj);
+        hr = IDirectMusicContainer_QueryInterface(&obj->IDirectMusicContainer_iface, lpcGUID, ppobj);
+        IDirectMusicContainer_Release(&obj->IDirectMusicContainer_iface);
+
+        return hr;
 }
diff --git a/dlls/dmloader/dmloader_private.h b/dlls/dmloader/dmloader_private.h
index f01acfc..ff22604 100644
--- a/dlls/dmloader/dmloader_private.h
+++ b/dlls/dmloader/dmloader_private.h
@@ -56,7 +56,6 @@ typedef struct IDirectMusicLoaderCF             IDirectMusicLoaderCF;
 typedef struct IDirectMusicContainerCF          IDirectMusicContainerCF;
 
 typedef struct IDirectMusicLoaderImpl           IDirectMusicLoaderImpl;
-typedef struct IDirectMusicContainerImpl        IDirectMusicContainerImpl;
 
 typedef struct IDirectMusicLoaderFileStream     IDirectMusicLoaderFileStream;
 typedef struct IDirectMusicLoaderResourceStream IDirectMusicLoaderResourceStream;
@@ -110,26 +109,6 @@ typedef struct _WINE_CONTAINER_ENTRY {
 } WINE_CONTAINER_ENTRY, *LPWINE_CONTAINER_ENTRY;
 
 /*****************************************************************************
- * IDirectMusicContainerImpl implementation structure
- */
-struct IDirectMusicContainerImpl {
-	/* VTABLEs */
-	const IDirectMusicContainerVtbl *ContainerVtbl;
-	const IDirectMusicObjectVtbl *ObjectVtbl;
-	const IPersistStreamVtbl *PersistStreamVtbl;
-	/* reference counter */
-	LONG dwRef;
-	/* stream */
-	LPSTREAM pStream;
-	/* header */
-	DMUS_IO_CONTAINER_HEADER Header;
-	/* data */
-	struct list *pContainedObjects;	
-	/* descriptor */
-	DMUS_OBJECTDESC Desc;
-};
-
-/*****************************************************************************
  * IDirectMusicLoaderFileStream implementation structure
  */
 struct IDirectMusicLoaderFileStream {
-- 
1.8.3.1



More information about the wine-patches mailing list