[PATCH 04/11] dmscript: Remove the extraneous IUnknown from DirectMusicScript.

Michael Stefaniuc mstefani at redhat.de
Sun Jan 12 15:04:51 CST 2014


Also lock/unlock the module only on creation/destruction of the object.
---
 dlls/dmscript/dmscript_private.h |   2 -
 dlls/dmscript/script.c           | 134 ++++++++++++++++-----------------------
 2 files changed, 55 insertions(+), 81 deletions(-)

diff --git a/dlls/dmscript/dmscript_private.h b/dlls/dmscript/dmscript_private.h
index a7f2ba9..97557bc 100644
--- a/dlls/dmscript/dmscript_private.h
+++ b/dlls/dmscript/dmscript_private.h
@@ -60,8 +60,6 @@ extern HRESULT WINAPI DMUSIC_CreateDirectMusicScriptTrack (LPCGUID lpcGUID, LPVO
  * IDirectMusicScriptImpl implementation structure
  */
 struct IDirectMusicScriptImpl {
-  /* IUnknown fields */
-  const IUnknownVtbl *UnknownVtbl;
   IDirectMusicScript IDirectMusicScript_iface;
   const IDirectMusicObjectVtbl *ObjectVtbl;
   const IPersistStreamVtbl *PersistStreamVtbl;
diff --git a/dlls/dmscript/script.c b/dlls/dmscript/script.c
index 3f25638..a7f26a6 100644
--- a/dlls/dmscript/script.c
+++ b/dlls/dmscript/script.c
@@ -34,91 +34,63 @@ WINE_DECLARE_DEBUG_CHANNEL(dmfile);
 /*****************************************************************************
  * IDirectMusicScriptImpl implementation
  */
-/* IDirectMusicScriptImpl IUnknown part: */
-static HRESULT WINAPI IDirectMusicScriptImpl_IUnknown_QueryInterface (LPUNKNOWN iface, REFIID riid, LPVOID *ppobj) {
-  ICOM_THIS_MULTI(IDirectMusicScriptImpl, UnknownVtbl, iface);
-  TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ppobj);
-  
-  if (IsEqualIID (riid, &IID_IUnknown)) {
-    *ppobj = &This->UnknownVtbl;
-    IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl);
-    return S_OK;	
-  } else if (IsEqualIID (riid, &IID_IDirectMusicScript)) {
-    *ppobj = &This->IDirectMusicScript_iface;
-    IDirectMusicScript_AddRef(&This->IDirectMusicScript_iface);
-    return S_OK;
-  } else if (IsEqualIID (riid, &IID_IDirectMusicObject)) {
-    *ppobj = &This->ObjectVtbl;
-    IDirectMusicObject_AddRef ((LPDIRECTMUSICOBJECT)&This->ObjectVtbl);
-    return S_OK;
-  } else if (IsEqualIID (riid, &IID_IPersistStream)) {
-    *ppobj = &This->PersistStreamVtbl;
-    IPersistStream_AddRef ((LPPERSISTSTREAM)&This->PersistStreamVtbl);
-    return S_OK;
-  }
-  
-  WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ppobj);
-  return E_NOINTERFACE;
-}
-
-static ULONG WINAPI IDirectMusicScriptImpl_IUnknown_AddRef (LPUNKNOWN iface) {
-  ICOM_THIS_MULTI(IDirectMusicScriptImpl, UnknownVtbl, iface);
-  ULONG ref = InterlockedIncrement(&This->ref);
-
-  TRACE("(%p): AddRef from %d\n", This, ref - 1);
-
-  DMSCRIPT_LockModule();
-
-  return ref;
-}
-
-static ULONG WINAPI IDirectMusicScriptImpl_IUnknown_Release (LPUNKNOWN iface) {
-  ICOM_THIS_MULTI(IDirectMusicScriptImpl, UnknownVtbl, iface);
-  ULONG ref = InterlockedDecrement(&This->ref);
-
-  TRACE("(%p): ReleaseRef to %d\n", This, ref);
-
-  if (ref == 0) {
-    HeapFree(GetProcessHeap(), 0, This->pHeader);
-    HeapFree(GetProcessHeap(), 0, This->pVersion);
-    HeapFree(GetProcessHeap(), 0, This->pwzLanguage);
-    HeapFree(GetProcessHeap(), 0, This->pwzSource);
-    HeapFree(GetProcessHeap(), 0, This);
-  }
-
-  DMSCRIPT_UnlockModule();
-  
-  return ref;
-}
-
-static const IUnknownVtbl DirectMusicScript_Unknown_Vtbl = {
-  IDirectMusicScriptImpl_IUnknown_QueryInterface,
-  IDirectMusicScriptImpl_IUnknown_AddRef,
-  IDirectMusicScriptImpl_IUnknown_Release
-};
-
 static inline IDirectMusicScriptImpl *impl_from_IDirectMusicScript(IDirectMusicScript *iface)
 {
   return CONTAINING_RECORD(iface, IDirectMusicScriptImpl, IDirectMusicScript_iface);
 }
 
 static HRESULT WINAPI IDirectMusicScriptImpl_QueryInterface(IDirectMusicScript *iface, REFIID riid,
-        void **ppobj)
+        void **ret_iface)
 {
-  IDirectMusicScriptImpl *This = impl_from_IDirectMusicScript(iface);
-  return IDirectMusicScriptImpl_IUnknown_QueryInterface ((LPUNKNOWN)&This->UnknownVtbl, riid, ppobj);
+    IDirectMusicScriptImpl *This = impl_from_IDirectMusicScript(iface);
+
+    TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ret_iface);
+
+    *ret_iface = NULL;
+
+    if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDirectMusicScript))
+        *ret_iface = iface;
+    else if (IsEqualIID(riid, &IID_IDirectMusicObject))
+        *ret_iface = &This->ObjectVtbl;
+    else if (IsEqualIID(riid, &IID_IPersistStream))
+        *ret_iface = &This->PersistStreamVtbl;
+    else {
+        WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ret_iface);
+        return E_NOINTERFACE;
+    }
+
+    IUnknown_AddRef((IUnknown*)*ret_iface);
+    return S_OK;
 }
 
 static ULONG WINAPI IDirectMusicScriptImpl_AddRef(IDirectMusicScript *iface)
 {
-  IDirectMusicScriptImpl *This = impl_from_IDirectMusicScript(iface);
-  return IDirectMusicScriptImpl_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl);
+    IDirectMusicScriptImpl *This = impl_from_IDirectMusicScript(iface);
+    LONG ref = InterlockedIncrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+
+    return ref;
 }
 
 static ULONG WINAPI IDirectMusicScriptImpl_Release(IDirectMusicScript *iface)
 {
-  IDirectMusicScriptImpl *This = impl_from_IDirectMusicScript(iface);
-  return IDirectMusicScriptImpl_IUnknown_Release ((LPUNKNOWN)&This->UnknownVtbl);
+    IDirectMusicScriptImpl *This = impl_from_IDirectMusicScript(iface);
+    LONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+
+    if (!ref) {
+        HeapFree(GetProcessHeap(), 0, This->pHeader);
+        HeapFree(GetProcessHeap(), 0, This->pVersion);
+        HeapFree(GetProcessHeap(), 0, This->pwzLanguage);
+        HeapFree(GetProcessHeap(), 0, This->pwzSource);
+        HeapFree(GetProcessHeap(), 0, This->pDesc);
+        HeapFree(GetProcessHeap(), 0, This);
+        DMSCRIPT_UnlockModule();
+    }
+
+    return ref;
 }
 
 static HRESULT WINAPI IDirectMusicScriptImpl_Init(IDirectMusicScript *iface,
@@ -223,17 +195,17 @@ static const IDirectMusicScriptVtbl dmscript_vtbl = {
 /* IDirectMusicScriptImpl IDirectMusicObject part: */
 static HRESULT WINAPI IDirectMusicScriptImpl_IDirectMusicObject_QueryInterface (LPDIRECTMUSICOBJECT iface, REFIID riid, LPVOID *ppobj) {
   ICOM_THIS_MULTI(IDirectMusicScriptImpl, ObjectVtbl, iface);
-  return IDirectMusicScriptImpl_IUnknown_QueryInterface ((LPUNKNOWN)&This->UnknownVtbl, riid, ppobj);
+  return IDirectMusicScript_QueryInterface(&This->IDirectMusicScript_iface, riid, ppobj);
 }
 
 static ULONG WINAPI IDirectMusicScriptImpl_IDirectMusicObject_AddRef (LPDIRECTMUSICOBJECT iface) {
   ICOM_THIS_MULTI(IDirectMusicScriptImpl, ObjectVtbl, iface);
-  return IDirectMusicScriptImpl_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl);
+  return IDirectMusicScript_AddRef (&This->IDirectMusicScript_iface);
 }
 
 static ULONG WINAPI IDirectMusicScriptImpl_IDirectMusicObject_Release (LPDIRECTMUSICOBJECT iface) {
   ICOM_THIS_MULTI(IDirectMusicScriptImpl, ObjectVtbl, iface);
-  return IDirectMusicScriptImpl_IUnknown_Release ((LPUNKNOWN)&This->UnknownVtbl);
+  return IDirectMusicScript_Release (&This->IDirectMusicScript_iface);
 }
 
 static HRESULT WINAPI IDirectMusicScriptImpl_IDirectMusicObject_GetDescriptor (LPDIRECTMUSICOBJECT iface, LPDMUS_OBJECTDESC pDesc) {
@@ -438,17 +410,17 @@ static const IDirectMusicObjectVtbl DirectMusicScript_Object_Vtbl = {
 /* IDirectMusicScriptImpl IPersistStream part: */
 static HRESULT WINAPI IDirectMusicScriptImpl_IPersistStream_QueryInterface (LPPERSISTSTREAM iface, REFIID riid, LPVOID *ppobj) {
   ICOM_THIS_MULTI(IDirectMusicScriptImpl, PersistStreamVtbl, iface);
-  return IDirectMusicScriptImpl_IUnknown_QueryInterface ((LPUNKNOWN)&This->UnknownVtbl, riid, ppobj);
+  return IDirectMusicScript_QueryInterface(&This->IDirectMusicScript_iface, riid, ppobj);
 }
 
 static ULONG WINAPI IDirectMusicScriptImpl_IPersistStream_AddRef (LPPERSISTSTREAM iface) {
   ICOM_THIS_MULTI(IDirectMusicScriptImpl, PersistStreamVtbl, iface);
-  return IDirectMusicScriptImpl_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl);
+  return IDirectMusicScript_AddRef(&This->IDirectMusicScript_iface);
 }
 
 static ULONG WINAPI IDirectMusicScriptImpl_IPersistStream_Release (LPPERSISTSTREAM iface) {
   ICOM_THIS_MULTI(IDirectMusicScriptImpl, PersistStreamVtbl, iface);
-  return IDirectMusicScriptImpl_IUnknown_Release ((LPUNKNOWN)&This->UnknownVtbl);
+  return IDirectMusicScript_Release(&This->IDirectMusicScript_iface);
 }
 
 static HRESULT WINAPI IDirectMusicScriptImpl_IPersistStream_GetClassID (LPPERSISTSTREAM iface, CLSID* pClassID) {
@@ -715,6 +687,7 @@ static const IPersistStreamVtbl DirectMusicScript_PersistStream_Vtbl = {
 HRESULT WINAPI DMUSIC_CreateDirectMusicScriptImpl(REFIID lpcGUID, void **ppobj, IUnknown *pUnkOuter)
 {
   IDirectMusicScriptImpl *obj;
+  HRESULT hr;
 
   *ppobj = NULL;
 
@@ -725,7 +698,6 @@ HRESULT WINAPI DMUSIC_CreateDirectMusicScriptImpl(REFIID lpcGUID, void **ppobj,
   if (!obj)
     return E_OUTOFMEMORY;
 
-  obj->UnknownVtbl = &DirectMusicScript_Unknown_Vtbl;
   obj->IDirectMusicScript_iface.lpVtbl = &dmscript_vtbl;
   obj->ObjectVtbl = &DirectMusicScript_Object_Vtbl;
   obj->PersistStreamVtbl = &DirectMusicScript_PersistStream_Vtbl;
@@ -733,7 +705,11 @@ HRESULT WINAPI DMUSIC_CreateDirectMusicScriptImpl(REFIID lpcGUID, void **ppobj,
   DM_STRUCT_INIT(obj->pDesc);
   obj->pDesc->dwValidData |= DMUS_OBJ_CLASS;
   obj->pDesc->guidClass = CLSID_DirectMusicScript;
-  obj->ref = 0; /* will be inited by QueryInterface */
+  obj->ref = 1;
+
+  DMSCRIPT_LockModule();
+  hr = IDirectMusicScript_QueryInterface(&obj->IDirectMusicScript_iface, lpcGUID, ppobj);
+  IDirectMusicScript_Release(&obj->IDirectMusicScript_iface);
 
-  return IDirectMusicScriptImpl_IUnknown_QueryInterface ((LPUNKNOWN)&obj->UnknownVtbl, lpcGUID, ppobj);
+  return hr;
 }
-- 
1.8.3.1



More information about the wine-patches mailing list