From 0d21f70d3bb99d7e3ad9712b60ebd1c91bb59f3e Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Mon, 18 May 2015 20:21:30 +0200 Subject: [PATCH] cleanup stalled DirectPlay peers --- src/plugins/simulator/fs9/fs9_host.cpp | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/plugins/simulator/fs9/fs9_host.cpp b/src/plugins/simulator/fs9/fs9_host.cpp index d3364f652..f940feeb9 100644 --- a/src/plugins/simulator/fs9/fs9_host.cpp +++ b/src/plugins/simulator/fs9/fs9_host.cpp @@ -148,6 +148,22 @@ namespace BlackSimPlugin m_hostStatus = Hosting; } + // Enumerate the number of stalled DirectPlay peers + DWORD dwNumPlayers = 0; + hr = m_directPlayPeer->EnumPlayersAndGroups( nullptr, &dwNumPlayers, DPNENUM_PLAYERS ); + + if(hr == DPNERR_BUFFERTOOSMALL) + { + QScopedArrayPointer stalledPeers(new DPNID[dwNumPlayers]); + hr = m_directPlayPeer->EnumPlayersAndGroups( stalledPeers.data(), &dwNumPlayers, DPNENUM_PLAYERS ); + + // Destroy all stalled peers + for (DWORD i = 0; i < dwNumPlayers; ++i) + { + m_directPlayPeer->DestroyPeer(stalledPeers[i], nullptr, 0, 0); + } + } + emit statusChanged(m_hostStatus); return hr; } @@ -171,6 +187,22 @@ namespace BlackSimPlugin m_hostStatus = Terminated; + // Enumerate the number of stalled DirectPlay peers + DWORD dwNumPlayers = 0; + hr = m_directPlayPeer->EnumPlayersAndGroups( nullptr, &dwNumPlayers, DPNENUM_PLAYERS ); + + if(hr == DPNERR_BUFFERTOOSMALL) + { + QScopedArrayPointer stalledPeers(new DPNID[dwNumPlayers]); + hr = m_directPlayPeer->EnumPlayersAndGroups( stalledPeers.data(), &dwNumPlayers, DPNENUM_PLAYERS ); + + // Destroy all stalled peers + for (DWORD i = 0; i < dwNumPlayers; ++i) + { + m_directPlayPeer->DestroyPeer(stalledPeers[i], nullptr, 0, 0); + } + } + emit statusChanged(m_hostStatus); return hr; }