summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Smith <git@kismith.co.uk>2012-04-26 10:33:06 (GMT)
committerKevin Smith <git@kismith.co.uk>2012-04-26 10:33:06 (GMT)
commit9a34412bef9992d97d2d2094f5e42a3cc9470262 (patch)
treec808937c48561eae29a88b5c9ddb7bf14890c916 /Swift/Controllers
parent4fc14f392e953ee2309312d9d8a07dc01303c838 (diff)
downloadswift-9a34412bef9992d97d2d2094f5e42a3cc9470262.zip
swift-9a34412bef9992d97d2d2094f5e42a3cc9470262.tar.bz2
Avoid duplicate subscription requests.
Resolves: #1040 Resolves: #876
Diffstat (limited to 'Swift/Controllers')
-rw-r--r--Swift/Controllers/EventWindowController.cpp14
-rw-r--r--Swift/Controllers/XMPPEvents/EventController.cpp25
2 files changed, 30 insertions, 9 deletions
diff --git a/Swift/Controllers/EventWindowController.cpp b/Swift/Controllers/EventWindowController.cpp
index 47554ce..32b9c76 100644
--- a/Swift/Controllers/EventWindowController.cpp
+++ b/Swift/Controllers/EventWindowController.cpp
@@ -1,11 +1,12 @@
/*
- * Copyright (c) 2010 Kevin Smith
+ * Copyright (c) 2010-2012 Kevin Smith
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
*/
-#include "Swift/Controllers/EventWindowController.h"
+#include <Swift/Controllers/EventWindowController.h>
+#include <Swift/Controllers/XMPPEvents/SubscriptionRequestEvent.h>
#include <boost/bind.hpp>
namespace Swift {
@@ -37,7 +38,14 @@ void EventWindowController::handleEventQueueEventAdded(boost::shared_ptr<StanzaE
void EventWindowController::handleEventConcluded(boost::shared_ptr<StanzaEvent> event) {
window_->removeEvent(event);
- window_->addEvent(event, false);
+ bool includeAsCompleted = true;
+ /* Because subscription requests get duplicated, don't add them back */
+ if (boost::dynamic_pointer_cast<SubscriptionRequestEvent>(event)) {
+ includeAsCompleted = false;
+ }
+ if (includeAsCompleted) {
+ window_->addEvent(event, false);
+ }
event->onConclusion.disconnect(boost::bind(&EventWindowController::handleEventConcluded, this, event));
}
diff --git a/Swift/Controllers/XMPPEvents/EventController.cpp b/Swift/Controllers/XMPPEvents/EventController.cpp
index 0808aa0..9841923 100644
--- a/Swift/Controllers/XMPPEvents/EventController.cpp
+++ b/Swift/Controllers/XMPPEvents/EventController.cpp
@@ -1,19 +1,19 @@
/*
- * Copyright (c) 2010 Kevin Smith
+ * Copyright (c) 2010-2012 Kevin Smith
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
*/
-#include "Swift/Controllers/XMPPEvents/EventController.h"
+#include <Swift/Controllers/XMPPEvents/EventController.h>
#include <boost/bind.hpp>
#include <algorithm>
#include <Swiften/Base/foreach.h>
-#include "Swift/Controllers/XMPPEvents/MessageEvent.h"
-#include "Swift/Controllers/XMPPEvents/ErrorEvent.h"
-#include "Swift/Controllers/XMPPEvents/SubscriptionRequestEvent.h"
-#include "Swift/Controllers/XMPPEvents/MUCInviteEvent.h"
+#include <Swift/Controllers/XMPPEvents/MessageEvent.h>
+#include <Swift/Controllers/XMPPEvents/ErrorEvent.h>
+#include <Swift/Controllers/XMPPEvents/SubscriptionRequestEvent.h>
+#include <Swift/Controllers/XMPPEvents/MUCInviteEvent.h>
namespace Swift {
@@ -31,6 +31,19 @@ void EventController::handleIncomingEvent(boost::shared_ptr<StanzaEvent> sourceE
boost::shared_ptr<SubscriptionRequestEvent> subscriptionEvent = boost::dynamic_pointer_cast<SubscriptionRequestEvent>(sourceEvent);
boost::shared_ptr<ErrorEvent> errorEvent = boost::dynamic_pointer_cast<ErrorEvent>(sourceEvent);
boost::shared_ptr<MUCInviteEvent> mucInviteEvent = boost::dynamic_pointer_cast<MUCInviteEvent>(sourceEvent);
+
+ /* If it's a duplicate subscription request, remove the previous request first */
+ if (subscriptionEvent) {
+ foreach(boost::shared_ptr<StanzaEvent> existingEvent, events_) {
+ boost::shared_ptr<SubscriptionRequestEvent> existingSubscriptionEvent = boost::dynamic_pointer_cast<SubscriptionRequestEvent>(existingEvent);
+ if (existingSubscriptionEvent) {
+ if (existingSubscriptionEvent->getJID() == subscriptionEvent->getJID()) {
+ existingEvent->conclude();
+ }
+ }
+ }
+ }
+
if ((messageEvent && messageEvent->isReadable()) || subscriptionEvent || errorEvent || mucInviteEvent) {
events_.push_back(sourceEvent);
sourceEvent->onConclusion.connect(boost::bind(&EventController::handleEventConcluded, this, sourceEvent));