#if 0 #pragma makedep unix #endif #include "unix_private.h" #include WINE_DEFAULT_DEBUG_CHANNEL(steamclient); template void free_callback_obj(T *obj) { obj->w_iface = (struct w_iface *)0xdeadbeef; *(void **)obj = (void *)0xdeadbeef; delete obj; } template class callback_obj_tracker { std::unordered_map 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 w_iface *w_iface; virtual void ServerResponded( int32_t ); virtual void ServerFailedToRespond( int32_t ); virtual void RefreshComplete( uint32_t ); }; void SteamMatchmakingServerListResponse_099u::ServerResponded( int32_t iServer ) { queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_0_1, (intptr_t)iServer, 0 ); } void SteamMatchmakingServerListResponse_099u::ServerFailedToRespond( int32_t iServer ) { queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_1_1, (intptr_t)iServer, 0 ); } void SteamMatchmakingServerListResponse_099u::RefreshComplete( uint32_t response ) { queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_2_1, (intptr_t)response, 0 ); TRACE( "RefreshComplete this %p, w_iface %p.\n", this, this->w_iface ); } u_ISteamMatchmakingServerListResponse_099u *create_LinuxISteamMatchmakingServerListResponse_099u( void *win ) { SteamMatchmakingServerListResponse_099u *ret; if (!win) return NULL; if (!(ret = new SteamMatchmakingServerListResponse_099u())) return NULL; ret->w_iface = (struct w_iface *)win; TRACE("-> %p.\n", ret); return ret; } struct SteamMatchmakingServerListResponse_106 : u_ISteamMatchmakingServerListResponse_106 { struct w_iface *w_iface; static class callback_obj_tracker track; 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 ServerFailedToRespond( void *, int32_t ); virtual void RefreshComplete( void *, uint32_t ); }; class callback_obj_tracker SteamMatchmakingServerListResponse_106::track; void SteamMatchmakingServerListResponse_106::ServerResponded( void *hRequest, int32_t iServer ) { queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_0_2, (intptr_t)hRequest, (intptr_t)iServer ); } void SteamMatchmakingServerListResponse_106::ServerFailedToRespond( void *hRequest, int32_t iServer ) { queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_1_2, (intptr_t)hRequest, (intptr_t)iServer ); } void SteamMatchmakingServerListResponse_106::RefreshComplete( void *hRequest, uint32_t response ) { queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_2_2, (intptr_t)hRequest, (intptr_t)response ); TRACE( "RefreshComplete this %p, w_iface %p.\n", this, this->w_iface ); } SteamMatchmakingServerListResponse_106 *create_LinuxISteamMatchmakingServerListResponse_106( void *win ) { SteamMatchmakingServerListResponse_106 *ret; if (!win) return NULL; if (!(ret = new SteamMatchmakingServerListResponse_106())) return NULL; ret->w_iface = (struct w_iface *)win; TRACE("-> %p.\n", ret); return ret; } struct SteamMatchmakingPingResponse : u_ISteamMatchmakingPingResponse { struct w_iface *w_iface; virtual void ServerResponded( gameserveritem_t_105 * ); virtual void ServerFailedToRespond( ); }; void SteamMatchmakingPingResponse::ServerResponded( gameserveritem_t_105 *server ) { queue_vtable_callback_0_server_responded( this->w_iface, server ); TRACE("Deleting this %p, w_iface %p.\n", this, this->w_iface); free_callback_obj(this); } void SteamMatchmakingPingResponse::ServerFailedToRespond(void) { queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_1_0, 0, 0 ); TRACE("Deleting this %p, w_iface %p.\n", this, this->w_iface); free_callback_obj(this); } struct u_ISteamMatchmakingPingResponse *create_LinuxISteamMatchmakingPingResponse( void *win ) { SteamMatchmakingPingResponse *ret; if (!win) return NULL; if (!(ret = new SteamMatchmakingPingResponse())) return NULL; ret->w_iface = (struct w_iface *)win; TRACE("-> %p.\n", ret); return ret; } struct SteamMatchmakingPlayersResponse : u_ISteamMatchmakingPlayersResponse { struct w_iface *w_iface; virtual void AddPlayerToList( const char *, int32_t, float ); virtual void PlayersFailedToRespond( ); virtual void PlayersRefreshComplete( ); }; void SteamMatchmakingPlayersResponse::AddPlayerToList(const char *pchName, int nScore, float flTimePlayed) { queue_vtable_callback_0_add_player_to_list( this->w_iface, pchName, nScore, flTimePlayed ); } void SteamMatchmakingPlayersResponse::PlayersFailedToRespond(void) { queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_1_0, 0, 0 ); TRACE("Deleting this %p, w_iface %p.\n", this, this->w_iface); free_callback_obj(this); } void SteamMatchmakingPlayersResponse::PlayersRefreshComplete(void) { queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_2_0, 0, 0 ); TRACE("Deleting this %p, w_iface %p.\n", this, this->w_iface); free_callback_obj(this); } struct u_ISteamMatchmakingPlayersResponse *create_LinuxISteamMatchmakingPlayersResponse( void *win ) { struct SteamMatchmakingPlayersResponse *ret; if (!win) return NULL; if (!(ret = new SteamMatchmakingPlayersResponse())) return NULL; ret->w_iface = (struct w_iface *)win; TRACE("-> %p.\n", ret); return ret; } struct SteamMatchmakingRulesResponse : u_ISteamMatchmakingRulesResponse { struct w_iface *w_iface; virtual void RulesResponded( const char *, const char * ); virtual void RulesFailedToRespond( ); virtual void RulesRefreshComplete( ); }; void SteamMatchmakingRulesResponse::RulesResponded(const char *pchRule, const char *pchValue) { queue_vtable_callback_0_rules_responded( this->w_iface, pchRule, pchValue ); } void SteamMatchmakingRulesResponse::RulesFailedToRespond(void) { queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_1_0, 0, 0 ); TRACE("Deleting this %p, w_iface %p.\n", this, this->w_iface); free_callback_obj(this); } void SteamMatchmakingRulesResponse::RulesRefreshComplete(void) { queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_2_0, 0, 0 ); TRACE("Deleting this %p, w_iface %p.\n", this, this->w_iface); free_callback_obj(this); } struct u_ISteamMatchmakingRulesResponse *create_LinuxISteamMatchmakingRulesResponse( void *win ) { SteamMatchmakingRulesResponse *ret; if (!win) return NULL; if (!(ret = new SteamMatchmakingRulesResponse())) return NULL; ret->w_iface = (struct w_iface *)win; TRACE("-> %p.\n", ret); return ret; } template< typename Params > static NTSTATUS ISteamMatchmakingServers_RequestInternetServerList( u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface, Params *params ) { u_ISteamMatchmakingServerListResponse_099u *u_response = create_LinuxISteamMatchmakingServerListResponse_099u( params->pRequestServersResponse ); iface->RequestInternetServerList( params->iApp, params->ppchFilters, params->nFilters, u_response ); return 0; } template< typename Params > static NTSTATUS ISteamMatchmakingServers_RequestLANServerList( u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface, Params *params ) { u_ISteamMatchmakingServerListResponse_099u *u_response = create_LinuxISteamMatchmakingServerListResponse_099u( params->pRequestServersResponse ); iface->RequestLANServerList( params->iApp, u_response ); return 0; } template< typename Params > static NTSTATUS ISteamMatchmakingServers_RequestFriendsServerList( u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface, Params *params ) { u_ISteamMatchmakingServerListResponse_099u *u_response = create_LinuxISteamMatchmakingServerListResponse_099u( params->pRequestServersResponse ); iface->RequestFriendsServerList( params->iApp, params->ppchFilters, params->nFilters, u_response ); return 0; } template< typename Params > static NTSTATUS ISteamMatchmakingServers_RequestFavoritesServerList( u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface, Params *params ) { u_ISteamMatchmakingServerListResponse_099u *u_response = create_LinuxISteamMatchmakingServerListResponse_099u( params->pRequestServersResponse ); iface->RequestFavoritesServerList( params->iApp, params->ppchFilters, params->nFilters, u_response ); return 0; } template< typename Params > static NTSTATUS ISteamMatchmakingServers_RequestHistoryServerList( u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface, Params *params ) { u_ISteamMatchmakingServerListResponse_099u *u_response = create_LinuxISteamMatchmakingServerListResponse_099u( params->pRequestServersResponse ); iface->RequestHistoryServerList( params->iApp, params->ppchFilters, params->nFilters, u_response ); return 0; } template< typename Params > static NTSTATUS ISteamMatchmakingServers_RequestSpectatorServerList( u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface, Params *params ) { u_ISteamMatchmakingServerListResponse_099u *u_response = create_LinuxISteamMatchmakingServerListResponse_099u( params->pRequestServersResponse ); iface->RequestSpectatorServerList( params->iApp, params->ppchFilters, params->nFilters, u_response ); return 0; } template< typename Iface, typename Params > static NTSTATUS ISteamMatchmakingServers_RequestInternetServerList( Iface *iface, Params *params ) { SteamMatchmakingServerListResponse_106 *u_response = create_LinuxISteamMatchmakingServerListResponse_106( params->pRequestServersResponse ); params->_ret = iface->RequestInternetServerList( params->iApp, params->ppchFilters, params->nFilters, u_response ); u_response->add_request( params->_ret ); return 0; } template< typename Iface, typename Params > static NTSTATUS ISteamMatchmakingServers_RequestLANServerList( Iface *iface, Params *params ) { SteamMatchmakingServerListResponse_106 *u_response = create_LinuxISteamMatchmakingServerListResponse_106( params->pRequestServersResponse ); params->_ret = iface->RequestLANServerList( params->iApp, u_response ); u_response->add_request( params->_ret ); return 0; } template< typename Iface, typename Params > static NTSTATUS ISteamMatchmakingServers_RequestFriendsServerList( Iface *iface, Params *params ) { SteamMatchmakingServerListResponse_106 *u_response = create_LinuxISteamMatchmakingServerListResponse_106( params->pRequestServersResponse ); params->_ret = iface->RequestFriendsServerList( params->iApp, params->ppchFilters, params->nFilters, u_response ); u_response->add_request( params->_ret ); return 0; } template< typename Iface, typename Params > static NTSTATUS ISteamMatchmakingServers_RequestFavoritesServerList( Iface *iface, Params *params ) { SteamMatchmakingServerListResponse_106 *u_response = create_LinuxISteamMatchmakingServerListResponse_106( params->pRequestServersResponse ); params->_ret = iface->RequestFavoritesServerList( params->iApp, params->ppchFilters, params->nFilters, u_response ); u_response->add_request( params->_ret ); return 0; } template< typename Iface, typename Params > static NTSTATUS ISteamMatchmakingServers_RequestHistoryServerList( Iface *iface, Params *params ) { SteamMatchmakingServerListResponse_106 *u_response = create_LinuxISteamMatchmakingServerListResponse_106( params->pRequestServersResponse ); params->_ret = iface->RequestHistoryServerList( params->iApp, params->ppchFilters, params->nFilters, u_response ); u_response->add_request( params->_ret ); return 0; } template< typename Iface, typename Params > static NTSTATUS ISteamMatchmakingServers_RequestSpectatorServerList( Iface *iface, Params *params ) { SteamMatchmakingServerListResponse_106 *u_response = create_LinuxISteamMatchmakingServerListResponse_106( params->pRequestServersResponse ); params->_ret = iface->RequestSpectatorServerList( params->iApp, params->ppchFilters, params->nFilters, u_response ); u_response->add_request( params->_ret ); return 0; } template< typename Iface, typename Params > static NTSTATUS ISteamMatchmakingServers_PingServer( Iface *iface, Params *params ) { u_ISteamMatchmakingPingResponse *u_response = create_LinuxISteamMatchmakingPingResponse( params->pRequestServersResponse ); params->_ret = iface->PingServer( params->unIP, params->usPort, u_response ); return 0; } template< typename Iface, typename Params > static NTSTATUS ISteamMatchmakingServers_PlayerDetails( Iface *iface, Params *params ) { u_ISteamMatchmakingPlayersResponse *u_response = create_LinuxISteamMatchmakingPlayersResponse( params->pRequestServersResponse ); params->_ret = iface->PlayerDetails( params->unIP, params->usPort, u_response ); return 0; } template< typename Iface, typename Params > static NTSTATUS ISteamMatchmakingServers_ServerRules( Iface *iface, Params *params ) { u_ISteamMatchmakingRulesResponse *u_response = create_LinuxISteamMatchmakingRulesResponse( params->pRequestServersResponse ); params->_ret = iface->ServerRules( params->unIP, params->usPort, u_response ); return 0; } template< typename Iface, typename Params > static NTSTATUS ISteamMatchmakingServers_ReleaseRequest( Iface *iface, Params *params ) { iface->ReleaseRequest( params->hServerListRequest ); SteamMatchmakingServerListResponse_106::request_released( params->hServerListRequest ); return 0; } LSTEAMCLIENT_UNIX_IMPL( ISteamMatchmakingServers, SteamMatchMakingServers001, RequestInternetServerList ); LSTEAMCLIENT_UNIX_IMPL( ISteamMatchmakingServers, SteamMatchMakingServers001, RequestLANServerList ); LSTEAMCLIENT_UNIX_IMPL( ISteamMatchmakingServers, SteamMatchMakingServers001, RequestFriendsServerList ); LSTEAMCLIENT_UNIX_IMPL( ISteamMatchmakingServers, SteamMatchMakingServers001, RequestFavoritesServerList ); LSTEAMCLIENT_UNIX_IMPL( ISteamMatchmakingServers, SteamMatchMakingServers001, RequestHistoryServerList ); LSTEAMCLIENT_UNIX_IMPL( ISteamMatchmakingServers, SteamMatchMakingServers001, RequestSpectatorServerList ); LSTEAMCLIENT_UNIX_IMPL( ISteamMatchmakingServers, SteamMatchMakingServers001, PingServer ); LSTEAMCLIENT_UNIX_IMPL( ISteamMatchmakingServers, SteamMatchMakingServers001, PlayerDetails ); LSTEAMCLIENT_UNIX_IMPL( ISteamMatchmakingServers, SteamMatchMakingServers001, ServerRules ); LSTEAMCLIENT_UNIX_IMPL( ISteamMatchmakingServers, SteamMatchMakingServers002, RequestInternetServerList ); LSTEAMCLIENT_UNIX_IMPL( ISteamMatchmakingServers, SteamMatchMakingServers002, RequestLANServerList ); LSTEAMCLIENT_UNIX_IMPL( ISteamMatchmakingServers, SteamMatchMakingServers002, RequestFriendsServerList ); LSTEAMCLIENT_UNIX_IMPL( ISteamMatchmakingServers, SteamMatchMakingServers002, RequestFavoritesServerList ); LSTEAMCLIENT_UNIX_IMPL( ISteamMatchmakingServers, SteamMatchMakingServers002, RequestHistoryServerList ); LSTEAMCLIENT_UNIX_IMPL( ISteamMatchmakingServers, SteamMatchMakingServers002, RequestSpectatorServerList ); LSTEAMCLIENT_UNIX_IMPL( ISteamMatchmakingServers, SteamMatchMakingServers002, PingServer ); LSTEAMCLIENT_UNIX_IMPL( ISteamMatchmakingServers, SteamMatchMakingServers002, PlayerDetails ); LSTEAMCLIENT_UNIX_IMPL( ISteamMatchmakingServers, SteamMatchMakingServers002, ServerRules ); LSTEAMCLIENT_UNIX_IMPL( ISteamMatchmakingServers, SteamMatchMakingServers002, ReleaseRequest );