refs #404 Try to connect only if FS9 is registered as lobbied application

This commit is contained in:
Roland Winklmeier
2015-05-21 00:43:22 +02:00
parent bad3ed3ea8
commit 3b8a4d5613
4 changed files with 55 additions and 10 deletions

View File

@@ -12,6 +12,7 @@
#include "blackmisc/project.h"
#include "fs9.h"
#include "lobby_client.h"
#include "blackmisc/logmessage.h"
#include <QDebug>
#include <QTimer>
#include <QFile>
@@ -86,6 +87,35 @@ namespace BlackSimPlugin
return S_OK;
}
bool CLobbyClient::canLobbyConnect()
{
GUID appGuid = CFs9Sdk::guid();
DWORD dwSize = 0;
DWORD dwItems = 0;
HRESULT hr = m_dpLobbyClient->EnumLocalPrograms(&appGuid, nullptr, &dwSize, &dwItems, 0);
if (hr == DPNERR_BUFFERTOOSMALL)
{
QScopedArrayPointer<BYTE> memPtr (new BYTE[dwSize]);
DPL_APPLICATION_INFO *appInfo = reinterpret_cast<DPL_APPLICATION_INFO *>(memPtr.data());
m_dpLobbyClient->EnumLocalPrograms(&appGuid, memPtr.data(), &dwSize, &dwItems, 0);
if (dwItems > 0)
{
BlackMisc::CLogMessage(this).debug() << "Found lobby application:" << QString::fromWCharArray(appInfo->pwszApplicationName);;
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
HRESULT CLobbyClient::connectFs9ToHost(const QString address)
{
HRESULT hr = S_OK;
@@ -109,9 +139,12 @@ namespace BlackSimPlugin
&m_applicationHandle,
INFINITE,
0);
if (FAILED(hr)) {
return hr == DPNERR_NOCONNECTION ? S_FALSE : printDirectPlayError(hr);
} else {
if (FAILED(hr))
{
return hr;
}
else
{
qDebug() << "Connected!";
freeConnectSettings(dnConnectInfo.pdplConnectionSettings);
return S_OK;

View File

@@ -28,6 +28,9 @@ namespace BlackSimPlugin
//! Initialize DirectPlay
HRESULT initDirectPlay();
//! Can FS9 be lobby connected?
bool canLobbyConnect();
//! Connect FS9 simulator to our host
HRESULT connectFs9ToHost(const QString address);

View File

@@ -290,27 +290,35 @@ namespace BlackSimPlugin
Q_CONSTEXPR int QueryInterval = 5 * 1000; // 5 seconds
m_timer->setInterval(QueryInterval);
connect(m_timer, &QTimer::timeout, [this]()
// Test whether we can lobby connect at all.
bool canLobbyConnect = lobbyClient->canLobbyConnect();
connect(m_timer, &QTimer::timeout, [this, canLobbyConnect]()
{
if (fs9Host->getHostAddress().isEmpty()) // host not yet set up
return;
if (m_lobbyConnected || lobbyClient->connectFs9ToHost(fs9Host->getHostAddress()) == S_OK)
if (canLobbyConnect)
{
m_lobbyConnected = true;
CLogMessage(this).info("Swift is joining FS9 to the multiplayer session...");
if (m_isConnecting || lobbyClient->connectFs9ToHost(fs9Host->getHostAddress()) == S_OK)
{
m_isConnecting = true;
CLogMessage(this).info("Swift is joining FS9 to the multiplayer session...");
}
}
if (m_lobbyConnected && fs9Host->isConnected())
if (!m_isStarted && fs9Host->isConnected())
{
emit simulatorStarted();
m_lobbyConnected = false;
m_isStarted = true;
m_isConnecting = false;
}
});
}
void CSimulatorFs9Listener::start()
{
m_isStarted = false;
m_timer->start();
}

View File

@@ -131,7 +131,8 @@ namespace BlackSimPlugin
private:
QTimer *m_timer = nullptr;
bool m_lobbyConnected = false;
bool m_isConnecting = false;
bool m_isStarted = false;
};