diff --git a/src/gui/accountstate.cpp b/src/gui/accountstate.cpp index f5938ad9a..6bca4bff4 100644 --- a/src/gui/accountstate.cpp +++ b/src/gui/accountstate.cpp @@ -72,6 +72,10 @@ AccountState::AccountState(AccountPtr account) _checkConnectionTimer.setInterval(ConnectionValidator::DefaultCallingIntervalMsec); _checkConnectionTimer.start(); + connect(&_checkServerAvailibilityTimer, &QTimer::timeout, this, &AccountState::slotCheckServerAvailibility); + _checkServerAvailibilityTimer.setInterval(ConnectionValidator::DefaultCallingIntervalMsec); + _checkServerAvailibilityTimer.start(); + QTimer::singleShot(0, this, &AccountState::slotCheckConnection); } @@ -557,6 +561,28 @@ void AccountState::slotCheckConnection() } } +void AccountState::slotCheckServerAvailibility() +{ + if (state() == AccountState::Connected + || state() == AccountState::SignedOut + || state() == AccountState::MaintenanceMode + || state() == AccountState::AskingCredentials) { + qCInfo(lcAccountState) << "Skipping server availibility check for account" << _account->id() << "with state" << state(); + return; + } + qCInfo(lcAccountState) << "Checking server availibility for account" << _account->id(); + const auto serverAvailibilityUrl = Utility::concatUrlPath(_account->url(), QLatin1String("/index.php/204")); + auto checkServerAvailibilityJob = _account->sendRequest(QByteArrayLiteral("GET"), serverAvailibilityUrl); + connect(checkServerAvailibilityJob, &SimpleNetworkJob::finishedSignal, this, [this](QNetworkReply *reply) { + if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) == 204) { + qCInfo(lcAccountState) << "Server is now available for account" << _account->id(); + _lastCheckConnectionTimer.invalidate(); + resetRetryCount(); + QMetaObject::invokeMethod(this, "slotCheckConnection", Qt::QueuedConnection); + } + }); +} + void AccountState::slotPushNotificationsReady() { if (state() != AccountState::State::Connected) { diff --git a/src/gui/accountstate.h b/src/gui/accountstate.h index fc6a4ab85..ea4062735 100644 --- a/src/gui/accountstate.h +++ b/src/gui/accountstate.h @@ -216,6 +216,7 @@ protected Q_SLOTS: private Q_SLOTS: void slotCheckConnection(); + void slotCheckServerAvailibility(); void slotPushNotificationsReady(); void slotServerUserStatusChanged(); @@ -261,6 +262,8 @@ private: QTimer _checkConnectionTimer; QElapsedTimer _lastCheckConnectionTimer; + QTimer _checkServerAvailibilityTimer; + explicit AccountState() = default; friend class ::FakeAccountState;