diff --git a/src/plugins/simulator/fs9/directplaypeer.cpp b/src/plugins/simulator/fs9/directplaypeer.cpp index f465baeec..f35ba2638 100644 --- a/src/plugins/simulator/fs9/directplaypeer.cpp +++ b/src/plugins/simulator/fs9/directplaypeer.cpp @@ -17,7 +17,6 @@ #include #include #include -#include using namespace BlackMisc; using namespace BlackMisc::Aviation; @@ -32,10 +31,9 @@ namespace BlackSimPlugin return cats; } - CDirectPlayPeer::CDirectPlayPeer(QObject *owner, const CCallsign &callsign) - : CContinuousWorker(owner, "peer_" + callsign.toQString()), + CDirectPlayPeer::CDirectPlayPeer(QObject *parent, const CCallsign &callsign) + : QObject(parent), m_callsign(callsign), - m_mutexHostList(QMutex::Recursive), m_callbackWrapper(this, &CDirectPlayPeer::directPlayMessageHandler) { } @@ -115,8 +113,6 @@ namespace BlackSimPlugin PDPNMSG_ENUM_HOSTS_RESPONSE enumHostsResponseMsg = static_cast(msgBuffer); const DPN_APPLICATION_DESC *applicationDescription = enumHostsResponseMsg->pApplicationDescription; - QMutexLocker locker(&m_mutexHostList); - auto iterator = std::find_if(m_hostNodeList.begin(), m_hostNodeList.end(), [&](const CHostNode & hostNode) { return applicationDescription->guidInstance == hostNode.getApplicationDesc().guidInstance; diff --git a/src/plugins/simulator/fs9/directplaypeer.h b/src/plugins/simulator/fs9/directplaypeer.h index dfadc82e0..2f2fa06cf 100644 --- a/src/plugins/simulator/fs9/directplaypeer.h +++ b/src/plugins/simulator/fs9/directplaypeer.h @@ -18,7 +18,6 @@ #include "blackmisc/logcategorylist.h" #include #include -#include #include #include #include @@ -31,13 +30,13 @@ namespace BlackSimPlugin //! DirectPlay peer implementation //! More information can be found in the DirectX9 SDK documentation //! http://doc.51windows.net/Directx9_SDK/?url=/Directx9_SDK/play/dplay.htm - class CDirectPlayPeer : public BlackMisc::CContinuousWorker + class CDirectPlayPeer : public QObject { Q_OBJECT public: //! Constructor - CDirectPlayPeer(QObject *owner, const BlackMisc::Aviation::CCallsign &callsign); + CDirectPlayPeer(QObject *parent, const BlackMisc::Aviation::CCallsign &callsign); //! Destructor virtual ~CDirectPlayPeer(); @@ -91,8 +90,6 @@ namespace BlackSimPlugin // We need the Id of the users player, because we are sending packets only to him std::atomic m_playerUser = {0}; //!< User player Id - QMutex m_mutexHostList; //!< Host list mutex - using TCallbackWrapper = CallbackWrapper; //!< DirectPlay peer message handler wrapper TCallbackWrapper m_callbackWrapper; //!< Callback wrapper }; diff --git a/src/plugins/simulator/fs9/fs9client.cpp b/src/plugins/simulator/fs9/fs9client.cpp index c4242fc15..0f7d081cd 100644 --- a/src/plugins/simulator/fs9/fs9client.cpp +++ b/src/plugins/simulator/fs9/fs9client.cpp @@ -137,6 +137,7 @@ namespace BlackSimPlugin CFs9Client::~CFs9Client() { + closeConnection(); SafeRelease(m_hostAddress); } @@ -172,6 +173,13 @@ namespace BlackSimPlugin } } + void CFs9Client::start() + { + initDirectPlay(); + createDeviceAddress(); + connectToSession(m_callsign); + } + CStatusMessageList CFs9Client::getInterpolationMessages(CInterpolationAndRenderingSetupBase::InterpolatorMode mode) const { if (!this->getInterpolator()) { return CStatusMessageList(); } @@ -195,18 +203,6 @@ namespace BlackSimPlugin sendMultiplayerParamaters(); } - void CFs9Client::initialize() - { - initDirectPlay(); - createDeviceAddress(); - connectToSession(m_callsign); - } - - void CFs9Client::cleanup() - { - closeConnection(); - } - HRESULT CFs9Client::enumDirectPlayHosts() { HRESULT hr = s_ok(); @@ -278,8 +274,6 @@ namespace BlackSimPlugin HRESULT hr = s_ok(); if (m_clientStatus == Connected) { return hr; } - QMutexLocker locker(&m_mutexHostList); - QScopedArrayPointer wszPlayername(new wchar_t[static_cast(callsign.toQString().size() + 1)]); callsign.toQString().toWCharArray(wszPlayername.data()); wszPlayername[callsign.toQString().size()] = 0; @@ -390,7 +384,7 @@ namespace BlackSimPlugin const ISimulator *CFs9Client::simulator() const { - return qobject_cast(this->owner()); + return qobject_cast(this->parent()); } } } diff --git a/src/plugins/simulator/fs9/fs9client.h b/src/plugins/simulator/fs9/fs9client.h index 485f0768b..2515777e4 100644 --- a/src/plugins/simulator/fs9/fs9client.h +++ b/src/plugins/simulator/fs9/fs9client.h @@ -15,7 +15,6 @@ #include "blackmisc/aviation/aircraftsituation.h" #include "blackmisc/aviation/callsign.h" #include "blackmisc/pq/time.h" -#include #include #include @@ -52,6 +51,9 @@ namespace BlackSimPlugin //! Set DirectPlay host address void setHostAddress(const QString &hostAddress); + //! Starts the FS9 client messaging + void start(); + //! Get interpolator @{ BlackMisc::Simulation::CInterpolatorMulti *getInterpolator() { return &m_interpolator; } const BlackMisc::Simulation::CInterpolatorMulti *getInterpolator() const { return &m_interpolator; } @@ -72,12 +74,6 @@ namespace BlackSimPlugin //! \copydoc QObject::timerEvent virtual void timerEvent(QTimerEvent *event) override; - //! \copydoc BlackMisc::CContinuousWorker::initialize - virtual void initialize() override; - - //! \copydoc BlackMisc::CContinuousWorker::cleanup - virtual void cleanup() override; - private: //! Enumerate all FS9 session hosts HRESULT enumDirectPlayHosts(); diff --git a/src/plugins/simulator/fs9/fs9host.cpp b/src/plugins/simulator/fs9/fs9host.cpp index 4ed3640d2..8c25abda3 100644 --- a/src/plugins/simulator/fs9/fs9host.cpp +++ b/src/plugins/simulator/fs9/fs9host.cpp @@ -27,7 +27,16 @@ namespace BlackSimPlugin { CFs9Host::CFs9Host(QObject *owner) : CDirectPlayPeer(owner, sApp->swiftVersionString()) - {} + { + initDirectPlay(); + createHostAddress(); + startHosting(sApp->swiftVersionString(), m_callsign.toQString()); + } + + CFs9Host::~CFs9Host() + { + stopHosting(); + } QString CFs9Host::getHostAddress() { @@ -73,18 +82,6 @@ namespace BlackSimPlugin sendMessage(message); } - void CFs9Host::initialize() - { - initDirectPlay(); - createHostAddress(); - startHosting(sApp->swiftVersionString(), m_callsign.toQString()); - } - - void CFs9Host::cleanup() - { - stopHosting(); - } - HRESULT CFs9Host::startHosting(const QString &session, const QString &callsign) { HRESULT hr = S_OK; diff --git a/src/plugins/simulator/fs9/fs9host.h b/src/plugins/simulator/fs9/fs9host.h index ec1ad9c19..359613202 100644 --- a/src/plugins/simulator/fs9/fs9host.h +++ b/src/plugins/simulator/fs9/fs9host.h @@ -35,7 +35,7 @@ namespace BlackSimPlugin CFs9Host(QObject *owner); //! Destructor - virtual ~CFs9Host() {} + virtual ~CFs9Host(); //! Returns true if the users simulator is connected bool isConnected() const { return m_playerUser != 0; } @@ -51,13 +51,6 @@ namespace BlackSimPlugin //! Hosting status changed void statusChanged(BlackSimPlugin::Fs9::CFs9Host::HostStatus); - protected: - //! \copydoc BlackMisc::CContinuousWorker::initialize - virtual void initialize() override; - - //! \copydoc BlackMisc::CContinuousWorker::cleanup - virtual void cleanup() override; - private: //! Start host session HRESULT startHosting(const QString &session, const QString &callsign); diff --git a/src/plugins/simulator/fs9/simulatorfs9.cpp b/src/plugins/simulator/fs9/simulatorfs9.cpp index c7acced32..84d6960a7 100644 --- a/src/plugins/simulator/fs9/simulatorfs9.cpp +++ b/src/plugins/simulator/fs9/simulatorfs9.cpp @@ -193,7 +193,7 @@ namespace BlackSimPlugin if (!m_hashFs9Clients.contains(callsign)) { return false; } auto fs9Client = m_hashFs9Clients.value(callsign); - fs9Client->quit(); + delete fs9Client; m_hashFs9Clients.remove(callsign); updateAircraftRendered(callsign, false); CLogMessage(this).info(u"FS9: Removed aircraft %1") << callsign.toQString(); @@ -466,7 +466,7 @@ namespace BlackSimPlugin static void cleanupFs9Host(CFs9Host *host) { - host->quitAndWait(); + delete host; } CSimulatorFs9Factory::CSimulatorFs9Factory(QObject *parent) : @@ -478,8 +478,6 @@ namespace BlackSimPlugin /* After FS9 is disconnected, reset its data stored in the host */ connect(m_lobbyClient.data(), &CLobbyClient::disconnected, m_fs9Host.data(), &CFs9Host::reset); - - m_fs9Host->start(); } CSimulatorFs9Factory::~CSimulatorFs9Factory()