[PATCH 3/3 v2] dmloader: Rewrite IDirectMusicLoader8 ReleaseObject using find_cache_object

Michael Stefaniuc mstefani at winehq.org
Mon Nov 25 14:22:08 CST 2019


From: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>

Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>
---
v2: whitespace


 dlls/dmloader/loader.c | 87 +++++++++++++-----------------------------
 1 file changed, 26 insertions(+), 61 deletions(-)

diff --git a/dlls/dmloader/loader.c b/dlls/dmloader/loader.c
index c8d04927fd..42209def94 100644
--- a/dlls/dmloader/loader.c
+++ b/dlls/dmloader/loader.c
@@ -685,70 +685,35 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_CacheObject(IDirectMusicLoader8 *if
     return DMUS_E_LOADER_OBJECTNOTFOUND;
 }
 
-static HRESULT WINAPI IDirectMusicLoaderImpl_ReleaseObject(IDirectMusicLoader8 *iface, IDirectMusicObject *pObject)
+static HRESULT WINAPI IDirectMusicLoaderImpl_ReleaseObject(IDirectMusicLoader8 *iface,
+                IDirectMusicObject *object)
 {
-	IDirectMusicLoaderImpl *This = impl_from_IDirectMusicLoader8(iface);
-	DMUS_OBJECTDESC Desc;
-        struct cache_entry *pObjectEntry;
-	HRESULT result = S_FALSE;
+    IDirectMusicLoaderImpl *This = impl_from_IDirectMusicLoader8(iface);
+    DMUS_OBJECTDESC desc;
+    struct cache_entry *entry;
 
-	TRACE("(%p, %p)\n", This, pObject);
-	
-	if(!pObject) return E_POINTER;
+    TRACE("(%p, %p)\n", This, object);
 
-	/* get descriptor */
-	DM_STRUCT_INIT(&Desc);
-	IDirectMusicObject_GetDescriptor (pObject, &Desc);
-	
-	/* iterate through the list of objects we know about; check only those with DMUS_OBJ_LOADED */
-	TRACE(": looking for the object in cache\n");
-        LIST_FOR_EACH_ENTRY(pObjectEntry, &This->cache, struct cache_entry, entry) {
-		if ((Desc.dwValidData & DMUS_OBJ_OBJECT) &&
-			(pObjectEntry->Desc.dwValidData & (DMUS_OBJ_OBJECT | DMUS_OBJ_LOADED)) &&
-			IsEqualGUID (&Desc.guidObject, &pObjectEntry->Desc.guidObject)) {
-			TRACE(": found it by object GUID\n");
-			if (TRACE_ON(dmloader))
-				dump_DMUS_OBJECTDESC(&pObjectEntry->Desc);
-			result = S_OK;
-			break;
-		}
-		else if ((Desc.dwValidData & (DMUS_OBJ_FILENAME | DMUS_OBJ_FULLPATH)) &&
-				(pObjectEntry->Desc.dwValidData & (DMUS_OBJ_FILENAME | DMUS_OBJ_FULLPATH | DMUS_OBJ_LOADED)) &&
-				!wcsncmp (Desc.wszFileName, pObjectEntry->Desc.wszFileName, DMUS_MAX_FILENAME)) {
-			TRACE(": found it by fullpath filename\n");
-			result = S_OK;			
-			break;
-		}
-		else if ((Desc.dwValidData & (DMUS_OBJ_NAME | DMUS_OBJ_CATEGORY)) &&
-				(pObjectEntry->Desc.dwValidData & (DMUS_OBJ_NAME | DMUS_OBJ_CATEGORY | DMUS_OBJ_LOADED)) &&
-				!wcsncmp (Desc.wszName, pObjectEntry->Desc.wszName, DMUS_MAX_NAME) &&
-				!wcsncmp (Desc.wszCategory, pObjectEntry->Desc.wszCategory, DMUS_MAX_CATEGORY)) {
-			TRACE(": found it by name and category\n");
-			result = S_OK;			
-			break;
-		}
-		else if ((Desc.dwValidData & DMUS_OBJ_NAME) &&
-				(pObjectEntry->Desc.dwValidData & (DMUS_OBJ_NAME | DMUS_OBJ_LOADED)) &&
-				!wcsncmp (Desc.wszName, pObjectEntry->Desc.wszName, DMUS_MAX_NAME)) {
-			TRACE(": found it by name\n");
-			result = S_OK;
-			break;
-		}
-		else if ((Desc.dwValidData & DMUS_OBJ_FILENAME) &&
-				(pObjectEntry->Desc.dwValidData & (DMUS_OBJ_FILENAME | DMUS_OBJ_LOADED)) &&
-				!wcsncmp (Desc.wszFileName, pObjectEntry->Desc.wszFileName, DMUS_MAX_FILENAME)) {
-			TRACE(": found it by filename\n");
-			result = S_OK;			
-			break;
-		}
-	}
-	if (result == S_OK) {
-		/*TRACE(": releasing:\n%s  - bInvalidDefaultDLS = %i\n  - pObject = %p\n", debugstr_DMUS_OBJECTDESC(&pObjectEntry->Desc), pObjectEntry->bInvalidDefaultDLS, pObjectEntry->pObject); */
-		IDirectMusicObject_Release (pObjectEntry->pObject);
-		pObjectEntry->pObject = NULL;
-		pObjectEntry->Desc.dwValidData &= ~DMUS_OBJ_LOADED;
-	} 
-	return result;
+    if (!object)
+        return E_POINTER;
+
+    DM_STRUCT_INIT(&desc);
+    IDirectMusicObject_GetDescriptor(object, &desc);
+
+    TRACE("Looking for the object in cache\n");
+    entry = find_cache_object(This, &desc);
+    if (entry) {
+        dump_DMUS_OBJECTDESC(&entry->Desc);
+
+        if (entry->pObject && entry->Desc.dwValidData & DMUS_OBJ_LOADED) {
+            IDirectMusicObject_Release(entry->pObject);
+            entry->pObject = NULL;
+            entry->Desc.dwValidData &= ~DMUS_OBJ_LOADED;
+            return S_OK;
+        }
+    }
+
+    return S_FALSE;
 }
 
 static HRESULT WINAPI IDirectMusicLoaderImpl_ClearCache(IDirectMusicLoader8 *iface, REFGUID class)
-- 
2.20.1




More information about the wine-devel mailing list