From 62ddeb9da5c5f04b1fdfa5085c7b22833848ba7c Mon Sep 17 00:00:00 2001 From: Raphael Junqueira Date: Fri, 31 Oct 2003 00:08:02 +0000 Subject: [PATCH] - better traces - some IPersistStream::GetClassID implementation - add the "search by name" support for IDirectMusicLoader8::GetObject (and a hack for understanding containers use) --- dlls/dmloader/dmloader_private.h | 1 + dlls/dmloader/loader.c | 79 ++++++++++++++++++++++++++++++---------- dlls/dmscript/script.c | 4 +- dlls/dmscript/scripttrack.c | 3 +- 4 files changed, 66 insertions(+), 21 deletions(-) diff --git a/dlls/dmloader/dmloader_private.h b/dlls/dmloader/dmloader_private.h index 1f5b2e97f74..e705156cf9a 100644 --- a/dlls/dmloader/dmloader_private.h +++ b/dlls/dmloader/dmloader_private.h @@ -43,6 +43,7 @@ typedef struct _DMUS_PRIVATE_CACHE_ENTRY { struct list entry; /* for listing elements */ GUID guidObject; WCHAR wzFileName[MAX_PATH]; + WCHAR wzName[256]; IDirectMusicObject* pObject; } DMUS_PRIVATE_CACHE_ENTRY, *LPDMUS_PRIVATE_CACHE_ENTRY; diff --git a/dlls/dmloader/loader.c b/dlls/dmloader/loader.c index 678c86684c4..733e9fe1a05 100644 --- a/dlls/dmloader/loader.c +++ b/dlls/dmloader/loader.c @@ -78,7 +78,7 @@ HRESULT WINAPI IDirectMusicLoader8Impl_GetObject (LPDIRECTMUSICLOADER8 iface, LP DMUS_PRIVATE_CACHE_ENTRY *cacheEntry; LPDMUS_PRIVATE_CACHE_ENTRY newEntry; - TRACE("(%p, %p, %s, %p)\n", This, pDesc, debugstr_guid(riid), ppv); + TRACE("(%p, %p(dwValidData:0x%08lx), %s, %p)\n", This, pDesc, pDesc->dwValidData, debugstr_guid(riid), ppv); TRACE("looking up cache...\n"); @@ -90,53 +90,94 @@ HRESULT WINAPI IDirectMusicLoader8Impl_GetObject (LPDIRECTMUSICLOADER8 iface, LP if (IsEqualGUID (&cacheEntry->guidObject, &pDesc->guidObject)) { TRACE(": found it by GUID\n"); if (cacheEntry->pObject) - return IDirectMusicObject_QueryInterface ((LPDIRECTMUSICOBJECT)cacheEntry->pObject, riid, ppv); + return IDirectMusicObject_QueryInterface ((LPDIRECTMUSICOBJECT) cacheEntry->pObject, riid, ppv); } } if (pDesc->dwValidData & DMUS_OBJ_FILENAME) { if (cacheEntry->wzFileName && !strncmpW (pDesc->wszFileName, cacheEntry->wzFileName, MAX_PATH)) { TRACE(": found it by FileName\n"); if (cacheEntry->pObject) - return IDirectMusicObject_QueryInterface ((LPDIRECTMUSICOBJECT)cacheEntry->pObject, riid, ppv); + return IDirectMusicObject_QueryInterface ((LPDIRECTMUSICOBJECT) cacheEntry->pObject, riid, ppv); } } + } else if (pDesc->dwValidData & DMUS_OBJ_NAME) { + /** + * Usually search by name (for example main procedure name for scripts) after containers loading + * TODO: container loading code + */ + TRACE(" comparing %s with cached %s (file:%s)\n", debugstr_w (pDesc->wszName), debugstr_w (cacheEntry->wzName), debugstr_w(cacheEntry->wzFileName)); + if (cacheEntry->wzName && !strncmpW (pDesc->wszName, cacheEntry->wzName, 256)) { + TRACE(": found it by Name\n"); + if (NULL != cacheEntry->pObject) + return IDirectMusicObject_QueryInterface ((LPDIRECTMUSICOBJECT) cacheEntry->pObject, riid, ppv); + } } } /* object doesn't exist in cache... guess we'll have to load it */ TRACE(": object does not exist in cache\n"); - result = CoCreateInstance (&pDesc->guidClass, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicObject, (LPVOID*)&pObject); + if (pDesc->dwValidData & DMUS_OBJ_LOADED) { + ERR("Wanted a on-memory (cached) entry, but not found. Active Hack (waiting for Load code)\n"); + /* ugly hack waiting for Load impl */ + result = CoCreateInstance (&pDesc->guidClass, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicObject, (LPVOID*) &pObject); + if (SUCCEEDED(result)) { + /* add object to cache */ + result = IDirectMusicObject_QueryInterface (pObject, riid, ppv); + if (SUCCEEDED(result)) { + newEntry = (LPDMUS_PRIVATE_CACHE_ENTRY) HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(DMUS_PRIVATE_CACHE_ENTRY)); + if (pDesc->dwValidData & DMUS_OBJ_NAME) + strncpyW (newEntry->wzName, pDesc->wszName, 256); + newEntry->pObject = pObject; + list_add_tail (&This->CacheList, &newEntry->entry); + TRACE(": filled in cache entry\n"); + } else { + IDirectMusicObject_Release(pObject); + } + } + return result; + /* + * Normal code + *ppv = NULL; + return E_FAIL; + */ + } + if (!(pDesc->dwValidData & DMUS_OBJ_CLASS)) { + WARN("guidClass not valid but needed. What they want to do ?\n"); + *ppv = NULL; + return DMUS_E_LOADER_NOCLASSID; + } + result = CoCreateInstance (&pDesc->guidClass, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicObject, (LPVOID*) &pObject); if (FAILED(result)) return result; if (pDesc->dwValidData & DMUS_OBJ_FILENAME) { /* load object from file */ WCHAR wzFileName[MAX_PATH]; ILoaderStream* pStream; - IPersistStream *pPersistStream = NULL; + IPersistStream* pPersistStream = NULL; /* if it's full path, don't add search directory path, otherwise do */ if (pDesc->dwValidData & DMUS_OBJ_FULLPATH) { - lstrcpyW( wzFileName, pDesc->wszFileName ); + lstrcpyW(wzFileName, pDesc->wszFileName); } else { WCHAR *p; - lstrcpyW( wzFileName, This->wzSearchPath ); + lstrcpyW(wzFileName, This->wzSearchPath); p = wzFileName + lstrlenW(wzFileName); if (p > wzFileName && p[-1] != '\\') *p++ = '\\'; - strcpyW( p, pDesc->wszFileName ); + strcpyW(p, pDesc->wszFileName); } TRACE(": loading from file (%s)\n", debugstr_w(wzFileName)); - result = DMUSIC_CreateLoaderStream ((LPSTREAM*)&pStream); + result = DMUSIC_CreateLoaderStream ((LPSTREAM*) &pStream); if (FAILED(result)) return result; - result = ILoaderStream_Attach (pStream, wzFileName, (LPDIRECTMUSICLOADER)iface); + result = ILoaderStream_Attach (pStream, wzFileName, (LPDIRECTMUSICLOADER) iface); if (FAILED(result)) return result; - result = IDirectMusicObject_QueryInterface (pObject, &IID_IPersistStream, (LPVOID*)&pPersistStream); + result = IDirectMusicObject_QueryInterface (pObject, &IID_IPersistStream, (LPVOID*) &pPersistStream); if (FAILED(result)) return result; - result = IPersistStream_Load (pPersistStream, (LPSTREAM)pStream); + result = IPersistStream_Load (pPersistStream, (LPSTREAM) pStream); if (FAILED(result)) return result; - ILoaderStream_IStream_Release ((LPSTREAM)pStream); + ILoaderStream_IStream_Release ((LPSTREAM) pStream); IPersistStream_Release (pPersistStream); } else if (pDesc->dwValidData & DMUS_OBJ_STREAM) { /* load object from stream */ @@ -144,7 +185,7 @@ HRESULT WINAPI IDirectMusicLoader8Impl_GetObject (LPDIRECTMUSICLOADER8 iface, LP IPersistStream* pPersistStream = NULL; TRACE(": loading from stream\n"); - result = IDirectMusicObject_QueryInterface (pObject, &IID_IPersistStream, (LPVOID*)&pPersistStream); + result = IDirectMusicObject_QueryInterface (pObject, &IID_IPersistStream, (LPVOID*) &pPersistStream); if (FAILED(result)) return result; result = IStream_Clone (pDesc->pStream, &pClonedStream); @@ -165,19 +206,19 @@ HRESULT WINAPI IDirectMusicLoader8Impl_GetObject (LPDIRECTMUSICLOADER8 iface, LP if (FAILED(DMUSIC_GetDefaultGMPath (wzFileName))) return E_FAIL; /* load object from file */ - result = DMUSIC_CreateLoaderStream ((LPSTREAM*)&pStream); + result = DMUSIC_CreateLoaderStream ((LPSTREAM*) &pStream); if (FAILED(result)) return result; - result = ILoaderStream_Attach (pStream, wzFileName, (LPDIRECTMUSICLOADER)iface); + result = ILoaderStream_Attach (pStream, wzFileName, (LPDIRECTMUSICLOADER) iface); if (FAILED(result)) return result; - result = IDirectMusicObject_QueryInterface (pObject, &IID_IPersistStream, (LPVOID*)&pPersistStream); + result = IDirectMusicObject_QueryInterface (pObject, &IID_IPersistStream, (LPVOID*) &pPersistStream); if (FAILED(result)) return result; - result = IPersistStream_Load (pPersistStream, (LPSTREAM)pStream); + result = IPersistStream_Load (pPersistStream, (LPSTREAM) pStream); if (FAILED(result)) return result; - ILoaderStream_IStream_Release ((LPSTREAM)pStream); + ILoaderStream_IStream_Release ((LPSTREAM) pStream); IPersistStream_Release (pPersistStream); } else { return E_FAIL; diff --git a/dlls/dmscript/script.c b/dlls/dmscript/script.c index 70d395a1822..c2116ca9041 100644 --- a/dlls/dmscript/script.c +++ b/dlls/dmscript/script.c @@ -177,6 +177,7 @@ HRESULT WINAPI DMUSIC_CreateDirectMusicScript (LPCGUID lpcGUID, LPDIRECTMUSICSCR { IDirectMusicScriptImpl* dmscript; + TRACE("(%p,%p,%p)\n",lpcGUID, ppDMScript, pUnkOuter); if (IsEqualIID (lpcGUID, &IID_IDirectMusicScript)) { dmscript = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicScriptImpl)); if (NULL == dmscript) { @@ -349,7 +350,8 @@ ULONG WINAPI IDirectMusicScriptObjectStream_Release (LPPERSISTSTREAM iface) /* IDirectMusicScriptObjectStream IPersist part: */ HRESULT WINAPI IDirectMusicScriptObjectStream_GetClassID (LPPERSISTSTREAM iface, CLSID* pClassID) { - return E_NOTIMPL; + *pClassID = CLSID_DirectMusicScript; + return S_OK; } /* IDirectMusicScriptObjectStream IPersistStream part: */ diff --git a/dlls/dmscript/scripttrack.c b/dlls/dmscript/scripttrack.c index 12ce7d409a0..3c47d4bfd37 100644 --- a/dlls/dmscript/scripttrack.c +++ b/dlls/dmscript/scripttrack.c @@ -301,7 +301,8 @@ ULONG WINAPI IDirectMusicScriptTrackStream_Release (LPPERSISTSTREAM iface) /* IDirectMusicScriptTrackStream IPersist part: */ HRESULT WINAPI IDirectMusicScriptTrackStream_GetClassID (LPPERSISTSTREAM iface, CLSID* pClassID) { - return E_NOTIMPL; + *pClassID = CLSID_DirectMusicScriptTrack; + return S_OK; } /* IDirectMusicScriptTrackStream IPersistStream part: */ -- 2.11.4.GIT