refs #602, emoved web service provider

* webservices now directly accessible via sGui
* interface no longer needed
* no init of provider (setProvider) needed anymore
This commit is contained in:
Klaus Basan
2016-02-25 04:30:08 +01:00
committed by Mathew Sutcliffe
parent a0cfa2e687
commit 79f95845b2
69 changed files with 396 additions and 1453 deletions

View File

@@ -13,6 +13,7 @@
#include "blackcore/webdataservices.h"
#include "blackcore/vatsimbookingreader.h"
#include "blackcore/vatsimdatafilereader.h"
#include "blackmisc/simulation/aircraftmodellist.h"
#include "blackmisc/project.h"
#include "blackmisc/testing.h"
#include "blackmisc/logmessage.h"
@@ -23,11 +24,11 @@
using namespace BlackMisc;
using namespace BlackMisc::Audio;
using namespace BlackMisc::Aviation;
using namespace BlackMisc::Simulation;
using namespace BlackMisc::Geo;
using namespace BlackMisc::Json;
using namespace BlackMisc::Network;
using namespace BlackMisc::PhysicalQuantities;
using namespace BlackMisc::Simulation;
using namespace BlackMisc::Weather;
namespace BlackCore

View File

@@ -22,7 +22,6 @@
#include "blackmisc/aviation/atcstationlist.h"
#include "blackmisc/aviation/aircraftsituationlist.h"
#include "blackmisc/weather/metarset.h"
#include "blackmisc/network/webdataservicesprovider.h"
#include "blackmisc/network/clientlist.h"
#include "blackmisc/network/userlist.h"
#include "blackmisc/aviation/flightplan.h"

View File

@@ -19,6 +19,7 @@
#include "blackmisc/dbusserver.h"
#include "blackmisc/registermetadata.h"
#include "blackmisc/network/networkutils.h"
#include "blackmisc/simulation/aircraftmodellist.h"
#include "blackmisc/verify.h"
#include <QStandardPaths>
#include <QFile>

View File

@@ -16,6 +16,7 @@
#include "cookiemanager.h"
#include "webdataservices.h"
#include "blackmisc/network/url.h"
#include "blackmisc/network/entityflags.h"
#include "blackmisc/logcategorylist.h"
#include "blackmisc/filelogger.h"
#include "blackmisc/slot.h"
@@ -266,7 +267,7 @@ namespace BlackCore
QNetworkAccessManager m_accessManager { this }; //!< single network access manager
CCookieManager m_cookieManager; //!< single cookie manager for our access manager
QString m_applicationName; //!< application name
QReadWriteLock m_accessManagerLock; //!< lock to make accessmanager access threadsafe
QReadWriteLock m_accessManagerLock; //!< lock to make access manager access threadsafe
CCoreFacadeConfig m_coreFacadeConfig; //!< Core facade config if any
CWebReaderFlags::WebReader m_webReader; //!< Readers used
CWebReaderFlags::DbReaderHint m_dbReaderHint; //!< Load or used caching?

View File

@@ -58,12 +58,7 @@ namespace BlackCore
// 3. data reader, start reading when setup is synced with xx delay
Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO, "Missing web data services");
this->m_webReaderSignalConnections.append(
sApp->getWebDataServices()->connectDataReadSignal(
this, // the object here must be the same as in the bind
std::bind(&CContextNetwork::webServiceDataRead, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)
)
);
connect(sApp->getWebDataServices(), &CWebDataServices::dataRead, this, &CContextNetwork::webServiceDataRead);
// 4. Airspace contents
Q_ASSERT_X(this->getRuntime()->getCContextOwnAircraft(), Q_FUNC_INFO, "this and own aircraft context must be local");
@@ -133,8 +128,6 @@ namespace BlackCore
void CContextNetwork::gracefulShutdown()
{
this->disconnect(); // all signals
this->disconnectReaderSignals(); // disconnect
if (this->isConnected()) { this->disconnectFromNetwork(); }
if (this->m_airspace) { this->m_airspace->gracefulShutdown(); }
}
@@ -457,15 +450,6 @@ namespace BlackCore
return this->getRuntime()->getCContextOwnAircraft()->getOwnAircraft();
}
void CContextNetwork::disconnectReaderSignals()
{
for (QMetaObject::Connection c : m_webReaderSignalConnections)
{
QObject::disconnect(c);
}
m_webReaderSignalConnections.clear();
}
CAtcStationList CContextNetwork::getAtcStationsOnline() const
{
if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; }

