diff --git a/src/blackcore/airspacemonitor.cpp b/src/blackcore/airspacemonitor.cpp index b06585508..8b5760245 100644 --- a/src/blackcore/airspacemonitor.cpp +++ b/src/blackcore/airspacemonitor.cpp @@ -312,7 +312,7 @@ namespace BlackCore void CAirspaceMonitor::testAddAircraftParts(const CCallsign &callsign, const CAircraftParts &parts, bool incremental) { this->onAircraftConfigReceived(callsign, - incremental ? parts.toIncrementalJson() : parts.toJson(), + incremental ? parts.toIncrementalJson() : parts.toFullJson(), 5000); } @@ -911,8 +911,7 @@ namespace BlackCore CClient client = this->getClientOrDefaultForCallsign(callsign); if (client.hasCapability(CClient::FsdWithAircraftConfig)) { return; } client.addCapability(CClient::FsdWithAircraftConfig); - const int caps = client.getCapabilities(); - this->updateOrAddClient(callsign, CPropertyIndexVariantMap(CClient::IndexCapabilities, CVariant::from(caps))); + this->setOtherClient(client); } void CAirspaceMonitor::storeAircraftSituation(const CAircraftSituation &situation) diff --git a/src/blackcore/airspacemonitor.h b/src/blackcore/airspacemonitor.h index 74ca59639..39b2e44b6 100644 --- a/src/blackcore/airspacemonitor.h +++ b/src/blackcore/airspacemonitor.h @@ -56,8 +56,8 @@ namespace BlackCore class BLACKCORE_EXPORT CAirspaceMonitor : public BlackMisc::Simulation::CRemoteAircraftProvider, // those data will be provided from the class CAirspaceMonitor public BlackMisc::Simulation::COwnAircraftAware, // used to obtain in memory information about own aircraft - public BlackMisc::Simulation::CSimulationEnvironmentAware, // elevation info etc. - public BlackMisc::Network::IClientProvider // those data will be provided from the class CAirspaceMonitor + public BlackMisc::Simulation::CSimulationEnvironmentAware, // elevation info etc. from simulator + public BlackMisc::Network::CClientProvider // those data will be provided from the class CAirspaceMonitor { Q_OBJECT Q_INTERFACES(BlackMisc::Network::IClientProvider) diff --git a/src/blackcore/context/contextnetwork.h b/src/blackcore/context/contextnetwork.h index 59aafb8c3..cd9e5c407 100644 --- a/src/blackcore/context/contextnetwork.h +++ b/src/blackcore/context/contextnetwork.h @@ -205,10 +205,13 @@ namespace BlackCore virtual BlackMisc::Network::CUser getUserForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const = 0; //! Information about other clients - virtual BlackMisc::Network::CClientList getOtherClients() const = 0; + virtual BlackMisc::Network::CClientList getClients() const = 0; //! Clients for given callsign, e.g. to test/fetch direct aircraft model - virtual BlackMisc::Network::CClientList getOtherClientsForCallsigns(const BlackMisc::Aviation::CCallsignSet &callsigns) const = 0; + virtual BlackMisc::Network::CClientList getClientsForCallsigns(const BlackMisc::Aviation::CCallsignSet &callsigns) const = 0; + + //! Set client for given callsign + virtual bool setOtherClient(const BlackMisc::Network::CClient &client) = 0; //! Known voice servers, available when data file was first read virtual BlackMisc::Network::CServerList getVatsimVoiceServers() const = 0; diff --git a/src/blackcore/context/contextnetworkempty.h b/src/blackcore/context/contextnetworkempty.h index ee2df9f5d..811539ede 100644 --- a/src/blackcore/context/contextnetworkempty.h +++ b/src/blackcore/context/contextnetworkempty.h @@ -193,21 +193,29 @@ namespace BlackCore return BlackMisc::Network::CUser(); } - //! \copydoc IContextNetwork::getOtherClients - virtual BlackMisc::Network::CClientList getOtherClients() const override + //! \copydoc IContextNetwork::getClients + virtual BlackMisc::Network::CClientList getClients() const override { logEmptyContextWarning(Q_FUNC_INFO); return BlackMisc::Network::CClientList(); } - //! \copydoc IContextNetwork::getOtherClientsForCallsigns - virtual BlackMisc::Network::CClientList getOtherClientsForCallsigns(const BlackMisc::Aviation::CCallsignSet &callsigns) const override + //! \copydoc IContextNetwork::getClientsForCallsigns + virtual BlackMisc::Network::CClientList getClientsForCallsigns(const BlackMisc::Aviation::CCallsignSet &callsigns) const override { Q_UNUSED(callsigns); logEmptyContextWarning(Q_FUNC_INFO); return BlackMisc::Network::CClientList(); } + //! \copydoc IContextNetwork::setOtherClient + virtual bool setOtherClient(const BlackMisc::Network::CClient &client) override + { + Q_UNUSED(client); + logEmptyContextWarning(Q_FUNC_INFO); + return false; + } + //! \copydoc IContextNetwork::requestDataUpdates virtual void requestDataUpdates()override { diff --git a/src/blackcore/context/contextnetworkimpl.cpp b/src/blackcore/context/contextnetworkimpl.cpp index 9a2ed0f58..fc3210eee 100644 --- a/src/blackcore/context/contextnetworkimpl.cpp +++ b/src/blackcore/context/contextnetworkimpl.cpp @@ -389,18 +389,34 @@ namespace BlackCore return users[0]; } - CClientList CContextNetwork::getOtherClients() const + CClientList CContextNetwork::getClients() const { if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } return m_airspace->getClients(); } - CClientList CContextNetwork::getOtherClientsForCallsigns(const CCallsignSet &callsigns) const + CClientList CContextNetwork::getClientsForCallsigns(const CCallsignSet &callsigns) const { if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } return m_airspace->getClientsForCallsigns(callsigns); } + bool CContextNetwork::setOtherClient(const CClient &client) + { + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } + return m_airspace->setOtherClient(client); + } + + int CContextNetwork::removeClient(const Aviation::CCallsign &callsign) + { + return m_airspace->removeClient(callsign); + } + + bool CContextNetwork::autoAdjustCientGndCapability(const Aviation::CAircraftSituation &situation) + { + return m_airspace->autoAdjustCientGndCapability(situation); + } + CServerList CContextNetwork::getVatsimFsdServers() const { Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO, "Missing data reader"); @@ -762,6 +778,36 @@ namespace BlackCore return m_airspace->getLatestAirspaceAircraftSnapshot(); } + void CContextNetwork::setClients(const CClientList &clients) + { + m_airspace->setClients(clients); + } + + void CContextNetwork::clearClients() + { + m_airspace->clearClients(); + } + + CClient CContextNetwork::getClientOrDefaultForCallsign(const Aviation::CCallsign &callsign) const + { + return m_airspace->getClientOrDefaultForCallsign(callsign); + } + + bool CContextNetwork::hasClientInfo(const Aviation::CCallsign &callsign) const + { + return m_airspace->hasClientInfo(callsign); + } + + bool CContextNetwork::addNewClient(const CClient &client) + { + return m_airspace->addNewClient(client); + } + + int CContextNetwork::updateOrAddClient(const Aviation::CCallsign &callsign, const CPropertyIndexVariantMap &vm, bool skipEqualValues) + { + return m_airspace->updateOrAddClient(callsign, vm, skipEqualValues); + } + void CContextNetwork::setFastPositionEnabledCallsigns(CCallsignSet &callsigns) { if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsigns; } diff --git a/src/blackcore/context/contextnetworkimpl.h b/src/blackcore/context/contextnetworkimpl.h index 0857e5b83..476a6ceae 100644 --- a/src/blackcore/context/contextnetworkimpl.h +++ b/src/blackcore/context/contextnetworkimpl.h @@ -32,6 +32,7 @@ #include "blackmisc/aviation/callsignset.h" #include "blackmisc/aviation/flightplan.h" #include "blackmisc/network/clientlist.h" +#include "blackmisc/network/clientprovider.h" #include "blackmisc/network/server.h" #include "blackmisc/network/serverlist.h" #include "blackmisc/network/textmessagelist.h" @@ -73,10 +74,12 @@ namespace BlackCore //! Network context implementation class BLACKCORE_EXPORT CContextNetwork : public IContextNetwork, - public BlackMisc::Simulation::IRemoteAircraftProvider + public BlackMisc::Simulation::IRemoteAircraftProvider, + public BlackMisc::Network::IClientProvider { Q_OBJECT Q_INTERFACES(BlackMisc::Simulation::IRemoteAircraftProvider) + Q_INTERFACES(BlackMisc::Network::IClientProvider) Q_CLASSINFO("D-Bus Interface", BLACKCORE_CONTEXTNETWORK_INTERFACENAME) friend class IContextNetwork; @@ -107,6 +110,18 @@ namespace BlackCore virtual BlackMisc::Simulation::CAirspaceAircraftSnapshot getLatestAirspaceAircraftSnapshot() const override; //! @} + //! \ingroup clientprovider + //! @{ + virtual void setClients(const BlackMisc::Network::CClientList &clients) override; + virtual void clearClients() override; + virtual BlackMisc::Network::CClient getClientOrDefaultForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const override; + virtual bool hasClientInfo(const BlackMisc::Aviation::CCallsign &callsign) const override; + virtual bool addNewClient(const BlackMisc::Network::CClient &client) override; + virtual int updateOrAddClient(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::CPropertyIndexVariantMap &vm, bool skipEqualValues = true) override; + virtual int removeClient(const BlackMisc::Aviation::CCallsign &callsign) override; + virtual bool autoAdjustCientGndCapability(const BlackMisc::Aviation::CAircraftSituation &situation) override; + //! @} + public slots: // from context and provider interface //! \ingroup remoteaircraftprovider @@ -138,6 +153,13 @@ namespace BlackCore virtual bool testAddAltitudeOffset(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CLength &offset = BlackMisc::PhysicalQuantities::CLength::null()) override; //! @} + //! \ingroup clientprovider + //! @{ + virtual BlackMisc::Network::CClientList getClients() const override; + virtual BlackMisc::Network::CClientList getClientsForCallsigns(const BlackMisc::Aviation::CCallsignSet &callsigns) const override; + virtual bool setOtherClient(const BlackMisc::Network::CClient &client) override; + //! @} + //! In transition state, e.g. connecting, disconnecting. //! \details In such a state it is advisable to wait until an end state (connected/disconnected) is reached //! \remarks Intentionally only running locally, not in interface @@ -183,8 +205,6 @@ namespace BlackCore virtual BlackMisc::Network::CUserList getUsers() const override; virtual BlackMisc::Network::CUserList getUsersForCallsigns(const BlackMisc::Aviation::CCallsignSet &callsigns) const override; virtual BlackMisc::Network::CUser getUserForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const override; - virtual BlackMisc::Network::CClientList getOtherClients() const override; - virtual BlackMisc::Network::CClientList getOtherClientsForCallsigns(const BlackMisc::Aviation::CCallsignSet &callsigns) const override; virtual BlackMisc::Network::CServerList getVatsimFsdServers() const override; virtual BlackMisc::Network::CServerList getVatsimVoiceServers() const override; virtual void requestDataUpdates()override; diff --git a/src/blackcore/context/contextnetworkproxy.cpp b/src/blackcore/context/contextnetworkproxy.cpp index 574761b2b..2995a699b 100644 --- a/src/blackcore/context/contextnetworkproxy.cpp +++ b/src/blackcore/context/contextnetworkproxy.cpp @@ -160,9 +160,9 @@ namespace BlackCore return m_dBusInterface->callDBusRet(QLatin1String("getUserForCallsign"), callsign); } - CClientList CContextNetworkProxy::getOtherClients() const + CClientList CContextNetworkProxy::getClients() const { - return m_dBusInterface->callDBusRet(QLatin1String("getOtherClients")); + return m_dBusInterface->callDBusRet(QLatin1String("getClients")); } CServerList CContextNetworkProxy::getVatsimFsdServers() const @@ -175,9 +175,14 @@ namespace BlackCore return m_dBusInterface->callDBusRet(QLatin1String("getVatsimVoiceServers")); } - CClientList CContextNetworkProxy::getOtherClientsForCallsigns(const BlackMisc::Aviation::CCallsignSet &callsigns) const + CClientList CContextNetworkProxy::getClientsForCallsigns(const BlackMisc::Aviation::CCallsignSet &callsigns) const { - return m_dBusInterface->callDBusRet(QLatin1String("getOtherClientsForCallsigns"), callsigns); + return m_dBusInterface->callDBusRet(QLatin1String("getClientsForCallsigns"), callsigns); + } + + bool CContextNetworkProxy::setOtherClient(const CClient &client) + { + return m_dBusInterface->callDBusRet(QLatin1String("setOtherClientForCallsign"), client); } CVoiceRoomList CContextNetworkProxy::getSelectedVoiceRooms() const diff --git a/src/blackcore/context/contextnetworkproxy.h b/src/blackcore/context/contextnetworkproxy.h index 76ae2b065..e8678a8a8 100644 --- a/src/blackcore/context/contextnetworkproxy.h +++ b/src/blackcore/context/contextnetworkproxy.h @@ -98,10 +98,11 @@ namespace BlackCore virtual BlackMisc::Network::CUserList getUsers() const override; virtual BlackMisc::Network::CUserList getUsersForCallsigns(const BlackMisc::Aviation::CCallsignSet &callsigns) const override; virtual BlackMisc::Network::CUser getUserForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const override; - virtual BlackMisc::Network::CClientList getOtherClients() const override; + virtual BlackMisc::Network::CClientList getClients() const override; virtual BlackMisc::Network::CServerList getVatsimVoiceServers() const override; virtual BlackMisc::Network::CServerList getVatsimFsdServers() const override; - virtual BlackMisc::Network::CClientList getOtherClientsForCallsigns(const BlackMisc::Aviation::CCallsignSet &callsigns) const override; + virtual BlackMisc::Network::CClientList getClientsForCallsigns(const BlackMisc::Aviation::CCallsignSet &callsigns) const override; + virtual bool setOtherClient(const BlackMisc::Network::CClient &client) override; virtual void requestDataUpdates()override; virtual void requestAtisUpdates() override; virtual bool updateAircraftEnabled(const BlackMisc::Aviation::CCallsign &callsign, bool enabledForRedering) override; diff --git a/src/blackcore/context/contextsimulatorimpl.cpp b/src/blackcore/context/contextsimulatorimpl.cpp index 9e8976f4c..ea548c072 100644 --- a/src/blackcore/context/contextsimulatorimpl.cpp +++ b/src/blackcore/context/contextsimulatorimpl.cpp @@ -342,7 +342,8 @@ namespace BlackCore Q_ASSERT_X(this->getIContextNetwork()->isUsingImplementingObject(), Q_FUNC_INFO, "Need implementing object"); IOwnAircraftProvider *ownAircraftProvider = this->getRuntime()->getCContextOwnAircraft(); IRemoteAircraftProvider *renderedAircraftProvider = this->getRuntime()->getCContextNetwork(); - ISimulator *simulator = factory->create(simulatorPluginInfo, ownAircraftProvider, renderedAircraftProvider, &m_weatherManager); + IClientProvider *clientProvider = this->getRuntime()->getCContextNetwork(); + ISimulator *simulator = factory->create(simulatorPluginInfo, ownAircraftProvider, renderedAircraftProvider, &m_weatherManager, clientProvider); Q_ASSERT_X(simulator, Q_FUNC_INFO, "no simulator driver can be created"); this->setRemoteAircraftProvider(renderedAircraftProvider); diff --git a/src/blackcore/simulator.cpp b/src/blackcore/simulator.cpp index c7270dd2c..b5d8aaa86 100644 --- a/src/blackcore/simulator.cpp +++ b/src/blackcore/simulator.cpp @@ -88,13 +88,17 @@ namespace BlackCore return (status.testFlag(Connected) || status.testFlag(Simulating) || status.testFlag(Paused)); } - ISimulator::ISimulator( - const CSimulatorPluginInfo &pluginInfo, IOwnAircraftProvider *ownAircraftProvider, - IRemoteAircraftProvider *remoteAircraftProvider, IWeatherGridProvider *weatherGridProvider, QObject *parent) : + ISimulator::ISimulator(const CSimulatorPluginInfo &pluginInfo, + IOwnAircraftProvider *ownAircraftProvider, + IRemoteAircraftProvider *remoteAircraftProvider, + IWeatherGridProvider *weatherGridProvider, + IClientProvider *clientProvider, + QObject *parent) : QObject(parent), COwnAircraftAware(ownAircraftProvider), CRemoteAircraftAware(remoteAircraftProvider), CWeatherGridAware(weatherGridProvider), + CClientAware(clientProvider), ISimulationEnvironmentProvider(pluginInfo), IInterpolationSetupProvider(), CIdentifiable(this) diff --git a/src/blackcore/simulatorcommon.cpp b/src/blackcore/simulatorcommon.cpp index 8db0d3902..4f611c08f 100644 --- a/src/blackcore/simulatorcommon.cpp +++ b/src/blackcore/simulatorcommon.cpp @@ -37,6 +37,7 @@ using namespace BlackConfig; using namespace BlackMisc; using namespace BlackMisc::Geo; using namespace BlackMisc::Aviation; +using namespace BlackMisc::Network; using namespace BlackMisc::Simulation; using namespace BlackMisc::PhysicalQuantities; using namespace BlackMisc::Simulation; @@ -49,8 +50,9 @@ namespace BlackCore IOwnAircraftProvider *ownAircraftProvider, IRemoteAircraftProvider *remoteAircraftProvider, IWeatherGridProvider *weatherGridProvider, + IClientProvider *clientProvider, QObject *parent) - : ISimulator(info, ownAircraftProvider, remoteAircraftProvider, weatherGridProvider, parent) + : ISimulator(info, ownAircraftProvider, remoteAircraftProvider, weatherGridProvider, clientProvider, parent) { this->setObjectName("Simulator: " + info.getIdentifier()); CSimulatorCommon::registerHelp(); diff --git a/src/blackcore/simulatorcommon.h b/src/blackcore/simulatorcommon.h index ba14d31b9..639f17650 100644 --- a/src/blackcore/simulatorcommon.h +++ b/src/blackcore/simulatorcommon.h @@ -119,6 +119,7 @@ namespace BlackCore BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider, BlackMisc::Simulation::IRemoteAircraftProvider *remoteAircraftProvider, BlackMisc::Weather::IWeatherGridProvider *weatherGridProvider, + BlackMisc::Network::IClientProvider *clientProvider, QObject *parent); //! \name Interface implementations, called from context diff --git a/src/blackgui/components/usercomponent.cpp b/src/blackgui/components/usercomponent.cpp index d7b649b26..22aca29fe 100644 --- a/src/blackgui/components/usercomponent.cpp +++ b/src/blackgui/components/usercomponent.cpp @@ -76,7 +76,7 @@ namespace BlackGui } // load data - ui->tvp_Clients->updateContainer(sGui->getIContextNetwork()->getOtherClients()); + ui->tvp_Clients->updateContainer(sGui->getIContextNetwork()->getClients()); ui->tvp_AllUsers->updateContainer(sGui->getIContextNetwork()->getUsers()); } } diff --git a/src/blackgui/models/clientlistmodel.h b/src/blackgui/models/clientlistmodel.h index 60b8589f2..edc836a1d 100644 --- a/src/blackgui/models/clientlistmodel.h +++ b/src/blackgui/models/clientlistmodel.h @@ -29,7 +29,6 @@ namespace BlackGui //! Client list model class BLACKGUI_EXPORT CClientListModel : public CListModelBase { - public: //! Constructor explicit CClientListModel(QObject *parent = nullptr); @@ -39,7 +38,6 @@ namespace BlackGui //! \copydoc QAbstractListModel::data() virtual QVariant data(const QModelIndex &index, int role) const override; - }; } // namespace } // namespace diff --git a/src/blackmisc/network/client.cpp b/src/blackmisc/network/client.cpp index bf02d77e7..9545208ae 100644 --- a/src/blackmisc/network/client.cpp +++ b/src/blackmisc/network/client.cpp @@ -50,7 +50,6 @@ namespace BlackMisc Capabilities cap = this->getCapabilities(); cap &= ~capability; this->setCapabilities(cap); - } void CClient::setCapabilities(const Capabilities &capabilities) @@ -60,8 +59,8 @@ namespace BlackMisc QString CClient::getCapabilitiesAsString() const { - const Capabilities cap = this->getCapabilities(); QStringList sl; + const Capabilities cap = this->getCapabilities(); if (cap.testFlag(FsdAtisCanBeReceived)) sl << "ATIS"; if (cap.testFlag(FsdWithInterimPositions)) sl << "interim pos."; if (cap.testFlag(FsdWithIcaoCodes)) sl << "ICAO"; diff --git a/src/blackmisc/network/client.h b/src/blackmisc/network/client.h index a9195651c..200b605eb 100644 --- a/src/blackmisc/network/client.h +++ b/src/blackmisc/network/client.h @@ -52,12 +52,12 @@ namespace BlackMisc enum Capability { None = 0, - FsdWithInterimPositions = 1 << 0, + FsdWithInterimPositions = 1 << 0, //!< fast position updates FsdWithIcaoCodes = 1 << 1, //!< basically means it is a pilot client handling ICAO code packages FsdAtisCanBeReceived = 1 << 2, //!< ATIS FsdWithAircraftConfig = 1 << 3, //!< Aircraft parts FsdWithGroundFlag = 1 << 4, //!< supports gnd. flag (in position) - FsdModelString = 1 << 5 + FsdModelString = 1 << 5 //!< model string can be queried }; Q_DECLARE_FLAGS(Capabilities, Capability) @@ -171,5 +171,6 @@ namespace BlackMisc } // namespace Q_DECLARE_METATYPE(BlackMisc::Network::CClient) +Q_DECLARE_METATYPE(BlackMisc::Network::CClient::Capability) #endif // guard diff --git a/src/blackmisc/network/clientprovider.cpp b/src/blackmisc/network/clientprovider.cpp index 5f6236f56..b05613df6 100644 --- a/src/blackmisc/network/clientprovider.cpp +++ b/src/blackmisc/network/clientprovider.cpp @@ -16,41 +16,48 @@ namespace BlackMisc { namespace Network { - CClientList IClientProvider::getClients() const + CClientList CClientProvider::getClients() const { QReadLocker l(&m_lockClient); return m_clients; } - void IClientProvider::setClients(const CClientList &clients) + void CClientProvider::setClients(const CClientList &clients) { QWriteLocker l(&m_lockClient); m_clients = clients; } - void IClientProvider::clearClients() + void CClientProvider::clearClients() { QWriteLocker l(&m_lockClient); m_clients.clear(); } - CClientList IClientProvider::getClientsForCallsigns(const CCallsignSet &callsigns) const + CClientList CClientProvider::getClientsForCallsigns(const CCallsignSet &callsigns) const { return this->getClients().findByCallsigns(callsigns); } - CClient IClientProvider::getClientOrDefaultForCallsign(const CCallsign &callsign) const + CClient CClientProvider::getClientOrDefaultForCallsign(const CCallsign &callsign) const { const CClientList clients(this->getClients()); return clients.findFirstByCallsign(callsign); } - bool IClientProvider::hasClientInfo(const CCallsign &callsign) const + bool CClientProvider::setOtherClient(const CClient &client) + { + QWriteLocker l(&m_lockClient); + m_clients.replaceOrAddObjectByCallsign(client); + return true; + } + + bool CClientProvider::hasClientInfo(const CCallsign &callsign) const { return this->getClients().containsCallsign(callsign); } - bool IClientProvider::addNewClient(const CClient &client) + bool CClientProvider::addNewClient(const CClient &client) { const CCallsign callsign = client.getCallsign(); Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "invalid callsign"); @@ -60,7 +67,7 @@ namespace BlackMisc return true; } - int IClientProvider::updateOrAddClient(const CCallsign &callsign, const CPropertyIndexVariantMap &vm, bool skipEqualValues) + int CClientProvider::updateOrAddClient(const CCallsign &callsign, const CPropertyIndexVariantMap &vm, bool skipEqualValues) { Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "Missing callsign"); int c = 0; @@ -78,13 +85,13 @@ namespace BlackMisc return c; } - int IClientProvider::removeClient(const CCallsign &callsign) + int CClientProvider::removeClient(const CCallsign &callsign) { QWriteLocker l(&m_lockClient); return m_clients.removeByCallsign(callsign); } - bool IClientProvider::autoAdjustCientGndCapability(const CAircraftSituation &situation) + bool CClientProvider::autoAdjustCientGndCapability(const CAircraftSituation &situation) { if (situation.getCallsign().isEmpty()) { return false; } // no callsign if (!situation.isOnGround()) { return false; } // nothing to adjust diff --git a/src/blackmisc/network/clientprovider.h b/src/blackmisc/network/clientprovider.h index f4342d7be..fc0050d2d 100644 --- a/src/blackmisc/network/clientprovider.h +++ b/src/blackmisc/network/clientprovider.h @@ -28,43 +28,67 @@ namespace BlackMisc public: //! Get other clients //! \threadsafe - CClientList getClients() const; + virtual CClientList getClients() const = 0; //! Set other clients //! \threadsafe - void setClients(const CClientList &clients); + virtual void setClients(const CClientList &clients) = 0; //! Set other clients //! \threadsafe - void clearClients(); + virtual void clearClients() = 0; //! Returns a list of other clients corresponding to the given callsigns //! \threadsafe - BlackMisc::Network::CClientList getClientsForCallsigns(const Aviation::CCallsignSet &callsigns) const; + virtual CClientList getClientsForCallsigns(const Aviation::CCallsignSet &callsigns) const = 0; //! Other client for the given callsigns //! \threadsafe - BlackMisc::Network::CClient getClientOrDefaultForCallsign(const Aviation::CCallsign &callsign) const; + virtual CClient getClientOrDefaultForCallsign(const Aviation::CCallsign &callsign) const = 0; //! Client info for given callsign? //! \threadsafe - bool hasClientInfo(const Aviation::CCallsign &callsign) const; + virtual bool hasClientInfo(const Aviation::CCallsign &callsign) const = 0; //! Add a new client, if existing nothing will be added //! \threadsafe - bool addNewClient(const CClient &client); + virtual bool addNewClient(const CClient &client) = 0; + + //! Set client for its callsign + //! \threadsafe + virtual bool setOtherClient(const BlackMisc::Network::CClient &client) = 0; //! Update or add a client //! \threadsafe - int updateOrAddClient(const Aviation::CCallsign &callsign, const CPropertyIndexVariantMap &vm, bool skipEqualValues = true); + virtual int updateOrAddClient(const Aviation::CCallsign &callsign, const CPropertyIndexVariantMap &vm, bool skipEqualValues = true) = 0; //! Remove client //! \threadsafe - int removeClient(const Aviation::CCallsign &callsign); + virtual int removeClient(const Aviation::CCallsign &callsign) = 0; //! Adjust gnd.flag capability from situation //! \threadsafe - bool autoAdjustCientGndCapability(const Aviation::CAircraftSituation &situation); + virtual bool autoAdjustCientGndCapability(const Aviation::CAircraftSituation &situation) = 0; + }; + + //! Direct in memory access to client (network client) data + class BLACKMISC_EXPORT CClientProvider : public IClientProvider + { + public: + //! \ingroup clientprovider + //! @{ + virtual CClientList getClients() const override; + virtual void setClients(const CClientList &clients) override; + virtual void clearClients() override; + virtual CClientList getClientsForCallsigns(const Aviation::CCallsignSet &callsigns) const override; + virtual CClient getClientOrDefaultForCallsign(const Aviation::CCallsign &callsign) const override; + virtual bool hasClientInfo(const Aviation::CCallsign &callsign) const override; + virtual bool addNewClient(const CClient &client) override; + virtual bool setOtherClient(const BlackMisc::Network::CClient &client) override; + virtual int updateOrAddClient(const Aviation::CCallsign &callsign, const CPropertyIndexVariantMap &vm, bool skipEqualValues = true) override; + virtual int removeClient(const Aviation::CCallsign &callsign) override; + virtual bool autoAdjustCientGndCapability(const Aviation::CAircraftSituation &situation) override; + //! @} private: CClientList m_clients; @@ -75,35 +99,35 @@ namespace BlackMisc class BLACKMISC_EXPORT CClientAware : public IProviderAware { public: - //! \copydoc IClientProvider::getClients + //! \copydoc CClientProvider::getClients CClientList getClients() const; - //! \copydoc IClientProvider::setClients + //! \copydoc CClientProvider::setClients void setClients(const CClientList &clients); - //! \copydoc IClientProvider::clearClients + //! \copydoc CClientProvider::clearClients void clearClients(); - //! \copydoc IClientProvider::getClientsForCallsigns + //! \copydoc CClientProvider::getClientsForCallsigns BlackMisc::Network::CClientList getClientsForCallsigns(const Aviation::CCallsignSet &callsigns) const; - //! \copydoc IClientProvider::getClientOrDefaultForCallsign + //! \copydoc CClientProvider::getClientOrDefaultForCallsign BlackMisc::Network::CClient getClientOrDefaultForCallsign(const Aviation::CCallsign &callsign) const; - //! \copydoc IClientProvider::hasClientInfo + //! \copydoc CClientProvider::hasClientInfo bool hasClientInfo(const Aviation::CCallsign &callsign) const; - //! \copydoc IClientProvider::addNewClient + //! \copydoc CClientProvider::addNewClient bool addNewClient(const CClient &client); - //! \copydoc IClientProvider::updateOrAddClient + //! \copydoc CClientProvider::updateOrAddClient int updateOrAddClient(const Aviation::CCallsign &callsign, const CPropertyIndexVariantMap &vm, bool skipEqualValues); - //! \copydoc IClientProvider::removeClient + //! \copydoc CClientProvider::removeClient int removeClient(const Aviation::CCallsign &callsign); //! Provider - void setClientProvider(IClientProvider *provider) { this->setProvider(provider); } + void setClientProvider(CClientProvider *provider) { this->setProvider(provider); } protected: //! Default constructor @@ -114,7 +138,7 @@ namespace BlackMisc }; //! Client provider dummy for testing - class BLACKMISC_EXPORT CClientProviderDummy: public IClientProvider + class BLACKMISC_EXPORT CClientProviderDummy: public CClientProvider { public: //! Dummy instance diff --git a/src/blackmisc/network/registermetadatanetwork.cpp b/src/blackmisc/network/registermetadatanetwork.cpp index c28ab47ee..81473ea74 100644 --- a/src/blackmisc/network/registermetadatanetwork.cpp +++ b/src/blackmisc/network/registermetadatanetwork.cpp @@ -18,6 +18,7 @@ namespace BlackMisc { CAuthenticatedUser::registerMetadata(); CClient::registerMetadata(); + qDBusRegisterMetaType(); CClientList::registerMetadata(); CEcosystem::registerMetadata(); CEcosystemList::registerMetadata();