refs #452 signals in reader classes. adjusted METAR reader

* renamed to connectDataReadSignal
* removed unused individual signals, e.g. vatsimMetarsRead -> replace by data read signal + entity flag
* added data in METAR class (kept there, not in airspace monitor) -> reader aware
This commit is contained in:
Klaus Basan
2015-09-28 18:16:34 +02:00
committed by Mathew Sutcliffe
parent 29d436ee67
commit 8827b68b3b
25 changed files with 241 additions and 156 deletions

View File

@@ -63,9 +63,8 @@ namespace BlackCore
Q_ASSERT_X(webDataReader, Q_FUNC_INFO, "Missing data reader");
if (webDataReader)
{
this->connect(webDataReader->getBookingReader(), &CVatsimBookingReader::dataRead, this, &CAirspaceMonitor::ps_receivedBookings);
this->connect(webDataReader->getDataFileReader(), &CVatsimDataFileReader::dataRead, this, &CAirspaceMonitor::ps_receivedDataFile);
this->connect(webDataReader->getMetarReader(), &CVatsimMetarReader::dataRead, this, &CAirspaceMonitor::ps_updateMetars);
this->connect(webDataReader->getBookingReader(), &CVatsimBookingReader::atcBookingsRead, this, &CAirspaceMonitor::ps_receivedBookings);
this->connect(webDataReader->getDataFileReader(), &CVatsimDataFileReader::dataFileRead, this, &CAirspaceMonitor::ps_receivedDataFile);
}
// Force snapshot in the main event loop
@@ -335,11 +334,6 @@ namespace BlackCore
return m_otherClients;
}
CMetar CAirspaceMonitor::getMetar(const BlackMisc::Aviation::CAirportIcaoCode &airportIcaoCode)
{
return m_metars.findFirstByOrDefault(&CMetar::getAirportIcaoCode, airportIcaoCode);
}
CAtcStation CAirspaceMonitor::getAtcStationForComUnit(const CComSystem &comSystem)
{
CAtcStation station;
@@ -391,7 +385,6 @@ namespace BlackCore
void CAirspaceMonitor::clear()
{
m_metars.clear();
m_flightPlanCache.clear();
m_modelCache.clear();
@@ -606,12 +599,6 @@ namespace BlackCore
}
}
void CAirspaceMonitor::ps_updateMetars(const CMetarSet &metars)
{
Q_ASSERT(BlackCore::isCurrentThreadObjectThread(this));
m_metars = metars;
}
void CAirspaceMonitor::ps_sendReadyForModelMatching(const CCallsign &callsign, int trial)
{
// some checks for special conditions, e.g. logout -> empty list, but still signals pending

View File

@@ -123,9 +123,6 @@ namespace BlackCore
//! Returns a list of other clients corresponding to the given callsigns
BlackMisc::Network::CClientList getOtherClientsForCallsigns(const BlackMisc::Aviation::CCallsignSet &callsigns) const;
//! Returns a METAR for the given airport, if available
BlackMisc::Weather::CMetar getMetar(const BlackMisc::Aviation::CAirportIcaoCode &airportIcaoCode);
//! Returns the current online ATC stations
BlackMisc::Aviation::CAtcStationList getAtcStationsOnline() const { return m_atcStationsOnline; }
@@ -213,7 +210,6 @@ namespace BlackCore
BlackMisc::Aviation::CAtcStationList m_atcStationsBooked;
BlackMisc::Network::CClientList m_otherClients;
BlackMisc::Simulation::CSimulatedAircraftList m_aircraftInRange; //!< aircraft, thread safe access required
BlackMisc::Weather::CMetarSet m_metars;
// hashs, because not sorted by key but keeping order
CSituationsPerCallsign m_situationsByCallsign; //!< situations, for performance reasons per callsign, thread safe access required
@@ -284,7 +280,6 @@ namespace BlackCore
void ps_frequencyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &frequency);
void ps_receivedBookings(const BlackMisc::Aviation::CAtcStationList &bookedStations);
void ps_receivedDataFile();
void ps_updateMetars(const BlackMisc::Weather::CMetarSet &metars);
void ps_aircraftConfigReceived(const BlackMisc::Aviation::CCallsign &callsign, const QJsonObject &jsonObject, bool isFull);
void ps_aircraftInterimUpdateReceived(const BlackMisc::Aviation::CAircraftSituation &situation);
void ps_sendInterimPositions();

View File

@@ -10,6 +10,7 @@
#include "blackmisc/sequence.h"
#include "blackmisc/aviation/atcstation.h"
#include "blackmisc/network/user.h"
#include "blackmisc/network/entityflags.h"
#include "blackmisc/logmessage.h"
#include "vatsimbookingreader.h"
@@ -146,7 +147,8 @@ namespace BlackCore
bookedStations.push_back(bookedStation);
}
this->setUpdateTimestamp(updateTimestamp); // thread safe update
emit this->dataRead(bookedStations);
emit this->atcBookingsRead(bookedStations);
emit this->dataRead(CEntityFlags::BookingEntity, CEntityFlags::ReadFinished, bookedStations.size());
} // node
}
else
@@ -154,6 +156,7 @@ namespace BlackCore
// network error
CLogMessage(this).warning("Reading bookings failed %1 %2") << nwReply->errorString() << nwReply->url().toString();
nwReply->abort();
emit this->dataRead(CEntityFlags::BookingEntity, CEntityFlags::ReadFailed, 0);
}
} // method

View File