View File

@@ -238,7 +238,6 @@ namespace BlackCore
private:
CAirspaceMonitor *m_airspace = nullptr;
INetwork *m_network = nullptr;
QList<QMetaObject::Connection> m_webReaderSignalConnections;
INetwork::ConnectionStatus m_currentStatus = INetwork::Disconnected; //!< used to detect pending connections
QTimer *m_networkDataUpdateTimer = nullptr; //!< general updates such as ATIS, frequencies, see requestDataUpdates()
@@ -250,9 +249,6 @@ namespace BlackCore
//! Own aircraft from \sa CContextOwnAircraft
const BlackMisc::Simulation::CSimulatedAircraft ownAircraft() const;
//! Disconnect all signals from swift DB readers
void disconnectReaderSignals();
private slots:
//! Update METAR collection
void ps_updateMetars(const BlackMisc::Weather::CMetarSet &metars);

View File

@@ -15,7 +15,6 @@
#include "blackcore/blackcoreexport.h"
#include "blackcore/databasereader.h"
#include "blackcore/data/globalsetup.h"
#include "blackmisc/network/webdataservicesprovider.h"
#include "blackmisc/aviation/liverylist.h"
#include "blackmisc/simulation/distributorlist.h"
#include "blackmisc/simulation/aircraftmodellist.h"

View File

