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
31065c62
Commit
31065c62
authored
Mar 29, 2013
by
Michael Stefaniuc
Committed by
Alexandre Julliard
Apr 02, 2013
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dplayx: Merge the IDirectPlay4_EnumSessions helper.
parent
5dc2b8f6
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
111 additions
and
165 deletions
+111
-165
dplay.c
dlls/dplayx/dplay.c
+111
-165
No files found.
dlls/dplayx/dplay.c
View file @
31065c62
...
...
@@ -130,10 +130,6 @@ static HRESULT DP_SP_SendEx
static
HRESULT
DP_IF_CancelMessage
(
IDirectPlay4Impl
*
This
,
DWORD
dwMsgID
,
DWORD
dwFlags
,
DWORD
dwMinPriority
,
DWORD
dwMaxPriority
,
BOOL
bAnsi
);
static
HRESULT
DP_IF_EnumSessions
(
IDirectPlay2Impl
*
This
,
LPDPSESSIONDESC2
lpsd
,
DWORD
dwTimeout
,
LPDPENUMSESSIONSCALLBACK2
lpEnumSessionsCallback2
,
LPVOID
lpContext
,
DWORD
dwFlags
,
BOOL
bAnsi
);
static
BOOL
CALLBACK
cbDPCreateEnumConnections
(
LPCGUID
lpguidSP
,
LPVOID
lpConnection
,
DWORD
dwConnectionSize
,
LPCDPNAME
lpName
,
DWORD
dwFlags
,
LPVOID
lpContext
);
...
...
@@ -1826,186 +1822,136 @@ static void DP_KillEnumSessionThread( IDirectPlay2Impl* This )
}
}
static
HRESULT
DP_IF_EnumSessions
(
IDirectPlay2Impl
*
This
,
LPDPSESSIONDESC2
lpsd
,
DWORD
dwTimeout
,
LPDPENUMSESSIONSCALLBACK2
lpEnumSessionsCallback2
,
LPVOID
lpContext
,
DWORD
dwFlags
,
BOOL
bAnsi
)
static
HRESULT
WINAPI
IDirectPlay4AImpl_EnumSessions
(
IDirectPlay4A
*
iface
,
DPSESSIONDESC2
*
sdesc
,
DWORD
timeout
,
LPDPENUMSESSIONSCALLBACK2
enumsessioncb
,
void
*
context
,
DWORD
flags
)
{
HRESULT
hr
=
DP_OK
;
TRACE
(
"(%p)->(%p,0x%08x,%p,%p,0x%08x,%u)
\n
"
,
This
,
lpsd
,
dwTimeout
,
lpEnumSessionsCallback2
,
lpContext
,
dwFlags
,
bAnsi
);
if
(
This
->
dp2
->
connectionInitialized
==
NO_PROVIDER
)
{
return
DPERR_UNINITIALIZED
;
}
/* Can't enumerate if the interface is already open */
if
(
This
->
dp2
->
bConnectionOpen
)
{
return
DPERR_GENERIC
;
}
#if 1
/* The loading of a lobby provider _seems_ to require a backdoor loading
* of the service provider to also associate with this DP object. This is
* because the app doesn't seem to have to call EnumConnections and
* InitializeConnection for the SP before calling this method. As such
* we'll do their dirty work for them with a quick hack so as to always
* load the TCP/IP service provider.
*
* The correct solution would seem to involve creating a dialog box which
* contains the possible SPs. These dialog boxes most likely follow SDK
* examples.
*/
if
(
This
->
dp2
->
bDPLSPInitialized
&&
!
This
->
dp2
->
bSPInitialized
)
{
LPVOID
lpConnection
;
DWORD
dwSize
;
WARN
(
"Hack providing TCP/IP SP for lobby provider activated
\n
"
);
if
(
!
DP_BuildSPCompoundAddr
(
(
LPGUID
)
&
DPSPGUID_TCPIP
,
&
lpConnection
,
&
dwSize
)
)
{
ERR
(
"Can't build compound addr
\n
"
);
return
DPERR_GENERIC
;
}
hr
=
IDirectPlayX_InitializeConnection
(
&
This
->
IDirectPlay4_iface
,
lpConnection
,
0
);
if
(
FAILED
(
hr
)
)
{
return
hr
;
}
/* Free up the address buffer */
HeapFree
(
GetProcessHeap
(),
0
,
lpConnection
);
/* The SP is now initialized */
This
->
dp2
->
bSPInitialized
=
TRUE
;
}
#endif
/* Use the service provider default? */
if
(
dwTimeout
==
0
)
{
DPCAPS
spCaps
;
spCaps
.
dwSize
=
sizeof
(
spCaps
);
IDirectPlayX_GetCaps
(
&
This
->
IDirectPlay4_iface
,
&
spCaps
,
0
);
dwTimeout
=
spCaps
.
dwTimeout
;
IDirectPlayImpl
*
This
=
impl_from_IDirectPlay4A
(
iface
);
return
IDirectPlayX_EnumSessions
(
&
This
->
IDirectPlay4_iface
,
sdesc
,
timeout
,
enumsessioncb
,
context
,
flags
);
}
/* The service provider doesn't provide one either! */
if
(
dwTimeout
==
0
)
{
/* Provide the TCP/IP default */
dwTimeout
=
DPMSG_WAIT_5_SECS
;
}
}
static
HRESULT
WINAPI
IDirectPlay4Impl_EnumSessions
(
IDirectPlay4
*
iface
,
DPSESSIONDESC2
*
sdesc
,
DWORD
timeout
,
LPDPENUMSESSIONSCALLBACK2
enumsessioncb
,
void
*
context
,
DWORD
flags
)
{
IDirectPlayImpl
*
This
=
impl_from_IDirectPlay4
(
iface
);
void
*
connection
;
DWORD
size
;
HRESULT
hr
=
DP_OK
;
if
(
dwFlags
&
DPENUMSESSIONS_STOPASYNC
)
{
DP_KillEnumSessionThread
(
This
);
return
hr
;
}
TRACE
(
"(%p)->(%p,0x%08x,%p,%p,0x%08x)
\n
"
,
This
,
sdesc
,
timeout
,
enumsessioncb
,
context
,
flags
);
if
(
(
dwFlags
&
DPENUMSESSIONS_ASYNC
)
)
{
/* Enumerate everything presently in the local session cache */
DP_InvokeEnumSessionCallbacks
(
lpEnumSessionsCallback2
,
This
->
dp2
->
lpNameServerData
,
dwTimeout
,
lpContext
);
if
(
This
->
dp2
->
connectionInitialized
==
NO_PROVIDER
)
return
DPERR_UNINITIALIZED
;
if
(
This
->
dp2
->
dwEnumSessionLock
!=
0
)
return
DPERR_CONNECTING
;
/* Can't enumerate if the interface is already open */
if
(
This
->
dp2
->
bConnectionOpen
)
return
DPERR_GENERIC
;
/* See if we've already created a thread to service this interface */
if
(
This
->
dp2
->
hEnumSessionThread
==
INVALID_HANDLE_VALUE
)
/* The loading of a lobby provider _seems_ to require a backdoor loading
* of the service provider to also associate with this DP object. This is
* because the app doesn't seem to have to call EnumConnections and
* InitializeConnection for the SP before calling this method. As such
* we'll do their dirty work for them with a quick hack so as to always
* load the TCP/IP service provider.
*
* The correct solution would seem to involve creating a dialog box which
* contains the possible SPs. These dialog boxes most likely follow SDK
* examples.
*/
if
(
This
->
dp2
->
bDPLSPInitialized
&&
!
This
->
dp2
->
bSPInitialized
)
{
DWORD
dwThreadId
;
This
->
dp2
->
dwEnumSessionLock
++
;
/* Send the first enum request inline since the user may cancel a dialog
* if one is presented. Also, may also have a connecting return code.
*/
hr
=
NS_SendSessionRequestBroadcast
(
&
lpsd
->
guidApplication
,
dwFlags
,
&
This
->
dp2
->
spData
);
WARN
(
"Hack providing TCP/IP SP for lobby provider activated
\n
"
);
if
(
SUCCEEDED
(
hr
)
)
{
EnumSessionAsyncCallbackData
*
lpData
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
*
lpData
)
);
/* FIXME: need to kill the thread on object deletion */
lpData
->
lpSpData
=
&
This
->
dp2
->
spData
;
lpData
->
requestGuid
=
lpsd
->
guidApplication
;
lpData
->
dwEnumSessionFlags
=
dwFlags
;
lpData
->
dwTimeout
=
dwTimeout
;
This
->
dp2
->
hKillEnumSessionThreadEvent
=
CreateEventW
(
NULL
,
TRUE
,
FALSE
,
NULL
);
if
(
!
DuplicateHandle
(
GetCurrentProcess
(),
This
->
dp2
->
hKillEnumSessionThreadEvent
,
GetCurrentProcess
(),
&
lpData
->
hSuicideRequest
,
0
,
FALSE
,
DUPLICATE_SAME_ACCESS
)
)
if
(
!
DP_BuildSPCompoundAddr
(
(
GUID
*
)
&
DPSPGUID_TCPIP
,
&
connection
,
&
size
)
)
{
ERR
(
"Can't duplicate thread killing handle
\n
"
);
ERR
(
"Can't build compound addr
\n
"
);
return
DPERR_GENERIC
;
}
TRACE
(
": creating EnumSessionsRequest thread
\n
"
);
hr
=
IDirectPlayX_InitializeConnection
(
&
This
->
IDirectPlay4_iface
,
connection
,
0
);
if
(
FAILED
(
hr
)
)
return
hr
;
This
->
dp2
->
hEnumSessionThread
=
CreateThread
(
NULL
,
0
,
DP_EnumSessionsSendAsyncRequestThread
,
lpData
,
0
,
&
dwThreadId
);
}
This
->
dp2
->
dwEnumSessionLock
--
;
HeapFree
(
GetProcessHeap
(),
0
,
connection
);
This
->
dp2
->
bSPInitialized
=
TRUE
;
}
}
else
{
/* Invalidate the session cache for the interface */
NS_InvalidateSessionCache
(
This
->
dp2
->
lpNameServerData
);
/* Send the broadcast for session enumeration */
hr
=
NS_SendSessionRequestBroadcast
(
&
lpsd
->
guidApplication
,
dwFlags
,
&
This
->
dp2
->
spData
);
/* Use the service provider default? */
if
(
!
timeout
)
{
DPCAPS
caps
;
caps
.
dwSize
=
sizeof
(
caps
);
SleepEx
(
dwTimeout
,
FALSE
);
IDirectPlayX_GetCaps
(
&
This
->
IDirectPlay4_iface
,
&
caps
,
0
);
timeout
=
caps
.
dwTimeout
;
if
(
!
timeout
)
timeout
=
DPMSG_WAIT_5_SECS
;
/* Provide the TCP/IP default */
}
DP_InvokeEnumSessionCallbacks
(
lpEnumSessionsCallback2
,
This
->
dp2
->
lpNameServerData
,
dwTimeout
,
lpContext
);
}
if
(
flags
&
DPENUMSESSIONS_STOPASYNC
)
{
DP_KillEnumSessionThread
(
This
);
return
hr
;
}
return
hr
;
}
if
(
flags
&
DPENUMSESSIONS_ASYNC
)
{
/* Enumerate everything presently in the local session cache */
DP_InvokeEnumSessionCallbacks
(
enumsessioncb
,
This
->
dp2
->
lpNameServerData
,
timeout
,
context
);
static
HRESULT
WINAPI
IDirectPlay4AImpl_EnumSessions
(
IDirectPlay4A
*
iface
,
DPSESSIONDESC2
*
lpsd
,
DWORD
dwTimeout
,
LPDPENUMSESSIONSCALLBACK2
lpEnumSessionsCallback2
,
void
*
lpContext
,
DWORD
dwFlags
)
{
IDirectPlayImpl
*
This
=
impl_from_IDirectPlay4A
(
iface
);
return
DP_IF_EnumSessions
(
This
,
lpsd
,
dwTimeout
,
lpEnumSessionsCallback2
,
lpContext
,
dwFlags
,
TRUE
);
}
if
(
This
->
dp2
->
dwEnumSessionLock
)
return
DPERR_CONNECTING
;
static
HRESULT
WINAPI
DirectPlay2WImpl_EnumSessions
(
LPDIRECTPLAY2
iface
,
LPDPSESSIONDESC2
lpsd
,
DWORD
dwTimeout
,
LPDPENUMSESSIONSCALLBACK2
lpEnumSessionsCallback2
,
LPVOID
lpContext
,
DWORD
dwFlags
)
{
IDirectPlay2Impl
*
This
=
(
IDirectPlay2Impl
*
)
iface
;
return
DP_IF_EnumSessions
(
This
,
lpsd
,
dwTimeout
,
lpEnumSessionsCallback2
,
lpContext
,
dwFlags
,
FALSE
);
/* See if we've already created a thread to service this interface */
if
(
This
->
dp2
->
hEnumSessionThread
==
INVALID_HANDLE_VALUE
)
{
DWORD
tid
;
This
->
dp2
->
dwEnumSessionLock
++
;
/* Send the first enum request inline since the user may cancel a dialog
* if one is presented. Also, may also have a connecting return code.
*/
hr
=
NS_SendSessionRequestBroadcast
(
&
sdesc
->
guidApplication
,
flags
,
&
This
->
dp2
->
spData
);
if
(
SUCCEEDED
(
hr
)
)
{
EnumSessionAsyncCallbackData
*
data
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
*
data
)
);
/* FIXME: need to kill the thread on object deletion */
data
->
lpSpData
=
&
This
->
dp2
->
spData
;
data
->
requestGuid
=
sdesc
->
guidApplication
;
data
->
dwEnumSessionFlags
=
flags
;
data
->
dwTimeout
=
timeout
;
This
->
dp2
->
hKillEnumSessionThreadEvent
=
CreateEventW
(
NULL
,
TRUE
,
FALSE
,
NULL
);
if
(
!
DuplicateHandle
(
GetCurrentProcess
(),
This
->
dp2
->
hKillEnumSessionThreadEvent
,
GetCurrentProcess
(),
&
data
->
hSuicideRequest
,
0
,
FALSE
,
DUPLICATE_SAME_ACCESS
)
)
ERR
(
"Can't duplicate thread killing handle
\n
"
);
TRACE
(
": creating EnumSessionsRequest thread
\n
"
);
This
->
dp2
->
hEnumSessionThread
=
CreateThread
(
NULL
,
0
,
DP_EnumSessionsSendAsyncRequestThread
,
data
,
0
,
&
tid
);
}
This
->
dp2
->
dwEnumSessionLock
--
;
}
}
else
{
/* Invalidate the session cache for the interface */
NS_InvalidateSessionCache
(
This
->
dp2
->
lpNameServerData
);
/* Send the broadcast for session enumeration */
hr
=
NS_SendSessionRequestBroadcast
(
&
sdesc
->
guidApplication
,
flags
,
&
This
->
dp2
->
spData
);
SleepEx
(
timeout
,
FALSE
);
DP_InvokeEnumSessionCallbacks
(
enumsessioncb
,
This
->
dp2
->
lpNameServerData
,
timeout
,
context
);
}
return
hr
;
}
static
HRESULT
WINAPI
IDirectPlay4AImpl_GetCaps
(
IDirectPlay4A
*
iface
,
DPCAPS
*
caps
,
DWORD
flags
)
...
...
@@ -4275,7 +4221,7 @@ static const IDirectPlay4Vtbl dp4_vt =
IDirectPlay4Impl_EnumGroupPlayers
,
IDirectPlay4Impl_EnumGroups
,
IDirectPlay4Impl_EnumPlayers
,
XCAST
(
EnumSessions
)
DirectPlay2W
Impl_EnumSessions
,
IDirectPlay4
Impl_EnumSessions
,
IDirectPlay4Impl_GetCaps
,
IDirectPlay4Impl_GetGroupData
,
XCAST
(
GetGroupName
)
DirectPlay2WImpl_GetGroupName
,
...
...
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