From 6bd9bc9c9d6152361a005eccecb95867bcb4e7c7 Mon Sep 17 00:00:00 2001 From: davidebeatrici Date: Sun, 21 Jan 2018 14:29:31 +0100 Subject: [PATCH] Correctly handle ServerResolver errors, with dedicated signal and slot This commit adds a signal to ServerResolver and a slot to MainWindow to handle ServerHandler errors, in order to start the reconnection timer after the first connection attempt. Fixes #3220. --- src/mumble/MainWindow.cpp | 16 ++++++++++++++++ src/mumble/MainWindow.h | 1 + src/mumble/ServerHandler.cpp | 1 + src/mumble/ServerHandler.h | 1 + 4 files changed, 19 insertions(+) diff --git a/src/mumble/MainWindow.cpp b/src/mumble/MainWindow.cpp index 5f92f74a6..4088110e3 100644 --- a/src/mumble/MainWindow.cpp +++ b/src/mumble/MainWindow.cpp @@ -809,6 +809,7 @@ static void recreateServerHandler() { g.sh = sh; g.mw->connect(sh.get(), SIGNAL(connected()), g.mw, SLOT(serverConnected())); g.mw->connect(sh.get(), SIGNAL(disconnected(QAbstractSocket::SocketError, QString)), g.mw, SLOT(serverDisconnected(QAbstractSocket::SocketError, QString))); + g.mw->connect(sh.get(), SIGNAL(error(QAbstractSocket::SocketError, QString)), g.mw, SLOT(resolverError(QAbstractSocket::SocketError, QString))); } void MainWindow::openUrl(const QUrl &url) { @@ -3013,6 +3014,21 @@ void MainWindow::serverDisconnected(QAbstractSocket::SocketError err, QString re AudioInput::setMaxBandwidth(-1); } +void MainWindow::resolverError(QAbstractSocket::SocketError, QString reason) { + if (! reason.isEmpty()) { + g.l->log(Log::ServerDisconnected, tr("Server connection failed: %1.").arg(Qt::escape(reason))); + } else { + g.l->log(Log::ServerDisconnected, tr("Server connection failed.")); + } + + if (g.s.bReconnect) { + qaServerDisconnect->setEnabled(true); + if (bRetryServer) { + qtReconnect->start(); + } + } +} + void MainWindow::trayAboutToShow() { bool top = false; diff --git a/src/mumble/MainWindow.h b/src/mumble/MainWindow.h index 28dce2f1f..5d13db304 100644 --- a/src/mumble/MainWindow.h +++ b/src/mumble/MainWindow.h @@ -267,6 +267,7 @@ class MainWindow : public QMainWindow, public MessageHandler, public Ui::MainWin void qtvUserCurrentChanged(const QModelIndex &, const QModelIndex &); void serverConnected(); void serverDisconnected(QAbstractSocket::SocketError, QString reason); + void resolverError(QAbstractSocket::SocketError, QString reason); void viewCertificate(bool); void openUrl(const QUrl &url); void context_triggered(); diff --git a/src/mumble/ServerHandler.cpp b/src/mumble/ServerHandler.cpp index 49fb1a612..2dd8b76c5 100644 --- a/src/mumble/ServerHandler.cpp +++ b/src/mumble/ServerHandler.cpp @@ -295,6 +295,7 @@ void ServerHandler::run() { int ret = exec(); if (ret < 0) { qWarning("ServerHandler: failed to resolve hostname"); + emit error(QAbstractSocket::HostNotFoundError, tr("Unable to resolve hostname")); return; } } diff --git a/src/mumble/ServerHandler.h b/src/mumble/ServerHandler.h index bb558c4bf..0840debae 100644 --- a/src/mumble/ServerHandler.h +++ b/src/mumble/ServerHandler.h @@ -135,6 +135,7 @@ class ServerHandler : public QThread { void disconnect(); void run() Q_DECL_OVERRIDE; signals: + void error(QAbstractSocket::SocketError, QString reason); void disconnected(QAbstractSocket::SocketError, QString reason); void connected(); void pingRequested();