@@ -16,7 +16,7 @@
#include "blackcore/vatsimbookingreader.h"
#include "blackcore/vatsimdatafilereader.h"
#include "blackcore/vatsimmetarreader.h"
#include "data/globalsetup.h"
#include "blackcore/data/globalsetup.h"
#include "blackmisc/network/networkutils.h"
#include "blackmisc/logmessage.h"
#include "blackmisc/fileutils.h"
@@ -46,68 +46,45 @@ namespace BlackCore
this->setObjectName("CWebDataReader");
this->initReaders(readerFlags);
this->initWriters();
this->readInBackground(CEntityFlags::AllEntities, 500);
}
QList<QMetaObject::Connection> CWebDataServices::connectDataReadSignal(QObject *receiver, std::function<void(CEntityFlags::Entity, CEntityFlags::ReadState, int)> dataRead)
{
Q_ASSERT_X(receiver, Q_FUNC_INFO, "Missing receiver");
// bind does not allow to define connection type
// so anything in its own thread will be sent with this thread affinity
QList<QMetaObject::Connection> cl;
bool c = false;
Q_UNUSED(c);
if (m_readerFlags.testFlag(CWebReaderFlags::WebReaderFlag::IcaoDataReader))
{
Q_ASSERT_X(this->m_icaoDataReader, Q_FUNC_INFO, "Missing reader ICAO");
QMetaObject::Connection con = connect(this->m_icaoDataReader, &CIcaoDataReader::dataRead, receiver, dataRead);
Q_ASSERT_X(con, Q_FUNC_INFO, "connect failed ICAO");
cl.append(con);
c = connect(this->m_icaoDataReader, &CIcaoDataReader::dataRead, this, &CWebDataServices::dataRead);
Q_ASSERT_X(c, Q_FUNC_INFO, "connect failed ICAO");
}
if (m_readerFlags.testFlag(CWebReaderFlags::WebReaderFlag::ModelReader))
{
Q_ASSERT_X(this->m_modelDataReader, Q_FUNC_INFO, "Missing reader models");
QMetaObject::Connection con = connect(this->m_modelDataReader, &CModelDataReader::dataRead, receiver, dataRead);
Q_ASSERT_X(con, Q_FUNC_INFO, "connect failed models");
cl.append(con);
c = connect(this->m_modelDataReader, &CModelDataReader::dataRead, this, &CWebDataServices::dataRead);
Q_ASSERT_X(c, Q_FUNC_INFO, "connect failed models");
}
if (m_readerFlags.testFlag(CWebReaderFlags::WebReaderFlag::VatsimBookingReader))
{
Q_ASSERT_X(this->m_vatsimBookingReader, Q_FUNC_INFO, "Missing reader bookings");
QMetaObject::Connection con = connect(this->m_vatsimBookingReader, &CVatsimBookingReader::dataRead, receiver, dataRead);
Q_ASSERT_X(con, Q_FUNC_INFO, "connect failed bookings");
cl.append(con);
c = connect(this->m_vatsimBookingReader, &CVatsimBookingReader::dataRead, this, &CWebDataServices::dataRead);
Q_ASSERT_X(c, Q_FUNC_INFO, "connect failed bookings");
}
if (m_readerFlags.testFlag(CWebReaderFlags::WebReaderFlag::VatsimDataReader))
{
Q_ASSERT_X(this->m_vatsimDataFileReader, Q_FUNC_INFO, "Missing reader data file");
QMetaObject::Connection con = connect(this->m_vatsimDataFileReader, &CVatsimDataFileReader::dataRead, receiver, dataRead);
Q_ASSERT_X(con, Q_FUNC_INFO, "connect failed VATSIM data file");
cl.append(con);
c = connect(this->m_vatsimDataFileReader, &CVatsimDataFileReader::dataRead, this, &CWebDataServices::dataRead);
Q_ASSERT_X(c, Q_FUNC_INFO, "connect failed VATSIM data file");
}
if (m_readerFlags.testFlag(CWebReaderFlags::WebReaderFlag::VatsimMetarReader))
{
Q_ASSERT_X(this->m_vatsimMetarReader, Q_FUNC_INFO, "Missing reader metars");
QMetaObject::Connection con = connect(this->m_vatsimMetarReader, &CVatsimMetarReader::dataRead, receiver, dataRead);
Q_ASSERT_X(con, Q_FUNC_INFO, "connect failed VATSIM METAR");
cl.append(con);
c = connect(this->m_vatsimMetarReader, &CVatsimMetarReader::dataRead, this, &CWebDataServices::dataRead);
Q_ASSERT_X(c, Q_FUNC_INFO, "connect failed VATSIM METAR");
}
return cl;
}
QList<QMetaObject::Connection> CWebDataServices::connectDataPublishSignal(QObject *receiver, std::function<void (const CAircraftModelList &, const CAircraftModelList &, const CStatusMessageList &)> dataPublished)
{
Q_ASSERT_X(receiver, Q_FUNC_INFO, "Missing receiver");
QList<QMetaObject::Connection> cl;
if (!m_databaseWriter) { return cl; }
QMetaObject::Connection con = connect(this->m_databaseWriter, &CDatabaseWriter::published, receiver, dataPublished);
Q_ASSERT_X(con, Q_FUNC_INFO, "connect failed publishing signal");
cl.push_back(con);
return cl;
this->readInBackground(CEntityFlags::AllEntities, 500);
}
CServerList CWebDataServices::getVatsimFsdServers() const

View File