@@ -37,7 +37,10 @@ namespace BlackCore
signals:
//! Bookings have been read and converted to BlackMisc::Aviation::CAtcStationList
void dataRead(const BlackMisc::Aviation::CAtcStationList &bookedStations);
void atcBookingsRead(const BlackMisc::Aviation::CAtcStationList &bookedStations);
//! Data have been read
void dataRead(BlackMisc::Network::CEntityFlags::Entity entity, BlackMisc::Network::CEntityFlags::ReadState state, int number);
private slots:
//! Bookings have been read
@@ -50,7 +53,7 @@ namespace BlackCore
private:
QString m_serviceUrl; //!< URL of the service
QNetworkAccessManager *m_networkManager = nullptr;
};
}
#endif // guard

View File

@@ -11,6 +11,7 @@
#include "blackmisc/aviation/atcstation.h"
#include "blackmisc/network/user.h"
#include "blackmisc/network/server.h"
#include "blackmisc/network/entityflags.h"
#include "blackmisc/logmessage.h"
#include "vatsimdatafilereader.h"
@@ -362,13 +363,15 @@ namespace BlackCore
}
// data read finished
emit this->dataRead(lines.count());
emit this->dataFileRead(lines.count());
emit this->dataRead(CEntityFlags::VatsimDataFile, CEntityFlags::ReadFinished, lines.count());
}
else
{
// network error
CLogMessage(this).warning("Reading VATSIM data file failed %1 %2") << nwReply->errorString() << nwReply->url().toString();
nwReply->abort();
emit this->dataRead(CEntityFlags::VatsimDataFile, CEntityFlags::ReadFailed, 0);
}
}

View File

@@ -106,7 +106,10 @@ namespace BlackCore
signals:
//! Data have been read
void dataRead(int lines);
void dataFileRead(int lines);
//! Data have been read
void dataRead(BlackMisc::Network::CEntityFlags::Entity entity, BlackMisc::Network::CEntityFlags::ReadState state, int number);
private slots:
//! Data have been read, parse VATSIM file
@@ -142,6 +145,6 @@ namespace BlackCore
static Section currentLineToSection(const QString &currentLine);
};
}
} // ns
#endif // guard

View File

@@ -8,12 +8,16 @@
*/
#include "vatsimmetarreader.h"
#include "blackmisc/network/entityflags.h"
#include "blackmisc/sequence.h"
#include "blackmisc/logmessage.h"
#include <QTextStream>
#include <QFile>
#include <QReadLocker>
#include <QWriteLocker>
using namespace BlackMisc;
using namespace BlackMisc::Network;
using namespace BlackMisc::Weather;
namespace BlackCore
@@ -34,6 +38,24 @@ namespace BlackCore
Q_UNUSED(s);
}
CMetarSet CVatsimMetarReader::getMetars() const
{
QReadLocker l(&m_lock);
return m_metars;
}
CMetar CVatsimMetarReader::getMetarForAirport(const Aviation::CAirportIcaoCode &icao) const
{
QReadLocker l(&m_lock);
return m_metars.getMetarForAirport(icao);
}
int CVatsimMetarReader::getMetarsCount() const
{
QReadLocker l(&m_lock);
return m_metars.size();
}
void CVatsimMetarReader::ps_readMetars()
{
this->threadAssertCheck();
@@ -85,19 +107,26 @@ namespace BlackCore
}
}
{
QWriteLocker l(&m_lock);
m_metars = metars;
}
// I could use those for logging, etc.
Q_UNUSED(invalidMetars);
if (invalidLineCount > 0)
{
CLogMessage(this).warning("Reading METARs failed for %1 entries") << invalidLineCount;
}
emit dataRead(metars);
emit metarsRead(metars);
emit dataRead(CEntityFlags::MetarEntity, CEntityFlags::ReadFinished, metars.size());
}
else
{
// network error
CLogMessage(this).warning("Reading METARs failed %1 %2") << nwReply->errorString() << nwReply->url().toString();
nwReply->abort();
emit dataRead(CEntityFlags::MetarEntity, CEntityFlags::ReadFailed, 0);
}
} // method

View File

@@ -36,9 +36,24 @@ namespace BlackCore
//! Read / re-read bookings
void readInBackgroundThread();
//! Get METARs
//! \threadsafe
virtual BlackMisc::Weather::CMetarSet getMetars() const;
//! Get METAR for airport
//! \threadsafe
virtual BlackMisc::Weather::CMetar getMetarForAirport(const BlackMisc::Aviation::CAirportIcaoCode &icao) const;
//! Get METARs count
//! \threadsafe
virtual int getMetarsCount() const;
signals:
//! METARs have been read and converted to BlackMisc::Weather::CMetarSet
void dataRead(const BlackMisc::Weather::CMetarSet &metars);
void metarsRead(const BlackMisc::Weather::CMetarSet &metars);
//! Data have been read
void dataRead(BlackMisc::Network::CEntityFlags::Entity entity, BlackMisc::Network::CEntityFlags::ReadState state, int number);
private slots:
//! Decode METARs
@@ -49,9 +64,10 @@ namespace BlackCore
void ps_readMetars();
private:
QString m_metarUrl; //!< URL of the service
QNetworkAccessManager *m_networkManager = nullptr;
QString m_metarUrl; //!< URL of the service
QNetworkAccessManager *m_networkManager = nullptr;
BlackMisc::Weather::CMetarDecoder m_metarDecoder;
BlackMisc::Weather::CMetarSet m_metars;
};
}
#endif // guard

View File

