7 #include <QJsonDocument>
38 using namespace swift::core::vatsim;
39 using namespace swift::core::context;
40 using namespace swift::config;
42 using namespace swift::misc::db;
43 using namespace swift::misc::simulation;
44 using namespace swift::misc::network;
45 using namespace swift::misc::aviation;
46 using namespace swift::misc::weather;
52 : QObject(parent), m_dbReaderConfig(dbReaderConfig)
54 if (!
sApp) {
return; }
56 Q_ASSERT_X(QSslSocket::supportsSsl(), Q_FUNC_INFO,
"Missing SSL support");
58 this->setObjectName(
"CWebDataServices");
61 CLogMessage(
this).
info(u
"SSL supported: %1 Version: %2 (build version) %3 (library version)")
62 << boolToYesNo(QSslSocket::supportsSsl()) << QSslSocket::sslLibraryBuildVersionString()
63 << QSslSocket::sslLibraryVersionString();
72 CLogMessage(
this).
info(u
"Remove info object reader because not needed");
77 if (entities.testFlag(CEntityFlags::DbInfoObjectEntity))
83 this->initReaders(readers, entities);
84 if (writeToSwiftDb) { this->initWriters(); }
89 entities &= ~m_entitiesPeriodicallyRead;
93 const CEntityFlags::Entity icaoPart = entities & CEntityFlags::AllIcaoCountriesCategory;
94 const CEntityFlags::Entity modelPart = entities & CEntityFlags::DistributorLiveryModel;
95 CEntityFlags::Entity remainingEntities = entities & ~icaoPart;
96 remainingEntities &= ~modelPart;
106 if (m_vatsimServerFileReader) {
return m_vatsimServerFileReader->
getFsdServers(); }
112 if (m_vatsimStatusReader) {
return m_vatsimStatusReader->
getMetarFileUrl(); }
118 if (m_vatsimStatusReader) {
return m_vatsimStatusReader->
getDataFileUrl(); }
124 if (m_vatsimDataFileReader) {
return m_vatsimDataFileReader->
getUsersForCallsign(callsign); }
147 if (m_databaseWriter) {
return m_databaseWriter->
asyncPublishModels(modelsToBePublished,
""); }
163 if (!m_icaoDataReader && !m_modelDataReader && !m_airportDataReader && !m_dbInfoDataReader) {
return false; }
188 if (m_shuttingDown) {
return; }
195 if (m_modelDataReader) { m_modelDataReader->
admitCaches(entities); }
196 if (m_icaoDataReader) { m_icaoDataReader->
admitCaches(entities); }
197 if (m_airportDataReader) { m_airportDataReader->
admitCaches(entities); }
202 if (m_shuttingDown) {
return; }
216 if (m_shuttingDown) {
return CEntityFlags::NoEntity; }
218 Q_ASSERT_X(!whatToRead.testFlag(CEntityFlags::DbInfoObjectEntity), Q_FUNC_INFO,
219 "Info object must be read upfront");
220 CEntityFlags::Entity triggeredRead = CEntityFlags::NoEntity;
221 if (m_vatsimDataFileReader)
223 if (whatToRead.testFlag(CEntityFlags::VatsimDataFile))
226 triggeredRead |= CEntityFlags::VatsimDataFile;
230 if (m_vatsimMetarReader)
232 if (whatToRead.testFlag(CEntityFlags::MetarEntity))
235 triggeredRead |= CEntityFlags::MetarEntity;
239 if (m_airportDataReader)
241 if (whatToRead.testFlag(CEntityFlags::AirportEntity))
243 CEntityFlags::Entity airportEntities = whatToRead & CEntityFlags::AirportEntity;
245 triggeredRead |= CEntityFlags::AirportEntity;
249 if (m_icaoDataReader)
251 if (whatToRead.testFlag(CEntityFlags::AircraftIcaoEntity) ||
252 whatToRead.testFlag(CEntityFlags::AircraftCategoryEntity) ||
253 whatToRead.testFlag(CEntityFlags::AirlineIcaoEntity) ||
254 whatToRead.testFlag(CEntityFlags::CountryEntity))
256 CEntityFlags::Entity icaoEntities = whatToRead & CEntityFlags::AllIcaoCountriesCategory;
258 triggeredRead |= icaoEntities;
262 if (m_modelDataReader)
264 if (whatToRead.testFlag(CEntityFlags::LiveryEntity) ||
265 whatToRead.testFlag(CEntityFlags::DistributorEntity) || whatToRead.testFlag(CEntityFlags::ModelEntity))
267 CEntityFlags::Entity modelEntities = whatToRead & CEntityFlags::DistributorLiveryModel;
269 triggeredRead |= modelEntities;
273 return triggeredRead;
277 const QDateTime &newerThan)
279 if (m_shuttingDown) {
return CEntityFlags::NoEntity; }
282 CEntityFlags::Entity triggeredRead = CEntityFlags::NoEntity;
283 if (m_dbInfoDataReader)
286 triggeredRead |= CEntityFlags::DbInfoObjectEntity;
289 if (m_icaoDataReader)
295 triggeredRead |= icaoEntities;
299 if (m_modelDataReader)
305 triggeredRead |= modelEntities;
309 if (m_airportDataReader)
315 triggeredRead |= airportEntities;
319 return triggeredRead;
323 bool checkCacheTsUpfront)
325 if (m_shuttingDown) {
return CEntityFlags::NoEntity; }
328 CEntityFlags::Entity triggeredRead = CEntityFlags::NoEntity;
331 if (m_icaoDataReader)
341 if (m_modelDataReader)
351 if (m_airportDataReader)
361 return triggeredRead;
366 Q_ASSERT_X(CEntityFlags::isSingleEntity(entity), Q_FUNC_INFO,
"Need single entity");
367 if (!CEntityFlags::anySwiftDbEntity(entity)) {
return QDateTime(); }
369 if (!dr) {
return QDateTime(); }
375 Q_ASSERT_X(CEntityFlags::isSingleEntity(entity), Q_FUNC_INFO,
"Need single entity");
376 if (!CEntityFlags::anySwiftDbEntity(entity)) {
return QDateTime(); }
378 if (!ir) {
return QDateTime(); }
385 if (!reader) {
return QDateTime(); }
386 Q_ASSERT_X(CEntityFlags::isSingleEntity(entity), Q_FUNC_INFO,
"need single entity");
394 for (CEntityFlags::Entity e : set)
397 if (!ts.isValid()) {
continue; }
398 if (!latest.isValid() || latest < ts) { latest = ts; }
405 Q_ASSERT_X(m_sharedInfoDataReader, Q_FUNC_INFO,
"Shared info reader was not initialized");
406 if (m_sharedInfoDataReader->
getInfoObjectCount() < 1) {
return CEntityFlags::NoEntity; }
412 entities &= CEntityFlags::AllDbEntities;
413 CEntityFlags::Entity currentEntity = CEntityFlags::iterateDbEntities(entities);
414 CEntityFlags::Entity emptyEntities = CEntityFlags::NoEntity;
415 while (currentEntity != CEntityFlags::NoEntity)
418 if (c < 1) { emptyEntities |= currentEntity; }
419 currentEntity = CEntityFlags::iterateDbEntities(entities);
421 return emptyEntities;
428 const CEntityFlags::Entity checkForEmptyEntities =
429 CEntityFlags::entityFlagToEntity(CEntityFlags::AllDbEntitiesNoInfoObjects) & ~loadEntities;
447 Q_ASSERT_X(CEntityFlags::isSingleEntity(entity), Q_FUNC_INFO,
"Need single entity");
448 if (CEntityFlags::anySwiftDbEntity(entity))
451 if (!dr) {
return -1; }
463 if (!m_dbInfoDataReader) {
return -1; }
464 return this->getInfoObjectCount(entity, m_dbInfoDataReader);
469 if (!m_dbInfoDataReader) {
return -1; }
472 for (CEntityFlags::Entity single : set)
475 if (c < 0 && stopIfNotFound) {
return -1; }
476 if (c > 0) { total += c; }
483 if (!m_sharedInfoDataReader)
return -1;
484 return this->getInfoObjectCount(entity, m_sharedInfoDataReader);
490 if (m_dbInfoDataReader)
494 if (m_sharedInfoDataReader)
499 if (m_airportDataReader)
503 if (m_icaoDataReader)
507 if (m_modelDataReader)
511 if (m_databaseWriter)
515 return report.join(separator);
522 if (m_vatsimMetarReader)
526 if (m_vatsimStatusReader)
530 if (report.isEmpty()) {
return db; }
531 return report.join(separator) + separator + db;
536 if (m_modelDataReader) {
return m_modelDataReader->
getDistributors(); }
567 if (m_modelDataReader) {
return m_modelDataReader->
getLiveries(); }
609 if (m_modelDataReader) {
return m_modelDataReader->
getModels(); }
615 if (m_modelDataReader) {
return m_modelDataReader->
getModelsCount(); }
621 if (m_modelDataReader) {
return m_modelDataReader->
getModelDbKeys(); }
628 return QStringList();
634 return QStringList();
639 const QString &combinedCode)
const
641 if (m_modelDataReader)
663 if (m_modelDataReader) {
return m_modelDataReader->
getModelForDbKey(dbKey); }
694 return QSet<QString>();
718 if (designator.isEmpty()) {
return false; }
749 if (designator.isEmpty()) {
return false; }
756 bool preferOperatingAirlines)
const
759 if (m_icaoDataReader)
762 preferOperatingAirlines);
783 if (!m_icaoDataReader) {
return names; }
786 if (code.hasName()) { names.push_back(code.getName()); }
793 QStringList designators;
794 if (!m_icaoDataReader) {
return designators; }
797 if (code.hasTelephonyDesignator()) { designators.push_back(code.getTelephonyDesignator()); }
824 if (m_icaoDataReader) {
return m_icaoDataReader->
getCountries(); }
842 if (m_airportDataReader) {
return m_airportDataReader->
getAirports(); }
848 if (m_airportDataReader) {
return m_airportDataReader->
getAirportsCount(); }
872 if (m_vatsimMetarReader) {
return m_vatsimMetarReader->
getMetars(); }
897 validModels = newValidModels;
918 u
"Model: '%1', there is no change")
919 << publishModel.getModelString());
920 if (ignoreEqual) { invalidModels.
push_back(publishModel); }
921 else { newValidModels.
push_back(publishModel); }
923 validModels = newValidModels;
950 if (m_shuttingDown) {
return; }
951 m_shuttingDown =
true;
953 if (m_vatsimMetarReader)
956 m_vatsimMetarReader =
nullptr;
958 if (m_vatsimDataFileReader)
961 m_vatsimDataFileReader =
nullptr;
963 if (m_vatsimStatusReader)
966 m_vatsimStatusReader =
nullptr;
968 if (m_vatsimServerFileReader)
971 m_vatsimServerFileReader =
nullptr;
973 if (m_modelDataReader)
976 m_modelDataReader =
nullptr;
978 if (m_airportDataReader)
981 m_airportDataReader =
nullptr;
983 if (m_icaoDataReader)
986 m_icaoDataReader =
nullptr;
988 if (m_dbInfoDataReader)
991 m_dbInfoDataReader =
nullptr;
995 if (m_databaseWriter)
998 m_databaseWriter =
nullptr;
1005 CEntityFlags::Entity entities = CEntityFlags::NoEntity;
1011 if (!m_dbReaderConfig.
isEmpty())
1014 entities &= configuredEntities;
1017 entities &= CEntityFlags::AllDbEntities;
1027 void CWebDataServices::initReaders(CWebReaderFlags::WebReader readersNeeded, CEntityFlags::Entity entities)
1035 const CEntityFlags::Entity dbEntities = entities & CEntityFlags::AllDbEntitiesNoInfoObjects;
1036 const bool anyDbEntities = CEntityFlags::anySwiftDbEntity(dbEntities);
1037 const bool needsSharedInfoObjects = dbReaderConfig.needsSharedInfoObjects(dbEntities);
1038 const bool needsDbInfoObjects = dbReaderConfig.possiblyReadsFromSwiftDb();
1042 if (needsDbInfoObjects)
1044 if (anyDbEntities && readersNeeded.testFlag(CWebReaderFlags::WebReaderFlag::DbInfoDataReader))
1047 this->initDbInfoObjectReaderAndTriggerRead();
1052 if (needsSharedInfoObjects) { this->initSharedInfoObjectReaderAndTriggerRead(); }
1061 c = connect(m_vatsimStatusReader, &CVatsimStatusFileReader::statusFileRead,
this,
1062 &CWebDataServices::vatsimStatusFileRead, Qt::QueuedConnection);
1064 m_vatsimStatusReader->
start(QThread::LowPriority);
1067 const QPointer<CWebDataServices> myself(
this);
1069 if (!myself || m_shuttingDown) {
return; }
1074 startVatsimServerFileReader();
1080 if (readersNeeded.testFlag(CWebReaderFlags::WebReaderFlag::VatsimDataReader))
1083 c = connect(m_vatsimDataFileReader, &CVatsimDataFileReader::dataFileRead,
this,
1084 &CWebDataServices::vatsimDataFileRead, Qt::QueuedConnection);
1085 Q_ASSERT_X(c, Q_FUNC_INFO,
"VATSIM data reader signals");
1087 Qt::QueuedConnection);
1088 Q_ASSERT_X(c, Q_FUNC_INFO,
"connect failed VATSIM data file");
1089 m_entitiesPeriodicallyRead |= CEntityFlags::VatsimDataFile;
1090 m_vatsimDataFileReader->
start(QThread::LowPriority);
1095 if (readersNeeded.testFlag(CWebReaderFlags::WebReaderFlag::VatsimMetarReader))
1098 c = connect(m_vatsimMetarReader, &CVatsimMetarReader::metarsRead,
this, &CWebDataServices::receivedMetars,
1099 Qt::QueuedConnection);
1100 Q_ASSERT_X(c, Q_FUNC_INFO,
"VATSIM METAR reader signals");
1102 Qt::QueuedConnection);
1103 Q_ASSERT_X(c, Q_FUNC_INFO,
"connect failed VATSIM METAR");
1104 m_entitiesPeriodicallyRead |= CEntityFlags::MetarEntity;
1105 m_vatsimMetarReader->
start(QThread::LowPriority);
1110 if (readersNeeded.testFlag(CWebReaderFlags::WebReaderFlag::IcaoDataReader))
1113 c = connect(m_icaoDataReader, &CIcaoDataReader::dataRead,
this, &CWebDataServices::readFromSwiftReader,
1114 Qt::QueuedConnection);
1115 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect ICAO reader signals");
1117 Qt::QueuedConnection);
1118 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect ICAO reader signals");
1120 Qt::QueuedConnection);
1121 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect Model reader signals");
1122 c = connect(m_icaoDataReader, &CIcaoDataReader::entityDownloadProgress,
this,
1124 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect Model reader signals");
1125 m_icaoDataReader->
start(QThread::LowPriority);
1129 if (readersNeeded.testFlag(CWebReaderFlags::WebReaderFlag::ModelReader))
1132 c = connect(m_modelDataReader, &CModelDataReader::dataRead,
this, &CWebDataServices::readFromSwiftReader,
1133 Qt::QueuedConnection);
1134 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect Model reader signals");
1136 Qt::QueuedConnection);
1137 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect Model reader signals");
1139 Qt::QueuedConnection);
1140 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect Model reader signals");
1141 c = connect(m_modelDataReader, &CModelDataReader::entityDownloadProgress,
this,
1143 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect Model reader signals");
1144 m_modelDataReader->
start(QThread::LowPriority);
1148 if (readersNeeded.testFlag(CWebReaderFlags::WebReaderFlag::AirportReader))
1151 c = connect(m_airportDataReader, &CAirportDataReader::dataRead,
this,
1152 &CWebDataServices::readFromSwiftReader, Qt::QueuedConnection);
1153 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect Model reader signals");
1155 Qt::QueuedConnection);
1156 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect Model reader signals");
1157 c = connect(m_airportDataReader, &CAirportDataReader::swiftDbDataRead,
this,
1159 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect Model reader signals");
1160 c = connect(m_airportDataReader, &CAirportDataReader::entityDownloadProgress,
this,
1162 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect Model reader signals");
1163 m_airportDataReader->
start(QThread::LowPriority);
1167 const QDateTime threshold =
1168 QDateTime::currentDateTimeUtc().addDays(-365);
1169 const CEntityFlags::Entity cachedDbEntities =
1170 this->getDbEntitiesWithCachedData();
1171 const CEntityFlags::Entity validTsDbEntities =
1172 this->getDbEntitiesWithTimestampNewerThan(threshold);
1173 const bool needsSharedInfoObjectsWithoutCache =
1174 dbReaderConfig.needsSharedInfoObjectsIfCachesEmpty(dbEntities, cachedDbEntities | validTsDbEntities);
1175 if (m_sharedInfoDataReader && !needsSharedInfoObjectsWithoutCache)
1183 void CWebDataServices::startVatsimServerFileReader()
1186 connect(m_vatsimServerFileReader, &CVatsimServerFileReader::dataFileRead,
this,
1187 &CWebDataServices::vatsimServerFileRead, Qt::QueuedConnection);
1189 m_vatsimServerFileReader->
start(QThread::LowPriority);
1192 const QPointer<CWebDataServices> myself(
this);
1194 if (!myself || m_shuttingDown) {
return; }
1200 void CWebDataServices::initDbInfoObjectReaderAndTriggerRead()
1203 if (m_shuttingDown) {
return; }
1206 const QPointer<CWebDataServices> myself(
this);
1208 if (!myself || m_shuttingDown) {
return; }
1210 this->initDbInfoObjectReaderAndTriggerRead();
1215 if (!m_dbInfoDataReader)
1217 m_dbInfoDataReader =
new CInfoDataReader(
this, m_dbReaderConfig, CDbFlags::DbReading);
1218 m_dbInfoDataReader->setObjectName(m_dbInfoDataReader->objectName() +
" (DB)");
1220 connect(m_dbInfoDataReader, &CInfoDataReader::dataRead,
this, &CWebDataServices::readFromSwiftReader);
1221 Q_ASSERT_X(c, Q_FUNC_INFO,
"Info reader connect failed");
1225 Q_ASSERT_X(c, Q_FUNC_INFO,
"Info reader connect failed");
1226 c = connect(m_dbInfoDataReader, &CInfoDataReader::databaseReaderMessages,
this,
1231 m_dbInfoDataReader->
start(QThread::LowPriority);
1233 const QPointer<CWebDataServices> myself(
this);
1235 if (!myself || m_shuttingDown) {
return; }
1242 void CWebDataServices::initSharedInfoObjectReaderAndTriggerRead()
1245 if (m_shuttingDown) {
return; }
1248 const QPointer<CWebDataServices> myself(
this);
1250 if (!myself || m_shuttingDown) {
return; }
1251 this->initSharedInfoObjectReaderAndTriggerRead();
1256 if (!m_sharedInfoDataReader)
1258 m_sharedInfoDataReader =
new CInfoDataReader(
this, m_dbReaderConfig, CDbFlags::Shared);
1259 m_sharedInfoDataReader->setObjectName(m_sharedInfoDataReader->objectName() +
" (shared)");
1260 bool c = connect(m_sharedInfoDataReader, &CInfoDataReader::dataRead,
this,
1261 &CWebDataServices::readFromSwiftReader);
1262 Q_ASSERT_X(c, Q_FUNC_INFO,
"Info reader connect failed");
1266 Q_ASSERT_X(c, Q_FUNC_INFO,
"Info reader connect failed");
1270 m_sharedInfoDataReader->
start(QThread::LowPriority);
1274 const QPointer<CWebDataServices> myself(
this);
1276 if (!myself || m_shuttingDown) {
return; }
1281 CDatabaseReader *CWebDataServices::getDbReader(CEntityFlags::Entity entity)
const
1283 Q_ASSERT_X(CEntityFlags::isSingleEntity(entity), Q_FUNC_INFO,
"Need single entity");
1284 Q_ASSERT_X(CEntityFlags::anySwiftDbEntity(entity), Q_FUNC_INFO,
"No swift DB entity");
1297 void CWebDataServices::initWriters()
1302 bool CWebDataServices::signalEntitiesAlreadyRead(CEntityFlags::Entity entities)
1304 if (m_signalledEntities.contains(entities)) {
return false; }
1305 m_signalledEntities.insert(entities);
1309 int CWebDataServices::getInfoObjectCount(CEntityFlags::Entity entity,
CInfoDataReader *reader)
const
1311 Q_ASSERT_X(CEntityFlags::isSingleEntity(entity), Q_FUNC_INFO,
"Need single entity");
1312 Q_ASSERT_X(reader, Q_FUNC_INFO,
"Need reader");
1313 if (CEntityFlags::anySwiftDbEntity(entity))
1325 CEntityFlags::Entity CWebDataServices::getDbEntitiesWithCachedData()
const
1327 CEntityFlags::Entity entities = CEntityFlags::NoEntity;
1334 CEntityFlags::Entity CWebDataServices::getDbEntitiesWithTimestampNewerThan(
const QDateTime &threshold)
const
1336 CEntityFlags::Entity entities = CEntityFlags::NoEntity;
1343 void CWebDataServices::receivedMetars(
const CMetarList &metars)
1348 void CWebDataServices::vatsimDataFileRead(
int kB) {
CLogMessage(
this).
info(u
"Read VATSIM data file, %1 kB") << kB; }
1350 void CWebDataServices::vatsimStatusFileRead(
int bytes)
1352 CLogMessage(
this).
info(u
"Read VATSIM status file, %1 bytes") << bytes;
1355 void CWebDataServices::vatsimServerFileRead(
int bytes)
1357 CLogMessage(
this).
info(u
"Read VATSIM server file, %1 bytes") << bytes;
1360 void CWebDataServices::readFromSwiftReader(CEntityFlags::Entity entities,
CEntityFlags::ReadState state,
int number,
1363 if (state == CEntityFlags::ReadStarted) {
return; }
1365 const QString from = url.
isEmpty() ? QStringLiteral(
"") : QStringLiteral(
" from '%1'").arg(url.toString());
1366 const QString entStr = CEntityFlags::entitiesToString(entities);
1368 if (CEntityFlags::isWarningOrAbove(state))
1374 << entStr << number << CEntityFlags::stateToString(state) << from;
1379 << entStr << number << CEntityFlags::stateToString(state) << from;
1385 << entStr << number << CEntityFlags::stateToString(state) << from;
1388 m_swiftDbEntitiesRead |= entities;
1390 if (((
static_cast<int>(m_swiftDbEntitiesRead)) & allUsedEntities) == allUsedEntities)
1396 if (CEntityFlags::isFinishedReadState(state))
1399 if (entities.testFlag(CEntityFlags::AirportEntity) &&
1400 signalEntitiesAlreadyRead(CEntityFlags::AirportEntity))
1404 if (entities.testFlag(CEntityFlags::AirlineIcaoEntity) &&
1405 signalEntitiesAlreadyRead(CEntityFlags::AirlineIcaoEntity))
1409 if (entities.testFlag(CEntityFlags::AircraftIcaoEntity) &&
1410 signalEntitiesAlreadyRead(CEntityFlags::AircraftIcaoEntity))
1414 if (entities.testFlag(CEntityFlags::ModelEntity) && signalEntitiesAlreadyRead(CEntityFlags::ModelEntity))
1420 if (m_swiftDbEntitiesRead.testFlag(CEntityFlags::AllIcaoEntities) &&
1421 signalEntitiesAlreadyRead(CEntityFlags::AllIcaoEntities))
1425 if (m_swiftDbEntitiesRead.testFlag(CEntityFlags::ModelMatchingEntities) &&
1426 signalEntitiesAlreadyRead(CEntityFlags::ModelMatchingEntities))
1435 if (m_shuttingDown) {
return; }
1436 if (entities == CEntityFlags::NoEntity) {
return; }
1437 const QPointer<CWebDataServices> myself(
this);
1440 if (!myself || m_shuttingDown) {
return; }
1447 if (m_shuttingDown) {
return; }
1449 if (CEntityFlags::anySwiftDbEntity(entities))
1452 Q_ASSERT_X(!entities.testFlag(CEntityFlags::DbInfoObjectEntity), Q_FUNC_INFO,
1453 "Info object must be read upfront, do not pass as entity here");
1454 const bool waitForDbInfoReader = m_dbInfoDataReader && !m_dbInfoDataReader->
areAllInfoObjectsRead() &&
1456 if (waitForDbInfoReader)
1460 if (!this->waitForDbInfoObjectsThenRead(entities)) {
return; }
1463 const bool waitForSharedInfoFile =
1465 if (waitForSharedInfoFile)
1469 if (!this->waitForSharedInfoObjectsThenRead(entities)) {
return; }
1477 bool CWebDataServices::waitForDbInfoObjectsThenRead(CEntityFlags::Entity entities)
1479 if (m_shuttingDown) {
return false; }
1481 Q_ASSERT_X(m_dbInfoDataReader, Q_FUNC_INFO,
"need reader");
1485 const int timeOutMs = 30 * 1000;
1486 if (!m_dbInfoObjectTimeout.isValid())
1488 m_dbInfoObjectTimeout = QDateTime::currentDateTimeUtc().addMSecs(timeOutMs);
1490 << timeOutMs << m_dbInfoObjectTimeout.toString(
"dd.MM.yyyy hh:mm:ss");
1492 const bool read = this->waitForInfoObjectsThenRead(entities,
"DB", m_dbInfoDataReader, m_dbInfoObjectTimeout);
1496 bool CWebDataServices::waitForSharedInfoObjectsThenRead(CEntityFlags::Entity entities)
1498 if (m_shuttingDown) {
return false; }
1500 Q_ASSERT_X(m_sharedInfoDataReader, Q_FUNC_INFO,
"need reader");
1502 const int timeOutMs = 30 * 1000;
1503 if (!m_sharedInfoObjectsTimeout.isValid())
1505 m_sharedInfoObjectsTimeout = QDateTime::currentDateTimeUtc().addMSecs(timeOutMs);
1507 << timeOutMs << m_sharedInfoObjectsTimeout.toString(
"dd.MM.yyyy hh:mm:ss");
1510 this->waitForInfoObjectsThenRead(entities,
"shared", m_sharedInfoDataReader, m_sharedInfoObjectsTimeout);
1514 bool CWebDataServices::waitForInfoObjectsThenRead(CEntityFlags::Entity entities,
const QString &info,
1517 if (m_shuttingDown) {
return false; }
1520 Q_ASSERT_X(infoReader, Q_FUNC_INFO,
"Need info data reader");
1521 const int waitForInfoObjectsMs = 1000;
1526 CLogMessage(
this).
info(u
"Info objects (%1) triggered for '%2' loaded from '%3'")
1528 timeOut = QDateTime();
1533 if (timeOut.isValid() && QDateTime::currentDateTimeUtc() > timeOut)
1535 const QString timeOutString = timeOut.toString();
1537 CLogMessage(
this).
warning(u
"Could not read '%1' info objects for '%2' from '%3', time out '%4'. "
1538 u
"Marking reader '%5' as failed and continue.")
1540 << timeOutString << infoReader->
getName();
1557 << info << CEntityFlags::entitiesToString(entities)
1567 CLogMessage(
this).
error(u
"Info objects (%1) loading for '%2' failed from '%3', '%4'")
1586 if (dir.isEmpty()) {
return false; }
1587 const QDir directory(dir);
1588 if (!directory.exists())
1590 const bool s = directory.mkpath(dir);
1591 if (!s) {
return false; }
1593 QList<QPair<QString, QString>> fileContents;
1597 const QString json(QJsonDocument(this->
getModels().toJson()).toJson());
1598 fileContents.push_back({
"models.json", json });
1603 const QString json(QJsonDocument(this->
getLiveries().toJson()).toJson());
1604 fileContents.push_back({
"liveries.json", json });
1609 const QString json(QJsonDocument(this->
getAirports().toJson()).toJson());
1610 fileContents.push_back({
"airports.json", json });
1613 for (
const auto &pair : fileContents)
1625 if (dir.isEmpty()) {
return false; }
1626 const QDir directory(dir);
1627 if (!directory.exists()) {
return false; }
1629 bool s1 = !m_icaoDataReader;
1630 if (m_icaoDataReader)
1650 bool s2 = !m_modelDataReader;
1651 if (m_modelDataReader)
1671 bool s3 = !m_airportDataReader;
1672 if (m_airportDataReader)
1692 return s1 && s2 && s3;
1714 CStatusMessage(
this).info(u
"No ICAO reader or not supporting entities"));
1717 CStatusMessage(
this).info(u
"No model reader or not supporting entities"));
1720 CStatusMessage(
this).info(u
"No airport reader or not supporting entities"));
SWIFT_CORE_EXPORT swift::core::CApplication * sApp
Single instance of application object.
data::CGlobalSetup getGlobalSetup() const
Global setup.
bool isShuttingDown() const
Is application shutting down?
bool isSetupAvailable() const
Setup already synchronized.
swift::misc::network::CUrlLogList getReadLog() const
Get the read log.
void setMarkedAsFailed(bool failed)
Set marker for read failed.
bool isMarkedAsFailed() const
Is marked as read failed.
void startReader()
Starts the reader.
void databaseReaderMessages(const swift::misc::CStatusMessageList &messages)
Database reader messages.
swift::misc::network::CEntityFlags::Entity allDbEntitiesForUsedReaders() const
All DB entities for those readers used and not ignored.
swift::misc::network::CServerList getVatsimFsdServers() const
FSD servers.
int getSharedInfoObjectCount(swift::misc::network::CEntityFlags::Entity entity) const
Count for entity from shared entity objects.
swift::misc::aviation::CAirlineIcaoCode getAirlineIcaoCodeForDbKey(int id) const
ICAO code for id.
swift::misc::CStatusMessageList asyncPublishModels(const swift::misc::simulation::CAircraftModelList &modelsToBePublished) const
Publish models to database.
bool hasDbModelData() const
Are DB model data available?
void swiftDbAirportsRead()
Airports read.
swift::misc::aviation::CAircraftIcaoCode smartAircraftIcaoSelector(const swift::misc::aviation::CAircraftIcaoCode &icao) const
Use an ICAO object to select the best complete ICAO object from DB for it.
void sharedInfoObjectsRead()
Shared info objects read.
swift::misc::network::CUserList getUsersForCallsign(const swift::misc::aviation::CCallsign &callsign) const
Users by callsign.
bool containsModelString(const QString &modelString) const
Existing modelstring?
swift::misc::aviation::CAirlineIcaoCode findBestMatchByCallsign(const swift::misc::aviation::CCallsign &callsign) const
ICAO code for callsign (e.g. DLH123 -> DLH)
void readDeferredInBackground(swift::misc::network::CEntityFlags::Entity entities, int delayMs)
Call CWebDataServices::readInBackground by single shot.
int getDistributorsCount() const
Distributors count.
QSet< int > getModelDbKeys() const
Model keys.
swift::misc::weather::CMetar getMetarForAirport(const swift::misc::aviation::CAirportIcaoCode &icao) const
Get METAR for airport.
void gracefulShutdown()
Shutdown.
swift::misc::aviation::CAirlineIcaoCodeList getAirlineIcaoCodesForDesignator(const QString &designator) const
Airline ICAO codes for designator.
int getModelsCount() const
Models count.
bool hasSuccesfullyConnectedSwiftDb() const
Has already successfully connect swift DB?
void swiftDbModelsRead()
All models read.
swift::misc::CCountryList getCountries() const
Countries.
swift::core::db::CInfoDataReader * getDbInfoDataReader() const
DB info data reader.
swift::misc::aviation::CAircraftIcaoCode getAircraftIcaoCodeForDbKey(int id) const
ICAO code for id.
void readInBackground(swift::misc::network::CEntityFlags::Entity entities=swift::misc::network::CEntityFlags::AllEntities)
First read (allows to immediately read in background)
swift::misc::aviation::CAircraftIcaoCode getAircraftIcaoCodeForDesignator(const QString &designator) const
ICAO code for designator.
QDateTime getLatestDbEntityTimestamp(swift::misc::network::CEntityFlags::Entity entity) const
Corresponding DB timestamp if applicable.
void updateWithVatsimDataFileData(swift::misc::simulation::CSimulatedAircraft &aircraftToBeUdpated) const
Update with web data.
QString getDbReadersLog(const QString &separator="\n") const
For all available DB readers the log info is generated.
swift::misc::aviation::CLivery getStdLiveryForAirlineCode(const swift::misc::aviation::CAirlineIcaoCode &icao) const
Standard livery for airline code.
swift::misc::aviation::CAircraftIcaoCodeList getAircraftIcaoCodesForAirline(const swift::misc::aviation::CAirlineIcaoCode &airline) const
Aircraft ICAO codes for airline.
swift::misc::network::CVoiceCapabilities getVoiceCapabilityForCallsign(const swift::misc::aviation::CCallsign &callsign) const
Voice capabilities for given callsign.
int getAircraftCategoriesCount() const
Aircraft categories count.
swift::misc::CStatusMessageList asyncAutoPublish(const swift::misc::simulation::CAutoPublishData &data) const
Auto publish to database.
QStringList getModelCompleterStrings(bool sorted=true, const swift::misc::simulation::CSimulatorInfo &simulator={ swift::misc::simulation::CSimulatorInfo::All }) const
Model completer string.
swift::misc::weather::CMetarList getMetars() const
Get METARs.
swift::misc::network::CEntityFlags::Entity triggerLoadingDirectlyFromSharedFiles(swift::misc::network::CEntityFlags::Entity whatToRead, bool checkCacheTsUpfront)
Trigger reload from shared files, loads the data and bypasses caches.
int getDbInfoObjectsCount(swift::misc::network::CEntityFlags::Entity entities, bool stopIfNotFound=true) const
Count for 1-n entities from DB entity objects.
static const QStringList & getLogCategories()
Log categories.
swift::misc::simulation::CAircraftModelList getModels() const
Models.
swift::misc::network::CUrl getVatsimMetarUrl() const
METAR URL (from status file)
QDateTime getCacheTimestamp(swift::misc::network::CEntityFlags::Entity entity) const
Corresponding cache timestamp if applicable.
void entityDownloadProgress(swift::misc::network::CEntityFlags::Entity entity, int logId, int progress, qint64 current, qint64 max, const QUrl &url)
Download progress for an entity.
swift::misc::simulation::CDistributorList getDistributors() const
Distributors.
QDateTime getLatestDbEntityCacheTimestamp() const
Latest DB object timestamp, or null if there is no such timestamp.
int getCountriesCount() const
Country count.
int getAircraftIcaoCodesForDesignatorCount(const QString &designator) const
ICAO code for designator count.
QDateTime getLatestSharedInfoObjectTimestamp(swift::misc::network::CEntityFlags::Entity entity) const
Shared info object timestamp.
bool isDbModelEqualForPublishing(const swift::misc::simulation::CAircraftModel &modelToBeChecked, swift::misc::CStatusMessageList *details=nullptr) const
Considered equal for publishing, compares if livery etc. are the same DB values.
QString getReadersLog(const QString &separator="\n") const
For all available readers the log info is generated.
swift::misc::CStatusMessageList validateForPublishing(const swift::misc::simulation::CAircraftModelList &modelsToBePublished, bool ignoreEqual, swift::misc::simulation::CAircraftModelList &validModels, swift::misc::simulation::CAircraftModelList &invalidModels) const
Validate for publishing.
swift::misc::CStatusMessageList initDbCachesFromLocalResourceFiles(bool inBackground)
Init caches from local DB files.
swift::misc::aviation::CAircraftIcaoCodeList getAircraftIcaoCodesForDesignator(const QString &designator) const
ICAO codes for designator.
swift::misc::network::CEntityFlags::Entity getEmptyEntities(swift::misc::network::CEntityFlags::Entity entities=swift::misc::network::CEntityFlags::AllDbEntities) const
Empty entities in cache.
swift::misc::aviation::CAirport getAirportForIcaoDesignator(const QString &icao) const
Get airport for ICAO designator.
swift::misc::network::CEntityFlags::Entity getSynchronizedEntitiesWithNewerSharedFileOrEmpty(bool syncData=true, swift::misc::network::CEntityFlags::Entity entities=swift::misc::network::CEntityFlags::AllDbEntities)
Synchronized entities either empty or with newer shared file.
swift::misc::network::CEntityFlags::Entity triggerLoadingDirectlyFromDb(swift::misc::network::CEntityFlags::Entity whatToRead, const QDateTime &newerThan=QDateTime())
Trigger reload from DB, loads the DB data and bypasses the caches checks and info objects.
swift::misc::aviation::CAirlineIcaoCode smartAirlineIcaoSelector(const swift::misc::aviation::CAirlineIcaoCode &code, const swift::misc::aviation::CCallsign &callsign=swift::misc::aviation::CCallsign()) const
Smart airline selector.
swift::misc::simulation::CAircraftModel getModelForDbKey(int dbKey) const
Model for key if any.
int getAirportsCount() const
Get airports count.
swift::misc::network::CEntityFlags::Entity triggerRead(swift::misc::network::CEntityFlags::Entity whatToRead, const QDateTime &newerThan=QDateTime())
Trigger read of new data.
void synchronizeDbCaches(swift::misc::network::CEntityFlags::Entity entities)
Synchronize all DB caches specified.
swift::misc::aviation::CAirlineIcaoCode getAirlineIcaoCodeForUniqueIataCodeOrDefault(const QString &iataCode) const
ICAO code if unique, otherwise default.
void triggerReadOfSharedInfoObjects()
Trigger read of shared info objects.
QStringList getTelephonyDesignators() const
Airline telephony designators.
CWebDataServices(CWebReaderFlags::WebReader readerFlags, const swift::core::db::CDatabaseReaderConfigList &dbReaderConfig, QObject *parent=nullptr)
Constructor, only allowed from swift::core::CApplication.
swift::misc::simulation::CAircraftModel getModelForModelString(const QString &modelString) const
Model for model string if any.
swift::misc::network::CEntityFlags::Entity getEntitiesWithNewerSharedFile(swift::misc::network::CEntityFlags::Entity entities) const
Entities with newer shared file (from DB Info object)
swift::misc::aviation::CLivery getTempLiveryOrDefault() const
The temp. livery if available.
void dataRead(swift::misc::network::CEntityFlags::Entity entity, swift::misc::network::CEntityFlags::ReadState state, int number, const QUrl &url)
Combined read signal.
void swiftDbModelMatchingEntitiesRead()
All entities needed for model matching.
swift::misc::simulation::CDistributor smartDistributorSelector() const
Use distributor object to select the best complete distributor from DB.
swift::misc::aviation::CAircraftCategoryList getAircraftCategories() const
Aircraft categories.
void swiftDbAirlineIcaoRead()
Airline ICAO data read.
swift::misc::aviation::CAirportList getAirports() const
Get airports.
int getCacheCount(swift::misc::network::CEntityFlags::Entity entity) const
Cache count for entity.
swift::misc::aviation::CLiveryList getLiveries() const
Liveries.
swift::misc::CCountry getCountryForIsoCode(const QString &iso) const
Country by ISO code (GB, US...)
QSet< QString > getAircraftDesignatorsForAirline(const swift::misc::aviation::CAirlineIcaoCode &airline) const
Aircraft ICAO designators for airline.
int getAirlineIcaoCodesForDesignatorCount(const QString &designator) const
Airline ICAO codes for designator count.
void swiftDbDataRead(bool success)
DB data read.
bool containsAircraftIcaoDesignator(const QString &designator) const
Contains the given designator?
swift::misc::aviation::CLivery getLiveryForDbKey(int id) const
Livery for id.
swift::misc::aviation::CLivery getLiveryForCombinedCode(const QString &combinedCode) const
Livery for its combined code.
swift::misc::network::CUrl getVatsimDataFileUrl() const
Data file location (from status file)
bool hasDbAircraftData() const
Are all DB data for an aircraft entity available?
int getDbInfoObjectCount(swift::misc::network::CEntityFlags::Entity entity) const
Count for entity from DB entity objects.
swift::misc::simulation::CDistributor getDistributorForDbKey(const QString &key) const
Distributor for key.
swift::misc::aviation::CAirport getAirportForNameOrLocation(const QString &nameOrLocation) const
Get airport for name of location.
bool writeDbDataToDisk(const QString &dir)
Write data to disk (mainly for testing scenarios)
bool containsAirlineIcaoDesignator(const QString &designator) const
Contains the given designator?
int getAircraftIcaoCodesCount() const
Aircraft ICAO codes count.
virtual ~CWebDataServices()
Destructor.
swift::misc::aviation::CAtcStationList getAtcStationsForCallsign(const swift::misc::aviation::CCallsign &callsign) const
ATC stations by callsign.
void swiftDbAllIcaoEntitiesRead()
All ICAO entities.
bool readDbDataFromDisk(const QString &dir, bool inBackground, bool overrideNewerOnly)
Load DB data from disk (mainly for initial data load and testing scenarios)
swift::misc::aviation::CLivery smartLiverySelector(const swift::misc::aviation::CLivery &livery) const
Use a livery as template and select the best complete livery from DB for it.
swift::misc::aviation::CAirlineIcaoCode getAirlineIcaoCodeForUniqueDesignatorOrDefault(const QString &designator, bool preferOperatingAirlines) const
ICAO code if unique, otherwise default.
int getAirlineIcaoCodesCount() const
Airline ICAO codes count.
int getLiveriesCount() const
Liveries count.
swift::misc::CCountry getCountryForName(const QString &name) const
Country by name (France, China ..)
void swiftDbAircraftIcaoRead()
Aircraft ICAO data read.
QStringList getModelStrings(bool sort=false) const
Model strings.
void triggerReadOfDbInfoObjects()
Trigger read of DB info objects.
bool hasDbIcaoData() const
Are all DB ICAO data available?
swift::misc::aviation::CAirlineIcaoCodeList getAirlineIcaoCodes() const
Airline ICAO codes.
void swiftDbAllDataRead()
All swift DB data have been read.
QStringList getAirlineNames() const
Airline names.
swift::misc::simulation::CAircraftModelList getModelsForAircraftDesignatorAndLiveryCombinedCode(const QString &aircraftDesignator, const QString &combinedCode) const
Models for combined code and aircraft designator.
void admitDbCaches(swift::misc::network::CEntityFlags::Entity entities)
Admit all DB caches specified.
swift::misc::aviation::CAircraftIcaoCodeList getAircraftIcaoCodes() const
Aircraft ICAO codes.
@ AirportReader
reader for airport list
@ VatsimMetarReader
reader for VATSIM metar data
@ VatsimStatusReader
reader for VATSIM status file
@ ModelReader
reader for model data such as liveries, models, etc
@ IcaoDataReader
reader for ICAO data
@ DbInfoDataReader
DB info data (metdata, how many data, when updated)
@ VatsimDataReader
reader for VATSIM data
static swift::misc::network::CEntityFlags::Entity allEntitiesForReaders(WebReader readers)
All entities readers can read.
static WebReader entitiesToReaders(swift::misc::network::CEntityFlags::Entity entities)
Relationship between readers and entities.
const swift::misc::network::CUrl & getDbRootDirectoryUrl() const
Root directory of DB.
Reader for airport database data.
virtual bool readFromJsonFilesInBackground(const QString &dir, swift::misc::network::CEntityFlags::Entity whatToRead, bool overrideNewerOnly)
Data read from local data.
virtual swift::misc::network::CEntityFlags::Entity getSupportedEntities() const
Supported entities by this reader.
swift::misc::aviation::CAirport getAirportForIcaoDesignator(const QString &designator) const
Returns airport for designator (or default)
virtual swift::misc::network::CEntityFlags::Entity getEntitiesWithCacheTimestampNewerThan(const QDateTime &threshold) const
Entities already having data in cache (based on timestamp assumption)
int getAirportsCount() const
Returns a list of all airports in the database.
swift::misc::aviation::CAirport getAirportForNameOrLocation(const QString &location) const
Get airports for location.
virtual void synchronizeCaches(swift::misc::network::CEntityFlags::Entity entities)
Admit caches for given entities.
swift::misc::aviation::CAirportList getAirports() const
Returns a list of all airports in the database.
virtual swift::misc::CStatusMessageList readFromJsonFiles(const QString &dir, swift::misc::network::CEntityFlags::Entity whatToRead, bool overrideNewerOnly)
Data read from local data.
virtual void admitCaches(swift::misc::network::CEntityFlags::Entity entities)
Admit caches for given entities.
virtual swift::misc::network::CEntityFlags::Entity getEntitiesWithCacheCount() const
Entities already having data in cache.
Value object encapsulating a list of reader configs.
bool needsSharedInfoFile(swift::misc::network::CEntityFlags::Entity entities) const
Needs any shared header loaded before continued.
swift::misc::network::CEntityFlags::Entity getEntitesCachedOrReadFromDB() const
Entities which will use cache or DB, so no canceled or ignored ones.
bool possiblyWritesToSwiftDb() const
Will write to swift DB.
bool possiblyReadsFromSwiftDb() const
Will read from swift DB.
Specialized version of threaded reader for DB data.
virtual QDateTime getCacheTimestamp(swift::misc::network::CEntityFlags::Entity entity) const =0
Get cache timestamp.
swift::misc::CStatusMessageList initFromLocalResourceFiles(bool inBackground)
Init from local resource file.
bool hasReceivedOkReply() const
Has received Ok response from server at least once?
virtual int getCacheCount(swift::misc::network::CEntityFlags::Entity entity) const =0
Cache`s number of entities.
QDateTime getLatestEntityTimestampFromSharedInfoObjects(swift::misc::network::CEntityFlags::Entity entity) const
Obtain latest object timestamp from shared info objects.
QDateTime getLatestEntityTimestampFromDbInfoObjects(swift::misc::network::CEntityFlags::Entity entity) const
Obtain latest object timestamp from DB info objects.
bool supportsAnyOfEntities(swift::misc::network::CEntityFlags::Entity entities) const
Is any of the given entities supported here by this reader.
QString getSupportedEntitiesAsString() const
Supported entities as string.
swift::misc::network::CEntityFlags::Entity getEntitesWithNewerSharedInfoObject(swift::misc::network::CEntityFlags::Entity entities) const
Those entities where the timestamp of a shared info object is newer than the cache timestamp.
swift::misc::network::CEntityFlags::Entity maskBySupportedEntities(swift::misc::network::CEntityFlags::Entity entities) const
Mask by supported entities.
swift::misc::network::CEntityFlags::Entity triggerLoadingDirectlyFromSharedFiles(swift::misc::network::CEntityFlags::Entity entities, bool checkCacheTsUpfront)
Start loading from shared files in own thread.
bool hasReceivedFirstReply() const
Has received 1st reply?
void readInBackgroundThread(swift::misc::network::CEntityFlags::Entity entities, const QDateTime &newerThan)
Start reading in own thread.
swift::misc::network::CEntityFlags::Entity triggerLoadingDirectlyFromDb(swift::misc::network::CEntityFlags::Entity entities, const QDateTime &newerThan)
Start loading from DB in own thread.
void setSeverityNoWorkingUrl(swift::misc::CStatusMessage::StatusSeverity s)
Severity used for log messages in case of no URLs.
const QString & getStatusMessage() const
Status message (error message)
const swift::misc::network::CUrlLogList & getWriteLog() const
Write log.
const QString & getName()
Name of the worker.
swift::misc::CStatusMessageList asyncPublishModels(const swift::misc::simulation::CAircraftModelList &models, const QString &extraInfo)
Write models to DB.
swift::misc::CStatusMessageList asyncAutoPublish(const swift::misc::simulation::CAutoPublishData &data)
Write auto publis data.
void gracefulShutdown()
Shutdown.
Read ICAO data from Database.
swift::misc::CCountry getCountryForName(const QString &name) const
Get country for ISO name.
swift::misc::CCountry getCountryForIsoCode(const QString &isoCode) const
Get country for ISO code.
bool containsAirlineIcaoDesignator(const QString &designator) const
Contains given designator?
int getCountriesCount() const
Get countries count.
swift::misc::aviation::CAirlineIcaoCode getAirlineIcaoCodeForDbKey(int key) const
Get airline ICAO information for key.
swift::misc::aviation::CAirlineIcaoCode getAirlineIcaoCodeForUniqueIataCodeOrDefault(const QString &iataCode) const
Find by IATA code if this is unique, otherwise return default object.
virtual swift::misc::CStatusMessageList readFromJsonFiles(const QString &dir, swift::misc::network::CEntityFlags::Entity whatToRead, bool overrideNewerOnly)
Data read from local data.
int getAirlineIcaoCodesCount() const
Get airline ICAO information count.
int getAircraftCategoryCount() const
Get aircraft category count.
swift::misc::aviation::CAircraftIcaoCodeList getAircraftIcaoCodes() const
Get aircraft ICAO information.
virtual swift::misc::network::CEntityFlags::Entity getEntitiesWithCacheCount() const
Entities already having data in cache.
swift::misc::aviation::CAircraftIcaoCode getAircraftIcaoCodeForDesignator(const QString &designator) const
Get aircraft ICAO information for designator.
swift::misc::aviation::CAirlineIcaoCodeList getAirlineIcaoCodesForDesignator(const QString &designator) const
Find by v-designator, this should be unique.
swift::misc::aviation::CAirlineIcaoCodeList getAirlineIcaoCodes() const
Get airline ICAO information.
virtual swift::misc::network::CEntityFlags::Entity getSupportedEntities() const
Supported entities by this reader.
virtual bool readFromJsonFilesInBackground(const QString &dir, swift::misc::network::CEntityFlags::Entity whatToRead, bool overrideNewerOnly)
Data read from local data.
swift::misc::aviation::CAircraftIcaoCodeList getAircraftIcaoCodesForDesignator(const QString &designator) const
Get aircraft ICAO information for designator.
virtual void admitCaches(swift::misc::network::CEntityFlags::Entity entities)
Admit caches for given entities.
swift::misc::aviation::CAircraftCategoryList getAircraftCategories() const
Get aircraft categories.
swift::misc::aviation::CAirlineIcaoCode getAirlineIcaoCodeForUniqueDesignatorOrDefault(const QString &designator, bool preferOperatingAirlines) const
Find by ICAO code if this is unique, otherwise return default object.
virtual swift::misc::network::CEntityFlags::Entity getEntitiesWithCacheTimestampNewerThan(const QDateTime &threshold) const
Entities already having data in cache (based on timestamp assumption)
swift::misc::CCountryList getCountries() const
Get countries.
int getAircraftIcaoCodesCount() const
Get aircraft ICAO information count.
bool containsAircraftIcaoDesignator(const QString &designator) const
Contains designator?
virtual void synchronizeCaches(swift::misc::network::CEntityFlags::Entity entities)
Admit caches for given entities.
swift::misc::aviation::CAirlineIcaoCode smartAirlineIcaoSelector(const swift::misc::aviation::CAirlineIcaoCode &icaoPattern, const swift::misc::aviation::CCallsign &callsign=swift::misc::aviation::CCallsign()) const
Get best match for airline ICAO code.
swift::misc::aviation::CAircraftIcaoCode getAircraftIcaoCodeForDbKey(int key) const
Get aircraft ICAO information for key.
swift::misc::aviation::CAircraftIcaoCode smartAircraftIcaoSelector(const swift::misc::aviation::CAircraftIcaoCode &icaoPattern) const
Get best match for incomplete aircraft ICAO code.
Read information about data from Database or shared files such as when updated and number of entries.
int getInfoObjectCount() const
Get info list size (either shared or from DB)
swift::misc::db::CDbInfoList getInfoObjects() const
Get info list (either shared or from DB)
void readInfoData()
Allow to call directly, special for info objects reader.
swift::misc::network::CUrl getInfoObjectsUrl() const
URL depending on mode, i.e. shared/DB.
bool areAllInfoObjectsRead() const
All data read?
Read model related data from Database.
bool containsModelString(const QString &modelString) const
Contains modelstring?
swift::misc::simulation::CAircraftModel getModelForModelString(const QString &modelString) const
Get model for string.
swift::misc::simulation::CAircraftModel getModelForDbKey(int dbKey) const
Get model for DB key.
swift::misc::aviation::CLivery getLiveryForCombinedCode(const QString &combinedCode) const
Get aircraft livery for code.
int getLiveriesCount() const
Get aircraft liveries count.
swift::misc::simulation::CDistributor getDistributorForDbKey(const QString &dbKey) const
Get distributor for id.
QSet< int > getModelDbKeys() const
Get model keys.
QStringList getModelStringList(bool sort=false) const
Get model keys.
swift::misc::aviation::CLivery smartLiverySelector(const swift::misc::aviation::CLivery &livery) const
Best match specified by livery.
int getDistributorsCount() const
Get model distributors count.
virtual swift::misc::network::CEntityFlags::Entity getEntitiesWithCacheCount() const
Entities already having data in cache.
virtual void admitCaches(swift::misc::network::CEntityFlags::Entity entities)
Admit caches for given entities.
swift::misc::simulation::CDistributorList getDistributors() const
Get distributors (of models)
swift::misc::simulation::CAircraftModelList getModelsForAircraftDesignatorAndLiveryCombinedCode(const QString &aircraftDesignator, const QString &combinedCode)
Get model for designator/combined code.
swift::misc::aviation::CAircraftIcaoCodeList getAicraftIcaoCodesForAirline(const swift::misc::aviation::CAirlineIcaoCode &code) const
Get aircraft ICAO designators (e.g. B737, ..) for given airline.
swift::misc::simulation::CDistributor smartDistributorSelector(const swift::misc::simulation::CDistributor &distributorPattern) const
Best match specified by distributor.
virtual swift::misc::network::CEntityFlags::Entity getSupportedEntities() const
Supported entities by this reader.
int getModelsCount() const
Get models count.
swift::misc::aviation::CLivery getStdLiveryForAirlineVDesignator(const swift::misc::aviation::CAirlineIcaoCode &icao) const
Get aircraft livery for ICAO code.
QSet< QString > getAircraftDesignatorsForAirline(const swift::misc::aviation::CAirlineIcaoCode &code) const
Get aircraft ICAO designators (e.g. B737, ..) for given airline.
virtual void synchronizeCaches(swift::misc::network::CEntityFlags::Entity entities)
Admit caches for given entities.
swift::misc::aviation::CLivery getLiveryForDbKey(int id) const
Get aircraft livery for id.
swift::misc::simulation::CAircraftModelList getModels() const
Get models.
virtual bool readFromJsonFilesInBackground(const QString &dir, swift::misc::network::CEntityFlags::Entity whatToRead, bool overrideNewerOnly)
Data read from local data.
swift::misc::aviation::CLiveryList getLiveries() const
Get aircraft liveries.
virtual swift::misc::network::CEntityFlags::Entity getEntitiesWithCacheTimestampNewerThan(const QDateTime &threshold) const
Entities already having data in cache (based on timestamp assumption)
virtual swift::misc::CStatusMessageList readFromJsonFiles(const QString &dir, swift::misc::network::CEntityFlags::Entity whatToRead, bool overrideNewerOnly)
Data read from local data.
void readInBackgroundThread()
Start reading in own thread.
swift::misc::aviation::CAtcStationList getAtcStationsForCallsign(const swift::misc::aviation::CCallsign &callsign) const
Get ATC stations for callsign.
swift::misc::network::CVoiceCapabilities getVoiceCapabilityForCallsign(const swift::misc::aviation::CCallsign &callsign) const
Voice capability for callsign.
void updateWithVatsimDataFileData(swift::misc::simulation::CSimulatedAircraft &aircraftToBeUdpated) const
Update aircraft with VATSIM aircraft data from data file.
swift::misc::network::CUserList getUsersForCallsign(const swift::misc::aviation::CCallsign &callsign) const
User for callsign.
void readInBackgroundThread()
Start reading in own thread.
swift::misc::network::CServerList getFsdServers() const
Get all VATSIM FSD servers.
Sole purpose is to read the URLs where VATSIM data can be downloaded.
swift::misc::network::CUrl getDataFileUrl() const
Data file URL.
swift::misc::network::CUrl getMetarFileUrl() const
METAR URL.
void readInBackgroundThread()
Start reading in own thread.
const QString & getName()
Name of the worker.
void quitAndWait() noexcept final
Calls quit() and blocks until the thread is finished.
void start(QThread::Priority priority=QThread::InheritPriority)
Starts a thread and moves the worker into it.
Value object encapsulating a list of countries.
static bool writeStringToFile(const QString &content, const QString &fileNameAndPath)
Write string to text file.
static QString appendFilePaths(const QString &path1, const QString &path2)
Append file paths.
static const QString & webservice()
Webservice.
Class for emitting a log message.
static void preformatted(const CStatusMessage &statusMessage)
Sends a verbatim, preformatted message to the log.
Derived & warning(const char16_t(&format)[N])
Set the severity to warning, providing a format string.
bool isEmpty() const
Message empty.
Derived & error(const char16_t(&format)[N])
Set the severity to error, providing a format string.
Derived & info(const char16_t(&format)[N])
Set the severity to info, providing a format string.
size_type size() const
Returns number of elements in the sequence.
void push_back(const T &value)
Appends an element at the end of the sequence.
bool isEmpty() const
Synonym for empty.
Streamable status message, e.g.
constexpr static auto SeverityError
Status severities.
constexpr static auto SeverityWarning
Status severities.
Status messages, e.g. from Core -> GUI.
bool isSuccess() const
All messages are marked as success.
void warningToError()
Turn warnings into errors.
static bool thisIsMainThread()
Is the current thread the application thread?
static bool isInThisThread(const QObject *toBeTested)
Is the current thread the object's thread?
static CWorker * fromTask(QObject *owner, const QString &name, F &&task)
Returns a new worker object which lives in a new thread.
Value object encapsulating a list of ICAO codes.
Value object for ICAO classification.
Value object encapsulating a list of ICAO codes.
Value object for ICAO classification.
bool hasValidDesignator() const
Airline designator available?
Value object encapsulating a list of ICAO codes.
CAirlineIcaoCode findBestMatchByCallsign(const CCallsign &callsign) const
Use callsign to conclude airline.
Value object encapsulating information about an airpot.
Value object encapsulating information of airport ICAO data.
Value object for a list of airports.
Value object for a list of ATC stations.
Value object encapsulating information of a callsign.
bool isEmpty() const
Is empty?
Value object encapsulating information about an airpot.
Value object for a list of airports.
Info about the latest models.
int getEntries() const
Entry count.
CDbInfo findFirstByEntityOrDefault(swift::misc::network::CEntityFlags::Entity entity) const
Find by entity.
int getDbKey() const
Get DB key.
bool isLoadedFromDb() const
Loaded from DB.
QString toQString(bool i18n=false) const
Cast as QString.
What and state of reading from web services.
QSet< CEntityFlags::Entity > EntitySet
Set of CEntityFlags::Entity.
ReadState
State of operation.
Value object encapsulating a list of servers.
Value object encapsulating information of a location, kind of simplified CValueObject compliant versi...
QString getSummary() const
Summary.
Value object encapsulating a list of voice rooms.
Value object encapsulating information for voice capabilities.
Aircraft model (used by another pilot, my models on disk)
const QString & getModelString() const
Model key, either queried or loaded from simulator model.
bool isEqualForPublishing(const CAircraftModel &dbModel, CStatusMessageList *details=nullptr) const
Considered equal for publishing, compares if livery etc. are the same DB values.
Value object encapsulating a list of aircraft models.
QStringList toCompleterStrings(bool sorted=true, const CSimulatorInfo &simulator={ CSimulatorInfo::All }) const
Completer strings.
CStatusMessageList validateDistributors(const CDistributorList &distributors, CAircraftModelList &validModels, CAircraftModelList &invalidModels) const
Validate distributors.
CStatusMessageList validateForPublishing() const
Validate for publishing.
Objects that can be use for auto-publishing. Auto publishing means we sent those data to the DB.
Value object encapsulating information of software distributor.
Value object encapsulating a list of distributors.
Comprehensive information of an aircraft.
Simple hardcoded info about the corresponding simulator.
Core data traits (aka cached values) and classes.
Classes interacting with the swift database (aka "datastore").
Backend services of the swift project, like dealing with the network or the simulators.
Free functions in swift::misc.
StatusSeverity
Status severities.
auto singleShot(int msec, QObject *target, F &&task)
Starts a single-shot timer which will call a task in the thread of the given object when it times out...