mirror of
https://github.com/ValveSoftware/Proton.git
synced 2025-06-23 10:59:35 +03:00
lsteamclient: Keep the unix side response object on the PE side request.
This commit is contained in:
parent
47d5d59f1b
commit
8e9e7b97ab
@ -86,4 +86,13 @@ struct u_request
|
|||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct u_response
|
||||||
|
{
|
||||||
|
UINT64 handle;
|
||||||
|
#ifdef __cplusplus
|
||||||
|
struct u_response &operator=(const void* value) { this->handle = (UINT_PTR)value; return *this; }
|
||||||
|
template< typename T > operator T*() const { return (T*)(UINT_PTR)this->handle; }
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* __STEAMCLIENT_STRUCTS_H */
|
#endif /* __STEAMCLIENT_STRUCTS_H */
|
||||||
|
@ -15,39 +15,6 @@ template <typename T> void free_callback_obj(T *obj)
|
|||||||
delete obj;
|
delete obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> class callback_obj_tracker
|
|
||||||
{
|
|
||||||
std::unordered_map<void *, T *> tracked_objects;
|
|
||||||
|
|
||||||
public:
|
|
||||||
void request_released( void *hrequest )
|
|
||||||
{
|
|
||||||
auto entry = tracked_objects.find( hrequest );
|
|
||||||
if (entry == tracked_objects.end())
|
|
||||||
{
|
|
||||||
WARN( "Object not found for request %p.\n", hrequest );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
TRACE( "request %p, deleting %p.\n", hrequest, entry->second );
|
|
||||||
free_callback_obj( entry->second );
|
|
||||||
tracked_objects.erase( entry );
|
|
||||||
}
|
|
||||||
|
|
||||||
void add_request( void *hrequest, T *obj )
|
|
||||||
{
|
|
||||||
auto entry = tracked_objects.find( hrequest );
|
|
||||||
|
|
||||||
TRACE( "request %p, obj %p.\n", hrequest, obj );
|
|
||||||
if (entry == tracked_objects.end())
|
|
||||||
{
|
|
||||||
tracked_objects[hrequest] = obj;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ERR( "hrequest %p already registered, old %p, new %p.\n", hrequest, entry->second, obj );
|
|
||||||
entry->second = obj;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SteamMatchmakingServerListResponse_099u : u_ISteamMatchmakingServerListResponse_099u
|
struct SteamMatchmakingServerListResponse_099u : u_ISteamMatchmakingServerListResponse_099u
|
||||||
{
|
{
|
||||||
struct w_iface *w_iface;
|
struct w_iface *w_iface;
|
||||||
@ -89,29 +56,12 @@ struct SteamMatchmakingServerListResponse_106 : u_ISteamMatchmakingServerListRes
|
|||||||
{
|
{
|
||||||
struct w_iface *w_iface;
|
struct w_iface *w_iface;
|
||||||
struct w_request *w_request;
|
struct w_request *w_request;
|
||||||
static class callback_obj_tracker<SteamMatchmakingServerListResponse_106> track;
|
|
||||||
|
|
||||||
SteamMatchmakingServerListResponse_106( w_ISteamMatchmakingServerListResponse_106 *w_iface, void *w_request );
|
SteamMatchmakingServerListResponse_106( w_ISteamMatchmakingServerListResponse_106 *w_iface, void *w_request );
|
||||||
|
|
||||||
void add_request( void *hrequest)
|
|
||||||
{
|
|
||||||
if (hrequest) track.add_request( hrequest, this );
|
|
||||||
else
|
|
||||||
{
|
|
||||||
WARN( "NULL request.\n" );
|
|
||||||
free_callback_obj( this );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
static void request_released( void *hrequest )
|
|
||||||
{
|
|
||||||
track.request_released( hrequest );
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void ServerResponded( void *, int32_t );
|
virtual void ServerResponded( void *, int32_t );
|
||||||
virtual void ServerFailedToRespond( void *, int32_t );
|
virtual void ServerFailedToRespond( void *, int32_t );
|
||||||
virtual void RefreshComplete( void *, uint32_t );
|
virtual void RefreshComplete( void *, uint32_t );
|
||||||
};
|
};
|
||||||
class callback_obj_tracker<SteamMatchmakingServerListResponse_106> SteamMatchmakingServerListResponse_106::track;
|
|
||||||
|
|
||||||
SteamMatchmakingServerListResponse_106::SteamMatchmakingServerListResponse_106( w_ISteamMatchmakingServerListResponse_106 *w_iface, void *w_request )
|
SteamMatchmakingServerListResponse_106::SteamMatchmakingServerListResponse_106( w_ISteamMatchmakingServerListResponse_106 *w_iface, void *w_request )
|
||||||
: w_iface( (struct w_iface *)w_iface ), w_request( (struct w_request *)w_request )
|
: w_iface( (struct w_iface *)w_iface ), w_request( (struct w_request *)w_request )
|
||||||
@ -301,7 +251,7 @@ static NTSTATUS ISteamMatchmakingServers_RequestInternetServerList( Iface *iface
|
|||||||
struct w_request *w_request = u_response->w_request;
|
struct w_request *w_request = u_response->w_request;
|
||||||
w_request->u_request = iface->RequestInternetServerList( params->iApp, params->ppchFilters, params->nFilters, u_response );
|
w_request->u_request = iface->RequestInternetServerList( params->iApp, params->ppchFilters, params->nFilters, u_response );
|
||||||
if (!w_request->u_request) delete u_response;
|
if (!w_request->u_request) delete u_response;
|
||||||
else u_response->add_request( w_request );
|
else w_request->u_response = u_response;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -312,7 +262,7 @@ static NTSTATUS ISteamMatchmakingServers_RequestLANServerList( Iface *iface, Par
|
|||||||
struct w_request *w_request = u_response->w_request;
|
struct w_request *w_request = u_response->w_request;
|
||||||
w_request->u_request = iface->RequestLANServerList( params->iApp, u_response );
|
w_request->u_request = iface->RequestLANServerList( params->iApp, u_response );
|
||||||
if (!w_request->u_request) delete u_response;
|
if (!w_request->u_request) delete u_response;
|
||||||
else u_response->add_request( w_request );
|
else w_request->u_response = u_response;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -323,7 +273,7 @@ static NTSTATUS ISteamMatchmakingServers_RequestFriendsServerList( Iface *iface,
|
|||||||
struct w_request *w_request = u_response->w_request;
|
struct w_request *w_request = u_response->w_request;
|
||||||
w_request->u_request = iface->RequestFriendsServerList( params->iApp, params->ppchFilters, params->nFilters, u_response );
|
w_request->u_request = iface->RequestFriendsServerList( params->iApp, params->ppchFilters, params->nFilters, u_response );
|
||||||
if (!w_request->u_request) delete u_response;
|
if (!w_request->u_request) delete u_response;
|
||||||
else u_response->add_request( w_request );
|
else w_request->u_response = u_response;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -334,7 +284,7 @@ static NTSTATUS ISteamMatchmakingServers_RequestFavoritesServerList( Iface *ifac
|
|||||||
struct w_request *w_request = u_response->w_request;
|
struct w_request *w_request = u_response->w_request;
|
||||||
w_request->u_request = iface->RequestFavoritesServerList( params->iApp, params->ppchFilters, params->nFilters, u_response );
|
w_request->u_request = iface->RequestFavoritesServerList( params->iApp, params->ppchFilters, params->nFilters, u_response );
|
||||||
if (!w_request->u_request) delete u_response;
|
if (!w_request->u_request) delete u_response;
|
||||||
else u_response->add_request( w_request );
|
else w_request->u_response = u_response;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -345,7 +295,7 @@ static NTSTATUS ISteamMatchmakingServers_RequestHistoryServerList( Iface *iface,
|
|||||||
struct w_request *w_request = u_response->w_request;
|
struct w_request *w_request = u_response->w_request;
|
||||||
w_request->u_request = iface->RequestHistoryServerList( params->iApp, params->ppchFilters, params->nFilters, u_response );
|
w_request->u_request = iface->RequestHistoryServerList( params->iApp, params->ppchFilters, params->nFilters, u_response );
|
||||||
if (!w_request->u_request) delete u_response;
|
if (!w_request->u_request) delete u_response;
|
||||||
else u_response->add_request( w_request );
|
else w_request->u_response = u_response;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -356,7 +306,7 @@ static NTSTATUS ISteamMatchmakingServers_RequestSpectatorServerList( Iface *ifac
|
|||||||
struct w_request *w_request = u_response->w_request;
|
struct w_request *w_request = u_response->w_request;
|
||||||
w_request->u_request = iface->RequestSpectatorServerList( params->iApp, params->ppchFilters, params->nFilters, u_response );
|
w_request->u_request = iface->RequestSpectatorServerList( params->iApp, params->ppchFilters, params->nFilters, u_response );
|
||||||
if (!w_request->u_request) delete u_response;
|
if (!w_request->u_request) delete u_response;
|
||||||
else u_response->add_request( w_request );
|
else w_request->u_response = u_response;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -389,7 +339,7 @@ static NTSTATUS ISteamMatchmakingServers_ReleaseRequest( Iface *iface, Params *p
|
|||||||
{
|
{
|
||||||
struct w_request *w_request = (struct w_request *)(void *)params->hServerListRequest;
|
struct w_request *w_request = (struct w_request *)(void *)params->hServerListRequest;
|
||||||
iface->ReleaseRequest( w_request ? (void *)w_request->u_request : nullptr );
|
iface->ReleaseRequest( w_request ? (void *)w_request->u_request : nullptr );
|
||||||
SteamMatchmakingServerListResponse_106::request_released( w_request );
|
if (w_request) free_callback_obj( (SteamMatchmakingServerListResponse_106 *)w_request->u_response );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -228,6 +228,7 @@ struct networking_message
|
|||||||
struct w_request
|
struct w_request
|
||||||
{
|
{
|
||||||
struct u_request u_request;
|
struct u_request u_request;
|
||||||
|
struct u_response u_response;
|
||||||
};
|
};
|
||||||
|
|
||||||
#include <poppack.h>
|
#include <poppack.h>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user