Browse Source

Fix WebUI error handling

adaptive-webui-19844
Vladimir Golovnev (Glassez) 7 years ago committed by sledgehammer999
parent
commit
71bb6538db
No known key found for this signature in database
GPG Key ID: 6E4A2D025B7CC9A2
  1. 23
      src/app/application.cpp
  2. 4
      src/app/application.h
  3. 27
      src/webui/webui.cpp
  4. 11
      src/webui/webui.h

23
src/app/application.cpp

@ -146,6 +146,13 @@ Application::Application(const QString &id, int &argc, char **argv)
Logger::instance()->addMessage(tr("qBittorrent %1 started", "qBittorrent v3.2.0alpha started").arg(QBT_VERSION)); Logger::instance()->addMessage(tr("qBittorrent %1 started", "qBittorrent v3.2.0alpha started").arg(QBT_VERSION));
} }
Application::~Application()
{
// we still need to call cleanup()
// in case the App failed to start
cleanup();
}
#ifndef DISABLE_GUI #ifndef DISABLE_GUI
QPointer<MainWindow> Application::mainWindow() QPointer<MainWindow> Application::mainWindow()
{ {
@ -483,7 +490,12 @@ int Application::exec(const QStringList &params)
#ifndef DISABLE_WEBUI #ifndef DISABLE_WEBUI
m_webui = new WebUI; m_webui = new WebUI;
#endif #ifdef DISABLE_GUI
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::Session; // create RSS::Session singleton
new RSS::AutoDownloader; // create RSS::AutoDownloader singleton new RSS::AutoDownloader; // create RSS::AutoDownloader singleton
@ -642,14 +654,13 @@ void Application::shutdownCleanup(QSessionManager &manager)
void Application::cleanup() void Application::cleanup()
{ {
#ifndef DISABLE_GUI
#ifdef Q_OS_WIN
// cleanup() can be called multiple times during shutdown. We only need it once. // cleanup() can be called multiple times during shutdown. We only need it once.
static QAtomicInt alreadyDone; static QAtomicInt alreadyDone;
if (!alreadyDone.testAndSetAcquire(0, 1)) if (!alreadyDone.testAndSetAcquire(0, 1))
return; return;
#endif // Q_OS_WIN
#ifndef DISABLE_GUI
if (m_window) {
// Hide the window and not leave it on screen as // Hide the window and not leave it on screen as
// unresponsive. Also for Windows take the WinId // unresponsive. Also for Windows take the WinId
// after it's hidden, because hide() may cause a // after it's hidden, because hide() may cause a
@ -672,7 +683,7 @@ void Application::cleanup()
// otherwise the system shutdown will continue even // otherwise the system shutdown will continue even
// though we created a ShutdownBlockReason // though we created a ShutdownBlockReason
m_window->cleanup(); m_window->cleanup();
}
#endif // DISABLE_GUI #endif // DISABLE_GUI
#ifndef DISABLE_WEBUI #ifndef DISABLE_WEBUI
@ -697,6 +708,7 @@ void Application::cleanup()
Utils::Fs::removeDirRecursive(Utils::Fs::tempPath()); Utils::Fs::removeDirRecursive(Utils::Fs::tempPath());
#ifndef DISABLE_GUI #ifndef DISABLE_GUI
if (m_window) {
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
typedef BOOL (WINAPI *PSHUTDOWNBRDESTROY)(HWND); typedef BOOL (WINAPI *PSHUTDOWNBRDESTROY)(HWND);
PSHUTDOWNBRDESTROY shutdownBRDestroy = (PSHUTDOWNBRDESTROY)::GetProcAddress(::GetModuleHandleW(L"User32.dll"), "ShutdownBlockReasonDestroy"); PSHUTDOWNBRDESTROY shutdownBRDestroy = (PSHUTDOWNBRDESTROY)::GetProcAddress(::GetModuleHandleW(L"User32.dll"), "ShutdownBlockReasonDestroy");
@ -705,6 +717,7 @@ void Application::cleanup()
shutdownBRDestroy((HWND)m_window->effectiveWinId()); shutdownBRDestroy((HWND)m_window->effectiveWinId());
#endif // Q_OS_WIN #endif // Q_OS_WIN
delete m_window; delete m_window;
}
#endif // DISABLE_GUI #endif // DISABLE_GUI
if (m_shutdownAct != ShutdownDialogAction::Exit) { if (m_shutdownAct != ShutdownDialogAction::Exit) {

4
src/app/application.h

@ -73,9 +73,11 @@ namespace RSS
class Application : public BaseApplication class Application : public BaseApplication
{ {
Q_OBJECT Q_OBJECT
Q_DISABLE_COPY(Application)
public: public:
Application(const QString &id, int &argc, char **argv); Application(const QString &id, int &argc, char **argv);
~Application() override;
#if (defined(Q_OS_WIN) && !defined(DISABLE_GUI)) #if (defined(Q_OS_WIN) && !defined(DISABLE_GUI))
bool isRunning(); bool isRunning();
@ -132,7 +134,7 @@ private:
#endif #endif
#ifndef DISABLE_WEBUI #ifndef DISABLE_WEBUI
QPointer<WebUI> m_webui; WebUI *m_webui;
#endif #endif
// FileLog // FileLog

27
src/webui/webui.cpp

@ -28,10 +28,6 @@
#include "webui.h" #include "webui.h"
#ifdef DISABLE_GUI
#include <QCoreApplication>
#endif
#include "base/http/server.h" #include "base/http/server.h"
#include "base/logger.h" #include "base/logger.h"
#include "base/net/dnsupdater.h" #include "base/net/dnsupdater.h"
@ -39,16 +35,18 @@
#include "base/preferences.h" #include "base/preferences.h"
#include "webapplication.h" #include "webapplication.h"
WebUI::WebUI(QObject *parent) WebUI::WebUI()
: QObject(parent) : m_isErrored(false)
, m_port(0) , m_port(0)
{ {
init(); configure();
connect(Preferences::instance(), SIGNAL(changed()), SLOT(init())); connect(Preferences::instance(), &Preferences::changed, this, &WebUI::configure);
} }
void WebUI::init() void WebUI::configure()
{ {
m_isErrored = false; // clear previous error state
Logger *const logger = Logger::instance(); Logger *const logger = Logger::instance();
Preferences *const pref = Preferences::instance(); Preferences *const pref = Preferences::instance();
@ -105,10 +103,10 @@ void WebUI::init()
const QString errorMsg = tr("Web UI: Unable to bind to IP: %1, port: %2. Reason: %3") const QString errorMsg = tr("Web UI: Unable to bind to IP: %1, port: %2. Reason: %3")
.arg(serverAddressString).arg(m_port).arg(m_httpServer->errorString()); .arg(serverAddressString).arg(m_port).arg(m_httpServer->errorString());
logger->addMessage(errorMsg, Log::CRITICAL); logger->addMessage(errorMsg, Log::CRITICAL);
#ifdef DISABLE_GUI
qCritical() << errorMsg; qCritical() << errorMsg;
QCoreApplication::exit(1);
#endif m_isErrored = true;
emit fatalError();
} }
} }
@ -137,3 +135,8 @@ void WebUI::init()
delete m_dnsUpdater; delete m_dnsUpdater;
} }
} }
bool WebUI::isErrored() const
{
return m_isErrored;
}

11
src/webui/webui.h

@ -47,14 +47,21 @@ class AbstractWebApplication;
class WebUI : public QObject class WebUI : public QObject
{ {
Q_OBJECT Q_OBJECT
Q_DISABLE_COPY(WebUI)
public: public:
explicit WebUI(QObject *parent = 0); WebUI();
bool isErrored() const;
signals:
void fatalError();
private slots: private slots:
void init(); void configure();
private: private:
bool m_isErrored;
QPointer<Http::Server> m_httpServer; QPointer<Http::Server> m_httpServer;
QPointer<Net::DNSUpdater> m_dnsUpdater; QPointer<Net::DNSUpdater> m_dnsUpdater;
QPointer<AbstractWebApplication> m_webapp; QPointer<AbstractWebApplication> m_webapp;

Loading…
Cancel
Save