From 49a1f21e61006aa5568458940c8659cee4838b71 Mon Sep 17 00:00:00 2001 From: Patrick von Reth Date: Wed, 15 Jul 2015 18:11:09 +0200 Subject: [PATCH] improve plugin loading/error handling --- src/libsnore/plugins/plugincontainer.cpp | 1 - src/libsnore/plugins/plugins.cpp | 33 ++++++++-------- src/libsnore/plugins/plugins.h | 31 +++++++++++---- src/libsnore/settingsdialog.cpp | 31 +++++++++++---- src/libsnore/settingsdialog.h | 1 + src/libsnore/settingsdialog.ui | 14 +++++++ src/libsnore/snore.cpp | 14 +------ src/libsnore/snore.h | 10 +++++ src/libsnore/snore_p.cpp | 15 ++++---- src/libsnore/snore_p.h | 3 +- .../freedesktopnotification_backend.cpp | 19 ++++------ .../freedesktopnotification_backend.h | 3 -- src/plugins/backends/growl/growlbackend.cpp | 8 +++- src/plugins/backends/growl/growlbackend.h | 4 +- .../osxnotificationcenter.h | 3 -- .../osxnotificationcenter.mm | 5 --- src/plugins/backends/snarl/snarl.cpp | 18 +++++---- src/plugins/backends/snarl/snarl.h | 5 +-- src/plugins/backends/snore/snorenotifier.cpp | 38 +++++++++---------- src/plugins/backends/snore/snorenotifier.h | 4 -- .../backends/snoretoast/snoretoast.cpp | 11 +++--- src/plugins/backends/snoretoast/snoretoast.h | 4 +- .../backends/trayicon/trayiconnotifer.cpp | 7 ++-- .../backends/trayicon/trayiconnotifer.h | 5 +-- .../freedesktopnotificationfrontend.cpp | 12 +----- .../freedesktopnotificationfrontend.h | 3 -- .../frontends/pushover/pushover_frontend.cpp | 5 --- .../frontends/pushover/pushover_frontend.h | 3 -- .../frontends/snarlnetwork/snarlnetwork.cpp | 19 +++------- .../frontends/snarlnetwork/snarlnetwork.h | 1 - src/plugins/secondary_backends/nma/nma.cpp | 5 --- src/plugins/secondary_backends/nma/nma.h | 3 -- .../secondary_backends/pushover/pushover.cpp | 5 --- .../secondary_backends/pushover/pushover.h | 3 -- .../secondary_backends/sound/sound.cpp | 7 +--- src/plugins/secondary_backends/sound/sound.h | 3 -- .../secondary_backends/toasty/toasty.cpp | 5 --- .../secondary_backends/toasty/toasty.h | 3 -- 38 files changed, 163 insertions(+), 201 deletions(-) diff --git a/src/libsnore/plugins/plugincontainer.cpp b/src/libsnore/plugins/plugincontainer.cpp index 8e2b15f..4e53d81 100644 --- a/src/libsnore/plugins/plugincontainer.cpp +++ b/src/libsnore/plugins/plugincontainer.cpp @@ -56,7 +56,6 @@ SnorePlugin *PluginContainer::load() m_plugin = qobject_cast (m_loader.instance()); m_plugin->m_container = this; m_plugin->setDefaultSettings(); - QMetaObject::invokeMethod(m_plugin, "load", Qt::QueuedConnection); } return m_plugin; } diff --git a/src/libsnore/plugins/plugins.cpp b/src/libsnore/plugins/plugins.cpp index 3529514..10597a7 100644 --- a/src/libsnore/plugins/plugins.cpp +++ b/src/libsnore/plugins/plugins.cpp @@ -35,14 +35,6 @@ SnorePlugin::SnorePlugin() if (thread() != qApp->thread()) { snoreDebug(SNORE_WARNING) << "Plugin initialized in wrong thread."; } - connect(this, &SnorePlugin::loadedStateChanged, [this](bool b) { - snoreDebug(SNORE_DEBUG) << "Plugin:" << name() << "initialized" << b; - Q_ASSERT_X(!(b && m_initialized), Q_FUNC_INFO, "Plugin initialized multiple times."); - if (!b) { - disable(); - } - m_initialized = b; - }); } SnorePlugin::~SnorePlugin() @@ -50,11 +42,6 @@ SnorePlugin::~SnorePlugin() snoreDebug(SNORE_DEBUG) << name() << this << "deleted"; } -bool SnorePlugin::isLoaded() const -{ - return m_initialized; -} - bool SnorePlugin::isEnabled() const { return m_enabled; @@ -106,6 +93,16 @@ const QString SnorePlugin::typeName() const return SnorePlugin::typeToString(type()); } +bool SnorePlugin::isReady() +{ + return m_error.isEmpty(); +} + +QString SnorePlugin::errorString() const +{ + return m_error; +} + QString SnorePlugin::settingsVersion() const { return QLatin1String("v1"); @@ -116,10 +113,16 @@ void SnorePlugin::setDefaultSettings() setDefaultSettingsValue(QLatin1String("Enabled"), false, LOCAL_SETTING); } +void SnorePlugin::setErrorString(const QString &_error) +{ + m_error = name() + tr(" encountered an error: ") + _error; + snoreDebug(SNORE_WARNING) << m_error; + disable(); + emit error(_error); +} + void SnorePlugin::setEnabled(bool enabled) { - Q_ASSERT_X(!enabled || isLoaded(), Q_FUNC_INFO, "Plugin not initialized"); - if (enabled != m_enabled) { emit enabledChanged(enabled); } diff --git a/src/libsnore/plugins/plugins.h b/src/libsnore/plugins/plugins.h index 4ad01ee..bf95af0 100644 --- a/src/libsnore/plugins/plugins.h +++ b/src/libsnore/plugins/plugins.h @@ -53,13 +53,24 @@ public: SnorePlugin(); virtual ~SnorePlugin(); + /** + * Sets the enabled state of the plugin to @param enabled. + */ void setEnabled(bool enabled); + /** + * Enables the plugin. + */ void enable(); + + /** + * Disables the plugin. + */ void disable(); - bool isLoaded() const; - + /** + * Returns whether the Plugin is enabled. + */ bool isEnabled() const; /** @@ -77,6 +88,13 @@ public: */ const QString typeName() const; + virtual bool isReady(); + + /** + * Returns the error string or an empty string. + */ + QString errorString() const; + QVariant settingsValue(const QString &key, SettingsType type = GLOBAL_SETTING) const; void setSettingsValue(const QString &key, const QVariant &settingsValue, SettingsType type = GLOBAL_SETTING); void setDefaultSettingsValue(const QString &key, const QVariant &settingsValue, SettingsType type = GLOBAL_SETTING); @@ -84,11 +102,8 @@ public: virtual PluginSettingsWidget *settingsWidget(); Q_SIGNALS: - void loadedStateChanged(bool loaded); void enabledChanged(bool enabled); - -private Q_SLOTS: - virtual void load() = 0; + void error(const QString &error); protected: /** @@ -101,13 +116,15 @@ protected: */ virtual void setDefaultSettings(); + void setErrorString(const QString &error); + private: QString normaliseKey(const QString &key) const; void setDefaultSettingsPlugin(); - bool m_initialized = false; bool m_enabled = false; PluginContainer *m_container = nullptr; + QString m_error; friend class PluginContainer; diff --git a/src/libsnore/settingsdialog.cpp b/src/libsnore/settingsdialog.cpp index ef0805d..addf5d4 100644 --- a/src/libsnore/settingsdialog.cpp +++ b/src/libsnore/settingsdialog.cpp @@ -69,9 +69,19 @@ void SettingsDialog::initTabs() addWidgets(ui->tabWidget_secondary_backends, ui->tab_secondaryBackends, SnorePlugin::SECONDARY_BACKEND); addWidgets(ui->tabWidget_frontends, ui->tab_frontends, SnorePlugin::FRONTEND); addWidgets(ui->tabWidget_plugins, ui->tab_plugins, SnorePlugin::PLUGIN); + + ui->errorLabel->setVisible(false); + ui->errorLineEdit->setVisible(false); + + connect(&SnoreCore::instance(), &SnoreCore::prmaryNotificationBackendChanged, this, &SettingsDialog::loadPrimaryBackendBox); + connect(&SnoreCore::instance(), &SnoreCore::prmaryNotificationBackendError, [this](const QString & error) { + ui->errorLabel->setVisible(true); + ui->errorLineEdit->setVisible(true); + ui->errorLineEdit->setText(error); + }); } -void Snore::SettingsDialog::on_pushButton_clicked() +void SettingsDialog::on_pushButton_clicked() { SnoreCore::instance().displayExapleNotification(); } @@ -79,22 +89,27 @@ void Snore::SettingsDialog::on_pushButton_clicked() void SettingsDialog::load() { snoreDebug(SNORE_DEBUG) << "loading"; + loadPrimaryBackendBox(SnoreCore::instance().settingsValue(QLatin1String("PrimaryBackend"), LOCAL_SETTING).toString()); + ui->timeoutSpinBox->setValue(SnoreCore::instance().settingsValue(QLatin1String("Timeout"), LOCAL_SETTING).toInt()); + ui->disableNotificationSoundCheckBox->setChecked(SnoreCore::instance().settingsValue(QLatin1String("Silent"), LOCAL_SETTING).toBool()); + for (auto widget : m_tabs) { + widget->loadSettings(); + } +} + +void SettingsDialog::loadPrimaryBackendBox(const QString &backend) +{ if (SnoreCore::instance().settingsValue(QLatin1String("PluginTypes"), LOCAL_SETTING).value() & SnorePlugin::BACKEND) { ui->primaryBackendComboBox->clear(); QStringList list = SnoreCore::instance().pluginNames(SnorePlugin::BACKEND); ui->primaryBackendComboBox->addItems(list); - ui->primaryBackendComboBox->setCurrentIndex(list.indexOf(SnoreCore::instance().settingsValue(QLatin1String("PrimaryBackend"), LOCAL_SETTING).toString())); + ui->primaryBackendComboBox->setCurrentIndex(list.indexOf(backend)); ui->primaryBackendComboBox->setVisible(true); ui->primaryBackendLabel->setVisible(true); } else { ui->primaryBackendComboBox->setVisible(false); ui->primaryBackendLabel->setVisible(false); } - ui->timeoutSpinBox->setValue(SnoreCore::instance().settingsValue(QLatin1String("Timeout"), LOCAL_SETTING).toInt()); - ui->disableNotificationSoundCheckBox->setChecked(SnoreCore::instance().settingsValue(QLatin1String("Silent"), LOCAL_SETTING).toBool()); - for (auto widget : m_tabs) { - widget->loadSettings(); - } } void SettingsDialog::save() @@ -114,7 +129,7 @@ void SettingsDialog::save() SnoreCore::instance().setSettingsValue(QLatin1String("Silent"), ui->disableNotificationSoundCheckBox->isChecked(), LOCAL_SETTING); if (dirty) { - QMetaObject::invokeMethod(SnoreCorePrivate::instance(), "slotSyncSettings", Qt::QueuedConnection); + SnoreCorePrivate::instance()->syncSettings(); } } diff --git a/src/libsnore/settingsdialog.h b/src/libsnore/settingsdialog.h index 1f41795..7e776c5 100644 --- a/src/libsnore/settingsdialog.h +++ b/src/libsnore/settingsdialog.h @@ -71,6 +71,7 @@ public Q_SLOTS: private Q_SLOTS: void on_pushButton_clicked(); void load(); + void loadPrimaryBackendBox(const QString &backend); void save(); private: diff --git a/src/libsnore/settingsdialog.ui b/src/libsnore/settingsdialog.ui index 991cc41..be61dcc 100644 --- a/src/libsnore/settingsdialog.ui +++ b/src/libsnore/settingsdialog.ui @@ -73,6 +73,20 @@ + + + + Error: + + + + + + + false + + + diff --git a/src/libsnore/snore.cpp b/src/libsnore/snore.cpp index 4fbd714..125ce1d 100644 --- a/src/libsnore/snore.cpp +++ b/src/libsnore/snore.cpp @@ -84,25 +84,13 @@ void SnoreCore::loadPlugins(SnorePlugin::PluginTypes types) case SnorePlugin::SECONDARY_BACKEND: case SnorePlugin::FRONTEND: case SnorePlugin::PLUGIN: - connect(plugin, &SnorePlugin::loadedStateChanged, [plugin](bool initialized) { - if (initialized) { - plugin->setEnabled(plugin->settingsValue(QLatin1String("Enabled"), LOCAL_SETTING).toBool()); - } - }); + plugin->setEnabled(plugin->settingsValue(QLatin1String("Enabled"), LOCAL_SETTING).toBool()); break; default: snoreDebug(SNORE_WARNING) << "Plugin Cache corrupted\n" << info->file() << info->type(); continue; } - connect(plugin, &SnorePlugin::loadedStateChanged, [d, plugin](bool initialized) { - if (!initialized) { - //TODO: improve - d->m_pluginNames[plugin->type()].removeAll(plugin->name()); - d->m_plugins.remove(qMakePair(plugin->type(), plugin->name())); - } - }); - snoreDebug(SNORE_DEBUG) << info->name() << "is a" << info->type(); d->m_pluginNames[info->type()].append(info->name()); auto key = qMakePair(type, info->name()); diff --git a/src/libsnore/snore.h b/src/libsnore/snore.h index 49e4be2..539dadd 100644 --- a/src/libsnore/snore.h +++ b/src/libsnore/snore.h @@ -166,6 +166,16 @@ Q_SIGNALS: */ void notificationClosed(Snore::Notification); + /** + * This signal is emited in case the Primary backend encountered an error. + */ + void prmaryNotificationBackendError(const QString &error); + + /** + * This signal is emited in case the Primary backend changed. + */ + void prmaryNotificationBackendChanged(const QString &erro); + private: SnoreCore(QObject *parent); SnoreCorePrivate *d_ptr; diff --git a/src/libsnore/snore_p.cpp b/src/libsnore/snore_p.cpp index 5b9bd09..a4ea8c5 100644 --- a/src/libsnore/snore_p.cpp +++ b/src/libsnore/snore_p.cpp @@ -86,8 +86,10 @@ bool SnoreCorePrivate::setBackendIfAvailible(const QString &backend) } snoreDebug(SNORE_DEBUG) << "Setting Notification Backend to:" << backend; SnoreBackend *b = qobject_cast(backends.value(backend)->load()); - if (!b->isLoaded()) { - snoreDebug(SNORE_DEBUG) << "Failed to initialize" << b->name(); + if (!b->isReady()) { + snoreDebug(SNORE_DEBUG) << "Backend not ready:" << b->errorString(); + + emit q->prmaryNotificationBackendError(b->errorString()); return false; } if (m_notificationBackend) { @@ -97,11 +99,10 @@ bool SnoreCorePrivate::setBackendIfAvailible(const QString &backend) m_notificationBackend->enable(); q->setSettingsValue(QLatin1String("PrimaryBackend"), backend, LOCAL_SETTING); - connect(b, &SnoreBackend::loadedStateChanged, [this, b](bool initialized) { - if (!initialized) { - slotInitPrimaryNotificationBackend(); - } + connect(b, &SnoreBackend::error, [this, b](const QString &) { + slotInitPrimaryNotificationBackend(); }); + emit q->prmaryNotificationBackendChanged(b->name()); return true; } return false; @@ -159,7 +160,7 @@ void SnoreCorePrivate::setDefaultSettingsValueIntern(const QString &key, const Q } } -void SnoreCorePrivate::slotSyncSettings() +void SnoreCorePrivate::syncSettings() { Q_Q(SnoreCore); QString newBackend = q->settingsValue(QLatin1String("PrimaryBackend"), LOCAL_SETTING).toString(); diff --git a/src/libsnore/snore_p.h b/src/libsnore/snore_p.h index a53e322..3d23fc0 100644 --- a/src/libsnore/snore_p.h +++ b/src/libsnore/snore_p.h @@ -71,6 +71,7 @@ public: void startNotificationTimeoutTimer(Notification notification); + void syncSettings(); private Q_SLOTS: //TODO: find a better solutinon for the slots in this section friend class Snore::SnoreBackend; @@ -79,8 +80,6 @@ private Q_SLOTS: void slotNotificationClosed(Snore::Notification); void slotAboutToQuit(); - void slotSyncSettings(); - bool slotInitPrimaryNotificationBackend(); Q_SIGNALS: diff --git a/src/plugins/backends/freedesktop/freedesktopnotification_backend.cpp b/src/plugins/backends/freedesktop/freedesktopnotification_backend.cpp index 5e89867..2b27fbf 100644 --- a/src/plugins/backends/freedesktop/freedesktopnotification_backend.cpp +++ b/src/plugins/backends/freedesktop/freedesktopnotification_backend.cpp @@ -12,6 +12,13 @@ using namespace Snore; FreedesktopBackend::FreedesktopBackend() { + m_interface = new org::freedesktop::Notifications(QLatin1String("org.freedesktop.Notifications"), + QLatin1String("/org/freedesktop/Notifications"), + QDBusConnection::sessionBus(), this); + QDBusPendingReply reply = m_interface->GetCapabilities(); + reply.waitForFinished(); + QStringList caps = reply.value(); + m_supportsRichtext = caps.contains(QLatin1String("body-markup")); connect(this, &SnoreSecondaryBackend::enabledChanged, [this](bool enabled) { if (enabled) { connect(m_interface, &org::freedesktop::Notifications::ActionInvoked, this, &FreedesktopBackend::slotActionInvoked); @@ -24,18 +31,6 @@ FreedesktopBackend::FreedesktopBackend() }); } -void FreedesktopBackend::load() -{ - m_interface = new org::freedesktop::Notifications(QLatin1String("org.freedesktop.Notifications"), - QLatin1String("/org/freedesktop/Notifications"), - QDBusConnection::sessionBus(), this); - QDBusPendingReply reply = m_interface->GetCapabilities(); - reply.waitForFinished(); - QStringList caps = reply.value(); - m_supportsRichtext = caps.contains(QLatin1String("body-markup")); - emit loadedStateChanged(true); -} - bool FreedesktopBackend::canCloseNotification() const { return true; diff --git a/src/plugins/backends/freedesktop/freedesktopnotification_backend.h b/src/plugins/backends/freedesktop/freedesktopnotification_backend.h index c317d77..e4510cd 100644 --- a/src/plugins/backends/freedesktop/freedesktopnotification_backend.h +++ b/src/plugins/backends/freedesktop/freedesktopnotification_backend.h @@ -22,9 +22,6 @@ public Q_SLOTS: void slotActionInvoked(const uint &id, const QString &actionID); void slotNotificationClosed(const uint &id, const uint &reason); -private Q_SLOTS: - void load() override; - private: org::freedesktop::Notifications *m_interface; QHash m_dbusIdMap; diff --git a/src/plugins/backends/growl/growlbackend.cpp b/src/plugins/backends/growl/growlbackend.cpp index fdaf30d..aa11c72 100644 --- a/src/plugins/backends/growl/growlbackend.cpp +++ b/src/plugins/backends/growl/growlbackend.cpp @@ -63,9 +63,13 @@ GrowlBackend::~GrowlBackend() Growl::shutdown(); } -void GrowlBackend::load() +bool GrowlBackend::isReady() { - emit loadedStateChanged(Growl::isRunning(GROWL_TCP, settingsValue(QLatin1String("Host")).toString().toUtf8().constData())); + bool running = Growl::isRunning(GROWL_TCP, settingsValue(QLatin1String("Host")).toString().toUtf8().constData()); + if (!running) { + setErrorString(tr("Growl is not running.")); + } + return running; } void GrowlBackend::slotRegisterApplication(const Application &application) diff --git a/src/plugins/backends/growl/growlbackend.h b/src/plugins/backends/growl/growlbackend.h index 04578ce..8a9d76d 100644 --- a/src/plugins/backends/growl/growlbackend.h +++ b/src/plugins/backends/growl/growlbackend.h @@ -33,6 +33,7 @@ public: GrowlBackend(); ~GrowlBackend(); Snore::PluginSettingsWidget *settingsWidget() override; + bool isReady() override; protected: void setDefaultSettings() override; @@ -47,9 +48,6 @@ public Q_SLOTS: void slotDeregisterApplication(const Snore::Application &application) override; void slotNotify(Snore::Notification notification) override; -private Q_SLOTS: - void load() override; - }; #endif // GROWL_BACKEND_H diff --git a/src/plugins/backends/osxnotificationcenter/osxnotificationcenter.h b/src/plugins/backends/osxnotificationcenter/osxnotificationcenter.h index 37819a1..48f6690 100644 --- a/src/plugins/backends/osxnotificationcenter/osxnotificationcenter.h +++ b/src/plugins/backends/osxnotificationcenter/osxnotificationcenter.h @@ -33,9 +33,6 @@ public: public Q_SLOTS: void slotNotify(Snore::Notification notification) override; - -private Q_SLOTS: - void load() override; }; #endif // OSXNOTIFICATIONCENTER_H diff --git a/src/plugins/backends/osxnotificationcenter/osxnotificationcenter.mm b/src/plugins/backends/osxnotificationcenter/osxnotificationcenter.mm index 38e5e48..f9cc6bd 100644 --- a/src/plugins/backends/osxnotificationcenter/osxnotificationcenter.mm +++ b/src/plugins/backends/osxnotificationcenter/osxnotificationcenter.mm @@ -107,9 +107,4 @@ void OSXNotificationCenter::slotNotify(Snore::Notification notification) slotNotificationDisplayed(notification); } -void OSXNotificationCenter::load() -{ - emit loadedStateChanged(true); -} - diff --git a/src/plugins/backends/snarl/snarl.cpp b/src/plugins/backends/snarl/snarl.cpp index c5ef7b0..22cc65b 100644 --- a/src/plugins/backends/snarl/snarl.cpp +++ b/src/plugins/backends/snarl/snarl.cpp @@ -120,6 +120,7 @@ private: SnarlBackend::SnarlBackend(): m_eventLoop(new SnarlBackend::SnarlWidget(this)) { + } SnarlBackend::~SnarlBackend() @@ -127,14 +128,6 @@ SnarlBackend::~SnarlBackend() delete m_eventLoop; } -void SnarlBackend::load() -{ - - SnarlInterface *snarlInterface = new SnarlInterface(); - emit loadedStateChanged(snarlInterface->IsSnarlRunning()); - delete snarlInterface; -} - PluginSettingsWidget *SnarlBackend::settingsWidget() { return new SnarlSettings(this); @@ -150,6 +143,15 @@ bool SnarlBackend::canUpdateNotification() const return true; } +bool SnarlBackend::isReady() +{ + bool running = SnarlInterface::IsSnarlRunning(); + if (!running) { + setErrorString(tr("Snarl is not running.")); + } + return running; +} + void SnarlBackend::setDefaultSettings() { diff --git a/src/plugins/backends/snarl/snarl.h b/src/plugins/backends/snarl/snarl.h index e180376..bcef4ad 100644 --- a/src/plugins/backends/snarl/snarl.h +++ b/src/plugins/backends/snarl/snarl.h @@ -34,6 +34,8 @@ public: virtual bool canCloseNotification() const override; virtual bool canUpdateNotification() const override; + bool isReady() override; + protected: void setDefaultSettings() override; @@ -48,9 +50,6 @@ public Q_SLOTS: void slotNotify(Snore::Notification notification); void slotCloseNotification(Snore::Notification notification); -private Q_SLOTS: - void load() override; - private: QHash m_idMap; diff --git a/src/plugins/backends/snore/snorenotifier.cpp b/src/plugins/backends/snore/snorenotifier.cpp index 94f0d65..b74eb4d 100644 --- a/src/plugins/backends/snore/snorenotifier.cpp +++ b/src/plugins/backends/snore/snorenotifier.cpp @@ -30,6 +30,23 @@ SnoreNotifier::SnoreNotifier(): m_widgets(3), m_timer(new QTimer(this)) { + for (int i = 0; i < m_widgets.size(); ++i) { + NotifyWidget *w = new NotifyWidget(i, this); + m_widgets[i] = w; + connect(w, &NotifyWidget::dismissed, [this, w]() { + Notification notification = w->notification(); + closeNotification(notification, Notification::DISMISSED); + slotCloseNotification(notification); + }); + + connect(w, &NotifyWidget::invoked, [this, w]() { + Notification notification = w->notification(); + slotNotificationActionInvoked(notification); + closeNotification(notification, Notification::ACTIVATED); + slotCloseNotification(notification); + }); + } + m_timer->setInterval(500); connect(m_timer, &QTimer::timeout, [this]() { if (m_queue.isEmpty()) { @@ -105,27 +122,6 @@ void SnoreNotifier::slotCloseNotification(Snore::Notification notification) //the timer will show the next } -void SnoreNotifier::load() -{ - for (int i = 0; i < m_widgets.size(); ++i) { - NotifyWidget *w = new NotifyWidget(i, this); - m_widgets[i] = w; - connect(w, &NotifyWidget::dismissed, [this, w]() { - Notification notification = w->notification(); - closeNotification(notification, Notification::DISMISSED); - slotCloseNotification(notification); - }); - - connect(w, &NotifyWidget::invoked, [this, w]() { - Notification notification = w->notification(); - slotNotificationActionInvoked(notification); - closeNotification(notification, Notification::ACTIVATED); - slotCloseNotification(notification); - }); - } - emit loadedStateChanged(true); -} - bool SnoreNotifier::canCloseNotification() const { return true; diff --git a/src/plugins/backends/snore/snorenotifier.h b/src/plugins/backends/snore/snorenotifier.h index 0728b8b..c321f0d 100644 --- a/src/plugins/backends/snore/snorenotifier.h +++ b/src/plugins/backends/snore/snorenotifier.h @@ -44,11 +44,7 @@ public Q_SLOTS: virtual void slotNotify(Snore::Notification notification) override; virtual void slotCloseNotification(Snore::Notification notification) override; -private Q_SLOTS: - void load() override; - private: - QList m_queue; QVector m_widgets; QTimer *m_timer; diff --git a/src/plugins/backends/snoretoast/snoretoast.cpp b/src/plugins/backends/snoretoast/snoretoast.cpp index 5f6f2ae..f406a97 100644 --- a/src/plugins/backends/snoretoast/snoretoast.cpp +++ b/src/plugins/backends/snoretoast/snoretoast.cpp @@ -14,13 +14,13 @@ using namespace Snore; -void SnoreToast::load() +bool SnoreToast::isReady() { if (QSysInfo::windowsVersion() < QSysInfo::WV_WINDOWS8) { - snoreDebug(SNORE_DEBUG) << "SnoreToast does not work on windows" << QSysInfo::windowsVersion(); - emit loadedStateChanged(false); + setErrorString(name() + tr(" needs at least Windows 8 to run.")); + return false; } - emit loadedStateChanged(true); + return true; } bool SnoreToast::canCloseNotification() const @@ -129,12 +129,11 @@ QProcess *SnoreToast::createProcess(Notification noti) }); connect(p, static_cast(&QProcess::error), [this, p, noti](QProcess::ProcessError) { - snoreDebug(SNORE_WARNING) << "SnoreToasts seems to be broken:" << p->errorString(); + setErrorString(name() + tr("encoutered an error: ") + p->errorString()); snoreDebug(SNORE_DEBUG) << p->readAll(); if (noti.isValid()) { closeNotification(noti, Notification::NONE); } - emit loadedStateChanged(false); p->deleteLater(); }); connect(qApp, &QApplication::aboutToQuit, p, &QProcess::kill); diff --git a/src/plugins/backends/snoretoast/snoretoast.h b/src/plugins/backends/snoretoast/snoretoast.h index 4e0af21..b140d4e 100644 --- a/src/plugins/backends/snoretoast/snoretoast.h +++ b/src/plugins/backends/snoretoast/snoretoast.h @@ -15,14 +15,12 @@ public: virtual bool canCloseNotification() const override; + bool isReady() override; public Q_SLOTS: void slotNotify(Snore::Notification notification) override; void slotRegisterApplication(const Snore::Application &application) override; void slotCloseNotification(Snore::Notification notification) override; -private Q_SLOTS: - void load() override; - private: QString appId(const Snore::Application &application); diff --git a/src/plugins/backends/trayicon/trayiconnotifer.cpp b/src/plugins/backends/trayicon/trayiconnotifer.cpp index a1c510f..f07b639 100644 --- a/src/plugins/backends/trayicon/trayiconnotifer.cpp +++ b/src/plugins/backends/trayicon/trayiconnotifer.cpp @@ -6,10 +6,11 @@ #include using namespace Snore; -void TrayIconNotifer::load() +TrayIconNotifer::TrayIconNotifer() { - m_currentlyDisplaying = false; - emit loadedStateChanged(true); + connect(this, &TrayIconNotifer::enabledChanged, [this](bool) { + m_currentlyDisplaying = false; + }); } bool TrayIconNotifer::canCloseNotification() const diff --git a/src/plugins/backends/trayicon/trayiconnotifer.h b/src/plugins/backends/trayicon/trayiconnotifer.h index 1e16596..ecea63d 100644 --- a/src/plugins/backends/trayicon/trayiconnotifer.h +++ b/src/plugins/backends/trayicon/trayiconnotifer.h @@ -15,7 +15,7 @@ class TrayIconNotifer: public Snore::SnoreBackend Q_INTERFACES(Snore::SnoreBackend) Q_PLUGIN_METADATA(IID "org.Snore.NotificationBackend/1.0" FILE "plugin.json") public: - TrayIconNotifer() = default; + TrayIconNotifer(); ~TrayIconNotifer() = default; virtual bool canCloseNotification() const override; @@ -26,9 +26,6 @@ public Q_SLOTS: void slotRegisterApplication(const Snore::Application &application) override; void slotDeregisterApplication(const Snore::Application &application) override; -private Q_SLOTS: - void load() override; - private: QSystemTrayIcon *trayIcon(const Snore::Application &app); QList m_notificationQue; diff --git a/src/plugins/frontends/freedesktop/freedesktopnotificationfrontend.cpp b/src/plugins/frontends/freedesktop/freedesktopnotificationfrontend.cpp index 6af1e24..8343d6f 100644 --- a/src/plugins/frontends/freedesktop/freedesktopnotificationfrontend.cpp +++ b/src/plugins/frontends/freedesktop/freedesktopnotificationfrontend.cpp @@ -37,12 +37,10 @@ FreedesktopFrontend::FreedesktopFrontend() QDBusConnection dbus = QDBusConnection::sessionBus(); if (dbus.registerService(QLatin1String("org.freedesktop.Notifications"))) { if (!dbus.registerObject(QLatin1String("/org/freedesktop/Notifications"), this)) { - snoreDebug(SNORE_WARNING) << "Failed to initialize" << name() << "failed to register object"; - emit loadedStateChanged(false); + setErrorString(tr("Failed to register dbus object.")); } } else { - snoreDebug(SNORE_WARNING) << "Failed to initialize" << name() << "failed to register service"; - emit loadedStateChanged(false); + setErrorString(tr("Failed to register dbus service.")); } } else { QDBusConnection dbus = QDBusConnection::sessionBus(); @@ -54,14 +52,8 @@ FreedesktopFrontend::FreedesktopFrontend() }); } -void FreedesktopFrontend::load() -{ - emit loadedStateChanged(true); -} - void FreedesktopFrontend::slotActionInvoked(Notification notification) { - if (notification.isActiveIn(this)) { if (notification.actionInvoked().isValid()) { emit ActionInvoked(notification.id(), QString::number(notification.actionInvoked().id())); diff --git a/src/plugins/frontends/freedesktop/freedesktopnotificationfrontend.h b/src/plugins/frontends/freedesktop/freedesktopnotificationfrontend.h index a16f826..81f94bc 100644 --- a/src/plugins/frontends/freedesktop/freedesktopnotificationfrontend.h +++ b/src/plugins/frontends/freedesktop/freedesktopnotificationfrontend.h @@ -46,9 +46,6 @@ public Q_SLOTS: void slotActionInvoked(Snore::Notification notification) override; void slotNotificationClosed(Snore::Notification notification) override; -private Q_SLOTS: - void load() override; - private: Snore::Alert m_alert; NotificationsAdaptor *m_adaptor; diff --git a/src/plugins/frontends/pushover/pushover_frontend.cpp b/src/plugins/frontends/pushover/pushover_frontend.cpp index 6b6f057..f44239d 100644 --- a/src/plugins/frontends/pushover/pushover_frontend.cpp +++ b/src/plugins/frontends/pushover/pushover_frontend.cpp @@ -51,11 +51,6 @@ PushoverFrontend::PushoverFrontend() }); } -void PushoverFrontend::load() -{ - emit loadedStateChanged(true); -} - PluginSettingsWidget *PushoverFrontend::settingsWidget() { return new PushoverSettings(this); diff --git a/src/plugins/frontends/pushover/pushover_frontend.h b/src/plugins/frontends/pushover/pushover_frontend.h index 699a44f..c8dcff2 100644 --- a/src/plugins/frontends/pushover/pushover_frontend.h +++ b/src/plugins/frontends/pushover/pushover_frontend.h @@ -49,9 +49,6 @@ protected: public Q_SLOTS: void slotActionInvoked(Snore::Notification notification); -private Q_SLOTS: - void load() override; - Q_SIGNALS: void loggedInChanged(bool isLoggedIn); void error(QString error); diff --git a/src/plugins/frontends/snarlnetwork/snarlnetwork.cpp b/src/plugins/frontends/snarlnetwork/snarlnetwork.cpp index 33ef85f..b9ecc6f 100644 --- a/src/plugins/frontends/snarlnetwork/snarlnetwork.cpp +++ b/src/plugins/frontends/snarlnetwork/snarlnetwork.cpp @@ -32,9 +32,14 @@ SnarlNetworkFrontend::SnarlNetworkFrontend(): { connect(this, &SnarlNetworkFrontend::enabledChanged, [this](bool enabled) { if (enabled) { + tcpServer = new QTcpServer(this); + if (!tcpServer->listen(QHostAddress::Any, port)) { + setErrorString(tr("The port is already used by a different application.")); + return; + } connect(tcpServer, &QTcpServer::newConnection, this, SnarlNetworkFrontend::handleConnection); } else { - disconnect(tcpServer, &QTcpServer::newConnection, this, SnarlNetworkFrontend::handleConnection); + tcpServer->deleteLater(); } }); } @@ -44,18 +49,6 @@ SnarlNetworkFrontend::~SnarlNetworkFrontend() delete parser; } -void SnarlNetworkFrontend::load() -{ - tcpServer = new QTcpServer(this); - if (!tcpServer->listen(QHostAddress::Any, port)) { - snoreDebug(SNORE_DEBUG) << "The port is already used"; - emit loadedStateChanged(false); - } else { - std::cout << "The Snarl Network Protokoll is developed for Snarl " << std::endl; - } - emit loadedStateChanged(true); -} - void SnarlNetworkFrontend::slotActionInvoked(Snore::Notification notification) { diff --git a/src/plugins/frontends/snarlnetwork/snarlnetwork.h b/src/plugins/frontends/snarlnetwork/snarlnetwork.h index 3a085d5..1828ef0 100644 --- a/src/plugins/frontends/snarlnetwork/snarlnetwork.h +++ b/src/plugins/frontends/snarlnetwork/snarlnetwork.h @@ -43,7 +43,6 @@ public Q_SLOTS: void slotNotificationClosed(Snore::Notification notification) override; private Q_SLOTS: - void load() override; void handleConnection(); void handleMessages(); diff --git a/src/plugins/secondary_backends/nma/nma.cpp b/src/plugins/secondary_backends/nma/nma.cpp index 6343df0..dfb1ba5 100644 --- a/src/plugins/secondary_backends/nma/nma.cpp +++ b/src/plugins/secondary_backends/nma/nma.cpp @@ -59,11 +59,6 @@ void NotifyMyAndroid::slotNotify(Notification notification) } -void NotifyMyAndroid::load() -{ - emit loadedStateChanged(true); -} - PluginSettingsWidget *NotifyMyAndroid::settingsWidget() { return new NotifyMyAndroidSettings(this); diff --git a/src/plugins/secondary_backends/nma/nma.h b/src/plugins/secondary_backends/nma/nma.h index 0b285a0..8cbdaca 100644 --- a/src/plugins/secondary_backends/nma/nma.h +++ b/src/plugins/secondary_backends/nma/nma.h @@ -39,9 +39,6 @@ protected: public Q_SLOTS: void slotNotify(Snore::Notification notification) override; -private Q_SLOTS: - void load() override; - private: QNetworkAccessManager m_manager; diff --git a/src/plugins/secondary_backends/pushover/pushover.cpp b/src/plugins/secondary_backends/pushover/pushover.cpp index 10f8ed1..9ef5f0e 100644 --- a/src/plugins/secondary_backends/pushover/pushover.cpp +++ b/src/plugins/secondary_backends/pushover/pushover.cpp @@ -120,11 +120,6 @@ void Pushover::slotNotify(Notification notification) } -void Pushover::load() -{ - emit loadedStateChanged(true); -} - PluginSettingsWidget *Pushover::settingsWidget() { return new PushoverSettings(this); diff --git a/src/plugins/secondary_backends/pushover/pushover.h b/src/plugins/secondary_backends/pushover/pushover.h index b1d343f..4a0a9e4 100644 --- a/src/plugins/secondary_backends/pushover/pushover.h +++ b/src/plugins/secondary_backends/pushover/pushover.h @@ -39,9 +39,6 @@ protected: public Q_SLOTS: void slotNotify(Snore::Notification notification) override; -private Q_SLOTS: - void load() override; - private: QNetworkAccessManager m_manager; diff --git a/src/plugins/secondary_backends/sound/sound.cpp b/src/plugins/secondary_backends/sound/sound.cpp index d2482f2..181ac21 100644 --- a/src/plugins/secondary_backends/sound/sound.cpp +++ b/src/plugins/secondary_backends/sound/sound.cpp @@ -34,12 +34,6 @@ Sound::Sound(): }); } -void Sound::load() -{ - m_player->setVolume(settingsValue(QLatin1String("Volume")).toInt()); - emit loadedStateChanged(true); -} - PluginSettingsWidget *Sound::settingsWidget() { return new SoundSettings(this); @@ -56,6 +50,7 @@ void Sound::slotNotificationDisplayed(Snore::Notification notification) if (notification.hints().value("silent").toBool()) { return; } + m_player->setVolume(settingsValue(QLatin1String("Volume")).toInt()); QString sound = notification.hints().value("sound").toString(); if (sound.isEmpty()) { diff --git a/src/plugins/secondary_backends/sound/sound.h b/src/plugins/secondary_backends/sound/sound.h index f125457..c8a05df 100644 --- a/src/plugins/secondary_backends/sound/sound.h +++ b/src/plugins/secondary_backends/sound/sound.h @@ -39,9 +39,6 @@ protected: public Q_SLOTS: void slotNotificationDisplayed(Snore::Notification notification) override; -private Q_SLOTS: - void load() override; - private: QMediaPlayer *m_player; }; diff --git a/src/plugins/secondary_backends/toasty/toasty.cpp b/src/plugins/secondary_backends/toasty/toasty.cpp index 2064b68..e0557e4 100644 --- a/src/plugins/secondary_backends/toasty/toasty.cpp +++ b/src/plugins/secondary_backends/toasty/toasty.cpp @@ -77,11 +77,6 @@ void Toasty::slotNotify(Notification notification) } -void Toasty::load() -{ - emit loadedStateChanged(true); -} - PluginSettingsWidget *Toasty::settingsWidget() { return new ToastySettings(this); diff --git a/src/plugins/secondary_backends/toasty/toasty.h b/src/plugins/secondary_backends/toasty/toasty.h index 29dc12c..ea5690b 100644 --- a/src/plugins/secondary_backends/toasty/toasty.h +++ b/src/plugins/secondary_backends/toasty/toasty.h @@ -39,9 +39,6 @@ protected: public Q_SLOTS: void slotNotify(Snore::Notification notification) override; -private Q_SLOTS: - void load() override; - private: QNetworkAccessManager m_manager;