diff --git a/src/blackcore/databasereader.cpp b/src/blackcore/databasereader.cpp index 232ca9ca8..3cc226bd6 100644 --- a/src/blackcore/databasereader.cpp +++ b/src/blackcore/databasereader.cpp @@ -24,11 +24,14 @@ namespace BlackCore connect(&m_watchdogTimer, &QTimer::timeout, this, &CDatabaseReader::ps_watchdog); } - void CDatabaseReader::readInBackgroundThread(CEntityFlags::Entity entities) + void CDatabaseReader::readInBackgroundThread(CEntityFlags::Entity entities, const QDateTime &newerThan) { if (isAbandoned()) { return; } this->m_watchdogTimer.stop(); - bool s = QMetaObject::invokeMethod(this, "ps_read", Q_ARG(BlackMisc::Network::CEntityFlags::Entity, entities)); + // ps_read is implemented in the derived classes + bool s = QMetaObject::invokeMethod(this, "ps_read", + Q_ARG(BlackMisc::Network::CEntityFlags::Entity, entities), + Q_ARG(QDateTime, newerThan)); Q_ASSERT_X(s, Q_FUNC_INFO, "Invoke failed"); Q_UNUSED(s); } @@ -63,6 +66,7 @@ namespace BlackCore datastoreResponse.jsonArray = responseObject["data"].toArray(); QString ts(responseObject["latest"].toString()); datastoreResponse.updated = ts.isEmpty() ? QDateTime::currentDateTimeUtc() : CDatastoreUtility::parseTimestamp(ts); + datastoreResponse.restricted = responseObject["restricted"].toBool(); } return datastoreResponse; } diff --git a/src/blackcore/databasereader.h b/src/blackcore/databasereader.h index befcbf2cf..f33ad189f 100644 --- a/src/blackcore/databasereader.h +++ b/src/blackcore/databasereader.h @@ -20,7 +20,6 @@ #include #include - namespace BlackCore { //! Specialized version of threaded reader for DB data @@ -32,8 +31,9 @@ namespace BlackCore //! Response from our database struct JsonDatastoreResponse { - QJsonArray jsonArray; //!< JSON array data - QDateTime updated; //!< when updated + QJsonArray jsonArray; //!< JSON array data + QDateTime updated; //!< when was the latest updated? + bool restricted = false; //!< restricted reponse, only data changed //! Any data? bool isEmpty() const { return jsonArray.isEmpty(); } @@ -50,12 +50,15 @@ namespace BlackCore //! Is response newer? bool isNewer(qint64 mSecsSinceEpoch) const { return updated.toMSecsSinceEpoch() > mSecsSinceEpoch; } + //! Incremental data + bool isRestricted() const { return restricted; } + //! Implicit conversion operator QJsonArray() const { return jsonArray; } }; //! Start reading in own thread - void readInBackgroundThread(BlackMisc::Network::CEntityFlags::Entity entities); + void readInBackgroundThread(BlackMisc::Network::CEntityFlags::Entity entities, const QDateTime &newerThan); //! Can connect to DB //! \threadsafe @@ -69,7 +72,7 @@ namespace BlackCore protected: BlackMisc::Network::CUrl m_watchdogUrl; //!< URL for checking if alive QTimer m_watchdogTimer { this }; //!< Timer for watchdog (DB available?) - QString m_watchdogMessage; //!< Returned status message + QString m_watchdogMessage; //!< Returned status message from watchdog bool m_canConnect = false; //!< Successful connection? mutable QReadWriteLock m_watchdogLock; //!< Lock diff --git a/src/blackcore/icaodatareader.cpp b/src/blackcore/icaodatareader.cpp index 81a6cd915..64dd29071 100644 --- a/src/blackcore/icaodatareader.cpp +++ b/src/blackcore/icaodatareader.cpp @@ -129,7 +129,7 @@ namespace BlackCore return m_countries.size(); } - void CIcaoDataReader::ps_read(BlackMisc::Network::CEntityFlags::Entity entities) + void CIcaoDataReader::ps_read(BlackMisc::Network::CEntityFlags::Entity entities, const QDateTime &newerThan) { this->threadAssertCheck(); // runs in background thread Q_ASSERT(this->m_networkManagerAircraft); @@ -139,9 +139,10 @@ namespace BlackCore CEntityFlags::Entity entitiesTriggered = CEntityFlags::NoEntity; if (entities.testFlag(CEntityFlags::AircraftIcaoEntity)) { - QUrl url(getAircraftIcaoUrl()); + CUrl url(getAircraftIcaoUrl()); if (!url.isEmpty()) { + if (!newerThan.isNull()) { url.appendQuery("newer=" + newerThan.toString(Qt::ISODate)); } QNetworkRequest requestAircraft(CNetworkUtils::getNetworkRequest(url)); this->m_networkManagerAircraft->get(requestAircraft); entitiesTriggered |= CEntityFlags::AircraftIcaoEntity; @@ -154,9 +155,10 @@ namespace BlackCore if (entities.testFlag(CEntityFlags::AirlineIcaoEntity)) { - QUrl url(getAirlineIcaoUrl()); + CUrl url(getAirlineIcaoUrl()); if (!url.isEmpty()) { + if (!newerThan.isNull()) { url.appendQuery("newer=" + newerThan.toString(Qt::ISODate)); } QNetworkRequest requestAirline(CNetworkUtils::getNetworkRequest(url)); this->m_networkManagerAirlines->get(requestAirline); entitiesTriggered |= CEntityFlags::AirlineIcaoEntity; @@ -169,9 +171,10 @@ namespace BlackCore if (entities.testFlag(CEntityFlags::CountryEntity)) { - QUrl url(getCountryUrl()); + CUrl url(getCountryUrl()); if (!url.isEmpty()) { + if (!newerThan.isNull()) { url.appendQuery("newer=" + newerThan.toString(Qt::ISODate)); } QNetworkRequest requestCountry(CNetworkUtils::getNetworkRequest(url)); this->m_networkManagerCountries->get(requestCountry); entitiesTriggered |= CEntityFlags::CountryEntity; diff --git a/src/blackcore/icaodatareader.h b/src/blackcore/icaodatareader.h index 1a2b94a05..e172a7f4d 100644 --- a/src/blackcore/icaodatareader.h +++ b/src/blackcore/icaodatareader.h @@ -120,7 +120,7 @@ namespace BlackCore void ps_parseCountryData(QNetworkReply *nwReply); //! Read / re-read data file - void ps_read(BlackMisc::Network::CEntityFlags::Entity entities); + void ps_read(BlackMisc::Network::CEntityFlags::Entity entities, const QDateTime &newerThan); private: QNetworkAccessManager *m_networkManagerAircraft = nullptr; diff --git a/src/blackcore/modeldatareader.cpp b/src/blackcore/modeldatareader.cpp index 3a2e8726f..62e538236 100644 --- a/src/blackcore/modeldatareader.cpp +++ b/src/blackcore/modeldatareader.cpp @@ -126,6 +126,18 @@ namespace BlackCore return m_models.size(); } + QList CModelDataReader::getModelDbKeys() const + { + QReadLocker l(&m_lockModels); + return m_models.toDbKeyList(); + } + + QStringList CModelDataReader::getModelStrings() const + { + QReadLocker l(&m_lockModels); + return m_models.getModelStrings(false); + } + bool CModelDataReader::areAllDataRead() const { return @@ -134,7 +146,7 @@ namespace BlackCore getDistributorsCount() > 0; } - void CModelDataReader::ps_read(CEntityFlags::Entity entity) + void CModelDataReader::ps_read(CEntityFlags::Entity entity, const QDateTime &newerThan) { this->threadAssertCheck(); Q_ASSERT(this->m_networkManagerLivery); @@ -147,6 +159,11 @@ namespace BlackCore CUrl url(getLiveryUrl()); if (!url.isEmpty()) { + if (!newerThan.isNull()) + { + const QString tss(newerThan.toString(Qt::ISODate)); + url.appendQuery("newer=" + tss); + } QNetworkRequest requestLivery(url); CNetworkUtils::ignoreSslVerification(requestLivery); this->m_networkManagerLivery->get(requestLivery); @@ -163,6 +180,11 @@ namespace BlackCore CUrl url(getDistributorUrl()); if (!url.isEmpty()) { + if (!newerThan.isNull()) + { + const QString tss(newerThan.toString(Qt::ISODate)); + url.appendQuery("newer=" + tss); + } QNetworkRequest requestDistributor(url); CNetworkUtils::ignoreSslVerification(requestDistributor); this->m_networkManagerDistributor->get(requestDistributor); @@ -179,6 +201,11 @@ namespace BlackCore CUrl url(getModelUrl()); if (!url.isEmpty()) { + if (!newerThan.isNull()) + { + const QString tss(newerThan.toString(Qt::ISODate)); + url.appendQuery("newer=" + tss); + } QNetworkRequest requestModel(url); CNetworkUtils::ignoreSslVerification(requestModel); this->m_networkManagerModel->get(requestModel); @@ -202,13 +229,25 @@ namespace BlackCore // required to use delete later as object is created in a different thread QScopedPointer nwReply(nwReplyPtr); QString urlString(nwReply->url().toString()); - QJsonArray array = this->setStatusAndTransformReplyIntoDatastoreResponse(nwReply.data()); - if (array.isEmpty()) + CDatabaseReader::JsonDatastoreResponse res = this->setStatusAndTransformReplyIntoDatastoreResponse(nwReply.data()); + if (res.isEmpty()) { emit dataRead(CEntityFlags::LiveryEntity, CEntityFlags::ReadFailed, 0); return; } - CLiveryList liveries = CLiveryList::fromDatabaseJson(array); + + // get all or incremental set of distributor + CLiveryList liveries; + if (res.isRestricted()) + { + // create full list if it was just incremental + liveries = this->getLiveries(); + liveries.replaceOrAddObjectsByKey(CLiveryList::fromDatabaseJson(res)); + } + else + { + liveries = CLiveryList::fromDatabaseJson(res); + } // this part needs to be synchronized int n = liveries.size(); @@ -216,8 +255,10 @@ namespace BlackCore QWriteLocker wl(&this->m_lockLivery); this->m_liveries = liveries; } + // never emit when lock is held -> deadlock - emit dataRead(CEntityFlags::LiveryEntity, CEntityFlags::ReadFinished, n); + emit dataRead(CEntityFlags::LiveryEntity, + res.isRestricted() ? CEntityFlags::ReadFinishedRestricted : CEntityFlags::ReadFinished, n); CLogMessage(this).info("Read %1 %2 from %3") << n << CEntityFlags::flagToString(CEntityFlags::LiveryEntity) << urlString; } @@ -225,13 +266,25 @@ namespace BlackCore { QScopedPointer nwReply(nwReplyPtr); QString urlString(nwReply->url().toString()); - QJsonArray array = this->setStatusAndTransformReplyIntoDatastoreResponse(nwReply.data()); - if (array.isEmpty()) + CDatabaseReader::JsonDatastoreResponse res = this->setStatusAndTransformReplyIntoDatastoreResponse(nwReply.data()); + if (res.isEmpty()) { emit dataRead(CEntityFlags::DistributorEntity, CEntityFlags::ReadFailed, 0); return; } - CDistributorList distributors = CDistributorList::fromDatabaseJson(array); + + // get all or incremental set of distributor + CDistributorList distributors; + if (res.isRestricted()) + { + // create full list if it was just incremental + distributors = this->getDistributors(); + distributors.replaceOrAddObjectsByKey(CDistributorList::fromDatabaseJson(res)); + } + else + { + distributors = CDistributorList::fromDatabaseJson(res); + } // this part needs to be synchronized int n = distributors.size(); @@ -239,7 +292,8 @@ namespace BlackCore QWriteLocker wl(&this->m_lockDistributor); this->m_distributors = distributors; } - emit dataRead(CEntityFlags::DistributorEntity, CEntityFlags::ReadFinished, n); + emit dataRead(CEntityFlags::DistributorEntity, + res.isRestricted() ? CEntityFlags::ReadFinishedRestricted : CEntityFlags::ReadFinished, n); CLogMessage(this).info("Read %1 %2 from %3") << n << CEntityFlags::flagToString(CEntityFlags::DistributorEntity) << urlString; } @@ -247,21 +301,35 @@ namespace BlackCore { QScopedPointer nwReply(nwReplyPtr); QString urlString(nwReply->url().toString()); - QJsonArray array = this->setStatusAndTransformReplyIntoDatastoreResponse(nwReply.data()); - if (array.isEmpty()) + CDatabaseReader::JsonDatastoreResponse res = this->setStatusAndTransformReplyIntoDatastoreResponse(nwReply.data()); + if (res.isEmpty()) { emit dataRead(CEntityFlags::ModelEntity, CEntityFlags::ReadFailed, 0); return; } - CAircraftModelList models = CAircraftModelList::fromDatabaseJson(array); - // this part needs to be synchronized + // get all or incremental set of models + CAircraftModelList models; + if (res.isRestricted()) + { + // create full list if it was just incremental + models = this->getModels(); + models.replaceOrAddObjectsByKey(CAircraftModelList::fromDatabaseJson(res)); + } + else + { + models = CAircraftModelList::fromDatabaseJson(res); + } + + // syncronized update int n = models.size(); { QWriteLocker wl(&this->m_lockModels); this->m_models = models; } - emit dataRead(CEntityFlags::ModelEntity, CEntityFlags::ReadFinished, n); + + emit dataRead(CEntityFlags::ModelEntity, + res.isRestricted() ? CEntityFlags::ReadFinishedRestricted : CEntityFlags::ReadFinished, n); CLogMessage(this).info("Read %1 %2 from %3") << n << CEntityFlags::flagToString(CEntityFlags::ModelEntity) << urlString; } diff --git a/src/blackcore/modeldatareader.h b/src/blackcore/modeldatareader.h index a5dbc0676..e500c22e5 100644 --- a/src/blackcore/modeldatareader.h +++ b/src/blackcore/modeldatareader.h @@ -88,6 +88,14 @@ namespace BlackCore //! \threadsafe int getModelsCount() const; + //! Get model keys + //! \threadsafe + QList getModelDbKeys() const; + + //! Get model keys + //! \threadsafe + QStringList getModelStrings() const; + //! All data read? //! \threadsafe bool areAllDataRead() const; @@ -116,7 +124,7 @@ namespace BlackCore void ps_parseModelData(QNetworkReply *nwReply); //! Read / re-read data file - void ps_read(BlackMisc::Network::CEntityFlags::Entity entity = BlackMisc::Network::CEntityFlags::DistributorLiveryModel); + void ps_read(BlackMisc::Network::CEntityFlags::Entity entity = BlackMisc::Network::CEntityFlags::DistributorLiveryModel, const QDateTime &newerThan = QDateTime()); private: QNetworkAccessManager *m_networkManagerLivery = nullptr; diff --git a/src/blackcore/webdataservices.cpp b/src/blackcore/webdataservices.cpp index 080714877..bedead8d7 100644 --- a/src/blackcore/webdataservices.cpp +++ b/src/blackcore/webdataservices.cpp @@ -177,7 +177,7 @@ namespace BlackCore return false; } - CEntityFlags::Entity CWebDataServices::triggerRead(CEntityFlags::Entity whatToRead) + CEntityFlags::Entity CWebDataServices::triggerRead(CEntityFlags::Entity whatToRead, const QDateTime &newerThan) { m_initialRead = true; CEntityFlags::Entity triggeredRead = CEntityFlags::NoEntity; @@ -213,7 +213,7 @@ namespace BlackCore if (whatToRead.testFlag(CEntityFlags::AircraftIcaoEntity) || whatToRead.testFlag(CEntityFlags::AirlineIcaoEntity) || whatToRead.testFlag(CEntityFlags::CountryEntity)) { CEntityFlags::Entity icaoEntities = whatToRead & CEntityFlags::AllIcaoAndCountries; - m_icaoDataReader->readInBackgroundThread(icaoEntities); + m_icaoDataReader->readInBackgroundThread(icaoEntities, newerThan); triggeredRead |= icaoEntities; } } @@ -223,7 +223,7 @@ namespace BlackCore if (whatToRead.testFlag(CEntityFlags::LiveryEntity) || whatToRead.testFlag(CEntityFlags::DistributorEntity) || whatToRead.testFlag(CEntityFlags::ModelEntity)) { CEntityFlags::Entity modelEntities = whatToRead & CEntityFlags::DistributorLiveryModel; - m_modelDataReader->readInBackgroundThread(modelEntities); + m_modelDataReader->readInBackgroundThread(modelEntities, newerThan); triggeredRead |= modelEntities; } } @@ -296,6 +296,18 @@ namespace BlackCore return 0; } + QList CWebDataServices::getModelDbKeys() const + { + if (m_modelDataReader) { return m_modelDataReader->getModelDbKeys(); } + return QList(); + } + + QStringList CWebDataServices::getModelStrings() const + { + if (m_modelDataReader) { return m_modelDataReader->getModelStrings(); } + return QStringList(); + } + CAircraftModelList CWebDataServices::getModelsForAircraftDesignatorAndLiveryCombinedCode(const QString &aircraftDesignator, const QString &combinedCode) const { if (m_modelDataReader) { return m_modelDataReader->getModelsForAircraftDesignatorAndLiveryCombinedCode(aircraftDesignator, combinedCode); } diff --git a/src/blackcore/webdataservices.h b/src/blackcore/webdataservices.h index 01a1af0c0..8345271ce 100644 --- a/src/blackcore/webdataservices.h +++ b/src/blackcore/webdataservices.h @@ -91,7 +91,7 @@ namespace BlackCore //! \copydoc BlackMisc::Network::IWebDataServicesProvider::triggerRead //! \ingroup webdatareaderprovider - virtual BlackMisc::Network::CEntityFlags::Entity triggerRead(BlackMisc::Network::CEntityFlags::Entity whatToRead) override; + virtual BlackMisc::Network::CEntityFlags::Entity triggerRead(BlackMisc::Network::CEntityFlags::Entity whatToRead, const QDateTime &newerThan = QDateTime()) override; //! \copydoc BlackMisc::Network::IWebDataServicesProvider::getVatsimFsdServers //! \ingroup webdatareaderprovider @@ -145,6 +145,14 @@ namespace BlackCore //! \ingroup webdatareaderprovider virtual int getModelsCount() const override; + //! \copydoc BlackMisc::Network::IWebDataServicesProvider::getModelDbKeys + //! \ingroup webdatareaderprovider + virtual QList getModelDbKeys() const override; + + //! \copydoc BlackMisc::Network::IWebDataServicesProvider::getModelStrings + //! \ingroup webdatareaderprovider + virtual QStringList getModelStrings() const override; + //! \copydoc BlackMisc::Network::IWebDataServicesProvider::getModelsForAircraftDesignatorAndLiveryCombinedCode //! \ingroup webdatareaderprovider virtual BlackMisc::Simulation::CAircraftModelList getModelsForAircraftDesignatorAndLiveryCombinedCode(const QString &aircraftDesignator, const QString &combinedCode) const override; diff --git a/src/blackgui/components/dbmodelcomponent.cpp b/src/blackgui/components/dbmodelcomponent.cpp index 8ae39b78c..6847e99b2 100644 --- a/src/blackgui/components/dbmodelcomponent.cpp +++ b/src/blackgui/components/dbmodelcomponent.cpp @@ -60,9 +60,12 @@ namespace BlackGui void CDbModelComponent::ps_modelsRead(CEntityFlags::Entity entity, CEntityFlags::ReadState readState, int count) { Q_UNUSED(count); - if (entity.testFlag(CEntityFlags::ModelEntity) && readState == CEntityFlags::ReadFinished) + if (entity.testFlag(CEntityFlags::ModelEntity)) { - this->ui->tvp_AircraftModel->updateContainer(this->getModels()); + if (readState == CEntityFlags::ReadFinished || readState == CEntityFlags::ReadFinishedRestricted) + { + this->ui->tvp_AircraftModel->updateContainer(this->getModels()); + } } } diff --git a/src/blackmisc/network/entityflags.cpp b/src/blackmisc/network/entityflags.cpp index f11a2bbac..1bf7a40fd 100644 --- a/src/blackmisc/network/entityflags.cpp +++ b/src/blackmisc/network/entityflags.cpp @@ -11,6 +11,7 @@ #include "blackmisc/dbus.h" #include #include +#include "blackmisc/verify.h" namespace BlackMisc { @@ -33,7 +34,7 @@ namespace BlackMisc case AllIcaoAndCountries: return "All ICAO + country"; case AllEntities: return "All"; default: - Q_ASSERT_X(false, Q_FUNC_INFO, "wrong flags"); + BLACK_VERIFY_X(false, Q_FUNC_INFO, "wrong flags"); return "wrong flags"; } } @@ -58,10 +59,11 @@ namespace BlackMisc switch (flag) { case ReadFinished: return "finished"; + case ReadFinishedRestricted: return "finished (restricted)"; case ReadFailed: return "failed"; case StartRead: return "read started"; default: - Q_ASSERT_X(false, Q_FUNC_INFO, "wrong flags"); + BLACK_VERIFY_X(false, Q_FUNC_INFO, "wrong flags"); return "wrong flags"; } } @@ -71,18 +73,22 @@ namespace BlackMisc switch (state) { case ReadFinished: + case ReadFinishedRestricted: case StartRead: - default: return CStatusMessage::SeverityInfo; case ReadFailed: return CStatusMessage::SeverityWarning; + default: + Q_ASSERT_X(false, Q_FUNC_INFO, "Missing state"); + return CStatusMessage::SeverityInfo; } } bool CEntityFlags::isWarningOrAbove(CEntityFlags::ReadState state) { CStatusMessage::StatusSeverity s = flagToSeverity(state); - switch (s) { + switch (s) + { case CStatusMessage::SeverityError: case CStatusMessage::SeverityWarning: return true; diff --git a/src/blackmisc/network/entityflags.h b/src/blackmisc/network/entityflags.h index f7d014e91..1045ce6b0 100644 --- a/src/blackmisc/network/entityflags.h +++ b/src/blackmisc/network/entityflags.h @@ -49,9 +49,10 @@ namespace BlackMisc //! State of operation enum ReadState { - StartRead, ///< reading has been started - ReadFinished, ///< reading done - ReadFailed ///< reading failed + StartRead, ///< reading has been started + ReadFinished, ///< reading done + ReadFinishedRestricted, ///< finished a timestamp restricted read + ReadFailed ///< reading failed }; //! Convert to string diff --git a/src/blackmisc/network/webdataservicesprovider.cpp b/src/blackmisc/network/webdataservicesprovider.cpp index f2df65492..1b73ae68f 100644 --- a/src/blackmisc/network/webdataservicesprovider.cpp +++ b/src/blackmisc/network/webdataservicesprovider.cpp @@ -129,6 +129,20 @@ namespace BlackMisc return this->m_webDataReaderProvider->getModelsCount(); } + QList CWebDataServicesAware::getModelDbKeys() const + { + Q_ASSERT_X(this->m_webDataReaderProvider, Q_FUNC_INFO, "Missing provider"); + if (!hasProvider()) { return QList(); } + return this->m_webDataReaderProvider->getModelDbKeys(); + } + + QStringList CWebDataServicesAware::getModelStrings() const + { + Q_ASSERT_X(this->m_webDataReaderProvider, Q_FUNC_INFO, "Missing provider"); + if (!hasProvider()) { return QStringList(); } + return this->m_webDataReaderProvider->getModelStrings(); + } + CAircraftModel CWebDataServicesAware::getModelForModelString(const QString &modelString) const { Q_ASSERT_X(this->m_webDataReaderProvider, Q_FUNC_INFO, "Missing provider"); @@ -306,11 +320,11 @@ namespace BlackMisc } } - CEntityFlags::Entity CWebDataServicesAware::triggerRead(CEntityFlags::Entity whatToRead) + CEntityFlags::Entity CWebDataServicesAware::triggerRead(CEntityFlags::Entity whatToRead, const QDateTime &newerThan) { Q_ASSERT_X(this->m_webDataReaderProvider, Q_FUNC_INFO, "Missing provider"); if (!hasProvider()) { return CEntityFlags::NoEntity; } - return this->m_webDataReaderProvider->triggerRead(whatToRead); + return this->m_webDataReaderProvider->triggerRead(whatToRead, newerThan); } bool CWebDataServicesAware::canConnectSwiftDb() const diff --git a/src/blackmisc/network/webdataservicesprovider.h b/src/blackmisc/network/webdataservicesprovider.h index 996d09031..50bb1f457 100644 --- a/src/blackmisc/network/webdataservicesprovider.h +++ b/src/blackmisc/network/webdataservicesprovider.h @@ -112,6 +112,14 @@ namespace BlackMisc //! \threadsafe virtual int getModelsCount() const = 0; + //! Model keys + //! \threadsafe + virtual QList getModelDbKeys() const = 0; + + //! Model strings + //! \threadsafe + virtual QStringList getModelStrings() const = 0; + //! Models for combined code and aircraft designator //! \threadsafe virtual BlackMisc::Simulation::CAircraftModelList getModelsForAircraftDesignatorAndLiveryCombinedCode(const QString &aircraftDesignator, const QString &combinedCode) const = 0; @@ -204,7 +212,7 @@ namespace BlackMisc std::function dataPublished) = 0; //! Trigger read of new data - virtual BlackMisc::Network::CEntityFlags::Entity triggerRead(BlackMisc::Network::CEntityFlags::Entity whatToRead) = 0; + virtual BlackMisc::Network::CEntityFlags::Entity triggerRead(BlackMisc::Network::CEntityFlags::Entity whatToRead, const QDateTime &dateTime = QDateTime()) = 0; //! Can connect to swift DB? virtual bool canConnectSwiftDb() const = 0; @@ -276,6 +284,12 @@ namespace BlackMisc //! \copydoc IWebDataServicesProvider::getModelsCount int getModelsCount() const; + //! \copydoc IWebDataServicesProvider::getModelDbKeys + QList getModelDbKeys() const; + + //! \copydoc IWebDataServicesProvider::getModelStrings + QStringList getModelStrings() const; + //! \copydoc IWebDataServicesProvider::getModelsForAircraftDesignatorAndLiveryCombinedCode BlackMisc::Simulation::CAircraftModelList getModelsForAircraftDesignatorAndLiveryCombinedCode(const QString &aircraftDesignator, const QString &combinedCode) const; @@ -353,7 +367,7 @@ namespace BlackMisc std::function dataPublished); //! \copydoc IWebDataServicesProvider::triggerRead - BlackMisc::Network::CEntityFlags::Entity triggerRead(BlackMisc::Network::CEntityFlags::Entity whatToRead); + BlackMisc::Network::CEntityFlags::Entity triggerRead(BlackMisc::Network::CEntityFlags::Entity whatToRead, const QDateTime &newerThan); //! \copydoc IWebDataServicesProvider::canConnectSwiftDb bool canConnectSwiftDb() const; diff --git a/tests/blackcore/testreaders.cpp b/tests/blackcore/testreaders.cpp index 388a01ae2..e5d8a052f 100644 --- a/tests/blackcore/testreaders.cpp +++ b/tests/blackcore/testreaders.cpp @@ -36,7 +36,7 @@ namespace BlackCoreTest m_icaoReader.start(); Expect e(&this->m_icaoReader); EXPECT_UNIT(e) - .send(&CIcaoDataReader::readInBackgroundThread, CEntityFlags::AllIcaoEntities) + .send(&CIcaoDataReader::readInBackgroundThread, CEntityFlags::AllIcaoEntities, QDateTime()) .expect(&CIcaoDataReader::dataRead, [url]() { qDebug() << "Read ICAO data from" << url.getFullUrl(); @@ -59,7 +59,7 @@ namespace BlackCoreTest m_modelReader.start(); Expect e(&this->m_modelReader); EXPECT_UNIT(e) - .send(&CModelDataReader::readInBackgroundThread, CEntityFlags::AllIcaoEntities) + .send(&CModelDataReader::readInBackgroundThread, CEntityFlags::DistributorLiveryModel, QDateTime()) .expect(&CModelDataReader::dataRead, [url]() { qDebug() << "Read model data " << url;