diff options
| author | Kevin Smith <git@kismith.co.uk> | 2012-03-14 13:12:24 (GMT) | 
|---|---|---|
| committer | Kevin Smith <git@kismith.co.uk> | 2012-03-14 13:24:44 (GMT) | 
| commit | f90fce80371ac12d97c6adc65a9437e4a3a7b268 (patch) | |
| tree | 9e277bc46ae0a0cf3e54aa252d1a5c630e35ec83 | |
| parent | 1089374439fa6073800679817198e3c39283113e (diff) | |
| download | swift-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.h | 3 | ||||
| -rw-r--r-- | SwifTools/Notifier/LoggingNotifier.h | 2 | ||||
| -rw-r--r-- | SwifTools/Notifier/Notifier.h | 3 | ||||
| -rw-r--r-- | SwifTools/Notifier/NullNotifier.h | 1 | ||||
| -rw-r--r-- | SwifTools/Notifier/SnarlNotifier.h | 4 | ||||
| -rw-r--r-- | SwifTools/Notifier/TogglableNotifier.h | 4 | ||||
| -rw-r--r-- | Swift/Controllers/EventNotifier.cpp | 1 | ||||
| -rw-r--r-- | Swift/QtUI/WindowsNotifier.cpp | 4 | ||||
| -rw-r--r-- | Swift/QtUI/WindowsNotifier.h | 3 | 
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;  	}; | 
 Swift
 Swift