diff --git a/src/blackcore/context_simulator_impl.cpp b/src/blackcore/context_simulator_impl.cpp index 3f4da9038..6106271c6 100644 --- a/src/blackcore/context_simulator_impl.cpp +++ b/src/blackcore/context_simulator_impl.cpp @@ -74,6 +74,40 @@ namespace BlackCore return plugin->factory; } + CVariant CContextSimulator::getPluginData(const QObject *obj, const QString& key) const + { + const QObject* p = obj; + while (p && !p->inherits("BlackCore::ISimulatorFactory")) + { + p = p->parent(); + } + + if (!p) return CVariant(); + auto it = std::find_if(m_simulatorPlugins.begin(), m_simulatorPlugins.end(), [p](const PluginData &plugin) + { + return plugin.factory == qobject_cast(p); + }); + Q_ASSERT(it != m_simulatorPlugins.end()); + return it->m_storage.value(key); + } + + void CContextSimulator::setPluginData(const QObject *obj, const QString &key, const CVariant &value) + { + const QObject* p = obj; + while (p && !p->inherits("BlackCore::ISimulatorFactory")) + { + p = p->parent(); + } + + if (!p) { return; } + auto it = std::find_if(m_simulatorPlugins.begin(), m_simulatorPlugins.end(), [p](const PluginData &plugin) + { + return plugin.factory == qobject_cast(p); + }); + Q_ASSERT(it != m_simulatorPlugins.end()); + it->m_storage.insert(key, value); + } + CSimulatorPluginInfoList CContextSimulator::getAvailableSimulatorPlugins() const { CSimulatorPluginInfoList list; diff --git a/src/blackcore/context_simulator_impl.h b/src/blackcore/context_simulator_impl.h index a09ac8103..ea8cca6f7 100644 --- a/src/blackcore/context_simulator_impl.h +++ b/src/blackcore/context_simulator_impl.h @@ -21,6 +21,8 @@ #include "blackmisc/network/textmessagelist.h" #include "blackmisc/pixmap.h" #include "blackmisc/simulation/simulatedaircraftlist.h" +#include "blackmisc/pluginstorageprovider.h" +#include "blackmisc/variant.h" #include #include #include @@ -28,7 +30,9 @@ namespace BlackCore { //! Network simulator concrete implementation - class BLACKCORE_EXPORT CContextSimulator : public IContextSimulator + class BLACKCORE_EXPORT CContextSimulator : + public IContextSimulator, + public BlackMisc::IPluginStorageProvider { Q_OBJECT Q_CLASSINFO("D-Bus Interface", BLACKCORE_CONTEXTSIMULATOR_INTERFACENAME) @@ -44,6 +48,12 @@ namespace BlackCore //! \todo Consider moving to private scope. ISimulatorFactory *getSimulatorFactory(const BlackMisc::Simulation::CSimulatorPluginInfo &simulator); + //! \copydoc IPluginStorageProvider::getPluginData + virtual BlackMisc::CVariant getPluginData(const QObject *obj, const QString& key) const; + + //! \copydoc IPluginStorageProvider::setPluginData + virtual void setPluginData(const QObject *obj, const QString& key, const BlackMisc::CVariant &value); + public slots: //! \copydoc IContextSimulator::getSimulatorPluginList() @@ -199,6 +209,7 @@ namespace BlackCore ISimulatorListener *listener = nullptr; //!< Listener instance, nullptr by default ISimulator *simulator = nullptr; //!< The simulator itself (always nullptr unless it is the currently working one) QString fileName; //!< Plugin file name (relative to plugins/simulator) + QHash m_storage; //!< Permanent plugin storage - data stored here will be kept even when plugin is unloaded }; //! Find and catalog all simulator plugins diff --git a/src/blackcore/simulator.h b/src/blackcore/simulator.h index 104be3610..0ae1f0513 100644 --- a/src/blackcore/simulator.h +++ b/src/blackcore/simulator.h @@ -20,6 +20,7 @@ #include "blackmisc/simulation/aircraftmodellist.h" #include "blackmisc/simulation/ownaircraftprovider.h" #include "blackmisc/simulation/remoteaircraftprovider.h" +#include "blackmisc/pluginstorageprovider.h" #include "blackmisc/statusmessagelist.h" #include "blackmisc/aviation/airportlist.h" #include "blackmisc/network/textmessage.h" @@ -270,18 +271,19 @@ namespace BlackCore //! \param info metadata about simulator //! \param ownAircraftProvider in memory access to own aircraft data //! \param renderedAircraftProvider in memory access to rendered aircraft data such as situation history and aircraft itself - //! \param parent QObject + //! \param pluginStorageProvider in memory access to persistent plugin data store //! \return driver instance virtual ISimulator *create( const BlackMisc::Simulation::CSimulatorPluginInfo &info, BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider, BlackMisc::Simulation::IRemoteAircraftProvider *renderedAircraftProvider, - QObject *parent = nullptr) = 0; + BlackMisc::IPluginStorageProvider *pluginStorageProvider) = 0; //! Simulator listener instance virtual ISimulatorListener *createListener(QObject *parent = nullptr) = 0; }; + } // namespace Q_DECLARE_INTERFACE(BlackCore::ISimulatorFactory, "org.swift-project.blackcore.simulatorinterface") diff --git a/src/blackcore/simulator_common.cpp b/src/blackcore/simulator_common.cpp index 4571dfa9a..a6612eaba 100644 --- a/src/blackcore/simulator_common.cpp +++ b/src/blackcore/simulator_common.cpp @@ -25,10 +25,11 @@ namespace BlackCore CSimulatorCommon::CSimulatorCommon(const CSimulatorPluginInfo &info, BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider, BlackMisc::Simulation::IRemoteAircraftProvider *remoteAircraftProvider, - QObject *parent) + IPluginStorageProvider *pluginStorageProvider, QObject *parent) : ISimulator(parent), COwnAircraftAware(ownAircraftProvider), CRemoteAircraftAware(remoteAircraftProvider), + CPluginStorageAware(pluginStorageProvider), m_simulatorPluginInfo(info) { this->setObjectName(info.getIdentifier()); diff --git a/src/blackcore/simulator_common.h b/src/blackcore/simulator_common.h index 926c7b9dd..b0a16a566 100644 --- a/src/blackcore/simulator_common.h +++ b/src/blackcore/simulator_common.h @@ -21,6 +21,7 @@ #include "blackmisc/simulation/aircraftmodellist.h" #include "blackmisc/simulation/ownaircraftprovider.h" #include "blackmisc/simulation/remoteaircraftprovider.h" +#include "blackmisc/pluginstorageprovider.h" #include "blackmisc/statusmessagelist.h" #include "blackmisc/aviation/airportlist.h" #include "blackmisc/network/textmessage.h" @@ -34,8 +35,9 @@ namespace BlackCore //! Common base class with providers, interface and some base functionality class BLACKCORE_EXPORT CSimulatorCommon : public BlackCore::ISimulator, - public BlackMisc::Simulation::COwnAircraftAware, // gain access to in memor own aircraft data - public BlackMisc::Simulation::CRemoteAircraftAware // gain access to in memory remote aircraft data + public BlackMisc::Simulation::COwnAircraftAware, // gain access to in memory own aircraft data + public BlackMisc::Simulation::CRemoteAircraftAware, // gain access to in memory remote aircraft data + public BlackMisc::CPluginStorageAware // gain access to in memory plugin storage { Q_OBJECT @@ -116,7 +118,8 @@ namespace BlackCore CSimulatorCommon(const BlackMisc::Simulation::CSimulatorPluginInfo &info, BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider, BlackMisc::Simulation::IRemoteAircraftProvider *remoteAircraftProvider, - QObject *parent = nullptr); + BlackMisc::IPluginStorageProvider *pluginStorageProvider, + QObject *parent); //! \copydoc IContextSimulator::logicallyAddRemoteAircraft virtual bool logicallyAddRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft) override; diff --git a/src/blackmisc/pluginstorageprovider.h b/src/blackmisc/pluginstorageprovider.h new file mode 100644 index 000000000..9acbe6d7e --- /dev/null +++ b/src/blackmisc/pluginstorageprovider.h @@ -0,0 +1,69 @@ +/* Copyright (C) 2015 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +//! \file + +#ifndef BLACKMISC_PLUGINSTORAGEPROVIDER_H +#define BLACKMISC_PLUGINSTORAGEPROVIDER_H + +#include "blackmisc/variant.h" +#include + +namespace BlackMisc +{ + + //! Interface for a plugin storage provider. + //! It allows plugins to store any arbitrary data which can be packed into a \sa CVariant + //! Every plugin shall have its own data area. This means mulitple plugins can store + //! data under the same key without overwriting each other. + class IPluginStorageProvider + { + + public: + + //! Destructor + virtual ~IPluginStorageProvider() {} + + //! Get plugin data stored for object and identified by key + virtual CVariant getPluginData(const QObject *obj, const QString& key) const = 0; + + //! Store plugin data for object, identified by key and packed into value + virtual void setPluginData(const QObject *obj, const QString& key, const CVariant &value) = 0; + }; + + //! Delegating class which can be directly used to access an \sa IPluginStorageProvider instance + class CPluginStorageAware + { + public: + //! \copydoc IPluginStorageProvider::getPluginData + virtual CVariant getPluginData(const QObject *obj, const QString& key) const + { + return m_pluginStorageProvider->getPluginData(obj, key); + } + + //! \copydoc IOwnAircraftProvider::ownAircraft + virtual void setPluginData(const QObject *obj, const QString& key, const CVariant &value) + { + m_pluginStorageProvider->setPluginData(obj, key, value); + } + + + protected: + //! Constructor + CPluginStorageAware(IPluginStorageProvider *pluginStorageProvider) : + m_pluginStorageProvider(pluginStorageProvider) + { + Q_ASSERT(pluginStorageProvider); + } + IPluginStorageProvider *m_pluginStorageProvider = nullptr; //!< access to object + }; + +} // namespace + +#endif diff --git a/src/plugins/simulator/fs9/simulator_fs9.cpp b/src/plugins/simulator/fs9/simulator_fs9.cpp index 57c6fc370..0705065e6 100644 --- a/src/plugins/simulator/fs9/simulator_fs9.cpp +++ b/src/plugins/simulator/fs9/simulator_fs9.cpp @@ -50,8 +50,9 @@ namespace BlackSimPlugin const CSimulatorPluginInfo &info, IOwnAircraftProvider *ownAircraftProvider, IRemoteAircraftProvider *remoteAircraftProvider, + IPluginStorageProvider *pluginStorageProvider, QObject *parent) : - CSimulatorFsCommon(info, ownAircraftProvider, remoteAircraftProvider, parent) + CSimulatorFsCommon(info, ownAircraftProvider, remoteAircraftProvider, pluginStorageProvider, parent) { connect(lobbyClient.data(), &CLobbyClient::disconnected, this, std::bind(&CSimulatorFs9::simulatorStatusChanged, this, 0)); this->m_interpolator = new BlackCore::CInterpolatorLinear(remoteAircraftProvider, this); @@ -369,9 +370,9 @@ namespace BlackSimPlugin const CSimulatorPluginInfo &info, IOwnAircraftProvider *ownAircraftProvider, IRemoteAircraftProvider *remoteAircraftProvider, - QObject *parent) + IPluginStorageProvider *pluginStorageProvider) { - return new CSimulatorFs9(info, ownAircraftProvider, remoteAircraftProvider, parent); + return new CSimulatorFs9(info, ownAircraftProvider, remoteAircraftProvider, pluginStorageProvider, this); } BlackCore::ISimulatorListener *CSimulatorFs9Factory::createListener(QObject *parent) diff --git a/src/plugins/simulator/fs9/simulator_fs9.h b/src/plugins/simulator/fs9/simulator_fs9.h index a9d00f915..968efd99c 100644 --- a/src/plugins/simulator/fs9/simulator_fs9.h +++ b/src/plugins/simulator/fs9/simulator_fs9.h @@ -43,6 +43,7 @@ namespace BlackSimPlugin const BlackMisc::Simulation::CSimulatorPluginInfo &info, BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider, BlackMisc::Simulation::IRemoteAircraftProvider *remoteAircraftProvider, + BlackMisc::IPluginStorageProvider *pluginStorageProvider, QObject *parent = nullptr); //! Destructor @@ -159,7 +160,7 @@ namespace BlackSimPlugin const BlackMisc::Simulation::CSimulatorPluginInfo &info, BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider, BlackMisc::Simulation::IRemoteAircraftProvider *remoteAircraftProvider, - QObject *parent) override; + BlackMisc::IPluginStorageProvider *pluginStorageProvider) override; //! \copydoc BlackCore::ISimulatorFactory::createListener virtual BlackCore::ISimulatorListener *createListener(QObject *parent = nullptr) override; diff --git a/src/plugins/simulator/fscommon/simulator_fscommon.cpp b/src/plugins/simulator/fscommon/simulator_fscommon.cpp index bfdd1a31f..e20a352e7 100644 --- a/src/plugins/simulator/fscommon/simulator_fscommon.cpp +++ b/src/plugins/simulator/fscommon/simulator_fscommon.cpp @@ -29,8 +29,9 @@ namespace BlackSimPlugin const CSimulatorPluginInfo &info, IOwnAircraftProvider *ownAircraftProvider, IRemoteAircraftProvider *renderedAircraftProvider, + IPluginStorageProvider *pluginStorageProvider, QObject *parent) : - CSimulatorCommon(info, ownAircraftProvider, renderedAircraftProvider, parent), + CSimulatorCommon(info, ownAircraftProvider, renderedAircraftProvider, pluginStorageProvider, parent), m_fsuipc(new CFsuipc()) { // hack to init mapper diff --git a/src/plugins/simulator/fscommon/simulator_fscommon.h b/src/plugins/simulator/fscommon/simulator_fscommon.h index c77e84e46..664218854 100644 --- a/src/plugins/simulator/fscommon/simulator_fscommon.h +++ b/src/plugins/simulator/fscommon/simulator_fscommon.h @@ -83,6 +83,7 @@ namespace BlackSimPlugin CSimulatorFsCommon(const BlackMisc::Simulation::CSimulatorPluginInfo &info, BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider, BlackMisc::Simulation::IRemoteAircraftProvider *renderedAircraftProvider, + BlackMisc::IPluginStorageProvider *pluginStorageProvider, QObject *parent = nullptr); QString simulatorDetails; //!< describes version etc. diff --git a/src/plugins/simulator/fsx/simulator_fsx.cpp b/src/plugins/simulator/fsx/simulator_fsx.cpp index b58f65628..2fba2012f 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.cpp +++ b/src/plugins/simulator/fsx/simulator_fsx.cpp @@ -38,12 +38,12 @@ namespace BlackSimPlugin { namespace Fsx { - CSimulatorFsx::CSimulatorFsx( - const CSimulatorPluginInfo &info, + CSimulatorFsx::CSimulatorFsx(const CSimulatorPluginInfo &info, IOwnAircraftProvider *ownAircraftProvider, IRemoteAircraftProvider *remoteAircraftProvider, + IPluginStorageProvider *pluginStorageProvider, QObject *parent) : - CSimulatorFsCommon(info, ownAircraftProvider, remoteAircraftProvider, parent) + CSimulatorFsCommon(info, ownAircraftProvider, remoteAircraftProvider, pluginStorageProvider, parent) { Q_ASSERT(ownAircraftProvider); Q_ASSERT(remoteAircraftProvider); diff --git a/src/plugins/simulator/fsx/simulator_fsx.h b/src/plugins/simulator/fsx/simulator_fsx.h index 3802e2ae9..ac3d405c8 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.h +++ b/src/plugins/simulator/fsx/simulator_fsx.h @@ -78,6 +78,7 @@ namespace BlackSimPlugin const BlackMisc::Simulation::CSimulatorPluginInfo &info, BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider, BlackMisc::Simulation::IRemoteAircraftProvider *remoteAircraftProvider, + BlackMisc::IPluginStorageProvider *pluginStorageProvider, QObject *parent = nullptr); //! Destructor diff --git a/src/plugins/simulator/fsx/simulator_fsxfactory.cpp b/src/plugins/simulator/fsx/simulator_fsxfactory.cpp index b83ef44a4..72c509543 100644 --- a/src/plugins/simulator/fsx/simulator_fsxfactory.cpp +++ b/src/plugins/simulator/fsx/simulator_fsxfactory.cpp @@ -18,10 +18,13 @@ namespace BlackSimPlugin { namespace Fsx { - BlackCore::ISimulator *CSimulatorFsxFactory::create(const BlackMisc::Simulation::CSimulatorPluginInfo &info, BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider, BlackMisc::Simulation::IRemoteAircraftProvider *renderedAircraftProvider, QObject *parent) + BlackCore::ISimulator *CSimulatorFsxFactory::create(const BlackMisc::Simulation::CSimulatorPluginInfo &info, + BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider, + BlackMisc::Simulation::IRemoteAircraftProvider *renderedAircraftProvider, + BlackMisc::IPluginStorageProvider *pluginStorageProvider) { Q_ASSERT(ownAircraftProvider); - return new CSimulatorFsx(info, ownAircraftProvider, renderedAircraftProvider, parent); + return new CSimulatorFsx(info, ownAircraftProvider, renderedAircraftProvider, pluginStorageProvider, this); } BlackCore::ISimulatorListener *CSimulatorFsxFactory::createListener(QObject *parent) diff --git a/src/plugins/simulator/fsx/simulator_fsxfactory.h b/src/plugins/simulator/fsx/simulator_fsxfactory.h index a424e5265..a31638508 100644 --- a/src/plugins/simulator/fsx/simulator_fsxfactory.h +++ b/src/plugins/simulator/fsx/simulator_fsxfactory.h @@ -35,7 +35,7 @@ namespace BlackSimPlugin virtual BlackCore::ISimulator *create(const BlackMisc::Simulation::CSimulatorPluginInfo &info, BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider, BlackMisc::Simulation::IRemoteAircraftProvider *renderedAircraftProvider, - QObject *parent) override; + BlackMisc::IPluginStorageProvider *pluginStorageProvider) override; //! \copydoc BlackCore::ISimulatorFactory::getListener virtual BlackCore::ISimulatorListener *createListener(QObject *parent = nullptr) override; diff --git a/src/plugins/simulator/xplane/simulator_xplane.cpp b/src/plugins/simulator/xplane/simulator_xplane.cpp index 76ca77861..5b5fd5581 100644 --- a/src/plugins/simulator/xplane/simulator_xplane.cpp +++ b/src/plugins/simulator/xplane/simulator_xplane.cpp @@ -37,12 +37,12 @@ namespace BlackSimPlugin namespace XPlane { - CSimulatorXPlane::CSimulatorXPlane( - const BlackMisc::Simulation::CSimulatorPluginInfo &info, + CSimulatorXPlane::CSimulatorXPlane(const BlackMisc::Simulation::CSimulatorPluginInfo &info, IOwnAircraftProvider *ownAircraftProvider, IRemoteAircraftProvider *remoteAircraftProvider, + IPluginStorageProvider *pluginStorageProvider, QObject *parent) : - CSimulatorCommon(info, ownAircraftProvider, remoteAircraftProvider, parent) + CSimulatorCommon(info, ownAircraftProvider, remoteAircraftProvider, pluginStorageProvider, parent) { m_watcher = new QDBusServiceWatcher(this); m_watcher->setWatchMode(QDBusServiceWatcher::WatchForUnregistration); @@ -434,13 +434,12 @@ namespace BlackSimPlugin return true; } - BlackCore::ISimulator *CSimulatorXPlaneFactory::create( - const BlackMisc::Simulation::CSimulatorPluginInfo &info, + BlackCore::ISimulator *CSimulatorXPlaneFactory::create(const BlackMisc::Simulation::CSimulatorPluginInfo &info, IOwnAircraftProvider *ownAircraftProvider, IRemoteAircraftProvider *renderedAircraftProvider, - QObject *parent) + IPluginStorageProvider *pluginStorageProvider) { - return new CSimulatorXPlane(info, ownAircraftProvider, renderedAircraftProvider, parent); + return new CSimulatorXPlane(info, ownAircraftProvider, renderedAircraftProvider, pluginStorageProvider, this); } CSimulatorXPlaneListener::CSimulatorXPlaneListener(QObject *parent): ISimulatorListener(parent) diff --git a/src/plugins/simulator/xplane/simulator_xplane.h b/src/plugins/simulator/xplane/simulator_xplane.h index 997c8e9ae..092f6a0e9 100644 --- a/src/plugins/simulator/xplane/simulator_xplane.h +++ b/src/plugins/simulator/xplane/simulator_xplane.h @@ -36,6 +36,7 @@ namespace BlackSimPlugin CSimulatorXPlane(const BlackMisc::Simulation::CSimulatorPluginInfo &info, BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider, BlackMisc::Simulation::IRemoteAircraftProvider *remoteAircraftProvider, + BlackMisc::IPluginStorageProvider *pluginStorageProvider, QObject *parent = nullptr); //! \copydoc ISimulator::isTimeSynchronized @@ -218,7 +219,7 @@ namespace BlackSimPlugin virtual BlackCore::ISimulator *create(const BlackMisc::Simulation::CSimulatorPluginInfo &info, BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider, BlackMisc::Simulation::IRemoteAircraftProvider *renderedAircraftProvider, - QObject *parent) override; + BlackMisc::IPluginStorageProvider *pluginStorageProvider) override; //! \copydoc BlackCore::ISimulatorFactory::createListener virtual BlackCore::ISimulatorListener *createListener(QObject *parent = nullptr) override { return new CSimulatorXPlaneListener(parent); }