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 /SwifTools
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.
Diffstat (limited to 'SwifTools')
-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
6 files changed, 17 insertions, 0 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
@@ -1,36 +1,39 @@
/*
* Copyright (c) 2010-2011 Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
*/
#pragma once
#include <boost/filesystem/fstream.hpp>
#include <SwifTools/Notifier/Notifier.h>
namespace Swift {
/**
* Preconditions for using growlnotifier:
* - Must be part a bundle.
* - The Carbon/Cocoa application loop must be running (e.g. through QApplication)
* such that notifications are coming through.
*/
class GrowlNotifier : public Notifier {
public:
GrowlNotifier(const std::string& name);
~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
@@ -1,30 +1,32 @@
/*
* Copyright (c) 2010 Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
*/
#pragma once
#include <SwifTools/Notifier/Notifier.h>
#include <Swiften/Base/ByteArray.h>
namespace Swift {
class LoggingNotifier : public Notifier {
public:
virtual void showMessage(Type type, const std::string& subject, const std::string& description, const boost::filesystem::path& picture, boost::function<void()> callback) {
notifications.push_back(Notification(type, subject, description, picture, callback));
}
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
@@ -4,44 +4,47 @@
* See Documentation/Licenses/GPLv3.txt for more information.
*/
#pragma once
#include <boost/function.hpp>
#include <boost/filesystem/path.hpp>
#include <string>
#include <vector>
namespace Swift {
class Notifier {
public:
virtual ~Notifier();
enum Type { ContactAvailable, ContactUnavailable, ContactStatusChange, IncomingMessage, SystemMessage };
/**
* Picture is a PNG image.
*/
virtual void showMessage(
Type type,
const std::string& subject,
const std::string& description,
const boost::filesystem::path& picture,
boost::function<void()> callback) = 0;
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
@@ -1,17 +1,18 @@
/*
* Copyright (c) 2010 Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
*/
#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
@@ -1,35 +1,39 @@
/*
* Copyright (c) 2010 Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
*/
#pragma once
#include <map>
#include <SwifTools/Notifier/Notifier.h>
#include <SnarlInterface.h>
namespace Swift {
class Win32NotifierWindow;
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
@@ -18,41 +18,45 @@ namespace Swift {
* Set a long-term (usually user-set) enabled.
* This may be temporarily overriden by the application, e.g. if the
* user is marked DND.
*/
void setPersistentEnabled(bool b) {
persistentEnabled = b;
}
/**
* Set a temporary override to stop notifications without changing the
* long-term state. e.g. if the user goes DND, but the persistent
* enabled shouldn't be lost when they become available again.
*/
void setTemporarilyDisabled(bool b) {
temporarilyDisabled = b;
}
/**
* Get the result of applying the temporary override to the persistent
* enabledness.
*/
bool getCurrentlyEnabled() const {
return persistentEnabled && !temporarilyDisabled;
}
virtual void showMessage(Type type, const std::string& subject, const std::string& description, const boost::filesystem::path& picture, boost::function<void()> callback) {
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;
};
}