From 89deccd9b598cec562ef42c213e5709ee4f403d3 Mon Sep 17 00:00:00 2001 From: "Vladimir Golovnev (Glassez)" Date: Thu, 29 Nov 2018 17:25:38 +0300 Subject: [PATCH] Show error message when Session failed to start --- src/app/application.cpp | 40 ++++++++++++++++++++++++--------- src/base/asyncfilestorage.cpp | 16 +++---------- src/base/asyncfilestorage.h | 10 ++++----- src/base/bittorrent/session.cpp | 5 +++-- src/base/exceptions.cpp | 3 +-- src/base/exceptions.h | 3 --- 6 files changed, 41 insertions(+), 36 deletions(-) diff --git a/src/app/application.cpp b/src/app/application.cpp index 3b1df76af..ade96dd20 100644 --- a/src/app/application.cpp +++ b/src/app/application.cpp @@ -44,6 +44,7 @@ #endif #ifndef DISABLE_GUI +#include #ifdef Q_OS_WIN #include #include @@ -61,6 +62,7 @@ #include "base/bittorrent/session.h" #include "base/bittorrent/torrenthandle.h" +#include "base/exceptions.h" #include "base/iconprovider.h" #include "base/logger.h" #include "base/net/downloadmanager.h" @@ -495,26 +497,42 @@ int Application::exec(const QStringList ¶ms) GuiIconProvider::initInstance(); #endif - BitTorrent::Session::initInstance(); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::torrentFinished, this, &Application::torrentFinished); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::allTorrentsFinished, this, &Application::allTorrentsFinished, Qt::QueuedConnection); + try { + BitTorrent::Session::initInstance(); + connect(BitTorrent::Session::instance(), &BitTorrent::Session::torrentFinished, this, &Application::torrentFinished); + connect(BitTorrent::Session::instance(), &BitTorrent::Session::allTorrentsFinished, this, &Application::allTorrentsFinished, Qt::QueuedConnection); #ifndef DISABLE_COUNTRIES_RESOLUTION - Net::GeoIPManager::initInstance(); + Net::GeoIPManager::initInstance(); #endif - ScanFoldersModel::initInstance(this); + ScanFoldersModel::initInstance(this); #ifndef DISABLE_WEBUI - m_webui = new WebUI; + m_webui = new WebUI; #ifdef DISABLE_GUI - if (m_webui->isErrored()) - return 1; - connect(m_webui, &WebUI::fatalError, this, []() { QCoreApplication::exit(1); }); + if (m_webui->isErrored()) + return 1; + connect(m_webui, &WebUI::fatalError, this, []() { QCoreApplication::exit(1); }); #endif // DISABLE_GUI #endif // DISABLE_WEBUI - new RSS::Session; // create RSS::Session singleton - new RSS::AutoDownloader; // create RSS::AutoDownloader singleton + new RSS::Session; // create RSS::Session singleton + new RSS::AutoDownloader; // create RSS::AutoDownloader singleton + } + catch (const RuntimeError &err) { +#ifdef DISABLE_GUI + fprintf(stderr, "%s", err.what()); +#else + QMessageBox msgBox; + msgBox.setIcon(QMessageBox::Critical); + msgBox.setText(tr("Application failed to start.")); + msgBox.setInformativeText(err.message()); + msgBox.show(); // Need to be shown or to moveToCenter does not work + msgBox.move(Utils::Misc::screenCenter(&msgBox)); + msgBox.exec(); +#endif + return 1; + } #ifdef DISABLE_GUI #ifndef DISABLE_WEBUI diff --git a/src/base/asyncfilestorage.cpp b/src/base/asyncfilestorage.cpp index 94402b924..1cc5d8d7e 100644 --- a/src/base/asyncfilestorage.cpp +++ b/src/base/asyncfilestorage.cpp @@ -38,12 +38,12 @@ AsyncFileStorage::AsyncFileStorage(const QString &storageFolderPath, QObject *pa , m_lockFile(m_storageDir.absoluteFilePath(QStringLiteral("storage.lock"))) { if (!m_storageDir.mkpath(m_storageDir.absolutePath())) - throw AsyncFileStorageError( - QString("Could not create directory '%1'.").arg(m_storageDir.absolutePath())); + throw AsyncFileStorageError {tr("Could not create directory '%1'.") + .arg(m_storageDir.absolutePath())}; // TODO: This folder locking approach does not work for UNIX systems. Implement it. if (!m_lockFile.open(QFile::WriteOnly)) - throw AsyncFileStorageError(m_lockFile.errorString()); + throw AsyncFileStorageError {m_lockFile.errorString()}; } AsyncFileStorage::~AsyncFileStorage() @@ -76,13 +76,3 @@ void AsyncFileStorage::store_impl(const QString &fileName, const QByteArray &dat } } } - -AsyncFileStorageError::AsyncFileStorageError(const QString &message) - : std::runtime_error(message.toUtf8().data()) -{ -} - -QString AsyncFileStorageError::message() const -{ - return what(); -} diff --git a/src/base/asyncfilestorage.h b/src/base/asyncfilestorage.h index 383b5b555..57f8973fa 100644 --- a/src/base/asyncfilestorage.h +++ b/src/base/asyncfilestorage.h @@ -28,22 +28,22 @@ #pragma once -#include - #include #include #include -class AsyncFileStorageError : public std::runtime_error +#include "base/exceptions.h" + +class AsyncFileStorageError : public RuntimeError { public: - explicit AsyncFileStorageError(const QString &message); - QString message() const; + using RuntimeError::RuntimeError; }; class AsyncFileStorage : public QObject { Q_OBJECT + Q_DISABLE_COPY(AsyncFileStorage) public: explicit AsyncFileStorage(const QString &storageFolderPath, QObject *parent = nullptr); diff --git a/src/base/bittorrent/session.cpp b/src/base/bittorrent/session.cpp index d15e26c05..8399931b0 100644 --- a/src/base/bittorrent/session.cpp +++ b/src/base/bittorrent/session.cpp @@ -69,6 +69,7 @@ #endif #include "base/algorithm.h" +#include "base/exceptions.h" #include "base/global.h" #include "base/logger.h" #include "base/net/downloadhandler.h" @@ -3797,11 +3798,11 @@ void Session::initResumeFolder() if (resumeFolderDir.exists() || resumeFolderDir.mkpath(resumeFolderDir.absolutePath())) { m_resumeFolderLock.setFileName(resumeFolderDir.absoluteFilePath("session.lock")); if (!m_resumeFolderLock.open(QFile::WriteOnly)) { - throw std::runtime_error("Cannot write to torrent resume folder."); + throw RuntimeError {tr("Cannot write to torrent resume folder.")}; } } else { - throw std::runtime_error("Cannot create torrent resume folder."); + throw RuntimeError {tr("Cannot create torrent resume folder.")}; } } diff --git a/src/base/exceptions.cpp b/src/base/exceptions.cpp index 87c0e0c0a..27527ddbb 100644 --- a/src/base/exceptions.cpp +++ b/src/base/exceptions.cpp @@ -30,11 +30,10 @@ RuntimeError::RuntimeError(const QString &message) : std::runtime_error {message.toUtf8().data()} - , m_message {message} { } QString RuntimeError::message() const { - return m_message; + return what(); } diff --git a/src/base/exceptions.h b/src/base/exceptions.h index 3a95f919c..3b4a67d1e 100644 --- a/src/base/exceptions.h +++ b/src/base/exceptions.h @@ -36,7 +36,4 @@ class RuntimeError : public std::runtime_error public: explicit RuntimeError(const QString &message = ""); QString message() const; - -private: - const QString m_message; };