@@ -21,7 +21,6 @@
#include "blackmisc/aviation/aircrafticaocodelist.h"
#include "blackmisc/network/serverlist.h"
#include "blackmisc/network/voicecapabilities.h"
#include "blackmisc/network/webdataservicesprovider.h"
#include "blackmisc/network/entityflags.h"
#include "blackmisc/simulation/distributorlist.h"
#include "blackmisc/weather/metarset.h"
@@ -44,15 +43,15 @@ namespace BlackCore
* Encapsulates reading data from web sources
*/
class BLACKCORE_EXPORT CWebDataServices :
public QObject,
public BlackMisc::Network::IWebDataServicesProvider
public QObject
{
Q_OBJECT
Q_INTERFACES(BlackMisc::Network::IWebDataServicesProvider)
friend class CApplication;
public:
//! Log categories
static const BlackMisc::CLogCategoryList &getLogCategories();
//! Shutdown
void gracefulShutdown();
@@ -68,85 +67,194 @@ namespace BlackCore
//! Metar reader
CVatsimMetarReader *getMetarReader() const { return m_vatsimMetarReader; }
//! DB writer class
CDatabaseWriter *getDatabaseWriter() const { return m_databaseWriter; }
//! Reader flags
CWebReaderFlags::WebReader getReaderFlags() const { return m_readerFlags; }
//! Reader flags
CWebReaderFlags::DbReaderHint getDbHint() const { return m_dbHint; }
//! Log categories
static const BlackMisc::CLogCategoryList &getLogCategories();
//! FSD servers
//! \threadsafe
BlackMisc::Network::CServerList getVatsimFsdServers() const;
// ------------------------ provider functionality start ------------------------------
//! Voice servers
//! \threadsafe
BlackMisc::Network::CServerList getVatsimVoiceServers() const;
//! \name Provider interface functions
//! @{
virtual QList<QMetaObject::Connection> connectDataReadSignal(
QObject *receiver,
std::function<void (BlackMisc::Network::CEntityFlags::Entity, BlackMisc::Network::CEntityFlags::ReadState, int)> dataRead) override;
//! Users by callsign
//! \threadsafe
BlackMisc::Network::CUserList getUsersForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const;
virtual QList<QMetaObject::Connection> connectDataPublishSignal(
QObject *receiver,
std::function<void (const BlackMisc::Simulation::CAircraftModelList &, const BlackMisc::Simulation::CAircraftModelList &, const BlackMisc::CStatusMessageList &)> dataPublished) override;
//! ATC stations by callsign
//! \threadsafe
BlackMisc::Aviation::CAtcStationList getAtcStationsForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const;
virtual BlackMisc::Network::CEntityFlags::Entity triggerRead(BlackMisc::Network::CEntityFlags::Entity whatToRead, const QDateTime &newerThan = QDateTime()) override;
virtual BlackMisc::Network::CServerList getVatsimFsdServers() const override;
virtual BlackMisc::Network::CServerList getVatsimVoiceServers() const override;
virtual BlackMisc::Simulation::CDistributorList getDistributors() const override;
virtual int getDistributorsCount() const override;
virtual BlackMisc::Simulation::CDistributor smartDistributorSelector(const BlackMisc::Simulation::CDistributor &distributor) const override;
virtual BlackMisc::Aviation::CLiveryList getLiveries() const override;
virtual int getLiveriesCount() const override;
virtual BlackMisc::Aviation::CLivery getLiveryForCombinedCode(const QString &combinedCode) const override;
virtual BlackMisc::Aviation::CLivery getStdLiveryForAirlineCode(const BlackMisc::Aviation::CAirlineIcaoCode &icao) const override;
virtual BlackMisc::Aviation::CLivery getLiveryForDbKey(int id) const override;
virtual BlackMisc::Aviation::CLivery smartLiverySelector(const BlackMisc::Aviation::CLivery &livery) const override;
virtual BlackMisc::Simulation::CAircraftModelList getModels() const override;
virtual int getModelsCount() const override;
virtual QList<int> getModelDbKeys() const override;
virtual QStringList getModelStrings() const override;
virtual BlackMisc::Simulation::CAircraftModelList getModelsForAircraftDesignatorAndLiveryCombinedCode(const QString &aircraftDesignator, const QString &combinedCode) const override;
virtual BlackMisc::Simulation::CAircraftModel getModelForModelString(const QString &modelString) const override;
virtual BlackMisc::Aviation::CAircraftIcaoCodeList getAircraftIcaoCodes() const override;
virtual int getAircraftIcaoCodesCount() const override;
virtual BlackMisc::Aviation::CAircraftIcaoCode getAircraftIcaoCodeForDesignator(const QString &designator) const override;
virtual BlackMisc::Aviation::CAircraftIcaoCode getAircraftIcaoCodeForDbKey(int key) const override;
virtual BlackMisc::Aviation::CAircraftIcaoCode smartAircraftIcaoSelector(const BlackMisc::Aviation::CAircraftIcaoCode &icao) const override;
virtual BlackMisc::Aviation::CAirlineIcaoCodeList getAirlineIcaoCodes() const override;
virtual int getAirlineIcaoCodesCount() const override;
virtual BlackMisc::Aviation::CAirlineIcaoCode smartAirlineIcaoSelector(const BlackMisc::Aviation::CAirlineIcaoCode &icaoPattern) const override;
virtual BlackMisc::Aviation::CAirlineIcaoCode getAirlineIcaoCodeForDbKey(int key) const override;
virtual BlackMisc::Aviation::CAirlineIcaoCodeList getAirlineIcaoCodeForDesignator(const QString &designator) const override;
virtual BlackMisc::CCountryList getCountries() const override;
virtual int getCountriesCount() const override;
virtual BlackMisc::CCountry getCountryForName(const QString &name) const override;
virtual BlackMisc::CCountry getCountryForIsoCode(const QString &iso) const override;
virtual BlackMisc::Weather::CMetarSet getMetars() const override;
virtual BlackMisc::Weather::CMetar getMetarForAirport(const BlackMisc::Aviation::CAirportIcaoCode &icao) const override;
virtual int getMetarsCount() const override;
virtual BlackMisc::Network::CUserList getUsersForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const override;
virtual BlackMisc::Aviation::CAtcStationList getAtcStationsForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const override;
virtual BlackMisc::Network::CVoiceCapabilities getVoiceCapabilityForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const override;
virtual void updateWithVatsimDataFileData(BlackMisc::Simulation::CSimulatedAircraft &aircraftToBeUdpated) const override;
virtual BlackMisc::CStatusMessageList asyncPublishModels(const BlackMisc::Simulation::CAircraftModelList &models) const override;
virtual bool canConnectSwiftDb() const override;
virtual bool writeDbDataToDisk(const QString &dir) const override;
virtual bool readDbDataFromDisk(const QString &dir, bool inBackground) override;
//! }@
//! Voice capabilities for given callsign
//! \threadsafe
BlackMisc::Network::CVoiceCapabilities getVoiceCapabilityForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const;
// ------------------------ provider functionality end ----------------------------
//! Update with web data
//! \threadsafe
void updateWithVatsimDataFileData(BlackMisc::Simulation::CSimulatedAircraft &aircraftToBeUdpated) const;
//! Distributors
//! \threadsafe
BlackMisc::Simulation::CDistributorList getDistributors() const;
//! Distributors count
//! \threadsafe
int getDistributorsCount() const;
//! Use distributor object to select the best complete distributor from DB
//! \threadsafe
BlackMisc::Simulation::CDistributor smartDistributorSelector(const BlackMisc::Simulation::CDistributor &distributor) const;
//! Liveries
//! \threadsafe
BlackMisc::Aviation::CLiveryList getLiveries() const;
//! Liveries count
//! \threadsafe
int getLiveriesCount() const;
//! Livery for its combined code
//! \threadsafe
BlackMisc::Aviation::CLivery getLiveryForCombinedCode(const QString &combinedCode) const;
//! Standard livery for airline code
//! \threadsafe
BlackMisc::Aviation::CLivery getStdLiveryForAirlineCode(const BlackMisc::Aviation::CAirlineIcaoCode &icao) const;
//! Livery for id
//! \threadsafe
BlackMisc::Aviation::CLivery getLiveryForDbKey(int id) const;
//! Use a livery as template and select the best complete livery from DB for it
//! \threadsafe
BlackMisc::Aviation::CLivery smartLiverySelector(const BlackMisc::Aviation::CLivery &livery) const;
//! Models
//! \threadsafe
BlackMisc::Simulation::CAircraftModelList getModels() const;
//! Models count
//! \threadsafe
int getModelsCount() const;
//! Model keys
//! \threadsafe
QList<int> getModelDbKeys() const;
//! Model strings
//! \threadsafe
QStringList getModelStrings() const;
//! Models for combined code and aircraft designator
//! \threadsafe
BlackMisc::Simulation::CAircraftModelList getModelsForAircraftDesignatorAndLiveryCombinedCode(const QString &aircraftDesignator, const QString &combinedCode) const;
//! Model for key if any
//! \threadsafe
BlackMisc::Simulation::CAircraftModel getModelForModelString(const QString &modelKey) const;
//! Aircraft ICAO codes
//! \threadsafe
BlackMisc::Aviation::CAircraftIcaoCodeList getAircraftIcaoCodes() const;
//! Aircraft ICAO codes count
//! \threadsafe
int getAircraftIcaoCodesCount() const;
//! ICAO code for designator
//! \threadsafe
BlackMisc::Aviation::CAircraftIcaoCode getAircraftIcaoCodeForDesignator(const QString &designator) const;
//! ICAO code for id
//! \threadsafe
BlackMisc::Aviation::CAircraftIcaoCode getAircraftIcaoCodeForDbKey(int id) const;
//! Use an ICAO object to select the best complete ICAO object from DB for it
//! \threadsafe
BlackMisc::Aviation::CAircraftIcaoCode smartAircraftIcaoSelector(const BlackMisc::Aviation::CAircraftIcaoCode &icao) const;
//! Airline ICAO codes
//! \threadsafe
BlackMisc::Aviation::CAirlineIcaoCodeList getAirlineIcaoCodes() const;
//! Airline ICAO codes count
//! \threadsafe
int getAirlineIcaoCodesCount() const;
//! ICAO code for designator
//! \threadsafe
BlackMisc::Aviation::CAirlineIcaoCodeList getAirlineIcaoCodeForDesignator(const QString &designator) const;
//! ICAO code for id
//! \threadsafe
BlackMisc::Aviation::CAirlineIcaoCode getAirlineIcaoCodeForDbKey(int id) const;
//! Smart airline selector
//! \threadsafe
BlackMisc::Aviation::CAirlineIcaoCode smartAirlineIcaoSelector(const BlackMisc::Aviation::CAirlineIcaoCode &code) const;
//! Countries
//! \threadsafe
BlackMisc::CCountryList getCountries() const;
//! Country count
//! \threadsafe
int getCountriesCount() const;
//! Country by ISO code (GB, US...)
//! \threadsafe
BlackMisc::CCountry getCountryForIsoCode(const QString &iso) const;
//! Country by name (France, China ..)
//! \threadsafe
BlackMisc::CCountry getCountryForName(const QString &name) const;
//! Get METARs
//! \threadsafe
BlackMisc::Weather::CMetarSet getMetars() const;
//! Get METAR for airport
//! \threadsafe
BlackMisc::Weather::CMetar getMetarForAirport(const BlackMisc::Aviation::CAirportIcaoCode &icao) const;
//! Get METARs count
//! \threadsafe
int getMetarsCount() const;
//! Publish models to database
BlackMisc::CStatusMessageList asyncPublishModels(const BlackMisc::Simulation::CAircraftModelList &models) const;
//! Trigger read of new data
BlackMisc::Network::CEntityFlags::Entity triggerRead(BlackMisc::Network::CEntityFlags::Entity whatToRead, const QDateTime &dateTime = QDateTime());
//! Can connect to swift DB?
bool canConnectSwiftDb() const;
//! Write data to disk (mainly for testing scenarios)
bool writeDbDataToDisk(const QString &dir) const;
//! Load DB data from disk (mainly for testing scenarios)
bool readDbDataFromDisk(const QString &dir, bool inBackground);
signals:
//! Combined read signal
void dataRead(BlackMisc::Network::CEntityFlags::Entity entity, BlackMisc::Network::CEntityFlags::ReadState state, int number);
public slots:
//! First read (allows to immediately read in background)
void readInBackground(BlackMisc::Network::CEntityFlags::Entity entities = BlackMisc::Network::CEntityFlags::AllEntities, int delayMs = 0);
protected:
//! Constructor
CWebDataServices(CWebReaderFlags::WebReader readerFlags, CWebReaderFlags:: DbReaderHint hint, QObject *parent = nullptr);
// ---------------------------------------------
// Consider to use the connect method of the provider to connect by entity
// ---------------------------------------------
public slots:
//! First read (allows to immediately read in background)
void readInBackground(BlackMisc::Network::CEntityFlags::Entity entities = BlackMisc::Network::CEntityFlags::AllEntities, int delayMs = 0);
private slots:
//! ATC bookings received
void ps_receivedBookings(const BlackMisc::Aviation::CAtcStationList &bookedStations);