summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Smith <git@kismith.co.uk>2012-03-14 13:12:24 (GMT)
committerKevin Smith <git@kismith.co.uk>2012-03-14 13:24:44 (GMT)
commitf90fce80371ac12d97c6adc65a9437e4a3a7b268 (patch)
tree9e277bc46ae0a0cf3e54aa252d1a5c630e35ec83
parent1089374439fa6073800679817198e3c39283113e (diff)
downloadswift-contrib-f90fce80371ac12d97c6adc65a9437e4a3a7b268.zip
swift-contrib-f90fce80371ac12d97c6adc65a9437e4a3a7b268.tar.bz2
Dispose of notification callbacks once the account signs out.
Fixes segfaults caused by clicking notifications after the handlers had been freed. Does not fix GrowlNotifier, which needs fixing later.
-rw-r--r--SwifTools/Notifier/GrowlNotifier.h3
-rw-r--r--SwifTools/Notifier/LoggingNotifier.h2
-rw-r--r--SwifTools/Notifier/Notifier.h3
-rw-r--r--SwifTools/Notifier/NullNotifier.h1
-rw-r--r--SwifTools/Notifier/SnarlNotifier.h4
-rw-r--r--SwifTools/Notifier/TogglableNotifier.h4
-rw-r--r--Swift/Controllers/EventNotifier.cpp1
-rw-r--r--Swift/QtUI/WindowsNotifier.cpp4
-rw-r--r--Swift/QtUI/WindowsNotifier.h3
9 files changed, 24 insertions, 1 deletions
diff --git a/SwifTools/Notifier/GrowlNotifier.h b/SwifTools/Notifier/GrowlNotifier.h
index f4e6803..f1fb8c6 100644
--- a/SwifTools/Notifier/GrowlNotifier.h
+++ b/SwifTools/Notifier/GrowlNotifier.h
@@ -23,14 +23,17 @@ namespace Swift {
~GrowlNotifier();
virtual void showMessage(Type type, const std::string& subject, const std::string& description, const boost::filesystem::path& picture, boost::function<void()> callback);
virtual bool isExternallyConfigured() const;
// Called by the delegate. Don't call.
void handleNotificationClicked(void* data);
void handleNotificationTimedOut(void* data);
+ virtual void purgeCallbacks() {
+#warning FIXME: Implement
+ }
private:
class Private;
boost::shared_ptr<Private> p;
};
}
diff --git a/SwifTools/Notifier/LoggingNotifier.h b/SwifTools/Notifier/LoggingNotifier.h
index 32e0610..3d62593 100644
--- a/SwifTools/Notifier/LoggingNotifier.h
+++ b/SwifTools/Notifier/LoggingNotifier.h
@@ -19,12 +19,14 @@ namespace Swift {
struct Notification {
Notification(Type type, const std::string& subject, const std::string& description, const boost::filesystem::path& picture, boost::function<void()> callback) : type(type), subject(subject), description(description), picture(picture), callback(callback) {}
Type type;
std::string subject;
std::string description;
boost::filesystem::path picture;
boost::function<void()> callback;
};
+ virtual void purgeCallbacks() {}
+
std::vector<Notification> notifications;
};
}
diff --git a/SwifTools/Notifier/Notifier.h b/SwifTools/Notifier/Notifier.h
index 1bcd58d..9537ec1 100644
--- a/SwifTools/Notifier/Notifier.h
+++ b/SwifTools/Notifier/Notifier.h
@@ -30,18 +30,21 @@ namespace Swift {
virtual bool isAvailable() const {
return true;
}
virtual bool isExternallyConfigured() const {
return false;
}
+ /** Remove any pending callbacks. */
+ virtual void purgeCallbacks() = 0;
+
protected:
std::string typeToString(Type type);
static std::vector<Type> getAllTypes();
static std::vector<Type> getDefaultTypes();
static const int DEFAULT_STATUS_NOTIFICATION_TIMEOUT_SECONDS;
static const int DEFAULT_MESSAGE_NOTIFICATION_TIMEOUT_SECONDS;
};
}
diff --git a/SwifTools/Notifier/NullNotifier.h b/SwifTools/Notifier/NullNotifier.h
index 2fa9c11..576dd85 100644
--- a/SwifTools/Notifier/NullNotifier.h
+++ b/SwifTools/Notifier/NullNotifier.h
@@ -7,11 +7,12 @@
#pragma once
#include <SwifTools/Notifier/Notifier.h>
namespace Swift {
class NullNotifier : public Notifier {
public:
virtual void showMessage(Type, const std::string&, const std::string&, const boost::filesystem::path&, boost::function<void()>) {
}
+ virtual void purgeCallbacks() {
};
}
diff --git a/SwifTools/Notifier/SnarlNotifier.h b/SwifTools/Notifier/SnarlNotifier.h
index c96dfa6..eb0eb5a 100644
--- a/SwifTools/Notifier/SnarlNotifier.h
+++ b/SwifTools/Notifier/SnarlNotifier.h
@@ -16,18 +16,22 @@ namespace Swift {
class SnarlNotifier : public Notifier {
public:
SnarlNotifier(const std::string& name, Win32NotifierWindow* window, const boost::filesystem::path& icon);
~SnarlNotifier();
virtual void showMessage(Type type, const std::string& subject, const std::string& description, const boost::filesystem::path& picture, boost::function<void()> callback);
virtual bool isAvailable() const;
+ virtual void purgeCallbacks() {
+ notifications.clear();
+ }
+
private:
void handleMessageReceived(MSG* message);
private:
Snarl::V41::SnarlInterface snarl;
Win32NotifierWindow* window;
bool available;
typedef std::map<int, boost::function<void()> > NotificationsMap;
NotificationsMap notifications;
diff --git a/SwifTools/Notifier/TogglableNotifier.h b/SwifTools/Notifier/TogglableNotifier.h
index 7abfd42..a4f0bb6 100644
--- a/SwifTools/Notifier/TogglableNotifier.h
+++ b/SwifTools/Notifier/TogglableNotifier.h
@@ -44,15 +44,19 @@ namespace Swift {
if (getCurrentlyEnabled() || notifier->isExternallyConfigured()) {
notifier->showMessage(type, subject, description, picture, callback);
}
}
virtual bool isExternallyConfigured() const {
return notifier->isExternallyConfigured();
}
+ virtual void purgeCallbacks() {
+ notifier->purgeCallbacks();
+ }
+
private:
Notifier* notifier;
bool persistentEnabled;
bool temporarilyDisabled;
};
}
diff --git a/Swift/Controllers/EventNotifier.cpp b/Swift/Controllers/EventNotifier.cpp
index 7ecc27c..e643ab3 100644
--- a/Swift/Controllers/EventNotifier.cpp
+++ b/Swift/Controllers/EventNotifier.cpp
@@ -21,18 +21,19 @@
#include "Swift/Controllers/Settings/SettingsProvider.h"
namespace Swift {
EventNotifier::EventNotifier(EventController* eventController, Notifier* notifier, AvatarManager* avatarManager, NickResolver* nickResolver) : eventController(eventController), notifier(notifier), avatarManager(avatarManager), nickResolver(nickResolver) {
eventController->onEventQueueEventAdded.connect(boost::bind(&EventNotifier::handleEventAdded, this, _1));
}
EventNotifier::~EventNotifier() {
+ notifier->purgeCallbacks();
eventController->onEventQueueEventAdded.disconnect(boost::bind(&EventNotifier::handleEventAdded, this, _1));
}
void EventNotifier::handleEventAdded(boost::shared_ptr<StanzaEvent> event) {
if (event->getConcluded()) {
return;
}
if (boost::shared_ptr<MessageEvent> messageEvent = boost::dynamic_pointer_cast<MessageEvent>(event)) {
JID jid = messageEvent->getStanza()->getFrom();
diff --git a/Swift/QtUI/WindowsNotifier.cpp b/Swift/QtUI/WindowsNotifier.cpp
index 1789451..212f0ca 100644
--- a/Swift/QtUI/WindowsNotifier.cpp
+++ b/Swift/QtUI/WindowsNotifier.cpp
@@ -41,10 +41,14 @@ void WindowsNotifier::showMessage(Type type, const std::string& subject, const s
tray->showMessage(P2QSTRING(subject), P2QSTRING(description), type == SystemMessage ? QSystemTrayIcon::Information : QSystemTrayIcon::NoIcon, timeout * 1000);
}
void WindowsNotifier::handleMessageClicked() {
if (lastCallback) {
lastCallback();
}
}
+void WindowsNotifier::purgeCallbacks() {
+ lastCallback = boost::function<void()>();
+}
+
}
diff --git a/Swift/QtUI/WindowsNotifier.h b/Swift/QtUI/WindowsNotifier.h
index 062b76f..b2b5577 100644
--- a/Swift/QtUI/WindowsNotifier.h
+++ b/Swift/QtUI/WindowsNotifier.h
@@ -17,19 +17,20 @@ class QSystemTrayIcon;
namespace Swift {
class WindowsNotifier : public QObject, public Notifier {
Q_OBJECT
public:
WindowsNotifier(const std::string& name, const boost::filesystem::path& icon, QSystemTrayIcon* tray);
~WindowsNotifier();
virtual void showMessage(Type type, const std::string& subject, const std::string& description, const boost::filesystem::path& picture, boost::function<void()> callback);
-
+ virtual void purgeCallbacks();
+
private slots:
void handleMessageClicked();
private:
QSystemTrayIcon* tray;
Win32NotifierWindow* notifierWindow;
SnarlNotifier* snarlNotifier;
boost::function<void()> lastCallback;
};