Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
3531e50c
Commit
3531e50c
authored
Jul 25, 2017
by
Michael Stefaniuc
Committed by
Alexandre Julliard
Jul 25, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dmloader: Simplify the cache list handling.
Signed-off-by:
Michael Stefaniuc
<
mstefani@winehq.org
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
c2aa7253
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
26 additions
and
43 deletions
+26
-43
loader.c
dlls/dmloader/loader.c
+26
-43
No files found.
dlls/dmloader/loader.c
View file @
3531e50c
...
...
@@ -50,8 +50,7 @@ typedef struct IDirectMusicLoaderImpl {
LONG
ref
;
WCHAR
*
search_paths
[
ARRAY_SIZE
(
classes
)];
unsigned
int
cache_class
;
/* simple cache */
struct
list
*
pObjects
;
struct
list
cache
;
}
IDirectMusicLoaderImpl
;
...
...
@@ -190,9 +189,7 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_GetObject(IDirectMusicLoader8 *ifac
IDirectMusicLoaderImpl
*
This
=
impl_from_IDirectMusicLoader8
(
iface
);
HRESULT
result
=
S_OK
;
HRESULT
ret
=
S_OK
;
/* used at the end of function, to determine whether everything went OK */
struct
list
*
pEntry
;
LPWINE_LOADER_ENTRY
pObjectEntry
=
NULL
;
struct
cache_entry
*
pExistingEntry
,
*
pObjectEntry
=
NULL
;
LPSTREAM
pStream
;
IPersistStream
*
pPersistStream
=
NULL
;
...
...
@@ -215,8 +212,7 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_GetObject(IDirectMusicLoader8 *ifac
/* OK, first we iterate through the list of objects we know about; these are either loaded (GetObject, LoadObjectFromFile)
or set via SetObject; */
TRACE
(
": looking if we have object in the cache or if it can be found via alias
\n
"
);
LIST_FOR_EACH
(
pEntry
,
This
->
pObjects
)
{
LPWINE_LOADER_ENTRY
pExistingEntry
=
LIST_ENTRY
(
pEntry
,
WINE_LOADER_ENTRY
,
entry
);
LIST_FOR_EACH_ENTRY
(
pExistingEntry
,
&
This
->
cache
,
struct
cache_entry
,
entry
)
{
if
((
pDesc
->
dwValidData
&
DMUS_OBJ_OBJECT
)
&&
(
pExistingEntry
->
Desc
.
dwValidData
&
DMUS_OBJ_OBJECT
)
&&
IsEqualGUID
(
&
pDesc
->
guidObject
,
&
pExistingEntry
->
Desc
.
guidObject
))
{
...
...
@@ -412,7 +408,7 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_GetObject(IDirectMusicLoader8 *ifac
DMUSIC_CopyDescriptor
(
&
pObjectEntry
->
Desc
,
&
GotDesc
);
pObjectEntry
->
pObject
=
pObject
;
pObjectEntry
->
bInvalidDefaultDLS
=
FALSE
;
list_add_head
(
This
->
pObjects
,
&
pObjectEntry
->
entry
);
list_add_head
(
&
This
->
cache
,
&
pObjectEntry
->
entry
);
}
else
{
DMUSIC_CopyDescriptor
(
&
pObjectEntry
->
Desc
,
&
GotDesc
);
pObjectEntry
->
pObject
=
pObject
;
...
...
@@ -437,7 +433,6 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_SetObject(IDirectMusicLoader8 *ifac
LPSTREAM
pStream
;
LPDIRECTMUSICOBJECT
pObject
;
DMUS_OBJECTDESC
Desc
;
struct
list
*
pEntry
;
LPWINE_LOADER_ENTRY
pObjectEntry
,
pNewEntry
;
HRESULT
hr
;
...
...
@@ -540,8 +535,7 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_SetObject(IDirectMusicLoader8 *ifac
/* sometimes it happens that twisted programs call SetObject for same object twice...
in such cases, native loader returns S_OK and does nothing... a sound plan */
LIST_FOR_EACH
(
pEntry
,
This
->
pObjects
)
{
pObjectEntry
=
LIST_ENTRY
(
pEntry
,
WINE_LOADER_ENTRY
,
entry
);
LIST_FOR_EACH_ENTRY
(
pObjectEntry
,
&
This
->
cache
,
struct
cache_entry
,
entry
)
{
if
(
!
memcmp
(
&
pObjectEntry
->
Desc
,
pDesc
,
sizeof
(
DMUS_OBJECTDESC
)))
{
TRACE
(
": exactly same entry already exists
\n
"
);
return
S_OK
;
...
...
@@ -556,7 +550,7 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_SetObject(IDirectMusicLoader8 *ifac
/* use this function instead of pure memcpy due to streams (memcpy just copies pointer),
which is basically used further by app that called SetDescriptor... better safety than exception */
DMUSIC_CopyDescriptor
(
&
pNewEntry
->
Desc
,
pDesc
);
list_add_head
(
This
->
pObjects
,
&
pNewEntry
->
entry
);
list_add_head
(
&
This
->
cache
,
&
pNewEntry
->
entry
);
return
S_OK
;
}
...
...
@@ -660,7 +654,6 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_CacheObject(IDirectMusicLoader8 *if
IDirectMusicLoaderImpl
*
This
=
impl_from_IDirectMusicLoader8
(
iface
);
DMUS_OBJECTDESC
Desc
;
HRESULT
result
=
DMUS_E_LOADER_OBJECTNOTFOUND
;
struct
list
*
pEntry
;
LPWINE_LOADER_ENTRY
pObjectEntry
=
NULL
;
TRACE
(
"(%p, %p)
\n
"
,
This
,
pObject
);
...
...
@@ -671,8 +664,7 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_CacheObject(IDirectMusicLoader8 *if
/* now iterate through the list and check if we have an alias (without object), corresponding
to the descriptor of the input object */
LIST_FOR_EACH
(
pEntry
,
This
->
pObjects
)
{
pObjectEntry
=
LIST_ENTRY
(
pEntry
,
WINE_LOADER_ENTRY
,
entry
);
LIST_FOR_EACH_ENTRY
(
pObjectEntry
,
&
This
->
cache
,
struct
cache_entry
,
entry
)
{
if
((
Desc
.
dwValidData
&
DMUS_OBJ_OBJECT
)
&&
(
pObjectEntry
->
Desc
.
dwValidData
&
DMUS_OBJ_OBJECT
)
&&
IsEqualGUID
(
&
Desc
.
guidObject
,
&
pObjectEntry
->
Desc
.
guidObject
))
{
...
...
@@ -740,7 +732,6 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_ReleaseObject(IDirectMusicLoader8 *
{
IDirectMusicLoaderImpl
*
This
=
impl_from_IDirectMusicLoader8
(
iface
);
DMUS_OBJECTDESC
Desc
;
struct
list
*
pEntry
;
LPWINE_LOADER_ENTRY
pObjectEntry
=
NULL
;
HRESULT
result
=
S_FALSE
;
...
...
@@ -754,8 +745,7 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_ReleaseObject(IDirectMusicLoader8 *
/* 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
(
pEntry
,
This
->
pObjects
)
{
pObjectEntry
=
LIST_ENTRY
(
pEntry
,
WINE_LOADER_ENTRY
,
entry
);
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
))
{
...
...
@@ -804,24 +794,22 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_ReleaseObject(IDirectMusicLoader8 *
return
result
;
}
static
HRESULT
WINAPI
IDirectMusicLoaderImpl_ClearCache
(
IDirectMusicLoader8
*
iface
,
REFGUID
rguidC
lass
)
static
HRESULT
WINAPI
IDirectMusicLoaderImpl_ClearCache
(
IDirectMusicLoader8
*
iface
,
REFGUID
c
lass
)
{
IDirectMusicLoaderImpl
*
This
=
impl_from_IDirectMusicLoader8
(
iface
);
struct
list
*
pEntry
;
LPWINE_LOADER_ENTRY
pObjectEntry
;
TRACE
(
"(%p, %s)
\n
"
,
This
,
debugstr_dmguid
(
rguidClass
));
LIST_FOR_EACH
(
pEntry
,
This
->
pObjects
)
{
pObjectEntry
=
LIST_ENTRY
(
pEntry
,
WINE_LOADER_ENTRY
,
entry
);
if
((
IsEqualGUID
(
rguidClass
,
&
GUID_DirectMusicAllTypes
)
||
IsEqualGUID
(
rguidClass
,
&
pObjectEntry
->
Desc
.
guidClass
))
&&
(
pObjectEntry
->
Desc
.
dwValidData
&
DMUS_OBJ_LOADED
))
{
/* basically, wrap to ReleaseObject for each object found */
IDirectMusicLoader8_ReleaseObject
(
iface
,
pObjectEntry
->
pObject
);
}
}
return
S_OK
;
IDirectMusicLoaderImpl
*
This
=
impl_from_IDirectMusicLoader8
(
iface
);
struct
cache_entry
*
obj
;
TRACE
(
"(%p, %s)
\n
"
,
This
,
debugstr_dmguid
(
class
));
LIST_FOR_EACH_ENTRY
(
obj
,
&
This
->
cache
,
struct
cache_entry
,
entry
)
{
if
((
IsEqualGUID
(
class
,
&
GUID_DirectMusicAllTypes
)
||
IsEqualGUID
(
class
,
&
obj
->
Desc
.
guidClass
))
&&
(
obj
->
Desc
.
dwValidData
&
DMUS_OBJ_LOADED
))
{
/* basically, wrap to ReleaseObject for each object found */
IDirectMusicLoader8_ReleaseObject
(
iface
,
obj
->
pObject
);
}
}
return
S_OK
;
}
static
HRESULT
WINAPI
IDirectMusicLoaderImpl_EnableCache
(
IDirectMusicLoader8
*
iface
,
REFGUID
class
,
...
...
@@ -856,15 +844,12 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_EnumObject(IDirectMusicLoader8 *ifa
{
IDirectMusicLoaderImpl
*
This
=
impl_from_IDirectMusicLoader8
(
iface
);
DWORD
dwCount
=
0
;
struct
list
*
pEntry
;
LPWINE_LOADER_ENTRY
pObjectEntry
;
TRACE
(
"(%p, %s, %d, %p)
\n
"
,
This
,
debugstr_dmguid
(
rguidClass
),
dwIndex
,
pDesc
);
DM_STRUCT_INIT
(
pDesc
);
LIST_FOR_EACH
(
pEntry
,
This
->
pObjects
)
{
pObjectEntry
=
LIST_ENTRY
(
pEntry
,
WINE_LOADER_ENTRY
,
entry
);
LIST_FOR_EACH_ENTRY
(
pObjectEntry
,
&
This
->
cache
,
struct
cache_entry
,
entry
)
{
if
(
IsEqualGUID
(
rguidClass
,
&
GUID_DirectMusicAllTypes
)
||
IsEqualGUID
(
rguidClass
,
&
pObjectEntry
->
Desc
.
guidClass
))
{
if
(
dwCount
==
dwIndex
)
{
*
pDesc
=
pObjectEntry
->
Desc
;
...
...
@@ -992,9 +977,7 @@ HRESULT WINAPI create_dmloader(REFIID lpcGUID, void **ppobj)
}
obj
->
IDirectMusicLoader8_iface
.
lpVtbl
=
&
DirectMusicLoader_Loader_Vtbl
;
obj
->
ref
=
0
;
/* Will be inited with QueryInterface */
/* init cache/alias list */
obj
->
pObjects
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
struct
list
));
list_init
(
obj
->
pObjects
);
list_init
(
&
obj
->
cache
);
/* Caching is enabled by default for all classes */
obj
->
cache_class
=
~
0
;
...
...
@@ -1010,7 +993,7 @@ HRESULT WINAPI create_dmloader(REFIID lpcGUID, void **ppobj)
collection, loader treats it as "invalid" and returns
DMUS_E_LOADER_NOFILENAME for all requests for it; basically, we check
if out input guidObject was overwritten */
pEntry
=
list_head
(
obj
->
pObjects
);
pEntry
=
list_head
(
&
obj
->
cache
);
pDefaultDLSEntry
=
LIST_ENTRY
(
pEntry
,
WINE_LOADER_ENTRY
,
entry
);
if
(
!
IsEqualGUID
(
&
Desc
.
guidObject
,
&
GUID_DefaultGMCollection
))
{
pDefaultDLSEntry
->
bInvalidDefaultDLS
=
TRUE
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment