From 87ff9c9ae8826387f61613870d108c1b94d71e86 Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Sat, 26 Apr 2014 15:01:33 +0200 Subject: [PATCH] Add methods to load and unload specific simulator plugins refs #215 fixes #208 --- src/blackcore/context_simulator.h | 6 +++ src/blackcore/context_simulator_impl.cpp | 41 +++++++++++++++++++-- src/blackcore/context_simulator_impl.h | 6 +++ src/blackcore/context_simulator_proxy.cpp | 10 +++++ src/blackcore/context_simulator_proxy.h | 6 +++ src/blackcore/simulator.h | 3 ++ src/plugins/simulator/fsx/simulator_fsx.cpp | 30 ++++++++++++--- src/plugins/simulator/fsx/simulator_fsx.h | 5 +++ 8 files changed, 98 insertions(+), 9 deletions(-) diff --git a/src/blackcore/context_simulator.h b/src/blackcore/context_simulator.h index 44f306a04..9a1a9204b 100644 --- a/src/blackcore/context_simulator.h +++ b/src/blackcore/context_simulator.h @@ -66,6 +66,12 @@ namespace BlackCore //! Simulator info virtual BlackSim::CSimulatorInfo getSimulatorInfo() const = 0; + //! Load specific simulator plugin + virtual bool loadSimulatorPlugin (const BlackSim::CSimulatorInfo &simulatorInfo) = 0; + + //! Unload simulator plugin + virtual void unloadSimulatorPlugin () = 0; + //! Simulator avialable? bool isSimulatorAvailable() const { return !getSimulatorInfo().isUnspecified(); } diff --git a/src/blackcore/context_simulator_impl.cpp b/src/blackcore/context_simulator_impl.cpp index 98e03b8fa..05e79a814 100644 --- a/src/blackcore/context_simulator_impl.cpp +++ b/src/blackcore/context_simulator_impl.cpp @@ -5,16 +5,14 @@ #include "context_simulator_impl.h" #include +#include #include "context_runtime.h" -#ifdef BLACK_WITH_FSX -#include "fsx/simulator_fsx.h" -#endif - using namespace BlackMisc; using namespace BlackMisc::PhysicalQuantities; using namespace BlackMisc::Aviation; using namespace BlackMisc::Geo; +using namespace BlackSim; namespace BlackCore { @@ -23,6 +21,8 @@ namespace BlackCore { m_updateTimer = new QTimer(this); findSimulatorPlugins(); + loadSimulatorPlugin(CSimulatorInfo::FSX()); + connect(m_updateTimer, &QTimer::timeout, this, &CContextSimulator::updateOwnAircraft); connectTo(); } @@ -30,6 +30,7 @@ namespace BlackCore CContextSimulator::~CContextSimulator() { disconnectFrom(); + unloadSimulatorPlugin(); } bool CContextSimulator::isConnected() const @@ -73,6 +74,35 @@ namespace BlackCore return m_simulator->getSimulatorInfo(); } + bool CContextSimulator::loadSimulatorPlugin(const CSimulatorInfo &simulatorInfo) + { + ISimulatorFactory *factory = nullptr; + QSet::iterator iterator = std::find_if(m_simulatorFactories.begin(), m_simulatorFactories.end(), [ = ](const ISimulatorFactory *factory) + { + return factory->getSimulatorInfo() == simulatorInfo; + }); + + if(iterator == m_simulatorFactories.end()) + return false; + + factory = *iterator; + Q_ASSERT(factory); + + m_simulator = factory->create(this); + Q_ASSERT(m_simulator); + + connect(m_simulator, SIGNAL(connectionChanged(bool)), this, SLOT(setConnectionStatus(bool))); + return true; + } + + void CContextSimulator::unloadSimulatorPlugin() + { + if(m_simulator) + m_simulator->deleteLater(); + + m_simulator = nullptr; + } + void CContextSimulator::updateOwnAircraft() { m_ownAircraft = m_simulator->getOwnAircraft(); @@ -100,6 +130,9 @@ namespace BlackCore foreach(QString fileName, m_pluginsDir.entryList(QDir::Files)) { + if (!QLibrary::isLibrary(fileName)) + continue; + QPluginLoader loader(m_pluginsDir.absoluteFilePath(fileName)); QObject *plugin = loader.instance(); if (plugin) diff --git a/src/blackcore/context_simulator_impl.h b/src/blackcore/context_simulator_impl.h index 87a7c85e4..2d576c8d6 100644 --- a/src/blackcore/context_simulator_impl.h +++ b/src/blackcore/context_simulator_impl.h @@ -48,6 +48,12 @@ namespace BlackCore //! \copydoc IContextSimulator::getSimulatorInfo() virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override; + //! \copydoc IContextSimulator::loadSimulatorPlugin() + virtual bool loadSimulatorPlugin (const BlackSim::CSimulatorInfo &simulatorInfo) override; + + //! \copydoc IContextSimulator::unloadSimulatorPlugin() + virtual void unloadSimulatorPlugin () override; + protected: //! \brief Constructor CContextSimulator(CRuntimeConfig::ContextMode, CRuntime *runtime); diff --git a/src/blackcore/context_simulator_proxy.cpp b/src/blackcore/context_simulator_proxy.cpp index 5542938df..e733073c2 100644 --- a/src/blackcore/context_simulator_proxy.cpp +++ b/src/blackcore/context_simulator_proxy.cpp @@ -57,4 +57,14 @@ namespace BlackCore return m_dBusInterface->callDBusRet(QLatin1Literal("getSimulatorInfo")); } + bool CContextSimulatorProxy::loadSimulatorPlugin(const BlackSim::CSimulatorInfo &simulatorInfo) + { + return m_dBusInterface->callDBusRet(QLatin1Literal("loadSimulatorPlugin"), simulatorInfo); + } + + void CContextSimulatorProxy::unloadSimulatorPlugin() + { + m_dBusInterface->callDBus(QLatin1Literal("unloadSimulatorPlugin")); + } + } // namespace BlackCore diff --git a/src/blackcore/context_simulator_proxy.h b/src/blackcore/context_simulator_proxy.h index c680e2899..2dee782e2 100644 --- a/src/blackcore/context_simulator_proxy.h +++ b/src/blackcore/context_simulator_proxy.h @@ -53,6 +53,12 @@ namespace BlackCore //! \copydoc IContextSimulator::getSimulatorInfo virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override; + + //! \copydoc IContextSimulator::loadSimulatorPlugin + virtual bool loadSimulatorPlugin (const BlackSim::CSimulatorInfo &simulatorInfo) override; + + //! \copydoc IContextSimulator::unloadSimulatorPlugin() + virtual void unloadSimulatorPlugin () override; }; } // namespace BlackCore diff --git a/src/blackcore/simulator.h b/src/blackcore/simulator.h index 3e8dc07d9..333103eca 100644 --- a/src/blackcore/simulator.h +++ b/src/blackcore/simulator.h @@ -89,6 +89,9 @@ namespace BlackCore * \return */ virtual ISimulator *create(QObject *parent = nullptr) = 0; + + //! Simulator info + virtual BlackSim::CSimulatorInfo getSimulatorInfo() const = 0; }; } // namespace BlackCore diff --git a/src/plugins/simulator/fsx/simulator_fsx.cpp b/src/plugins/simulator/fsx/simulator_fsx.cpp index c4d76de91..78c846000 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.cpp +++ b/src/plugins/simulator/fsx/simulator_fsx.cpp @@ -3,11 +3,11 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include "blacksim/fsx/fsxsimulatorsetup.h" #include "simulator_fsx.h" #include "simconnect_datadefinition.h" #include "simconnect_exception.h" - +#include "blacksim/fsx/fsxsimulatorsetup.h" +#include "blacksim/simulatorinfo.h" #include using namespace BlackMisc::Aviation; @@ -25,6 +25,11 @@ namespace BlackSimPlugin return new Fsx::CSimulatorFsx(parent); } + BlackSim::CSimulatorInfo CSimulatorFsxFactory::getSimulatorInfo() const + { + return CSimulatorInfo::FSX(); + } + CSimulatorFsx::CSimulatorFsx(QObject *parent) : ISimulator(parent), m_isConnected(false), @@ -39,6 +44,11 @@ namespace BlackSimPlugin this->m_simulatorInfo.setSimulatorSetup(setup.getSettings()); } + CSimulatorFsx::~CSimulatorFsx() + { + disconnectFrom(); + } + bool CSimulatorFsx::isConnected() const { return m_isConnected; @@ -65,11 +75,21 @@ namespace BlackSimPlugin bool CSimulatorFsx::disconnectFrom() { - SimConnect_Close(m_hSimConnect); - killTimer(m_simconnectTimerId); - m_isConnected = false; + if (!m_isConnected) + return true; emit connectionChanged(false); + if (m_hSimConnect) + SimConnect_Close(m_hSimConnect); + + + if (m_simconnectTimerId) + killTimer(m_simconnectTimerId); + + m_hSimConnect = nullptr; + m_simconnectTimerId = -1; + m_isConnected = false; + return true; } diff --git a/src/plugins/simulator/fsx/simulator_fsx.h b/src/plugins/simulator/fsx/simulator_fsx.h index 8370f8866..699e66ce5 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.h +++ b/src/plugins/simulator/fsx/simulator_fsx.h @@ -35,6 +35,9 @@ namespace BlackSimPlugin public: //! \copydoc BlackCore::ISimulatorFactory::create() virtual BlackCore::ISimulator *create(QObject *parent) override; + + //! Simulator info + virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override; }; //! \brief SimConnect Event ID's @@ -58,6 +61,8 @@ namespace BlackSimPlugin //! \brief Constructor CSimulatorFsx(QObject *parent = nullptr); + virtual ~CSimulatorFsx(); + //! \copydoc ISimulator::isConnected() virtual bool isConnected() const override;