diff --git a/src/blackcore/contextnetworkimpl.cpp b/src/blackcore/contextnetworkimpl.cpp index 3e46520df..b980597c8 100644 --- a/src/blackcore/contextnetworkimpl.cpp +++ b/src/blackcore/contextnetworkimpl.cpp @@ -7,8 +7,8 @@ * contained in the LICENSE file. */ +#include "application.h" #include "contextnetworkimpl.h" -#include "corefacade.h" #include "contextapplication.h" #include "contextsimulator.h" #include "contextownaircraftimpl.h" @@ -57,9 +57,9 @@ namespace BlackCore this->m_networkDataUpdateTimer->start(30 * 1000); // 3. data reader, start reading when setup is synced with xx delay - this->m_webDataReader = new CWebDataServices(CWebReaderFlags::AllReaders, this); + Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO, "Missing web data services"); this->m_webReaderSignalConnections.append( - this->m_webDataReader->connectDataReadSignal( + sApp->getWebDataServices()->connectDataReadSignal( this, // the object here must be the same as in the bind std::bind(&CContextNetwork::webServiceDataRead, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3) ) @@ -67,8 +67,7 @@ namespace BlackCore // 4. Airspace contents Q_ASSERT_X(this->getRuntime()->getCContextOwnAircraft(), Q_FUNC_INFO, "this and own aircraft context must be local"); - Q_ASSERT_X(this->m_webDataReader, Q_FUNC_INFO, "Missing reader"); - this->m_airspace = new CAirspaceMonitor(this->getRuntime()->getCContextOwnAircraft(), this->m_network, this->m_webDataReader, this); + this->m_airspace = new CAirspaceMonitor(this->getRuntime()->getCContextOwnAircraft(), this->m_network, sApp->getWebDataServices(), this); connect(this->m_airspace, &CAirspaceMonitor::changedAtcStationsOnline, this, &CContextNetwork::changedAtcStationsOnline); connect(this->m_airspace, &CAirspaceMonitor::changedAtcStationsBooked, this, &CContextNetwork::changedAtcStationsBooked); connect(this->m_airspace, &CAirspaceMonitor::changedAtcStationOnlineConnectionStatus, this, &CContextNetwork::changedAtcStationOnlineConnectionStatus); @@ -135,7 +134,6 @@ namespace BlackCore { this->disconnect(); // all signals this->disconnectReaderSignals(); // disconnect - this->m_webDataReader->gracefulShutdown(); if (this->isConnected()) { this->disconnectFromNetwork(); } if (this->m_airspace) { this->m_airspace->gracefulShutdown(); } @@ -374,16 +372,16 @@ namespace BlackCore CServerList CContextNetwork::getVatsimFsdServers() const { - Q_ASSERT_X(this->m_webDataReader, Q_FUNC_INFO, "Missing data reader"); + Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO, "Missing data reader"); if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } - return this->m_webDataReader->getVatsimFsdServers(); + return sApp->getWebDataServices()->getVatsimFsdServers(); } CServerList CContextNetwork::getVatsimVoiceServers() const { - Q_ASSERT_X(this->m_webDataReader, Q_FUNC_INFO, "Missing data reader"); + Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO, "Missing data reader"); if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } - return this->m_webDataReader->getVatsimVoiceServers(); + return sApp->getWebDataServices()->getVatsimVoiceServers(); } void CContextNetwork::ps_fsdConnectionStatusChanged(INetwork::ConnectionStatus from, INetwork::ConnectionStatus to) @@ -569,8 +567,8 @@ namespace BlackCore void CContextNetwork::readAtcBookingsFromSource() const { if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } - Q_ASSERT_X(this->m_webDataReader, Q_FUNC_INFO, "missing reader"); - this->m_webDataReader->readInBackground(BlackMisc::Network::CEntityFlags::BookingEntity); + Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO, "missing reader"); + sApp->getWebDataServices()->readInBackground(BlackMisc::Network::CEntityFlags::BookingEntity); } bool CContextNetwork::updateAircraftRendered(const CCallsign &callsign, bool rendered, const CIdentifier &originator) diff --git a/src/blackcore/contextnetworkimpl.h b/src/blackcore/contextnetworkimpl.h index 179b44e81..5defc9e2d 100644 --- a/src/blackcore/contextnetworkimpl.h +++ b/src/blackcore/contextnetworkimpl.h @@ -238,7 +238,6 @@ namespace BlackCore private: CAirspaceMonitor *m_airspace = nullptr; INetwork *m_network = nullptr; - CWebDataServices *m_webDataReader = nullptr; //!< web service readers QList m_webReaderSignalConnections; INetwork::ConnectionStatus m_currentStatus = INetwork::Disconnected; //!< used to detect pending connections QTimer *m_networkDataUpdateTimer = nullptr; //!< general updates such as ATIS, frequencies, see requestDataUpdates() diff --git a/src/blackcore/cookiemanager.cpp b/src/blackcore/cookiemanager.cpp index 54e3ec877..b02733a4d 100644 --- a/src/blackcore/cookiemanager.cpp +++ b/src/blackcore/cookiemanager.cpp @@ -18,29 +18,6 @@ using namespace BlackMisc; namespace BlackCore { - CCookieManager *CCookieManager::instance() - { - static CCookieManager *manager = nullptr; - if (!manager) - { - Q_ASSERT_X(CThreadUtils::isCurrentThreadApplicationThread(), Q_FUNC_INFO, "Supposed to run in application thread"); - manager = new CCookieManager(QCoreApplication::instance()); - } - return manager; - } - - void CCookieManager::resetParent() - { - instance()->setParent(nullptr); - } - - void CCookieManager::setToAccessManager(QNetworkAccessManager *manager) - { - if (!manager) { return; } - manager->setCookieJar(instance()); - resetParent(); - } - CCookieManager::CCookieManager(QObject *parent) : QNetworkCookieJar(parent) { // code diff --git a/src/blackcore/cookiemanager.h b/src/blackcore/cookiemanager.h index a973f0536..be3cd1c27 100644 --- a/src/blackcore/cookiemanager.h +++ b/src/blackcore/cookiemanager.h @@ -21,14 +21,17 @@ namespace BlackCore { + class CApplication; + /*! - * Centralized cookie manager, - * which allows thread safe sharing of cookies + * Cookie manager, which allows thread safe sharing of cookies */ - class BLACKCORE_EXPORT CCookieManager : QNetworkCookieJar + class BLACKCORE_EXPORT CCookieManager : public QNetworkCookieJar { Q_OBJECT + friend class CApplication; + public: //! cookiesForUrl::setCookiesFromUrl //! \threadsafe @@ -58,19 +61,10 @@ namespace BlackCore //! \threadsafe virtual bool updateCookie(const QNetworkCookie &cookie) override; - //! Our central access manager - static CCookieManager *instance(); - - //! Set the central instance to the given access manager - static void setToAccessManager(QNetworkAccessManager *manager); - private: //! Constructor CCookieManager(QObject *parent = nullptr); - //! Reset the parent, required when CookieManager is set to QNetworkAccessManager - static void resetParent(); - mutable QReadWriteLock m_lock { QReadWriteLock::Recursive }; }; diff --git a/src/blackcore/webdataservices.cpp b/src/blackcore/webdataservices.cpp index 1eedb5568..bf1e9f07f 100644 --- a/src/blackcore/webdataservices.cpp +++ b/src/blackcore/webdataservices.cpp @@ -36,9 +36,8 @@ using namespace BlackMisc::Weather; namespace BlackCore { - CWebDataServices::CWebDataServices( - CWebReaderFlags::WebReader readerFlags, QObject *parent) : - QObject(parent), m_readerFlags(readerFlags) + CWebDataServices::CWebDataServices(CWebReaderFlags::WebReader readerFlags, CWebReaderFlags::DbReaderHint hint, QObject *parent) : + QObject(parent), m_readerFlags(readerFlags), m_dbHint(hint) { if (!sApp) { return; } // shutting down @@ -47,7 +46,6 @@ namespace BlackCore this->setObjectName("CWebDataReader"); this->initReaders(readerFlags); this->initWriters(); - this->readInBackground(CEntityFlags::AllEntities, 500); } diff --git a/src/blackcore/webdataservices.h b/src/blackcore/webdataservices.h index 85b923e3c..b7e854e8d 100644 --- a/src/blackcore/webdataservices.h +++ b/src/blackcore/webdataservices.h @@ -38,6 +38,7 @@ namespace BlackCore class CIcaoDataReader; class CModelDataReader; class CDatabaseWriter; + class CApplication; /*! * Encapsulates reading data from web sources @@ -49,10 +50,9 @@ namespace BlackCore Q_OBJECT Q_INTERFACES(BlackMisc::Network::IWebDataServicesProvider) - public: - //! Constructor - CWebDataServices(CWebReaderFlags::WebReader readerFlags, QObject *parent = nullptr); + friend class CApplication; + public: //! Shutdown void gracefulShutdown(); @@ -71,6 +71,9 @@ namespace BlackCore //! Reader flags CWebReaderFlags::WebReader getReaderFlags() const { return m_readerFlags; } + //! Reader flags + CWebReaderFlags::DbReaderHint getDbHint() const { return m_dbHint; } + //! Log categories static const BlackMisc::CLogCategoryList &getLogCategories(); @@ -133,10 +136,13 @@ namespace BlackCore // ------------------------ provider functionality end ---------------------------- + protected: + //! Constructor + CWebDataServices(CWebReaderFlags::WebReader readerFlags, CWebReaderFlags:: DbReaderHint hint, QObject *parent = nullptr); + // --------------------------------------------- // Consider to use the connect method of the provider to connect by entity // --------------------------------------------- - public slots: //! First read (allows to immediately read in background) void readInBackground(BlackMisc::Network::CEntityFlags::Entity entities = BlackMisc::Network::CEntityFlags::AllEntities, int delayMs = 0); @@ -165,6 +171,7 @@ namespace BlackCore void initWriters(); CWebReaderFlags::WebReader m_readerFlags = CWebReaderFlags::WebReaderFlag::None; //!< which readers are available + CWebReaderFlags::DbReaderHint m_dbHint = CWebReaderFlags::NoHint; //!< how to read DB data bool m_initialRead = false; //!< Initial read conducted BlackMisc::CData m_setup {this, &CWebDataServices::ps_setupChanged}; //!< setup cache diff --git a/src/blackcore/webreaderflags.h b/src/blackcore/webreaderflags.h index ba1dc2b5c..efb220ebc 100644 --- a/src/blackcore/webreaderflags.h +++ b/src/blackcore/webreaderflags.h @@ -28,18 +28,28 @@ namespace BlackCore //! Which readers to init enum WebReaderFlag { - None = 0, ///< no reader at all + None = 0, ///< no reader at all VatsimBookingReader = 1 << 0, ///< reader for VATSIM booking data VatsimDataReader = 1 << 1, ///< reader for VATSIM data VatsimMetarReader = 1 << 2, ///< reader for VATSIM metar data IcaoDataReader = 1 << 3, ///< reader for ICAO data ModelReader = 1 << 4, ///< reader for model data such as liveries, models, .. AllVatsimReaders = VatsimBookingReader | VatsimDataReader | VatsimMetarReader, ///< all readers - AllSwiftDbReaders = IcaoDataReader | ModelReader, ///< all swift data - AllReaders = AllSwiftDbReaders | AllVatsimReaders ///< everything + AllSwiftDbReaders = IcaoDataReader | ModelReader, ///< all swift data + AllReaders = AllSwiftDbReaders | AllVatsimReaders ///< everything }; Q_DECLARE_FLAGS(WebReader, WebReaderFlag) + //! How to read DB data + enum DbReaderHintFlag + { + NoHint = 0, + FromDb = 1 << 1, ///< directly from DB + FromJsonFile = 1 << 2, ///< from the JSON files + FromCache = 1 << 3, ///< try cache first + }; + Q_DECLARE_FLAGS(DbReaderHint, DbReaderHintFlag) + //! Relationship between reader and entity static WebReader entityToReader(BlackMisc::Network::CEntityFlags::Entity entity); @@ -53,6 +63,9 @@ namespace BlackCore Q_DECLARE_METATYPE(BlackCore::CWebReaderFlags::WebReaderFlag) Q_DECLARE_METATYPE(BlackCore::CWebReaderFlags::WebReader) +Q_DECLARE_METATYPE(BlackCore::CWebReaderFlags::DbReaderHintFlag) +Q_DECLARE_METATYPE(BlackCore::CWebReaderFlags::DbReaderHint) Q_DECLARE_OPERATORS_FOR_FLAGS(BlackCore::CWebReaderFlags::WebReader) +Q_DECLARE_OPERATORS_FOR_FLAGS(BlackCore::CWebReaderFlags::DbReaderHint) #endif diff --git a/src/swiftdata/main.cpp b/src/swiftdata/main.cpp index 1e3c8759b..7d7eede72 100644 --- a/src/swiftdata/main.cpp +++ b/src/swiftdata/main.cpp @@ -28,7 +28,9 @@ using namespace BlackGui; int main(int argc, char *argv[]) { QApplication qa(argc, argv); + Q_UNUSED(qa); CGuiApplication a("swift mapping tool", CIcons::swiftDatabase48()); + a.useWebDataServices(BlackCore::CWebReaderFlags::AllSwiftDbReaders, BlackCore::CWebReaderFlags::FromDb); a.start(); CSwiftData w; w.show(); diff --git a/src/swiftdata/swiftdata.cpp b/src/swiftdata/swiftdata.cpp index 93cf5b382..751304f1f 100644 --- a/src/swiftdata/swiftdata.cpp +++ b/src/swiftdata/swiftdata.cpp @@ -32,8 +32,7 @@ using namespace BlackGui::Components; CSwiftData::CSwiftData(QWidget *parent) : QMainWindow(parent), CIdentifiable(this), - ui(new Ui::CSwiftData), - m_webDataReader(new CWebDataServices(CWebReaderFlags::AllSwiftDbReaders, this)) + ui(new Ui::CSwiftData) { ui->setupUi(this); this->init(); @@ -58,7 +57,7 @@ void CSwiftData::closeEvent(QCloseEvent *event) { Q_UNUSED(event); this->performGracefulShutdown(); - QApplication::exit(); + sGui->exit(); } void CSwiftData::ps_appendLogMessage(const CStatusMessage &message) @@ -100,9 +99,9 @@ void CSwiftData::initLogDisplay() void CSwiftData::initReaders() { - Q_ASSERT_X(this->m_webDataReader, Q_FUNC_INFO, "Missing reader"); - this->ui->comp_MainInfoArea->setProvider(this->m_webDataReader); - this->ui->comp_InfoBar->setProvider(this->m_webDataReader); + Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO, "Missing reader"); + this->ui->comp_MainInfoArea->setProvider(sApp->getWebDataServices()); + this->ui->comp_InfoBar->setProvider(sApp->getWebDataServices()); // web data will be read automatically when setup is syncronized } @@ -139,11 +138,7 @@ void CSwiftData::initMenu() void CSwiftData::performGracefulShutdown() { - if (this->m_webDataReader) - { - m_webDataReader->gracefulShutdown(); - m_webDataReader = nullptr; - } + // void } void CSwiftData::displayConsole() diff --git a/src/swiftdata/swiftdata.h b/src/swiftdata/swiftdata.h index 464857439..b6fd8fd7a 100644 --- a/src/swiftdata/swiftdata.h +++ b/src/swiftdata/swiftdata.h @@ -72,7 +72,6 @@ private: QScopedPointer ui; BlackGui::CManagedStatusBar m_statusBar; - BlackCore::CWebDataServices *m_webDataReader = nullptr; BlackMisc::CData m_setup {this, &CSwiftData::ps_setupChanged}; //!< setup cache BlackMisc::CData m_updateInfo { this }; //!< download / version data }; diff --git a/src/swiftguistandard/swiftguistdapplication.cpp b/src/swiftguistandard/swiftguistdapplication.cpp index cdea05439..90d74d3b0 100644 --- a/src/swiftguistandard/swiftguistdapplication.cpp +++ b/src/swiftguistandard/swiftguistdapplication.cpp @@ -19,6 +19,7 @@ CSwiftGuiStdApplication::CSwiftGuiStdApplication() : CGuiApplication("swift pilo this->addParserOption(this->m_cmdFacadeMode); this->addWindowModeOption(); this->addDBusAddressOption(); + this->useWebDataServices(CWebReaderFlags::AllReaders, CWebReaderFlags::FromCache); } bool CSwiftGuiStdApplication::startHookIn()