@@ -18,6 +18,7 @@
#include "blackmisc/logmessage.h"
#include "blackmisc/worker.h"
using namespace BlackCore;
using namespace BlackCore::Settings;
using namespace BlackMisc;
using namespace BlackMisc::Simulation;
@@ -35,40 +36,7 @@ namespace BlackCore
this->initWriters();
}
QList<QMetaObject::Connection> CWebDataServices::connectVatsimDataSignals(QObject *receiver,
std::function<void(int)> bookingsRead,
std::function<void(int)> dataFileRead,
std::function<void(int)> metarsRead)
{
// bind does not allow to define connection type
// so anything in its own thread will be sent with this thread affinity
Q_ASSERT_X(receiver, Q_FUNC_INFO, "Missing receiver");
QList<QMetaObject::Connection> cl;
if (m_readerFlags.testFlag(CWebReaderFlags::WebReaderFlags::VatsimBookingReader))
{
QMetaObject::Connection c1 = connect(this, &CWebDataServices::vatsimBookingsRead, receiver, bookingsRead);
Q_ASSERT_X(c1, Q_FUNC_INFO, "connect failed (bookings)");
cl.append(c1);
}
if (m_readerFlags.testFlag(CWebReaderFlags::WebReaderFlags::VatsimDataReader))
{
QMetaObject::Connection c2 = connect(this, &CWebDataServices::vatsimDataFileRead, receiver, dataFileRead);
Q_ASSERT_X(c2, Q_FUNC_INFO, "connect failed (data)");
cl.append(c2);
}
if (m_readerFlags.testFlag(CWebReaderFlags::WebReaderFlags::VatsimMetarReader))
{
QMetaObject::Connection c3 = connect(this, &CWebDataServices::vatsimMetarsRead, receiver, metarsRead);
Q_ASSERT_X(c3, Q_FUNC_INFO, "connect failed (METARs)");
cl.append(c3);
}
return cl;
}
QList<QMetaObject::Connection> CWebDataServices::connectSwiftDatabaseSignals(QObject *receiver, std::function<void(CDbFlags::Entity, CDbFlags::ReadState, int)> dataRead)
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");
@@ -76,21 +44,45 @@ namespace BlackCore
// so anything in its own thread will be sent with this thread affinity
QList<QMetaObject::Connection> cl;
if (m_readerFlags.testFlag(CWebReaderFlags::WebReaderFlags::IcaoDataReader))
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::readData, receiver, dataRead);
QMetaObject::Connection con = connect(this->m_icaoDataReader, &CIcaoDataReader::dataRead, receiver, dataRead);
Q_ASSERT_X(con, Q_FUNC_INFO, "connect failed ICAO");
cl.append(con);
}
if (m_readerFlags.testFlag(CWebReaderFlags::WebReaderFlags::ModelReader))
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::readData, receiver, dataRead);
QMetaObject::Connection con = connect(this->m_modelDataReader, &CModelDataReader::dataRead, receiver, dataRead);
Q_ASSERT_X(con, Q_FUNC_INFO, "connect failed models");
cl.append(con);
}
if (m_readerFlags.testFlag(CWebReaderFlags::WebReaderFlag::VatsimBookingReader))
{
Q_ASSERT_X(this->m_modelDataReader, 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);
}
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);
}
if (m_readerFlags.testFlag(CWebReaderFlags::WebReaderFlag::VatsimMetarReader))
{
Q_ASSERT_X(this->m_vatsimMetarReader, Q_FUNC_INFO, "Missing reader bookings");
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);
}
return cl;
}
@@ -149,32 +141,32 @@ namespace BlackCore
return true;
}
CDbFlags::Entity CWebDataServices::triggerRead(CDbFlags::Entity whatToRead)
CEntityFlags::Entity CWebDataServices::triggerRead(CEntityFlags::Entity whatToRead)
{
CDbFlags::Entity triggeredRead = CDbFlags::NoEntity;
CEntityFlags::Entity triggeredRead = CEntityFlags::NoEntity;
if (m_vatsimDataFileReader)
{
if (whatToRead.testFlag(CDbFlags::VatsimDataFile))
if (whatToRead.testFlag(CEntityFlags::VatsimDataFile))
{
m_vatsimDataFileReader->readInBackgroundThread();
triggeredRead |= CDbFlags::VatsimDataFile;
triggeredRead |= CEntityFlags::VatsimDataFile;
}
}
if (m_vatsimBookingReader)
{
if (whatToRead.testFlag(CDbFlags::VatsimBookings))
if (whatToRead.testFlag(CEntityFlags::BookingEntity))
{
m_vatsimBookingReader->readInBackgroundThread();
triggeredRead |= CDbFlags::VatsimBookings;
triggeredRead |= CEntityFlags::BookingEntity;
}
}
if (m_icaoDataReader)
{
if (whatToRead.testFlag(CDbFlags::AircraftIcaoEntity) || whatToRead.testFlag(CDbFlags::AirlineIcaoEntity) || whatToRead.testFlag(CDbFlags::CountryEntity))
if (whatToRead.testFlag(CEntityFlags::AircraftIcaoEntity) || whatToRead.testFlag(CEntityFlags::AirlineIcaoEntity) || whatToRead.testFlag(CEntityFlags::CountryEntity))
{
CDbFlags::Entity icaoEntities = whatToRead & CDbFlags::AllIcaoAndCountries;
CEntityFlags::Entity icaoEntities = whatToRead & CEntityFlags::AllIcaoAndCountries;
m_icaoDataReader->readInBackgroundThread(icaoEntities);
triggeredRead |= icaoEntities;
}
@@ -182,9 +174,9 @@ namespace BlackCore
if (m_modelDataReader)
{
if (whatToRead.testFlag(CDbFlags::LiveryEntity) || whatToRead.testFlag(CDbFlags::DistributorEntity) || whatToRead.testFlag(CDbFlags::ModelEntity))
if (whatToRead.testFlag(CEntityFlags::LiveryEntity) || whatToRead.testFlag(CEntityFlags::DistributorEntity) || whatToRead.testFlag(CEntityFlags::ModelEntity))
{
CDbFlags::Entity modelEntities = whatToRead & CDbFlags::DistributorLiveryModel;
CEntityFlags::Entity modelEntities = whatToRead & CEntityFlags::DistributorLiveryModel;
m_modelDataReader->readInBackgroundThread(modelEntities);
triggeredRead |= modelEntities;
}
@@ -336,6 +328,24 @@ namespace BlackCore
return CCountry();
}
CMetarSet CWebDataServices::getMetars() const
{
if (m_vatsimMetarReader) { return m_vatsimMetarReader->getMetars(); }
return CMetarSet();
}
CMetar CWebDataServices::getMetarForAirport(const CAirportIcaoCode &icao) const
{
if (m_vatsimMetarReader) { return m_vatsimMetarReader->getMetarForAirport(icao); }
return CMetar();
}
int CWebDataServices::getMetarsCount() const
{
if (m_vatsimMetarReader) { return m_vatsimMetarReader->getMetarsCount(); }
return 0;
}
CAirlineIcaoCode CWebDataServices::getAirlineIcaoCodeForDesignator(const QString &designator) const
{
if (m_icaoDataReader) { return m_icaoDataReader->getAirlineIcaoCodeForDesignator(designator); }
@@ -361,10 +371,10 @@ namespace BlackCore
void CWebDataServices::initReaders(CWebReaderFlags::WebReader flags)
{
// 1. VATSIM bookings
if (flags.testFlag(CWebReaderFlags::WebReaderFlags::VatsimBookingReader))
if (flags.testFlag(CWebReaderFlags::WebReaderFlag::VatsimBookingReader))
{
this->m_vatsimBookingReader = new CVatsimBookingReader(this, CGlobalReaderSettings::instance().bookingsUrl());
bool c = connect(this->m_vatsimBookingReader, &CVatsimBookingReader::dataRead, this, &CWebDataServices::ps_receivedBookings);
bool c = connect(this->m_vatsimBookingReader, &CVatsimBookingReader::atcBookingsRead, this, &CWebDataServices::ps_receivedBookings);
Q_ASSERT_X(c, Q_FUNC_INFO, "VATSIM booking reader signals");
Q_UNUSED(c);
this->m_vatsimBookingReader->start(QThread::LowPriority);
@@ -372,10 +382,10 @@ namespace BlackCore
}
// 2. VATSIM data file
if (flags.testFlag(CWebReaderFlags::WebReaderFlags::VatsimDataReader))
if (flags.testFlag(CWebReaderFlags::WebReaderFlag::VatsimDataReader))
{
this->m_vatsimDataFileReader = new CVatsimDataFileReader(this, CGlobalReaderSettings::instance().vatsimDataFileUrls());
bool c = connect(this->m_vatsimDataFileReader, &CVatsimDataFileReader::dataRead, this, &CWebDataServices::ps_dataFileRead);
bool c = connect(this->m_vatsimDataFileReader, &CVatsimDataFileReader::dataFileRead, this, &CWebDataServices::ps_dataFileRead);
Q_ASSERT_X(c, Q_FUNC_INFO, "VATSIM data reader signals");
Q_UNUSED(c);
this->m_vatsimDataFileReader->start(QThread::LowPriority);
@@ -383,10 +393,10 @@ namespace BlackCore
}
// 3. VATSIM metar data
if (flags.testFlag(CWebReaderFlags::WebReaderFlags::VatsimMetarReader))
if (flags.testFlag(CWebReaderFlags::WebReaderFlag::VatsimMetarReader))
{
this->m_vatsimMetarReader = new CVatsimMetarReader(this, CGlobalReaderSettings::instance().urlVatsimMetars());
bool c = connect(this->m_vatsimMetarReader, &CVatsimMetarReader::dataRead, this, &CWebDataServices::ps_receivedMetars);
bool c = connect(this->m_vatsimMetarReader, &CVatsimMetarReader::metarsRead, this, &CWebDataServices::ps_receivedMetars);
Q_ASSERT_X(c, Q_FUNC_INFO, "VATSIM METAR reader signals");
Q_UNUSED(c);
this->m_vatsimMetarReader->start(QThread::LowPriority);
@@ -394,21 +404,21 @@ namespace BlackCore
}
// 4. ICAO data reader
if (flags.testFlag(CWebReaderFlags::WebReaderFlags::IcaoDataReader))
if (flags.testFlag(CWebReaderFlags::WebReaderFlag::IcaoDataReader))
{
bool c;
this->m_icaoDataReader = new CIcaoDataReader(this, CGlobalReaderSettings::instance().protocolIcaoReader(), CGlobalReaderSettings::instance().serverIcaoReader(), CGlobalReaderSettings::instance().baseUrlIcaoReader());
c = connect(this->m_icaoDataReader, &CIcaoDataReader::readData, this, &CWebDataServices::ps_readFromSwiftDb);
c = connect(this->m_icaoDataReader, &CIcaoDataReader::dataRead, this, &CWebDataServices::ps_readFromSwiftDb);
Q_ASSERT_X(c, Q_FUNC_INFO, "ICAO reader signals");
Q_UNUSED(c);
this->m_icaoDataReader->start();
}
// 5. Model reader
if (flags.testFlag(CWebReaderFlags::WebReaderFlags::ModelReader))
if (flags.testFlag(CWebReaderFlags::WebReaderFlag::ModelReader))
{
this->m_modelDataReader = new CModelDataReader(this, CGlobalReaderSettings::instance().protocolModelReader(), CGlobalReaderSettings::instance().serverModelReader(), CGlobalReaderSettings::instance().baseUrlModelReader());
bool c = connect(this->m_modelDataReader, &CModelDataReader::readData, this, &CWebDataServices::ps_readFromSwiftDb);
bool c = connect(this->m_modelDataReader, &CModelDataReader::dataRead, this, &CWebDataServices::ps_readFromSwiftDb);
Q_ASSERT_X(c, Q_FUNC_INFO, "Model reader signals");
Q_UNUSED(c);
this->m_modelDataReader->start();
@@ -427,25 +437,22 @@ namespace BlackCore
void CWebDataServices::ps_receivedBookings(const CAtcStationList &stations)
{
CLogMessage(this).info("Read %1 ATC bookings from network") << stations.size();
emit vatsimBookingsRead(stations.size());
}
void CWebDataServices::ps_receivedMetars(const CMetarSet &metars)
{
CLogMessage(this).info("Read %1 METARs") << metars.size();
emit vatsimDataFileRead(metars.size());
}
void CWebDataServices::ps_dataFileRead(int lines)
{
CLogMessage(this).info("Read VATSIM data file, %1 lines") << lines;
emit vatsimDataFileRead(lines);
}
void CWebDataServices::ps_readFromSwiftDb(CDbFlags::Entity entity, CDbFlags::ReadState state, int number)
void CWebDataServices::ps_readFromSwiftDb(CEntityFlags::Entity entity, CEntityFlags::ReadState state, int number)
{
CLogMessage(this).info("Read data %1 %3 %2") << CDbFlags::flagToString(entity) << number << CDbFlags::flagToString(state);
emit readSwiftDbData(entity, state, number);
CLogMessage(this).info("Read data %1 %3 %2") << CEntityFlags::flagToString(entity) << number << CEntityFlags::flagToString(state);
// emit readSwiftDbData(entity, state, number);
}
void CWebDataServices::readAllInBackground(int delayMs)
@@ -462,8 +469,8 @@ namespace BlackCore
// only readers requested will be read
if (this->m_vatsimBookingReader) {this->m_vatsimBookingReader->readInBackgroundThread(); }
if (this->m_vatsimDataFileReader) this->m_vatsimDataFileReader->readInBackgroundThread();
if (this->m_icaoDataReader) { this->m_icaoDataReader->readInBackgroundThread(CDbFlags::AllIcaoAndCountries); }
if (this->m_modelDataReader) { this->m_modelDataReader->readInBackgroundThread(CDbFlags::DistributorLiveryModel); }
if (this->m_icaoDataReader) { this->m_icaoDataReader->readInBackgroundThread(CEntityFlags::AllIcaoAndCountries); }
if (this->m_modelDataReader) { this->m_modelDataReader->readInBackgroundThread(CEntityFlags::DistributorLiveryModel); }
}
}

View File

@@ -73,19 +73,13 @@ namespace BlackCore
// ------------------------ provider functionality ------------------------------
//! \copydoc IWebDataReaderProvider::connectVatsimDataSignals
//! \copydoc IWebDataReaderProvider::connectDataReadSignal
//! \ingroup webdatareaderprovider
virtual QList<QMetaObject::Connection> connectVatsimDataSignals(
virtual QList<QMetaObject::Connection> connectDataReadSignal(
QObject *receiver,
std::function<void(int)> bookingsRead, std::function<void(int)> dataFileRead, std::function<void(int)> metarsRead) override;
std::function<void (BlackMisc::Network::CEntityFlags::Entity, BlackMisc::Network::CEntityFlags::ReadState, int)> dataRead) override;
//! \copydoc IWebDataReaderProvider::connectSwiftDatabaseSignals
//! \ingroup webdatareaderprovider
virtual QList<QMetaObject::Connection> connectSwiftDatabaseSignals(
QObject *receiver,
std::function<void (BlackMisc::Network::CDbFlags::Entity, BlackMisc::Network::CDbFlags::ReadState, int)> dataRead) override;
//! \copydoc IWebDataReaderProvider::connectSwiftDatabaseSignals
//! \copydoc IWebDataReaderProvider::triggerRead
//! \ingroup webdatareaderprovider
virtual BlackMisc::Network::CEntityFlags::Entity triggerRead(BlackMisc::Network::CEntityFlags::Entity whatToRead) override;
@@ -197,6 +191,18 @@ namespace BlackCore
//! \ingroup webdatareaderprovider
virtual BlackMisc::CCountry getCountryForIsoCode(const QString &iso) const override;
//! \copydoc IWebDataReaderProvider::getMetars
//! \ingroup webdatareaderprovider
virtual BlackMisc::Weather::CMetarSet getMetars() const override;
//! \copydoc IWebDataReaderProvider::getMetarForAirport
//! \ingroup webdatareaderprovider
virtual BlackMisc::Weather::CMetar getMetarForAirport(const BlackMisc::Aviation::CAirportIcaoCode &icao) const override;
//! \copydoc IWebDataReaderProvider::getMetarForAirport
//! \ingroup webdatareaderprovider
virtual int getMetarsCount() const override;
//! \copydoc IWebDataReaderProvider::getUsersForCallsign
//! \ingroup webdatareaderprovider
virtual BlackMisc::Network::CUserList getUsersForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const override;
@@ -226,17 +232,9 @@ namespace BlackCore
void readAllInBackground(int delayMs);
signals:
//! Data file read
void vatsimDataFileRead(int lines);
//! Bookings read
void vatsimBookingsRead(int number);
//! METARs read
void vatsimMetarsRead(int number);
//! Combined read signal
void readSwiftDbData(BlackMisc::Network::CEntityFlags::Entity entity, BlackMisc::Network::CEntityFlags::ReadState state, int number);
//
// Consider to use the connect method of the provider to connect by entity
//
//! Model has been written
void modelWritten(const BlackMisc::Simulation::CAircraftModel &model);

View File

@@ -39,7 +39,7 @@ namespace BlackGui
{
CWebDataServicesAware::setProvider(webDataReaderProvider);
this->ui->filter_AircraftIcao->setProvider(webDataReaderProvider);
connectSwiftDatabaseSignals(
connectDataReadSignal(
this,
std::bind(&CDbAircraftIcaoComponent::ps_icaoRead, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)
);

View File

@@ -40,7 +40,7 @@ namespace BlackGui
{
if (!webDataReaderProvider) { return; }
CWebDataServicesAware::setProvider(webDataReaderProvider);
connectSwiftDatabaseSignals(
connectDataReadSignal(
this,
std::bind(&CDbAircraftIcaoSelectorComponent::ps_codesRead, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)
);

View File

@@ -40,7 +40,7 @@ namespace BlackGui
{
CWebDataServicesAware::setProvider(webDataReaderProvider);
this->ui->filter_AirlineIcao->setProvider(webDataReaderProvider);
webDataReaderProvider->connectSwiftDatabaseSignals(
webDataReaderProvider->connectDataReadSignal(
this,
std::bind(&CDbAirlineIcaoComponent::ps_icaoRead, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)
);

View File

@@ -42,7 +42,7 @@ namespace BlackGui
{
if (!webDataReaderProvider) { return; }
CWebDataServicesAware::setProvider(webDataReaderProvider);
connectSwiftDatabaseSignals(
connectDataReadSignal(
this,
std::bind(&CDbAirlineIcaoSelectorComponent::ps_codesRead, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)
);

View File

@@ -40,7 +40,7 @@ namespace BlackGui
void CDbCountryComponent::setProvider(IWebDataServicesProvider *webDataReaderProvider)
{
CWebDataServicesAware::setProvider(webDataReaderProvider);
connectSwiftDatabaseSignals(
connectDataReadSignal(
this,
std::bind(&CDbCountryComponent::ps_countriesRead, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)
);

View File

@@ -43,7 +43,7 @@ namespace BlackGui
{
if (!webDataReaderProvider) { return; }
CWebDataServicesAware::setProvider(webDataReaderProvider);
webDataReaderProvider->connectSwiftDatabaseSignals(
webDataReaderProvider->connectDataReadSignal(
this,
std::bind(&CDbCountrySelectorComponent::ps_CountriesRead, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)
);

View File

@@ -36,7 +36,7 @@ namespace BlackGui
void CDbDistributorComponent::setProvider(IWebDataServicesProvider *webDataReaderProvider)
{
CWebDataServicesAware::setProvider(webDataReaderProvider);
connectSwiftDatabaseSignals(
connectDataReadSignal(
this,
std::bind(&CDbDistributorComponent::ps_distributorsRead, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)
);

View File

@@ -41,7 +41,7 @@ namespace BlackGui
void CDbDistributorSelectorComponent::setProvider(Network::IWebDataServicesProvider *webDataReaderProvider)
{
CWebDataServicesAware::setProvider(webDataReaderProvider);
connectSwiftDatabaseSignals(
connectDataReadSignal(
this,
std::bind(&CDbDistributorSelectorComponent::ps_distributorsRead, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)
);

View File

@@ -39,7 +39,7 @@ namespace BlackGui
void CDbLiveryComponent::setProvider(IWebDataServicesProvider *webDataReaderProvider)
{
CWebDataServicesAware::setProvider(webDataReaderProvider);
connectSwiftDatabaseSignals(
connectDataReadSignal(
this,
std::bind(&CDbLiveryComponent::ps_liveriesRead, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)
);

View File

@@ -44,7 +44,7 @@ namespace BlackGui
void CDbModelComponent::setProvider(IWebDataServicesProvider *webDataReaderProvider)
{
CWebDataServicesAware::setProvider(webDataReaderProvider);
webDataReaderProvider->connectSwiftDatabaseSignals(
webDataReaderProvider->connectDataReadSignal(
this,
std::bind(&CDbModelComponent::ps_modelsRead, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)
);

View File

@@ -54,7 +54,7 @@ namespace BlackGui
void CInfoBarWebReadersStatusComponent::setProvider(IWebDataServicesProvider *webDataReaderProvider)
{
CWebDataServicesAware::setProvider(webDataReaderProvider);
connectSwiftDatabaseSignals(
connectDataReadSignal(
this,
std::bind(&CInfoBarWebReadersStatusComponent::ps_dataRead, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)
);

View File

@@ -135,13 +135,13 @@ namespace BlackGui
{
Q_ASSERT(getIContextNetwork());
Q_ASSERT(getIContextSettings());
connect(getIContextNetwork(), &IContextNetwork::vatsimDataFileRead, this, &CLoginComponent::ps_onVatsimDataFileLoaded);
connect(getIContextNetwork(), &IContextNetwork::webServiceDataRead, this, &CLoginComponent::ps_onWebServiceDataRead);
connect(getIContextSettings(), &IContextSettings::changedSettings, this, &CLoginComponent::ps_onSettingsChanged);
// inital setup, if data already available
ps_validateAircraftValues();
ps_validateVatsimValues();
ps_onVatsimDataFileLoaded();
ps_onWebServiceDataRead(CEntityFlags::VatsimDataFile, CEntityFlags::ReadFinished, -1);
CServerList otherServers = this->m_trafficNetworkServers.get();
// add a testserver when no servers can be loaded
@@ -266,10 +266,14 @@ namespace BlackGui
}
}
void CLoginComponent::ps_onVatsimDataFileLoaded()
void CLoginComponent::ps_onWebServiceDataRead(int entityI, int stateI, int number)
// void CLoginComponent::ps_onWebServiceDataRead(CEntityFlags::Entity entity, CEntityFlags::ReadState, int number)
{
Q_ASSERT(getIContextNetwork());
Q_ASSERT(getIContextSettings());
CEntityFlags::EntityFlag entity = static_cast<CEntityFlags::EntityFlag>(entityI);
CEntityFlags::ReadState state = static_cast<CEntityFlags::ReadState>(stateI);
if (entity != CEntityFlags::VatsimDataFile || state != CEntityFlags::ReadFinished) { return; }
Q_UNUSED(number);
Q_ASSERT_X(getIContextNetwork(), Q_FUNC_INFO, "Missing context");
CServerList vatsimFsdServers = this->getIContextNetwork()->getVatsimFsdServers();
if (vatsimFsdServers.isEmpty()) { return; }
this->ui->cbp_VatsimServer->setServers(vatsimFsdServers);

View File

@@ -13,9 +13,10 @@
#define BLACKGUI_LOGINCOMPONENT_H
#include "blackgui/blackguiexport.h"
#include "enableforruntime.h"
#include "blackgui/components/enableforruntime.h"
#include "blackcore/settings/network.h"
#include "blackmisc/network/server.h"
#include "blackmisc/network/entityflags.h"
#include <QFrame>
#include <QScopedPointer>
@@ -25,7 +26,6 @@ namespace BlackGui
{
namespace Components
{
//! Login component
class BLACKGUI_EXPORT CLoginComponent :
public QFrame,
@@ -66,7 +66,7 @@ namespace BlackGui
void ps_toggleNetworkConnection();
//! VATSIM data file was loaded
void ps_onVatsimDataFileLoaded();
void ps_onWebServiceDataRead(int entity, int state, int number);
//! Validate aircaft
bool ps_validateAircraftValues();

View File

@@ -13,6 +13,7 @@ using namespace BlackMisc;
using namespace BlackMisc::Network;
using namespace BlackMisc::Simulation;
using namespace BlackMisc::Aviation;
using namespace BlackMisc::Weather;
namespace BlackMisc
{
@@ -218,6 +219,27 @@ namespace BlackMisc
return this->m_webDataReaderProvider->getCountryForName(name);
}
CMetarSet CWebDataServicesAware::getMetars() const
{
Q_ASSERT_X(this->m_webDataReaderProvider, Q_FUNC_INFO, "Missing provider");
if (!hasProvider()) { return CMetarSet(); }
return this->m_webDataReaderProvider->getMetars();
}
Weather::CMetar CWebDataServicesAware::getMetarForAirport(const CAirportIcaoCode &icao) const
{
Q_ASSERT_X(this->m_webDataReaderProvider, Q_FUNC_INFO, "Missing provider");
if (!hasProvider()) { return CMetar(); }
return this->m_webDataReaderProvider->getMetarForAirport(icao);
}
int CWebDataServicesAware::getMetarCount() const
{
Q_ASSERT_X(this->m_webDataReaderProvider, Q_FUNC_INFO, "Missing provider");
if (!hasProvider()) { return 0; }
return this->m_webDataReaderProvider->getMetarsCount();
}
CCountry CWebDataServicesAware::getCountryForIsoCode(const QString &iso) const
{
Q_ASSERT_X(this->m_webDataReaderProvider, Q_FUNC_INFO, "Missing provider");
@@ -257,20 +279,20 @@ namespace BlackMisc
this->m_webDataReaderProvider = nullptr;
}
void CWebDataServicesAware::connectSwiftDatabaseSignals(QObject *receiver, std::function<void (CDbFlags::Entity, CDbFlags::ReadState, int)> dataRead)
void CWebDataServicesAware::connectDataReadSignal(QObject *receiver, std::function<void (CEntityFlags::Entity, CEntityFlags::ReadState, int)> dataRead)
{
Q_ASSERT_X(this->m_webDataReaderProvider, Q_FUNC_INFO, "Missing provider");
if (!hasProvider()) { return; }
if (receiver)
{
this->m_swiftConnections.append(this->m_webDataReaderProvider->connectSwiftDatabaseSignals(receiver, dataRead));
this->m_swiftConnections.append(this->m_webDataReaderProvider->connectDataReadSignal(receiver, dataRead));
}
}
CDbFlags::Entity CWebDataServicesAware::triggerRead(CDbFlags::Entity whatToRead)
CEntityFlags::Entity CWebDataServicesAware::triggerRead(CEntityFlags::Entity whatToRead)
{
Q_ASSERT_X(this->m_webDataReaderProvider, Q_FUNC_INFO, "Missing provider");
if (!hasProvider()) { return CDbFlags::NoEntity; }
if (!hasProvider()) { return CEntityFlags::NoEntity; }
return this->m_webDataReaderProvider->triggerRead(whatToRead);
}

View File

@@ -17,13 +17,14 @@
#include "blackmisc/aviation/airlineicaocodelist.h"
#include "blackmisc/aviation/liverylist.h"
#include "blackmisc/aviation/atcstationlist.h"
#include "blackmisc/network/dbflags.h"
#include "blackmisc/network/entityflags.h"
#include "blackmisc/network/serverlist.h"
#include "blackmisc/network/userlist.h"
#include "blackmisc/network/voicecapabilities.h"
#include "blackmisc/simulation/aircraftmodellist.h"
#include "blackmisc/simulation/distributorlist.h"
#include "blackmisc/simulation/simulatedaircraft.h"
#include "blackmisc/weather/metarset.h"
#include "blackmisc/countrylist.h"
#include <functional>
@@ -166,26 +167,31 @@ namespace BlackMisc
//! \threadsafe
virtual BlackMisc::CCountry getCountryForName(const QString &name) const = 0;
//! Get METARs
//! \threadsafe
virtual BlackMisc::Weather::CMetarSet getMetars() const = 0;
//! Get METAR for airport
//! \threadsafe
virtual BlackMisc::Weather::CMetar getMetarForAirport(const BlackMisc::Aviation::CAirportIcaoCode &icao) const = 0;
//! Get METARs count
//! \threadsafe
virtual int getMetarsCount() const = 0;
//! Write directly to database
virtual BlackMisc::CStatusMessageList asyncWriteModel(BlackMisc::Simulation::CAircraftModel &model) const = 0;
//! Relay signals for VATSIM data
//! Relay signals for swift data
//! Connect signals to slot receiver. As the interface is no QObject, slots can not be connected directly.
//! In order to disconnect a list of connections is provided, which have to be disconnected manually.
//! \note receiver is required for connection type
//! \todo currently still used, will be replaced by abstract connection by entity
virtual QList<QMetaObject::Connection> connectVatsimDataSignals(
virtual QList<QMetaObject::Connection> connectDataReadSignal(
QObject *receiver,
std::function<void(int)> bookingsRead, std::function<void(int)> dataFileRead, std::function<void(int)> metarsRead) = 0;
//! Relay signals for swift data
//! \todo currently still used, will be replaced by abstract connection by entity
virtual QList<QMetaObject::Connection> connectSwiftDatabaseSignals(
QObject *receiver,
std::function<void(BlackMisc::Network::CDbFlags::Entity, BlackMisc::Network::CDbFlags::ReadState, int)> dataRead) = 0;
std::function<void(BlackMisc::Network::CEntityFlags::Entity, BlackMisc::Network::CEntityFlags::ReadState, int)> dataRead) = 0;
//! Trigger read of new data
virtual BlackMisc::Network::CDbFlags::Entity triggerRead(BlackMisc::Network::CDbFlags::Entity whatToRead) = 0;
virtual BlackMisc::Network::CEntityFlags::Entity triggerRead(BlackMisc::Network::CEntityFlags::Entity whatToRead) = 0;
//! Can connect to swift DB?
virtual bool canConnectSwiftDb() const = 0;
@@ -285,6 +291,15 @@ namespace BlackMisc
//! \copydoc IWebDataReaderProvider::getCountryForName
BlackMisc::CCountry getCountryForName(const QString &name) const;
//! \copydoc IWebDataReaderProvider::getMetars
BlackMisc::Weather::CMetarSet getMetars() const;
//! \copydoc IWebDataReaderProvider::getMetarForAirport
BlackMisc::Weather::CMetar getMetarForAirport(const BlackMisc::Aviation::CAirportIcaoCode &icao) const;
//! \copydoc IWebDataReaderProvider::getMetarCount
int getMetarCount() const;
//! \copydoc IWebDataReaderProvider::updateWithWebData
void updateWithVatsimDataFileData(BlackMisc::Simulation::CSimulatedAircraft &aircraftToBeUdpated) const;
@@ -300,13 +315,13 @@ namespace BlackMisc
//! Called when provider should no longer be used
void gracefulShutdown();
//! \copydoc IWebDataReaderProvider::connectSwiftDatabaseSignals
void connectSwiftDatabaseSignals(
//! \copydoc IWebDataReaderProvider::connectDataReadSignal
void connectDataReadSignal(
QObject *receiver,
std::function<void(BlackMisc::Network::CDbFlags::Entity, BlackMisc::Network::CDbFlags::ReadState, int)> dataRead);
std::function<void(BlackMisc::Network::CEntityFlags::Entity, BlackMisc::Network::CEntityFlags::ReadState, int)> dataRead);
//! \copydoc IWebDataReaderProvider::triggerRead
BlackMisc::Network::CDbFlags::Entity triggerRead(BlackMisc::Network::CDbFlags::Entity whatToRead);
BlackMisc::Network::CEntityFlags::Entity triggerRead(BlackMisc::Network::CEntityFlags::Entity whatToRead);
//! \copydoc IWebDataReaderProvider::canConnectSwiftDb
bool canConnectSwiftDb() const;