dmloader: Use a bitfield to store the per class cache enable info.
Signed-off-by: Michael Stefaniuc <mstefani@winehq.org> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
693b40f7dc
commit
8b98126666
|
@ -42,6 +42,7 @@
|
|||
#include "dmusicf.h"
|
||||
#include "dmusics.h"
|
||||
|
||||
#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
|
||||
#define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field))
|
||||
|
||||
/* dmloader.dll global (for DllCanUnloadNow) */
|
||||
|
@ -83,7 +84,6 @@ typedef struct _WINE_LOADER_OPTION {
|
|||
struct list entry; /* for listing elements */
|
||||
GUID guidClass; /* ID of object type */
|
||||
WCHAR wszSearchPath[MAX_PATH]; /* look for objects of certain type in here */
|
||||
BOOL bCache; /* cache objects of certain type */
|
||||
} WINE_LOADER_OPTION, *LPWINE_LOADER_OPTION;
|
||||
|
||||
/*****************************************************************************
|
||||
|
@ -92,6 +92,7 @@ typedef struct _WINE_LOADER_OPTION {
|
|||
struct IDirectMusicLoaderImpl {
|
||||
IDirectMusicLoader8 IDirectMusicLoader8_iface;
|
||||
LONG ref;
|
||||
unsigned int cache_class;
|
||||
/* simple cache (linked list) */
|
||||
struct list *pObjects;
|
||||
/* settings for certain object classes */
|
||||
|
|
|
@ -22,14 +22,45 @@
|
|||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(dmloader);
|
||||
|
||||
static const GUID *classes[] = {
|
||||
&GUID_DirectMusicAllTypes, /* Keep as first */
|
||||
&CLSID_DirectMusicAudioPathConfig,
|
||||
&CLSID_DirectMusicBand,
|
||||
&CLSID_DirectMusicContainer,
|
||||
&CLSID_DirectMusicCollection,
|
||||
&CLSID_DirectMusicChordMap,
|
||||
&CLSID_DirectMusicSegment,
|
||||
&CLSID_DirectMusicScript,
|
||||
&CLSID_DirectMusicSong,
|
||||
&CLSID_DirectMusicStyle,
|
||||
&CLSID_DirectMusicGraph,
|
||||
&CLSID_DirectSoundWave
|
||||
};
|
||||
|
||||
static inline IDirectMusicLoaderImpl* impl_from_IDirectMusicLoader8(IDirectMusicLoader8 *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, IDirectMusicLoaderImpl, IDirectMusicLoader8_iface);
|
||||
}
|
||||
|
||||
static int index_from_class(REFCLSID class)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(classes); i++)
|
||||
if (IsEqualGUID(class, classes[i]))
|
||||
return i;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static inline BOOL is_cache_enabled(IDirectMusicLoaderImpl *This, REFCLSID class)
|
||||
{
|
||||
return !!(This->cache_class & 1 << index_from_class(class));
|
||||
}
|
||||
|
||||
static HRESULT DMUSIC_InitLoaderSettings(IDirectMusicLoader8 *iface);
|
||||
static HRESULT DMUSIC_GetLoaderSettings(IDirectMusicLoader8 *iface, REFGUID class_id, WCHAR *search_path, BOOL *cache);
|
||||
static HRESULT DMUSIC_SetLoaderSettings(IDirectMusicLoader8 *iface, REFGUID class_id, WCHAR *search_path, BOOL *cache);
|
||||
static HRESULT DMUSIC_GetLoaderSettings(IDirectMusicLoader8 *iface, REFGUID class_id, WCHAR *search_path);
|
||||
static HRESULT DMUSIC_SetLoaderSettings(IDirectMusicLoader8 *iface, REFGUID class_id, WCHAR *search_path);
|
||||
|
||||
static HRESULT DMUSIC_CopyDescriptor(DMUS_OBJECTDESC *pDst, DMUS_OBJECTDESC *pSrc)
|
||||
{
|
||||
|
@ -251,7 +282,7 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_GetObject(IDirectMusicLoader8 *ifac
|
|||
lstrcpyW(wszFileName, pDesc->wszFileName);
|
||||
} else {
|
||||
WCHAR *p, wszSearchPath[MAX_PATH];
|
||||
DMUSIC_GetLoaderSettings (iface, &pDesc->guidClass, wszSearchPath, NULL);
|
||||
DMUSIC_GetLoaderSettings(iface, &pDesc->guidClass, wszSearchPath);
|
||||
lstrcpyW(wszFileName, wszSearchPath);
|
||||
p = wszFileName + lstrlenW(wszFileName);
|
||||
if (p > wszFileName && p[-1] != '\\') *p++ = '\\';
|
||||
|
@ -343,7 +374,7 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_GetObject(IDirectMusicLoader8 *ifac
|
|||
IPersistStream_Release (pPersistStream);
|
||||
|
||||
/* add object to cache/overwrite existing info (if cache is enabled) */
|
||||
DMUSIC_GetLoaderSettings (iface, &pDesc->guidClass, NULL, &bCache);
|
||||
bCache = is_cache_enabled(This, &pDesc->guidClass);
|
||||
if (bCache) {
|
||||
if (!pObjectEntry) {
|
||||
pObjectEntry = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(WINE_LOADER_ENTRY));
|
||||
|
@ -407,7 +438,7 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_SetObject(IDirectMusicLoader8 *ifac
|
|||
} else {
|
||||
WCHAR *p;
|
||||
WCHAR wszSearchPath[MAX_PATH];
|
||||
DMUSIC_GetLoaderSettings (iface, &pDesc->guidClass, wszSearchPath, NULL);
|
||||
DMUSIC_GetLoaderSettings(iface, &pDesc->guidClass, wszSearchPath);
|
||||
lstrcpyW(wszFileName, wszSearchPath);
|
||||
p = wszFileName + lstrlenW(wszFileName);
|
||||
if (p > wszFileName && p[-1] != '\\') *p++ = '\\';
|
||||
|
@ -535,11 +566,11 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_SetSearchDirectory(IDirectMusicLoad
|
|||
FIXME("clear flag ignored\n");
|
||||
|
||||
current_path[0] = 0;
|
||||
DMUSIC_GetLoaderSettings(iface, class, current_path, NULL);
|
||||
DMUSIC_GetLoaderSettings(iface, class, current_path);
|
||||
if (!strncmpW(current_path, path, MAX_PATH))
|
||||
return S_FALSE;
|
||||
|
||||
return DMUSIC_SetLoaderSettings(iface, class, path, NULL);
|
||||
return DMUSIC_SetLoaderSettings(iface, class, path);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirectMusicLoaderImpl_ScanDirectory(IDirectMusicLoader8 *iface, REFGUID rguidClass, WCHAR *pwzFileExtension, WCHAR *pwzScanFileName)
|
||||
|
@ -562,8 +593,8 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_ScanDirectory(IDirectMusicLoader8 *
|
|||
return S_FALSE;
|
||||
|
||||
/* get search path for given class */
|
||||
DMUSIC_GetLoaderSettings (iface, rguidClass, wszSearchString, NULL);
|
||||
|
||||
DMUSIC_GetLoaderSettings(iface, rguidClass, wszSearchString);
|
||||
|
||||
p = wszSearchString + lstrlenW(wszSearchString);
|
||||
if (p > wszSearchString && p[-1] != '\\') *p++ = '\\';
|
||||
*p++ = '*'; /* any file */
|
||||
|
@ -770,16 +801,32 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_ClearCache(IDirectMusicLoader8 *ifa
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirectMusicLoaderImpl_EnableCache(IDirectMusicLoader8 *iface, REFGUID rguidClass, BOOL fEnable)
|
||||
static HRESULT WINAPI IDirectMusicLoaderImpl_EnableCache(IDirectMusicLoader8 *iface, REFGUID class,
|
||||
BOOL enable)
|
||||
{
|
||||
IDirectMusicLoaderImpl *This = impl_from_IDirectMusicLoader8(iface);
|
||||
BOOL bCurrent;
|
||||
TRACE("(%p, %s, %d)\n", This, debugstr_dmguid(rguidClass), fEnable);
|
||||
DMUSIC_GetLoaderSettings (iface, rguidClass, NULL, &bCurrent);
|
||||
if (bCurrent == fEnable)
|
||||
return S_FALSE;
|
||||
else
|
||||
return DMUSIC_SetLoaderSettings (iface, rguidClass, NULL, &fEnable);
|
||||
IDirectMusicLoaderImpl *This = impl_from_IDirectMusicLoader8(iface);
|
||||
BOOL current;
|
||||
|
||||
TRACE("(%p, %s, %d)\n", This, debugstr_dmguid(class), enable);
|
||||
|
||||
current = is_cache_enabled(This, class);
|
||||
|
||||
if (IsEqualGUID(class, &GUID_DirectMusicAllTypes))
|
||||
This->cache_class = enable ? ~0 : 0;
|
||||
else {
|
||||
if (enable)
|
||||
This->cache_class |= 1 << index_from_class(class);
|
||||
else
|
||||
This->cache_class &= ~(1 << index_from_class(class));
|
||||
}
|
||||
|
||||
if (!enable)
|
||||
IDirectMusicLoader8_ClearCache(iface, class);
|
||||
|
||||
if (current == enable)
|
||||
return S_FALSE;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI IDirectMusicLoaderImpl_EnumObject(IDirectMusicLoader8 *iface, REFGUID rguidClass, DWORD dwIndex, DMUS_OBJECTDESC *pDesc)
|
||||
|
@ -856,7 +903,7 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_LoadObjectFromFile(IDirectMusicLoad
|
|||
- windows search path (FIXME: how do I get that?)
|
||||
- loader's search path (DONE)
|
||||
*/
|
||||
DMUSIC_GetLoaderSettings (iface, rguidClassID, wszLoaderSearchPath, NULL);
|
||||
DMUSIC_GetLoaderSettings(iface, rguidClassID, wszLoaderSearchPath);
|
||||
/* search in current directory */
|
||||
if (!SearchPathW (NULL, pwzFilePath, NULL, sizeof(ObjDesc.wszFileName)/sizeof(WCHAR), ObjDesc.wszFileName, NULL) &&
|
||||
/* search in loader's search path */
|
||||
|
@ -929,6 +976,8 @@ HRESULT WINAPI create_dmloader(REFIID lpcGUID, void **ppobj)
|
|||
obj->pClassSettings = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(struct list));
|
||||
list_init (obj->pClassSettings);
|
||||
DMUSIC_InitLoaderSettings(&obj->IDirectMusicLoader8_iface);
|
||||
/* Caching is enabled by default for all classes */
|
||||
obj->cache_class = ~0;
|
||||
|
||||
/* set default DLS collection (via SetObject... so that loading via DMUS_OBJ_OBJECT is possible) */
|
||||
DM_STRUCT_INIT(&Desc);
|
||||
|
@ -954,19 +1003,16 @@ HRESULT WINAPI create_dmloader(REFIID lpcGUID, void **ppobj)
|
|||
}
|
||||
|
||||
/* help function for retrieval of search path and caching option for certain class */
|
||||
static HRESULT DMUSIC_GetLoaderSettings(IDirectMusicLoader8 *iface, REFGUID pClassID, WCHAR *wszSearchPath, BOOL *pbCache)
|
||||
static HRESULT DMUSIC_GetLoaderSettings(IDirectMusicLoader8 *iface, REFGUID pClassID, WCHAR *wszSearchPath)
|
||||
{
|
||||
IDirectMusicLoaderImpl *This = impl_from_IDirectMusicLoader8(iface);
|
||||
struct list *pEntry;
|
||||
TRACE(": (%p, %s, %p, %p)\n", This, debugstr_dmguid(pClassID), wszSearchPath, pbCache);
|
||||
TRACE(": (%p, %s, %p)\n", This, debugstr_dmguid(pClassID), wszSearchPath);
|
||||
|
||||
LIST_FOR_EACH(pEntry, This->pClassSettings) {
|
||||
LPWINE_LOADER_OPTION pOptionEntry = LIST_ENTRY(pEntry, WINE_LOADER_OPTION, entry);
|
||||
if (IsEqualCLSID (pClassID, &pOptionEntry->guidClass)) {
|
||||
if (wszSearchPath)
|
||||
strcpyW(wszSearchPath, pOptionEntry->wszSearchPath);
|
||||
if (pbCache)
|
||||
*pbCache = pOptionEntry->bCache;
|
||||
strcpyW(wszSearchPath, pOptionEntry->wszSearchPath);
|
||||
return S_OK;
|
||||
}
|
||||
}
|
||||
|
@ -974,12 +1020,12 @@ static HRESULT DMUSIC_GetLoaderSettings(IDirectMusicLoader8 *iface, REFGUID pCla
|
|||
}
|
||||
|
||||
/* help function for setting search path and caching option for certain class */
|
||||
static HRESULT DMUSIC_SetLoaderSettings(IDirectMusicLoader8 *iface, REFGUID pClassID, WCHAR *wszSearchPath, BOOL *pbCache)
|
||||
static HRESULT DMUSIC_SetLoaderSettings(IDirectMusicLoader8 *iface, REFGUID pClassID, WCHAR *wszSearchPath)
|
||||
{
|
||||
IDirectMusicLoaderImpl *This = impl_from_IDirectMusicLoader8(iface);
|
||||
struct list *pEntry;
|
||||
HRESULT result = S_FALSE; /* in case pClassID != GUID_DirectMusicAllTypes and not a valid CLSID */
|
||||
TRACE(": (%p, %s, %p, %p)\n", This, debugstr_dmguid(pClassID), wszSearchPath, pbCache);
|
||||
TRACE(": (%p, %s, %p)\n", This, debugstr_dmguid(pClassID), wszSearchPath);
|
||||
|
||||
LIST_FOR_EACH(pEntry, This->pClassSettings) {
|
||||
LPWINE_LOADER_OPTION pOptionEntry = LIST_ENTRY(pEntry, WINE_LOADER_OPTION, entry);
|
||||
|
@ -987,10 +1033,7 @@ static HRESULT DMUSIC_SetLoaderSettings(IDirectMusicLoader8 *iface, REFGUID pCla
|
|||
or specific CLSID is given and we set it only to it */
|
||||
if (IsEqualGUID (pClassID, &GUID_DirectMusicAllTypes) ||
|
||||
IsEqualCLSID (pClassID, &pOptionEntry->guidClass)) {
|
||||
if (wszSearchPath)
|
||||
strcpyW(pOptionEntry->wszSearchPath, wszSearchPath);
|
||||
if (pbCache)
|
||||
pOptionEntry->bCache = *pbCache;
|
||||
strcpyW(pOptionEntry->wszSearchPath, wszSearchPath);
|
||||
result = S_OK;
|
||||
}
|
||||
}
|
||||
|
@ -1001,22 +1044,6 @@ static HRESULT DMUSIC_SetLoaderSettings(IDirectMusicLoader8 *iface, REFGUID pCla
|
|||
static HRESULT DMUSIC_InitLoaderSettings(IDirectMusicLoader8 *iface)
|
||||
{
|
||||
IDirectMusicLoaderImpl *This = impl_from_IDirectMusicLoader8(iface);
|
||||
|
||||
/* hard-coded list of classes */
|
||||
static REFCLSID classes[] = {
|
||||
&CLSID_DirectMusicAudioPathConfig,
|
||||
&CLSID_DirectMusicBand,
|
||||
&CLSID_DirectMusicContainer,
|
||||
&CLSID_DirectMusicCollection,
|
||||
&CLSID_DirectMusicChordMap,
|
||||
&CLSID_DirectMusicSegment,
|
||||
&CLSID_DirectMusicScript,
|
||||
&CLSID_DirectMusicSong,
|
||||
&CLSID_DirectMusicStyle,
|
||||
&CLSID_DirectMusicGraph,
|
||||
&CLSID_DirectSoundWave
|
||||
};
|
||||
|
||||
unsigned int i;
|
||||
WCHAR wszCurrent[MAX_PATH];
|
||||
|
||||
|
@ -1027,7 +1054,6 @@ static HRESULT DMUSIC_InitLoaderSettings(IDirectMusicLoader8 *iface)
|
|||
LPWINE_LOADER_OPTION pNewSetting = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(WINE_LOADER_OPTION));
|
||||
pNewSetting->guidClass = *classes[i];
|
||||
strcpyW (pNewSetting->wszSearchPath, wszCurrent);
|
||||
pNewSetting->bCache = TRUE;
|
||||
list_add_tail (This->pClassSettings, &pNewSetting->entry);
|
||||
}
|
||||
|
||||
|
|
|
@ -69,14 +69,14 @@ static void test_directory(void)
|
|||
/* SetSearchDirectory with the current directory */
|
||||
GetCurrentDirectoryW(ARRAY_SIZE(path), path);
|
||||
hr = IDirectMusicLoader_SetSearchDirectory(loader, &GUID_DirectMusicAllTypes, path, 0);
|
||||
ok(hr == S_OK, "SetSearchDirectory failed with %#x\n", hr);
|
||||
todo_wine ok(hr == S_OK, "SetSearchDirectory failed with %#x\n", hr);
|
||||
|
||||
/* Two consecutive SetSearchDirectory with the same path */
|
||||
GetTempPathW(ARRAY_SIZE(path), path);
|
||||
hr = IDirectMusicLoader_SetSearchDirectory(loader, &GUID_DirectMusicAllTypes, path, 0);
|
||||
ok(hr == S_OK, "SetSearchDirectory failed with %#x\n", hr);
|
||||
hr = IDirectMusicLoader_SetSearchDirectory(loader, &GUID_DirectMusicAllTypes, path, 0);
|
||||
todo_wine ok(hr == S_FALSE, "Second SetSearchDirectory failed with %#x\n", hr);
|
||||
ok(hr == S_FALSE, "Second SetSearchDirectory failed with %#x\n", hr);
|
||||
hr = IDirectMusicLoader_SetSearchDirectory(loader, &CLSID_DirectSoundWave, path, 0);
|
||||
todo_wine ok(hr == S_OK, "SetSearchDirectory failed with %#x\n", hr);
|
||||
hr = IDirectMusicLoader_SetSearchDirectory(loader, &CLSID_DirectSoundWave, path, 0);
|
||||
|
@ -99,7 +99,7 @@ static void test_directory(void)
|
|||
(void**)&loader);
|
||||
ok(hr == S_OK, "Couldn't create Loader %#x\n", hr);
|
||||
hr = IDirectMusicLoader_SetSearchDirectory(loader, &GUID_DirectMusicAllTypes, empty, 0);
|
||||
todo_wine ok(hr == S_OK, "SetSearchDirectory failed with %#x\n", hr);
|
||||
ok(hr == S_OK, "SetSearchDirectory failed with %#x\n", hr);
|
||||
hr = IDirectMusicLoader_SetSearchDirectory(loader, &GUID_DirectMusicAllTypes, empty, 0);
|
||||
ok(hr == S_FALSE, "SetSearchDirectory failed with %#x\n", hr);
|
||||
hr = IDirectMusicLoader_ScanDirectory(loader, &CLSID_DirectMusicContainer, con, NULL);
|
||||
|
@ -126,7 +126,7 @@ static void test_caching(void)
|
|||
hr = IDirectMusicLoader_EnableCache(loader, &CLSID_DirectMusicContainer, TRUE);
|
||||
ok(hr == S_FALSE, "EnableCache failed with %#x\n", hr);
|
||||
hr = IDirectMusicLoader_EnableCache(loader, &GUID_DirectMusicAllTypes, TRUE);
|
||||
todo_wine ok(hr == S_FALSE, "EnableCache failed with %#x\n", hr);
|
||||
ok(hr == S_FALSE, "EnableCache failed with %#x\n", hr);
|
||||
|
||||
/* Disabling/enabling the cache for all types */
|
||||
hr = IDirectMusicLoader_EnableCache(loader, &GUID_DirectMusicAllTypes, FALSE);
|
||||
|
@ -135,6 +135,10 @@ static void test_caching(void)
|
|||
ok(hr == S_FALSE, "EnableCache failed with %#x\n", hr);
|
||||
hr = IDirectMusicLoader_EnableCache(loader, &GUID_DirectMusicAllTypes, TRUE);
|
||||
ok(hr == S_OK, "EnableCache failed with %#x\n", hr);
|
||||
hr = IDirectMusicLoader_EnableCache(loader, &CLSID_DirectMusicContainer, FALSE);
|
||||
ok(hr == S_OK, "EnableCache failed with %#x\n", hr);
|
||||
hr = IDirectMusicLoader_EnableCache(loader, &GUID_DirectMusicAllTypes, TRUE);
|
||||
ok(hr == S_FALSE, "EnableCache failed with %#x\n", hr);
|
||||
hr = IDirectMusicLoader_EnableCache(loader, &CLSID_DirectMusicContainer, TRUE);
|
||||
ok(hr == S_FALSE, "EnableCache failed with %#x\n", hr);
|
||||
|
||||
|
|
Loading…
Reference in New Issue