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))
80 "info object but no reader");
84 this->initReaders(readerFlags, entities);
85 if (writeToSwiftDb) { this->initWriters(); }
90 entities &= ~m_entitiesPeriodicallyRead;
101 if (m_vatsimServerFileReader) {
return m_vatsimServerFileReader->
getFsdServers(); }
107 if (m_vatsimStatusReader) {
return m_vatsimStatusReader->
getMetarFileUrl(); }
113 if (m_vatsimStatusReader) {
return m_vatsimStatusReader->
getDataFileUrl(); }
119 if (m_vatsimDataFileReader) {
return m_vatsimDataFileReader->
getUsersForCallsign(callsign); }
142 if (m_databaseWriter) {
return m_databaseWriter->
asyncPublishModels(modelsToBePublished,
""); }
158 if (!m_icaoDataReader && !m_modelDataReader && !m_airportDataReader && !m_dbInfoDataReader) {
return false; }
183 if (m_shuttingDown) {
return; }
190 if (m_modelDataReader) { m_modelDataReader->
admitCaches(entities); }
191 if (m_icaoDataReader) { m_icaoDataReader->
admitCaches(entities); }
192 if (m_airportDataReader) { m_airportDataReader->
admitCaches(entities); }
197 if (m_shuttingDown) {
return; }
211 if (m_shuttingDown) {
return CEntityFlags::NoEntity; }
213 Q_ASSERT_X(!whatToRead.testFlag(CEntityFlags::DbInfoObjectEntity), Q_FUNC_INFO,
214 "Info object must be read upfront");
215 Q_ASSERT_X(!whatToRead.testFlag(CEntityFlags::VatsimDataFile), Q_FUNC_INFO,
216 "Datafile is read periodically and should not be triggered manually!");
217 Q_ASSERT_X(!whatToRead.testFlag(CEntityFlags::MetarEntity), Q_FUNC_INFO,
218 "METAR file is read periodically and should not be triggered manually!");
220 CEntityFlags::Entity triggeredRead = CEntityFlags::NoEntity;
222 if (m_airportDataReader && whatToRead.testFlag(CEntityFlags::AirportEntity))
224 CEntityFlags::Entity airportEntities = whatToRead & CEntityFlags::AirportEntity;
226 triggeredRead |= CEntityFlags::AirportEntity;
229 const bool shouldReadIcaoData = whatToRead.testFlag(CEntityFlags::AircraftIcaoEntity) ||
230 whatToRead.testFlag(CEntityFlags::AircraftCategoryEntity) ||
231 whatToRead.testFlag(CEntityFlags::AirlineIcaoEntity) ||
232 whatToRead.testFlag(CEntityFlags::CountryEntity);
233 if (m_icaoDataReader && shouldReadIcaoData)
235 CEntityFlags::Entity icaoEntities = whatToRead & CEntityFlags::AllIcaoCountriesCategory;
237 triggeredRead |= icaoEntities;
240 const bool shouldReadModelData = whatToRead.testFlag(CEntityFlags::LiveryEntity) ||
241 whatToRead.testFlag(CEntityFlags::DistributorEntity) ||
242 whatToRead.testFlag(CEntityFlags::ModelEntity);
243 if (m_modelDataReader && shouldReadModelData)
245 CEntityFlags::Entity modelEntities = whatToRead & CEntityFlags::DistributorLiveryModel;
247 triggeredRead |= modelEntities;
250 return triggeredRead;
254 const QDateTime &newerThan)
256 if (m_shuttingDown) {
return CEntityFlags::NoEntity; }
259 CEntityFlags::Entity triggeredRead = CEntityFlags::NoEntity;
260 if (m_dbInfoDataReader)
263 triggeredRead |= CEntityFlags::DbInfoObjectEntity;
266 if (m_icaoDataReader)
272 triggeredRead |= icaoEntities;
276 if (m_modelDataReader)
282 triggeredRead |= modelEntities;
286 if (m_airportDataReader)
292 triggeredRead |= airportEntities;
296 return triggeredRead;
300 bool checkCacheTsUpfront)
302 if (m_shuttingDown) {
return CEntityFlags::NoEntity; }
305 CEntityFlags::Entity triggeredRead = CEntityFlags::NoEntity;
308 if (m_icaoDataReader)
318 if (m_modelDataReader)
328 if (m_airportDataReader)
338 return triggeredRead;
343 Q_ASSERT_X(CEntityFlags::isSingleEntity(entity), Q_FUNC_INFO,
"Need single entity");
344 if (!CEntityFlags::anySwiftDbEntity(entity)) {
return {}; }
346 if (!dr) {
return {}; }
352 Q_ASSERT_X(CEntityFlags::isSingleEntity(entity), Q_FUNC_INFO,
"Need single entity");
353 if (!CEntityFlags::anySwiftDbEntity(entity)) {
return {}; }
355 if (!ir) {
return {}; }
362 if (!reader) {
return {}; }
363 Q_ASSERT_X(CEntityFlags::isSingleEntity(entity), Q_FUNC_INFO,
"need single entity");
371 for (CEntityFlags::Entity e : set)
374 if (!ts.isValid()) {
continue; }
375 if (!latest.isValid() || latest < ts) { latest = ts; }
382 Q_ASSERT_X(m_sharedInfoDataReader, Q_FUNC_INFO,
"Shared info reader was not initialized");
383 if (m_sharedInfoDataReader->
getInfoObjectCount() < 1) {
return CEntityFlags::NoEntity; }
389 entities &= CEntityFlags::AllDbEntities;
390 CEntityFlags::Entity currentEntity = CEntityFlags::iterateDbEntities(entities);
391 CEntityFlags::Entity emptyEntities = CEntityFlags::NoEntity;
392 while (currentEntity != CEntityFlags::NoEntity)
395 if (c < 1) { emptyEntities |= currentEntity; }
396 currentEntity = CEntityFlags::iterateDbEntities(entities);
398 return emptyEntities;
405 const CEntityFlags::Entity checkForEmptyEntities =
406 CEntityFlags::entityFlagToEntity(CEntityFlags::AllDbEntitiesNoInfoObjects) & ~loadEntities;
424 Q_ASSERT_X(CEntityFlags::isSingleEntity(entity), Q_FUNC_INFO,
"Need single entity");
425 if (CEntityFlags::anySwiftDbEntity(entity))
428 if (!dr) {
return -1; }
437 if (!m_dbInfoDataReader) {
return -1; }
438 return this->getInfoObjectCount(entity, m_dbInfoDataReader);
443 if (!m_dbInfoDataReader) {
return -1; }
446 for (CEntityFlags::Entity single : set)
449 if (c < 0 && stopIfNotFound) {
return -1; }
450 if (c > 0) { total += c; }
457 if (!m_sharedInfoDataReader)
return -1;
458 return this->getInfoObjectCount(entity, m_sharedInfoDataReader);
464 if (m_dbInfoDataReader)
468 if (m_sharedInfoDataReader)
473 if (m_airportDataReader)
477 if (m_icaoDataReader)
481 if (m_modelDataReader)
485 if (m_databaseWriter)
489 return report.join(separator);
496 if (m_vatsimMetarReader)
500 if (m_vatsimStatusReader)
504 if (report.isEmpty()) {
return db; }
505 return report.join(separator) + separator + db;
510 if (m_modelDataReader) {
return m_modelDataReader->
getDistributors(); }
541 if (m_modelDataReader) {
return m_modelDataReader->
getLiveries(); }
583 if (m_modelDataReader) {
return m_modelDataReader->
getModels(); }
589 if (m_modelDataReader) {
return m_modelDataReader->
getModelsCount(); }
595 if (m_modelDataReader) {
return m_modelDataReader->
getModelDbKeys(); }
613 const QString &combinedCode)
const
615 if (m_modelDataReader)
637 if (m_modelDataReader) {
return m_modelDataReader->
getModelForDbKey(dbKey); }
692 if (designator.isEmpty()) {
return false; }
723 if (designator.isEmpty()) {
return false; }
730 bool preferOperatingAirlines)
const
732 if (designator.isEmpty()) {
return {}; }
733 if (m_icaoDataReader)
736 preferOperatingAirlines);
743 if (iataCode.isEmpty()) {
return {}; }
757 if (!m_icaoDataReader) {
return names; }
760 if (code.hasName()) { names.push_back(code.getName()); }
767 QStringList designators;
768 if (!m_icaoDataReader) {
return designators; }
771 if (code.hasTelephonyDesignator()) { designators.push_back(code.getTelephonyDesignator()); }
785 if (callsign.
isEmpty()) {
return {}; }
798 if (m_icaoDataReader) {
return m_icaoDataReader->
getCountries(); }
816 if (m_airportDataReader) {
return m_airportDataReader->
getAirports(); }
822 if (m_airportDataReader) {
return m_airportDataReader->
getAirportsCount(); }
846 if (m_vatsimMetarReader) {
return m_vatsimMetarReader->
getMetars(); }
871 validModels = newValidModels;
892 u
"Model: '%1', there is no change")
893 << publishModel.getModelString());
894 if (ignoreEqual) { invalidModels.
push_back(publishModel); }
895 else { newValidModels.
push_back(publishModel); }
897 validModels = newValidModels;
924 if (m_shuttingDown) {
return; }
925 m_shuttingDown =
true;
927 if (m_vatsimMetarReader)
930 m_vatsimMetarReader =
nullptr;
932 if (m_vatsimDataFileReader)
935 m_vatsimDataFileReader =
nullptr;
937 if (m_vatsimStatusReader)
940 m_vatsimStatusReader =
nullptr;
942 if (m_vatsimServerFileReader)
945 m_vatsimServerFileReader =
nullptr;
947 if (m_modelDataReader)
950 m_modelDataReader =
nullptr;
952 if (m_airportDataReader)
955 m_airportDataReader =
nullptr;
957 if (m_icaoDataReader)
960 m_icaoDataReader =
nullptr;
962 if (m_dbInfoDataReader)
965 m_dbInfoDataReader =
nullptr;
969 if (m_databaseWriter)
972 m_databaseWriter =
nullptr;
979 CEntityFlags::Entity entities = CEntityFlags::NoEntity;
985 if (!m_dbReaderConfig.
isEmpty())
988 entities &= configuredEntities;
991 entities &= CEntityFlags::AllDbEntities;
1001 void CWebDataServices::initReaders(CWebReaderFlags::WebReader readersNeeded, CEntityFlags::Entity entities)
1008 const CEntityFlags::Entity dbEntities = entities & CEntityFlags::AllDbEntitiesNoInfoObjects;
1009 const bool anyDbEntities = CEntityFlags::anySwiftDbEntity(dbEntities);
1014 if (needsDbInfoObjects)
1016 if (anyDbEntities && readersNeeded.testFlag(CWebReaderFlags::WebReaderFlag::DbInfoDataReader))
1019 this->initDbInfoObjectReaderAndTriggerRead();
1024 if (needsSharedInfoObjects) { this->initSharedInfoObjectReaderAndTriggerRead(); }
1032 startVatsimStatusFileReader();
1033 startVatsimServerFileReader();
1039 if (readersNeeded.testFlag(CWebReaderFlags::WebReaderFlag::VatsimDataReader)) { startVatsimDataFileReader(); }
1042 if (readersNeeded.testFlag(CWebReaderFlags::WebReaderFlag::VatsimMetarReader)) { startVatsimMetarFileReader(); }
1047 if (readersNeeded.testFlag(CWebReaderFlags::WebReaderFlag::IcaoDataReader)) { startIcaoDataReader(); }
1050 if (readersNeeded.testFlag(CWebReaderFlags::WebReaderFlag::ModelReader)) { startModelDataReader(); }
1053 if (readersNeeded.testFlag(CWebReaderFlags::WebReaderFlag::AirportReader)) { startAirportDataReader(); }
1055 const QDateTime threshold =
1056 QDateTime::currentDateTimeUtc().addDays(-365);
1057 const CEntityFlags::Entity cachedDbEntities =
1058 this->getDbEntitiesWithCachedData();
1059 const CEntityFlags::Entity validTsDbEntities =
1060 this->getDbEntitiesWithTimestampNewerThan(threshold);
1061 const bool needsSharedInfoObjectsWithoutCache =
1063 if (m_sharedInfoDataReader && !needsSharedInfoObjectsWithoutCache)
1071 void CWebDataServices::startVatsimStatusFileReader()
1073 Q_ASSERT_X(!m_vatsimStatusReader, Q_FUNC_INFO,
"VATSIM status file reader already initialized");
1075 connect(m_vatsimStatusReader, &CVatsimStatusFileReader::statusFileRead,
this,
1076 &CWebDataServices::vatsimStatusFileRead, Qt::QueuedConnection);
1078 m_vatsimStatusReader->
start(QThread::LowPriority);
1081 const QPointer<CWebDataServices> myself(
this);
1083 if (!myself || m_shuttingDown) {
return; }
1089 void CWebDataServices::startVatsimServerFileReader()
1091 Q_ASSERT_X(!m_vatsimServerFileReader, Q_FUNC_INFO,
"VATSIM server file reader already initialized");
1093 bool c = connect(m_vatsimServerFileReader, &CVatsimServerFileReader::dataFileRead,
this,
1094 &CWebDataServices::vatsimServerFileRead, Qt::QueuedConnection);
1095 Q_ASSERT_X(c, Q_FUNC_INFO,
"VATSIM server reader signals");
1097 m_vatsimServerFileReader->
start(QThread::LowPriority);
1100 const QPointer<CWebDataServices> myself(
this);
1102 if (!myself || m_shuttingDown) {
return; }
1108 void CWebDataServices::startVatsimDataFileReader()
1110 Q_ASSERT_X(!m_vatsimDataFileReader, Q_FUNC_INFO,
"VATSIM data file reader already initialized");
1112 bool c = connect(m_vatsimDataFileReader, &CVatsimDataFileReader::dataFileRead,
this,
1113 &CWebDataServices::vatsimDataFileRead, Qt::QueuedConnection);
1114 Q_ASSERT_X(c, Q_FUNC_INFO,
"VATSIM data reader signals");
1116 Qt::QueuedConnection);
1117 Q_ASSERT_X(c, Q_FUNC_INFO,
"connect failed VATSIM data file");
1118 m_entitiesPeriodicallyRead |= CEntityFlags::VatsimDataFile;
1119 m_vatsimDataFileReader->
start(QThread::LowPriority);
1123 void CWebDataServices::startVatsimMetarFileReader()
1125 Q_ASSERT_X(!m_vatsimMetarReader, Q_FUNC_INFO,
"VATSIM METAR file reader already initialized");
1127 bool c = connect(m_vatsimMetarReader, &CVatsimMetarReader::metarsRead,
this, &CWebDataServices::receivedMetars,
1128 Qt::QueuedConnection);
1129 Q_ASSERT_X(c, Q_FUNC_INFO,
"VATSIM METAR reader signals");
1131 Qt::QueuedConnection);
1132 Q_ASSERT_X(c, Q_FUNC_INFO,
"connect failed VATSIM METAR");
1133 m_entitiesPeriodicallyRead |= CEntityFlags::MetarEntity;
1134 m_vatsimMetarReader->
start(QThread::LowPriority);
1138 void CWebDataServices::startIcaoDataReader()
1140 Q_ASSERT_X(!m_icaoDataReader, Q_FUNC_INFO,
"ICAO data reader already initialized");
1142 bool c = connect(m_icaoDataReader, &CIcaoDataReader::dataRead,
this, &CWebDataServices::readFromSwiftReader,
1143 Qt::QueuedConnection);
1144 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect ICAO reader signals");
1146 Qt::QueuedConnection);
1147 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect ICAO reader signals");
1149 Qt::QueuedConnection);
1150 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect Model reader signals");
1151 c = connect(m_icaoDataReader, &CIcaoDataReader::entityDownloadProgress,
this,
1153 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect Model reader signals");
1154 m_icaoDataReader->
start(QThread::LowPriority);
1157 void CWebDataServices::startModelDataReader()
1159 Q_ASSERT_X(!m_modelDataReader, Q_FUNC_INFO,
"Model data reader already initialized");
1161 bool c = connect(m_modelDataReader, &CModelDataReader::dataRead,
this, &CWebDataServices::readFromSwiftReader,
1162 Qt::QueuedConnection);
1163 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect Model reader signals");
1165 Qt::QueuedConnection);
1166 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect Model reader signals");
1168 Qt::QueuedConnection);
1169 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect Model reader signals");
1170 c = connect(m_modelDataReader, &CModelDataReader::entityDownloadProgress,
this,
1172 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect Model reader signals");
1173 m_modelDataReader->
start(QThread::LowPriority);
1176 void CWebDataServices::startAirportDataReader()
1179 bool c = connect(m_airportDataReader, &CAirportDataReader::dataRead,
this,
1180 &CWebDataServices::readFromSwiftReader, Qt::QueuedConnection);
1181 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect Model reader signals");
1183 Qt::QueuedConnection);
1184 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect Model reader signals");
1186 Qt::QueuedConnection);
1187 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect Model reader signals");
1188 c = connect(m_airportDataReader, &CAirportDataReader::entityDownloadProgress,
this,
1190 Q_ASSERT_X(c, Q_FUNC_INFO,
"Cannot connect Model reader signals");
1191 m_airportDataReader->
start(QThread::LowPriority);
1194 void CWebDataServices::initDbInfoObjectReaderAndTriggerRead()
1197 if (m_shuttingDown) {
return; }
1200 const QPointer<CWebDataServices> myself(
this);
1202 if (!myself || m_shuttingDown) {
return; }
1204 this->initDbInfoObjectReaderAndTriggerRead();
1209 if (!m_dbInfoDataReader)
1211 m_dbInfoDataReader =
new CInfoDataReader(
this, m_dbReaderConfig, CDbFlags::DbReading);
1212 m_dbInfoDataReader->setObjectName(m_dbInfoDataReader->objectName() +
" (DB)");
1214 connect(m_dbInfoDataReader, &CInfoDataReader::dataRead,
this, &CWebDataServices::readFromSwiftReader);
1215 Q_ASSERT_X(c, Q_FUNC_INFO,
"Info reader connect failed");
1219 Q_ASSERT_X(c, Q_FUNC_INFO,
"Info reader connect failed");
1220 c = connect(m_dbInfoDataReader, &CInfoDataReader::databaseReaderMessages,
this,
1225 m_dbInfoDataReader->
start(QThread::LowPriority);
1227 const QPointer<CWebDataServices> myself(
this);
1229 if (!myself || m_shuttingDown) {
return; }
1236 void CWebDataServices::initSharedInfoObjectReaderAndTriggerRead()
1239 if (m_shuttingDown) {
return; }
1242 const QPointer<CWebDataServices> myself(
this);
1244 if (!myself || m_shuttingDown) {
return; }
1245 this->initSharedInfoObjectReaderAndTriggerRead();
1250 if (!m_sharedInfoDataReader)
1252 m_sharedInfoDataReader =
new CInfoDataReader(
this, m_dbReaderConfig, CDbFlags::Shared);
1253 m_sharedInfoDataReader->setObjectName(m_sharedInfoDataReader->objectName() +
" (shared)");
1254 bool c = connect(m_sharedInfoDataReader, &CInfoDataReader::dataRead,
this,
1255 &CWebDataServices::readFromSwiftReader);
1256 Q_ASSERT_X(c, Q_FUNC_INFO,
"Info reader connect failed");
1260 Q_ASSERT_X(c, Q_FUNC_INFO,
"Info reader connect failed");
1264 m_sharedInfoDataReader->
start(QThread::LowPriority);
1268 const QPointer<CWebDataServices> myself(
this);
1270 if (!myself || m_shuttingDown) {
return; }
1275 CDatabaseReader *CWebDataServices::getDbReader(CEntityFlags::Entity entity)
const
1277 Q_ASSERT_X(CEntityFlags::isSingleEntity(entity), Q_FUNC_INFO,
"Need single entity");
1278 Q_ASSERT_X(CEntityFlags::anySwiftDbEntity(entity), Q_FUNC_INFO,
"No swift DB entity");
1291 void CWebDataServices::initWriters()
1296 bool CWebDataServices::signalEntitiesAlreadyRead(CEntityFlags::Entity entities)
1298 if (m_signalledEntities.contains(entities)) {
return false; }
1299 m_signalledEntities.insert(entities);
1303 int CWebDataServices::getInfoObjectCount(CEntityFlags::Entity entity,
CInfoDataReader *reader)
const
1305 Q_ASSERT_X(CEntityFlags::isSingleEntity(entity), Q_FUNC_INFO,
"Need single entity");
1306 Q_ASSERT_X(reader, Q_FUNC_INFO,
"Need reader");
1307 if (CEntityFlags::anySwiftDbEntity(entity))
1316 CEntityFlags::Entity CWebDataServices::getDbEntitiesWithCachedData()
const
1318 CEntityFlags::Entity entities = CEntityFlags::NoEntity;
1325 CEntityFlags::Entity CWebDataServices::getDbEntitiesWithTimestampNewerThan(
const QDateTime &threshold)
const
1327 CEntityFlags::Entity entities = CEntityFlags::NoEntity;
1334 void CWebDataServices::receivedMetars(
const CMetarList &metars)
1339 void CWebDataServices::vatsimDataFileRead(
int kB) {
CLogMessage(
this).
info(u
"Read VATSIM data file, %1 kB") << kB; }
1341 void CWebDataServices::vatsimStatusFileRead(
int bytes)
1343 CLogMessage(
this).
info(u
"Read VATSIM status file, %1 bytes") << bytes;
1346 void CWebDataServices::vatsimServerFileRead(
int bytes)
1348 CLogMessage(
this).
info(u
"Read VATSIM server file, %1 bytes") << bytes;
1351 void CWebDataServices::readFromSwiftReader(CEntityFlags::Entity entities,
CEntityFlags::ReadState state,
int number,
1354 if (state == CEntityFlags::ReadStarted) {
return; }
1356 const QString from = url.
isEmpty() ? QStringLiteral(
"") : QStringLiteral(
" from '%1'").arg(url.toString());
1357 const QString entStr = CEntityFlags::entitiesToString(entities);
1359 if (CEntityFlags::isWarningOrAbove(state))
1365 << entStr << number << CEntityFlags::stateToString(state) << from;
1370 << entStr << number << CEntityFlags::stateToString(state) << from;
1376 << entStr << number << CEntityFlags::stateToString(state) << from;
1379 m_swiftDbEntitiesRead |= entities;
1381 if (((
static_cast<int>(m_swiftDbEntitiesRead)) & allUsedEntities) == allUsedEntities)
1387 if (CEntityFlags::isFinishedReadState(state))
1390 if (entities.testFlag(CEntityFlags::AirportEntity) &&
1391 signalEntitiesAlreadyRead(CEntityFlags::AirportEntity))
1395 if (entities.testFlag(CEntityFlags::AirlineIcaoEntity) &&
1396 signalEntitiesAlreadyRead(CEntityFlags::AirlineIcaoEntity))
1400 if (entities.testFlag(CEntityFlags::AircraftIcaoEntity) &&
1401 signalEntitiesAlreadyRead(CEntityFlags::AircraftIcaoEntity))
1405 if (entities.testFlag(CEntityFlags::ModelEntity) && signalEntitiesAlreadyRead(CEntityFlags::ModelEntity))
1411 if (m_swiftDbEntitiesRead.testFlag(CEntityFlags::AllIcaoEntities) &&
1412 signalEntitiesAlreadyRead(CEntityFlags::AllIcaoEntities))
1416 if (m_swiftDbEntitiesRead.testFlag(CEntityFlags::ModelMatchingEntities) &&
1417 signalEntitiesAlreadyRead(CEntityFlags::ModelMatchingEntities))
1426 if (m_shuttingDown) {
return; }
1427 if (entities == CEntityFlags::NoEntity) {
return; }
1428 const QPointer<CWebDataServices> myself(
this);
1431 if (!myself || m_shuttingDown) {
return; }
1438 if (m_shuttingDown) {
return; }
1440 if (CEntityFlags::anySwiftDbEntity(entities))
1443 Q_ASSERT_X(!entities.testFlag(CEntityFlags::DbInfoObjectEntity), Q_FUNC_INFO,
1444 "Info object must be read upfront, do not pass as entity here");
1445 const bool waitForDbInfoReader = m_dbInfoDataReader && !m_dbInfoDataReader->
areAllInfoObjectsRead() &&
1447 if (waitForDbInfoReader)
1450 if (!this->waitForDbInfoObjectsThenRead(entities)) {
return; }
1453 const bool waitForSharedInfoFile =
1455 if (waitForSharedInfoFile)
1458 if (!this->waitForSharedInfoObjectsThenRead(entities)) {
return; }
1466 bool CWebDataServices::waitForDbInfoObjectsThenRead(CEntityFlags::Entity entities)
1468 if (m_shuttingDown) {
return false; }
1470 Q_ASSERT_X(m_dbInfoDataReader, Q_FUNC_INFO,
"need reader");
1474 const int timeOutMs = 30 * 1000;
1475 if (!m_dbInfoObjectTimeout.isValid())
1477 m_dbInfoObjectTimeout = QDateTime::currentDateTimeUtc().addMSecs(timeOutMs);
1479 << timeOutMs << m_dbInfoObjectTimeout.toString(
"dd.MM.yyyy hh:mm:ss");
1481 const bool read = this->waitForInfoObjectsThenRead(entities,
"DB", m_dbInfoDataReader, m_dbInfoObjectTimeout);
1485 bool CWebDataServices::waitForSharedInfoObjectsThenRead(CEntityFlags::Entity entities)
1487 if (m_shuttingDown) {
return false; }
1489 Q_ASSERT_X(m_sharedInfoDataReader, Q_FUNC_INFO,
"need reader");
1491 const int timeOutMs = 30 * 1000;
1492 if (!m_sharedInfoObjectsTimeout.isValid())
1494 m_sharedInfoObjectsTimeout = QDateTime::currentDateTimeUtc().addMSecs(timeOutMs);
1496 << timeOutMs << m_sharedInfoObjectsTimeout.toString(
"dd.MM.yyyy hh:mm:ss");
1499 this->waitForInfoObjectsThenRead(entities,
"shared", m_sharedInfoDataReader, m_sharedInfoObjectsTimeout);
1503 bool CWebDataServices::waitForInfoObjectsThenRead(CEntityFlags::Entity entities,
const QString &info,
1506 if (m_shuttingDown) {
return false; }
1509 Q_ASSERT_X(infoReader, Q_FUNC_INFO,
"Need info data reader");
1514 CLogMessage(
this).
info(u
"Info objects (%1) triggered for '%2' loaded from '%3'")
1516 timeOut = QDateTime();
1521 if (timeOut.isValid() && QDateTime::currentDateTimeUtc() > timeOut)
1523 const QString timeOutString = timeOut.toString();
1525 CLogMessage(
this).
warning(u
"Could not read '%1' info objects for '%2' from '%3', time out '%4'. "
1526 u
"Marking reader '%5' as failed and continue.")
1528 << timeOutString << infoReader->
getName();
1545 << info << CEntityFlags::entitiesToString(entities)
1554 CLogMessage(
this).
error(u
"Info objects (%1) loading for '%2' failed from '%3', '%4'")
1570 if (dir.isEmpty()) {
return false; }
1571 const QDir directory(dir);
1572 if (!directory.exists())
1574 const bool s = directory.mkpath(dir);
1575 if (!s) {
return false; }
1577 QList<QPair<QString, QString>> fileContents;
1581 const QString json(QJsonDocument(this->
getModels().toJson()).toJson());
1582 fileContents.push_back({
"models.json", json });
1587 const QString json(QJsonDocument(this->
getLiveries().toJson()).toJson());
1588 fileContents.push_back({
"liveries.json", json });
1593 const QString json(QJsonDocument(this->
getAirports().toJson()).toJson());
1594 fileContents.push_back({
"airports.json", json });
1597 for (
const auto &pair : fileContents)
1609 if (dir.isEmpty()) {
return false; }
1610 const QDir directory(dir);
1611 if (!directory.exists()) {
return false; }
1613 bool s1 = !m_icaoDataReader;
1614 if (m_icaoDataReader)
1634 bool s2 = !m_modelDataReader;
1635 if (m_modelDataReader)
1655 bool s3 = !m_airportDataReader;
1656 if (m_airportDataReader)
1676 return s1 && s2 && s3;
1698 CStatusMessage(
this).info(u
"No ICAO reader or not supporting entities"));
1701 CStatusMessage(
this).info(u
"No model reader or not supporting entities"));
1704 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::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)
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.
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::aviation::CAirlineIcaoCode getAirlineIcaoCodeForDbKey(int key) const
ICAO code for id.
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::simulation::CAircraftModel getModelForDbKey(int dbKey) const
Model for key if any.
void readDeferredInBackground(swift::misc::network::CEntityFlags::Entity entities)
Call CWebDataServices::readInBackground by single shot.
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::CAircraftIcaoCode getAircraftIcaoCodeForDbKey(int key) const
ICAO code for id.
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...)
swift::misc::aviation::CAirlineIcaoCode smartAirlineIcaoSelector(const swift::misc::aviation::CAirlineIcaoCode &icaoPattern, const swift::misc::aviation::CCallsign &callsign=swift::misc::aviation::CCallsign()) const
Smart airline selector.
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
@ 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)
@ VatsimServerFileReader
reader for VATSIM server file
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 needsSharedInfoObjects(swift::misc::network::CEntityFlags::Entity entities) const
Needs any shared info object.
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 needsSharedInfoObjectsIfCachesEmpty(swift::misc::network::CEntityFlags::Entity entities, swift::misc::network::CEntityFlags::Entity cachedEntities) const
Needs any shared info object, but only if the cache is empty.
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.
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...