From 04e980a6aea4ddabb76e848fddbe20eb4f5dc4ce Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 12 Jan 2017 18:00:38 +0100 Subject: [PATCH] refs #857, monitor accessible network in application --- src/blackcore/application.cpp | 41 ++++++++++++++++++++++++++++++++--- src/blackcore/application.h | 12 ++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/blackcore/application.cpp b/src/blackcore/application.cpp index 982a0b946..1aa8b8b6e 100644 --- a/src/blackcore/application.cpp +++ b/src/blackcore/application.cpp @@ -130,6 +130,7 @@ namespace BlackCore // Init network this->m_cookieManager.setParent(&this->m_accessManager); this->m_accessManager.setCookieJar(&this->m_cookieManager); + connect(&this->m_accessManager, &QNetworkAccessManager::networkAccessibleChanged, this, &CApplication::ps_networkAccessibleChanged); // global setup sApp = this; @@ -154,7 +155,7 @@ namespace BlackCore CApplicationInfoList apps = getRunningApplications(); apps.push_back(instance()->getApplicationInfo()); bool ok = CFileUtils::writeStringToLockedFile(apps.toJsonString(), swiftDataRoot() + "apps.json"); - if (!ok) { CLogMessage(static_cast(nullptr)).error("Failed to write to application list file"); } + if (!ok) { CLogMessage(static_cast(nullptr)).error("Failed to write to application list file"); } return QCoreApplication::exec(); } @@ -176,13 +177,13 @@ namespace BlackCore { CApplicationInfoList apps; apps.convertFromJsonNoThrow(CFileUtils::readLockedFileToString(swiftDataRoot() + "apps.json"), {}, {}); - apps.removeIf([](const CApplicationInfo &info) { return !info.processInfo().exists(); }); + apps.removeIf([](const CApplicationInfo & info) { return !info.processInfo().exists(); }); return apps; } bool CApplication::isAlreadyRunning() const { - return getRunningApplications().containsBy([this](const CApplicationInfo &info) { return info.application() == getSwiftApplication(); }); + return getRunningApplications().containsBy([this](const CApplicationInfo & info) { return info.application() == getSwiftApplication(); }); } const QString &CApplication::getApplicationNameAndVersion() const @@ -490,6 +491,7 @@ namespace BlackCore QNetworkReply *CApplication::postToNetwork(const QNetworkRequest &request, QHttpMultiPart *multiPart, const CSlot &callback) { + if (!this->isNetworkConnectedAndAccessible()) { return nullptr; } if (QThread::currentThread() != this->m_accessManager.thread()) { multiPart->moveToThread(this->m_accessManager.thread()); @@ -519,6 +521,22 @@ namespace BlackCore this->m_cookieManager.deleteAllCookies(); } + bool CApplication::isNetworkAccessible() const + { + return this->m_accessManager.networkAccessible() == QNetworkAccessManager::Accessible; + } + + bool CApplication::isNetworkConnected() const + { + static bool con = CNetworkUtils::hasConnectedInterface(); + return con; + } + + bool CApplication::isNetworkConnectedAndAccessible() const + { + return this->isNetworkConnected() && this->isNetworkAccessible(); + } + void CApplication::exit(int retcode) { if (instance()) @@ -749,6 +767,22 @@ namespace BlackCore // void } + void CApplication::ps_networkAccessibleChanged(QNetworkAccessManager::NetworkAccessibility accessible) + { + switch (accessible) + { + case QNetworkAccessManager::Accessible: + CLogMessage(this).info("Network is accessible"); + break; + case QNetworkAccessManager::NotAccessible: + CLogMessage(this).error("Network not accessible"); + break; + default: + CLogMessage(this).warning("Network accessibility unknown"); + break; + } + } + CStatusMessageList CApplication::asyncWebAndContextStart() { if (this->m_started) { return CStatusMessage(this).info("Already started "); } @@ -1091,6 +1125,7 @@ namespace BlackCore QNetworkReply *CApplication::httpRequestImpl(const QNetworkRequest &request, const BlackMisc::CSlot &callback, std::function method) { if (this->m_shutdown) { return nullptr; } + if (!this->isNetworkConnectedAndAccessible()) { return nullptr; } QWriteLocker locker(&m_accessManagerLock); Q_ASSERT_X(QCoreApplication::instance()->thread() == m_accessManager.thread(), Q_FUNC_INFO, "Network manager supposed to be in main thread"); if (QThread::currentThread() != this->m_accessManager.thread()) diff --git a/src/blackcore/application.h b/src/blackcore/application.h index a46f0f9e6..3f2d39712 100644 --- a/src/blackcore/application.h +++ b/src/blackcore/application.h @@ -139,6 +139,15 @@ namespace BlackCore //! Delete all cookies from cookier manager void deleteAllCookies(); + //! Network accessible? + bool isNetworkAccessible() const; + + //! Network connected (at startup time) + bool isNetworkConnected() const; + + //! Network connected and also accessible + bool isNetworkConnectedAndAccessible() const; + //! Setup already synchronized bool isSetupAvailable() const; @@ -368,6 +377,9 @@ namespace BlackCore //! Startup completed virtual void ps_startupCompleted(); + //! Problem with network access manager + virtual void ps_networkAccessibleChanged(QNetworkAccessManager::NetworkAccessibility accessible); + protected: //! Init class, allows to init from BlackGui::CGuiApplication as well (pseudo virtual) void init(bool withMetadata);