diff --git a/src/ChatPage.cc b/src/ChatPage.cc
index d8280a4a..cf78d8a1 100644
--- a/src/ChatPage.cc
+++ b/src/ChatPage.cc
@@ -29,6 +29,8 @@
#include "StateEvent.h"
+constexpr int MAX_INITIAL_SYNC_FAILURES = 5;
+
namespace events = matrix::events;
ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
@@ -192,6 +194,24 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
SIGNAL(initialSyncCompleted(const SyncResponse &)),
this,
SLOT(initialSyncCompleted(const SyncResponse &)));
+ connect(client_.data(), &MatrixClient::initialSyncFailed, this, [=](const QString &msg) {
+ initialSyncFailures += 1;
+
+ if (initialSyncFailures >= MAX_INITIAL_SYNC_FAILURES) {
+ initialSyncFailures = 0;
+
+ deleteConfigs();
+
+ emit showLoginPage(msg);
+ emit contentLoaded();
+ return;
+ }
+
+ qWarning() << msg;
+ qWarning() << "Retrying initial sync";
+
+ client_->initialSync();
+ });
connect(client_.data(),
SIGNAL(syncCompleted(const SyncResponse &)),
this,
@@ -239,7 +259,29 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
void
ChatPage::logout()
{
- // Delete all config parameters.
+ deleteConfigs();
+
+ resetUI();
+
+ emit close();
+}
+
+void
+ChatPage::resetUI()
+{
+ room_avatars_.clear();
+ room_list_->clear();
+ settingsManager_.clear();
+ state_manager_.clear();
+ top_bar_->reset();
+ user_info_widget_->reset();
+ view_manager_->clearAll();
+ AvatarProvider::clear();
+}
+
+void
+ChatPage::deleteConfigs()
+{
QSettings settings;
settings.beginGroup("auth");
settings.remove("");
@@ -253,21 +295,7 @@ ChatPage::logout()
cache_->deleteData();
- // Clear the environment.
- room_list_->clear();
- view_manager_->clearAll();
-
- top_bar_->reset();
- user_info_widget_->reset();
client_->reset();
-
- state_manager_.clear();
- settingsManager_.clear();
- room_avatars_.clear();
-
- AvatarProvider::clear();
-
- emit close();
}
void
diff --git a/src/MainWindow.cc b/src/MainWindow.cc
index f6276967..b6033eaf 100644
--- a/src/MainWindow.cc
+++ b/src/MainWindow.cc
@@ -73,6 +73,10 @@ MainWindow::MainWindow(QWidget *parent)
connect(
chat_page_, SIGNAL(changeWindowTitle(QString)), this, SLOT(setWindowTitle(QString)));
connect(chat_page_, SIGNAL(unreadMessages(int)), trayIcon_, SLOT(setUnreadCount(int)));
+ connect(chat_page_, &ChatPage::showLoginPage, this, [=](const QString &msg) {
+ login_page_->loginError(msg);
+ showLoginPage();
+ });
connect(trayIcon_,
SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
diff --git a/src/MatrixClient.cc b/src/MatrixClient.cc
index e9e47fcb..4ececd01 100644
--- a/src/MatrixClient.cc
+++ b/src/MatrixClient.cc
@@ -221,7 +221,7 @@ MatrixClient::onInitialSyncResponse(QNetworkReply *reply)
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if (status == 0 || status >= 400) {
- qWarning() << reply->errorString();
+ emit initialSyncFailed(reply->errorString());
return;
}
|