8 #include <QElapsedTimer>
11 #include <QJsonDocument>
12 #include <QNetworkReply>
14 #include <QReadLocker>
15 #include <QScopedPointer>
16 #include <QScopedPointerDeleteLater>
17 #include <QStringBuilder>
20 #include <QWriteLocker>
34 using namespace swift::misc::db;
35 using namespace swift::misc::aviation;
36 using namespace swift::misc::network;
106 bool preferOperatingAirlines)
const
149 const QDateTime &newerThan)
153 entities &= CEntityFlags::AllIcaoCountriesCategory;
155 CEntityFlags::Entity entitiesTriggered = CEntityFlags::NoEntity;
157 if (entities.testFlag(CEntityFlags::AircraftIcaoEntity))
159 url = this->getAircraftIcaoUrl(mode);
164 entitiesTriggered |= CEntityFlags::AircraftIcaoEntity;
169 if (entities.testFlag(CEntityFlags::AirlineIcaoEntity))
171 url = this->getAirlineIcaoUrl(mode);
176 entitiesTriggered |= CEntityFlags::AirlineIcaoEntity;
181 if (entities.testFlag(CEntityFlags::CountryEntity))
183 url = this->getCountryUrl(mode);
188 entitiesTriggered |= CEntityFlags::CountryEntity;
193 if (entities.testFlag(CEntityFlags::AircraftCategoryEntity))
195 url = this->getAircraftCategoryUrl(mode);
200 entitiesTriggered |= CEntityFlags::AircraftCategoryEntity;
205 if (entitiesTriggered != CEntityFlags::NoEntity)
207 emit this->
dataRead(entitiesTriggered, CEntityFlags::ReadStarted, 0, url);
211 void CIcaoDataReader::aircraftIcaoCacheChanged() { this->
cacheHasChanged(CEntityFlags::AircraftIcaoEntity); }
213 void CIcaoDataReader::airlineIcaoCacheChanged() { this->
cacheHasChanged(CEntityFlags::AirlineIcaoEntity); }
215 void CIcaoDataReader::countryCacheChanged() { this->
cacheHasChanged(CEntityFlags::CountryEntity); }
217 void CIcaoDataReader::aircraftCategoryCacheChanged()
222 void CIcaoDataReader::baseUrlCacheChanged()
227 void CIcaoDataReader::updateReaderUrl(
const CUrl &url)
229 const CUrl current = m_readerUrlCache.
get();
230 if (current == url) {
return; }
235 void CIcaoDataReader::parseAircraftIcaoData(QNetworkReply *nwReplyPtr)
239 QScopedPointer<QNetworkReply, QScopedPointerDeleteLater> nwReply(nwReplyPtr);
242 const CDatabaseReader::JsonDatastoreResponse res =
244 const QUrl url = nwReply->url();
246 if (res.hasErrorMessage())
249 emit this->
dataRead(CEntityFlags::AircraftIcaoEntity, CEntityFlags::ReadFailed, 0, url);
253 emit this->
dataRead(CEntityFlags::AircraftIcaoEntity, CEntityFlags::ReadParsing, 0, url);
257 if (res.isRestricted())
261 CAircraftIcaoCodeList::fromDatabaseJson(res, categories,
true, &inconsistent));
262 if (incrementalCodes.isEmpty()) {
return; }
271 codes = CAircraftIcaoCodeList::fromDatabaseJson(res, categories,
true, &inconsistent);
272 this->
logParseMessage(
"aircraft ICAO", codes.
size(),
static_cast<int>(time.elapsed()), res);
278 u
"Inconsistent aircraft codes: " % inconsistent.
dbKeysAsString(
", ")),
283 const int n = codes.
size();
285 if (n > 0 && latestTimestamp < 0)
287 CLogMessage(
this).
error(u
"No timestamp in aircraft ICAO list, setting to last modified value");
291 m_aircraftIcaoCache.
set(codes, latestTimestamp);
292 this->updateReaderUrl(this->
getBaseUrl(CDbFlags::DbReading));
297 void CIcaoDataReader::parseAirlineIcaoData(QNetworkReply *nwReplyPtr)
299 QScopedPointer<QNetworkReply, QScopedPointerDeleteLater> nwReply(nwReplyPtr);
302 const QUrl url = nwReply->url();
303 const CDatabaseReader::JsonDatastoreResponse res =
305 if (res.hasErrorMessage())
308 emit this->
dataRead(CEntityFlags::AirlineIcaoEntity, CEntityFlags::ReadFailed, 0, url);
312 emit this->
dataRead(CEntityFlags::AirlineIcaoEntity, CEntityFlags::ReadParsing, 0, url);
315 if (res.isRestricted())
319 CAirlineIcaoCodeList::fromDatabaseJson(res,
true, &inconsistent));
320 if (incrementalCodes.isEmpty()) {
return; }
329 codes = CAirlineIcaoCodeList::fromDatabaseJson(res,
true, &inconsistent);
330 this->
logParseMessage(
"airline ICAO", codes.
size(),
static_cast<int>(time.elapsed()), res);
336 u
"Inconsistent airline codes: " % inconsistent.
dbKeysAsString(
", ")),
341 const int n = codes.
size();
343 if (n > 0 && latestTimestamp < 0)
345 CLogMessage(
this).
error(u
"No timestamp in airline ICAO list, setting to last modified value");
349 m_airlineIcaoCache.
set(codes, latestTimestamp);
350 this->updateReaderUrl(this->
getBaseUrl(CDbFlags::DbReading));
355 void CIcaoDataReader::parseCountryData(QNetworkReply *nwReplyPtr)
357 QScopedPointer<QNetworkReply, QScopedPointerDeleteLater> nwReply(nwReplyPtr);
358 const CDatabaseReader::JsonDatastoreResponse res =
360 const QUrl url = nwReply->url();
362 if (res.hasErrorMessage())
365 emit this->
dataRead(CEntityFlags::CountryEntity, CEntityFlags::ReadFailed, 0, url);
369 emit this->
dataRead(CEntityFlags::CountryEntity, CEntityFlags::ReadParsing, 0, url);
371 if (res.isRestricted())
375 if (incrementalCountries.isEmpty()) {
return; }
385 this->
logParseMessage(
"countries", countries.
size(),
static_cast<int>(time.elapsed()), res);
389 const int n = countries.
size();
391 if (n > 0 && latestTimestamp < 0)
393 CLogMessage(
this).
error(u
"No timestamp in country list, setting to last modified value");
397 m_countryCache.
set(countries, latestTimestamp);
398 this->updateReaderUrl(this->
getBaseUrl(CDbFlags::DbReading));
403 void CIcaoDataReader::parseAircraftCategoryData(QNetworkReply *nwReplyPtr)
405 QScopedPointer<QNetworkReply, QScopedPointerDeleteLater> nwReply(nwReplyPtr);
406 const CDatabaseReader::JsonDatastoreResponse res =
408 const QUrl url = nwReply->url();
410 if (res.hasErrorMessage())
413 emit this->
dataRead(CEntityFlags::AircraftCategoryEntity, CEntityFlags::ReadFailed, 0, url);
417 emit this->
dataRead(CEntityFlags::AircraftCategoryEntity, CEntityFlags::ReadParsing, 0, url);
419 if (res.isRestricted())
423 if (incrementalCategories.isEmpty()) {
return; }
432 categories = CAircraftCategoryList::fromDatabaseJson(res);
433 this->
logParseMessage(
"categories", categories.
size(),
static_cast<int>(time.elapsed()), res);
437 const int n = categories.
size();
439 if (n > 0 && latestTimestamp < 0)
441 CLogMessage(
this).
error(u
"No timestamp in category list, setting to last modified value");
445 m_categoryCache.
set(categories, latestTimestamp);
446 this->updateReaderUrl(this->
getBaseUrl(CDbFlags::DbReading));
452 bool overrideNewerOnly)
454 const QDir directory(dir);
455 if (!directory.exists()) {
return CStatusMessage(
this).
error(u
"Missing directory '%1'") << dir; }
459 whatToRead &= CEntityFlags::AllIcaoCountriesCategory;
460 CEntityFlags::Entity reallyRead = CEntityFlags::NoEntity;
461 if (whatToRead.testFlag(CEntityFlags::CountryEntity))
464 directory.absolutePath(), CDbInfo::entityToSharedName(CEntityFlags::CountryEntity));
465 const QFileInfo fi(fileName);
473 const QUrl url = QUrl::fromLocalFile(fi.absoluteFilePath());
475 if (countriesJson.isEmpty())
484 const int c = countries.
size();
485 msgs.
push_back(m_countryCache.
set(countries, fi.birthTime().toUTC().toMSecsSinceEpoch()));
486 reallyRead |= CEntityFlags::CountryEntity;
487 emit this->
dataRead(CEntityFlags::CountryEntity, CEntityFlags::ReadFinished, c, url);
491 emit this->
dataRead(CEntityFlags::CountryEntity, CEntityFlags::ReadFailed, 0, url);
493 ex,
this, QStringLiteral(
"Reading countries from '%1'").arg(fileName)));
499 if (whatToRead.testFlag(CEntityFlags::AircraftIcaoEntity))
502 directory.absolutePath(), CDbInfo::entityToSharedName(CEntityFlags::AircraftIcaoEntity));
503 const QFileInfo fi(fileName);
505 else if (!this->
overrideCacheFromFile(overrideNewerOnly, fi, CEntityFlags::AircraftIcaoEntity, msgs))
511 const QUrl url = QUrl::fromLocalFile(fi.absoluteFilePath());
513 if (aircraftJson.isEmpty())
522 CAircraftIcaoCodeList::fromMultipleJsonFormats(aircraftJson);
523 const int c = aircraftIcaos.
size();
525 m_aircraftIcaoCache.
set(aircraftIcaos, fi.birthTime().toUTC().toMSecsSinceEpoch()));
526 reallyRead |= CEntityFlags::AircraftIcaoEntity;
527 emit this->
dataRead(CEntityFlags::AircraftIcaoEntity, CEntityFlags::ReadFinished, c, url);
531 emit this->
dataRead(CEntityFlags::AircraftIcaoEntity, CEntityFlags::ReadFailed, 0, url);
533 ex,
this, QStringLiteral(
"Reading aircraft ICAOs from '%1'").arg(fileName)));
539 if (whatToRead.testFlag(CEntityFlags::AirlineIcaoEntity))
542 directory.absolutePath(), CDbInfo::entityToSharedName(CEntityFlags::AirlineIcaoEntity));
543 const QFileInfo fi(fileName);
551 const QUrl url = QUrl::fromLocalFile(fi.absoluteFilePath());
553 if (airlineJson.isEmpty())
562 CAirlineIcaoCodeList::fromMultipleJsonFormats(airlineJson);
563 const int c = airlineIcaos.
size();
565 m_airlineIcaoCache.
set(airlineIcaos, fi.birthTime().toUTC().toMSecsSinceEpoch()));
566 reallyRead |= CEntityFlags::AirlineIcaoEntity;
567 emit this->
dataRead(CEntityFlags::AirlineIcaoEntity, CEntityFlags::ReadFinished, c, url);
571 emit this->
dataRead(CEntityFlags::AirlineIcaoEntity, CEntityFlags::ReadFailed, 0, url);
573 ex,
this, QStringLiteral(
"Reading airline ICAOs from '%1'").arg(fileName)));
579 if (whatToRead.testFlag(CEntityFlags::AircraftCategoryEntity))
582 directory.absolutePath(), CDbInfo::entityToSharedName(CEntityFlags::AircraftCategoryEntity));
583 const QFileInfo fi(fileName);
585 else if (!this->
overrideCacheFromFile(overrideNewerOnly, fi, CEntityFlags::AircraftCategoryEntity, msgs))
591 const QUrl url = QUrl::fromLocalFile(fi.absoluteFilePath());
593 if (aircraftCategory.isEmpty())
602 CAircraftCategoryList::fromMultipleJsonFormats(aircraftCategory);
603 const int c = aircraftCategories.
size();
605 m_categoryCache.
set(aircraftCategories, fi.birthTime().toUTC().toMSecsSinceEpoch()));
606 reallyRead |= CEntityFlags::AircraftCategoryEntity;
607 emit this->
dataRead(CEntityFlags::AircraftCategoryEntity, CEntityFlags::ReadFinished, c, url);
611 emit this->
dataRead(CEntityFlags::AircraftCategoryEntity, CEntityFlags::ReadFailed, 0, url);
613 ex,
this, QStringLiteral(
"Reading categories from '%1'").arg(fileName)));
623 bool overrideNewerOnly)
625 if (dir.isEmpty() || whatToRead == CEntityFlags::NoEntity) {
return false; }
627 QPointer<CIcaoDataReader> myself(
this);
629 if (!myself) {
return; }
639 if (!directory.exists()) {
return false; }
640 QList<QPair<CEntityFlags::EntityFlag, QString>> fileContents;
643 const QString json(QJsonDocument(this->
getCountries().toJson()).toJson());
644 fileContents.push_back({ CEntityFlags::CountryEntity, json });
650 fileContents.push_back({ CEntityFlags::AircraftIcaoEntity, json });
656 fileContents.push_back({ CEntityFlags::AirlineIcaoEntity, json });
662 fileContents.push_back({ CEntityFlags::AircraftCategoryEntity, json });
665 for (
const auto &pair : fileContents)
678 return CEntityFlags::AllIcaoCountriesCategory;
683 if (entities.testFlag(CEntityFlags::AircraftIcaoEntity))
685 if (m_syncedAircraftIcaoCache) {
return; }
686 m_syncedAircraftIcaoCache =
true;
689 if (entities.testFlag(CEntityFlags::AirlineIcaoEntity))
691 if (m_syncedAirlineIcaoCache) {
return; }
692 m_syncedAirlineIcaoCache =
true;
695 if (entities.testFlag(CEntityFlags::CountryEntity))
697 if (m_syncedCountryCache) {
return; }
698 m_syncedCountryCache =
true;
701 if (entities.testFlag(CEntityFlags::AircraftCategoryEntity))
703 if (m_syncedCategories) {
return; }
704 m_syncedCategories =
true;
711 if (entities.testFlag(CEntityFlags::AircraftIcaoEntity)) { m_aircraftIcaoCache.
admit(); }
712 if (entities.testFlag(CEntityFlags::AirlineIcaoEntity)) { m_airlineIcaoCache.
admit(); }
713 if (entities.testFlag(CEntityFlags::CountryEntity)) { m_countryCache.
admit(); }
714 if (entities.testFlag(CEntityFlags::AircraftCategoryEntity)) { m_categoryCache.
admit(); }
719 if (entities.testFlag(CEntityFlags::AircraftIcaoEntity))
723 if (entities.testFlag(CEntityFlags::AirlineIcaoEntity))
727 if (entities.testFlag(CEntityFlags::CountryEntity))
731 if (entities.testFlag(CEntityFlags::AircraftCategoryEntity))
745 default:
return QDateTime();
753 case CEntityFlags::AircraftIcaoEntity:
return m_aircraftIcaoCache.
get().size();
754 case CEntityFlags::AirlineIcaoEntity:
return m_airlineIcaoCache.
get().size();
755 case CEntityFlags::CountryEntity:
return m_countryCache.
get().size();
756 case CEntityFlags::AircraftCategoryEntity:
return m_categoryCache.
get().size();
763 CEntityFlags::Entity entities = CEntityFlags::NoEntity;
764 if (this->
getCacheCount(CEntityFlags::AircraftIcaoEntity) > 0) entities |= CEntityFlags::AircraftIcaoEntity;
765 if (this->
getCacheCount(CEntityFlags::AirlineIcaoEntity) > 0) entities |= CEntityFlags::AirlineIcaoEntity;
766 if (this->
getCacheCount(CEntityFlags::CountryEntity) > 0) entities |= CEntityFlags::CountryEntity;
767 if (this->
getCacheCount(CEntityFlags::AircraftCategoryEntity) > 0)
768 entities |= CEntityFlags::AircraftCategoryEntity;
774 CEntityFlags::Entity entities = CEntityFlags::NoEntity;
776 entities |= CEntityFlags::AircraftIcaoEntity;
778 entities |= CEntityFlags::AirlineIcaoEntity;
780 entities |= CEntityFlags::CountryEntity;
782 entities |= CEntityFlags::CountryEntity;
789 oldUrlInfo = m_readerUrlCache.
get();
790 newUrlInfo = this->
getBaseUrl(CDbFlags::DbReading);
SWIFT_CORE_EXPORT swift::core::CApplication * sApp
Single instance of application object.
data::CGlobalSetup getGlobalSetup() const
Global setup.
static void logInconsistentData(const swift::misc::CStatusMessage &msg, const char *funcInfo=nullptr)
Use this to log inconsistent data.
void threadAssertCheck() const
Make sure everthing runs correctly in own thread.
QNetworkReply * getFromNetworkAndLog(const swift::misc::network::CUrl &url, const swift::misc::CSlot< void(QNetworkReply *)> &callback)
Get request from network, and log with m_urlReadLog.
bool doWorkCheck() const
Still enabled etc.?
qint64 lastModifiedMsSinceEpoch(QNetworkReply *nwReply) const
When was reply last modified, -1 if N/A.
swift::misc::network::CUrl getDbIcaoReaderUrl() const
ICAO reader URL.
Value object encapsulating a list of reader configs.
Specialized version of threaded reader for DB data.
void emitAndLogDataRead(swift::misc::network::CEntityFlags::Entity entity, int number, const JsonDatastoreResponse &res)
Emit signal and log when data have been read.
static QString queryLatestTimestamp(const QDateTime &ts)
Latest timestamp query for DB.
virtual void cacheHasChanged(swift::misc::network::CEntityFlags::Entity entities)
Cache for given entity has changed.
void logNoWorkingUrl(swift::misc::network::CEntityFlags::Entity entity)
Log if no working URL exists, using m_noWorkingUrlSeverity.
bool overrideCacheFromFile(bool overrideNewerOnly, const QFileInfo &fileInfo, swift::misc::network::CEntityFlags::Entity entity, swift::misc::CStatusMessageList &msgs) const
Override cache from file.
swift::misc::network::CUrl getBaseUrl(swift::misc::db::CDbFlags::DataRetrievalModeFlag mode) const
Base URL for mode (either a shared or DB URL)
void dataRead(swift::misc::network::CEntityFlags::Entity entities, swift::misc::network::CEntityFlags::ReadState state, int number, const QUrl &url)
Combined read signal.
static bool isChangedUrl(const swift::misc::network::CUrl &oldUrl, const swift::misc::network::CUrl ¤tUrl)
Has URL been changed? Means we load from a different server.
static QString fileNameForMode(swift::misc::network::CEntityFlags::Entity entity, swift::misc::db::CDbFlags::DataRetrievalModeFlag mode)
File name for given mode, either php service or shared file name.
CDatabaseReader::JsonDatastoreResponse setStatusAndTransformReplyIntoDatastoreResponse(QNetworkReply *nwReply)
Check if terminated or error, otherwise split into array of objects.
void logParseMessage(const QString &entity, int size, int msElapsed, const JsonDatastoreResponse &response) const
Parsing info message.
bool hasCacheTimestampNewerThan(swift::misc::network::CEntityFlags::Entity entity, const QDateTime &threshold) const
Has entity a valid and newer timestamp.
static QJsonObject readQJsonObjectFromDatabaseFile(const QString &filename)
QJsonObject from database JSON file (normally shared file)
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.
virtual void read(swift::misc::network::CEntityFlags::Entity entities, swift::misc::db::CDbFlags::DataRetrievalModeFlag mode, const QDateTime &newerThan)
Read / re-read data file.
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.
bool writeToJsonFiles(const QString &dir)
Write to static DB data file.
int getAircraftCategoryCount() const
Get aircraft category count.
virtual int getCacheCount(swift::misc::network::CEntityFlags::Entity entity) const
Cache`s number of entities.
swift::misc::aviation::CAircraftIcaoCodeList getAircraftIcaoCodes() const
Get aircraft ICAO information.
virtual swift::misc::network::CEntityFlags::Entity getEntitiesWithCacheCount() const
Entities already having data in cache.
virtual QDateTime getCacheTimestamp(swift::misc::network::CEntityFlags::Entity entity) const
Get cache timestamp.
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.
swift::misc::aviation::CAircraftIcaoCodeList getAircraftIcaoCodesForIataCode(const QString &iataCode) const
Get aircraft ICAO information for IATA code.
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 bool hasChangedUrl(swift::misc::network::CEntityFlags::Entity entity, swift::misc::network::CUrl &oldUrlInfo, swift::misc::network::CUrl &newUrlInfo) const
Changed URL, means the cache values have been read from elsewhere.
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)
bool areAllDataRead() const
All data read?
swift::misc::CCountryList getCountries() const
Get countries.
virtual void invalidateCaches(swift::misc::network::CEntityFlags::Entity entities)
Invalidate the caches for given entities.
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::CAirlineIcaoCodeList getAirlineIcaoCodesForIataCode(const QString &iataCode) const
Find by IATA code Not unique because of virtual airlines and ceased airlines.
virtual swift::misc::network::CUrl getDbServiceBaseUrl() const
Get the service URL, individual for each reader.
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.
const QString & getKey() const
Get the key string of this value.
T get() const
Get a copy of the current value.
Value object encapsulating a list of countries.
static CCountryList fromDatabaseJson(const QJsonArray &array)
From our database JSON format.
CCountry findBestMatchByCountryName(const QString &candidate) const
Find "best match" by country.
CCountry findByIsoCode(const QString &isoCode) const
Find by ISO code.
static CDataCache * instance()
Return the singleton instance.
CStatusMessage set(const typename Trait::type &value, qint64 timestamp=0)
Write a new value. Must be called from the thread in which the owner lives.
void admit()
If the value is load-deferred, trigger the deferred load (async).
QDateTime getAvailableTimestamp() const
Get the timestamp of the value, or of the deferred value that is available to be loaded.
void synchronize()
If the value is currently being loaded, wait for it to finish loading, and call the notification slot...
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.
Thrown when a convertFromJson method encounters an unrecoverable error in JSON data.
Class for emitting a log message.
static void preformatted(const CStatusMessage &statusMessage)
Sends a verbatim, preformatted message to the log.
Derived & error(const char16_t(&format)[N])
Set the severity to error, 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.
static CStatusMessage fromJsonException(const CJsonException &ex, const CLogCategoryList &categories, const QString &prefix)
Object from JSON exception message.
constexpr static auto SeverityInfo
Status severities.
bool isFailure() const
Operation considered unsuccessful.
Status messages, e.g. from Core -> GUI.
bool isFailure() const
Any message is marked as failure.
void clearAllValues(const QString &keyPrefix={})
Clear all values from the cache.
static CWorker * fromTask(QObject *owner, const QString &name, F &&task)
Returns a new worker object which lives in a new thread.
qint64 latestTimestampMsecsSinceEpoch() const
Latest timestamp.
Value object encapsulating a list of ICAO codes.
Value object for ICAO classification.
Value object encapsulating a list of ICAO codes.
CAircraftIcaoCodeList findByDesignator(const QString &designator, int fuzzySearch=-1) const
Find by designator.
CAircraftIcaoCode findFirstByDesignatorAndRank(const QString &designator) const
Find by designator, then best match by rank.
bool containsDesignator(const QString &designator) const
Contains designator?
CAircraftIcaoCode smartAircraftIcaoSelector(const CAircraftIcaoCode &icaoPattern) const
Best selection by given pattern, also searches IATA and family information.
CAircraftIcaoCodeList findByIataCode(const QString &iata, int fuzzySearch=-1) const
Find by IATA code.
Value object for ICAO classification.
Value object encapsulating a list of ICAO codes.
CAirlineIcaoCode findByUniqueIataCodeOrDefault(const QString &iata) const
Find by IATA code if this is unique, otherwise return default object.
bool containsVDesignator(const QString &vDesignator) const
Contains given designator?
CAirlineIcaoCodeList findByIataCode(const QString &iata) const
Find by IATA code Not unique because of virtual airlines and ceased airlines.
CAirlineIcaoCode findByUniqueVDesignatorOrDefault(const QString &designator, bool preferOperatingAirlines) const
Find by ICAO code if this is unique, otherwise return default object.
CAirlineIcaoCode smartAirlineIcaoSelector(const CAirlineIcaoCode &icaoPattern, const CCallsign &callsign) const
Best selection by given pattern.
CAirlineIcaoCodeList findByVDesignator(const QString &designator) const
Find by v-designator, this should be unique.
Value object encapsulating information of a callsign.
DataRetrievalModeFlag
Which data to read, requires corresponding readers.
int replaceOrAddObjectsByKey(const CONTAINER &container)
Update or insert data (based on DB key)
OBJ findByKey(KEYTYPE key, const OBJ ¬Found=OBJ()) const
Object with key, notFound otherwise.
QString dbKeysAsString(const QString &separator) const
The DB keys as string.
static CCountryList fromMultipleJsonFormats(const QJsonObject &jsonObject)
From multiple JSON formats.
Value object encapsulating information of a location, kind of simplified CValueObject compliant versi...
bool isEmpty() const
Empty.
CUrl withAppendedPath(const QString &path) const
Append path.
void appendQuery(const QString &queryToAppend)
Append query.
Core data traits (aka cached values) and classes.
Classes interacting with the swift database (aka "datastore").
Free functions in swift::misc.
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...