From 7e921ec72997493c5ab06cc13d7cf82bb7e8f643 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Remko=20Tron=C3=A7on?= Date: Mon, 1 Nov 2010 16:23:09 +0100 Subject: Give later IQ handlers precedence over older IQ handlers. diff --git a/Swiften/Queries/IQRouter.cpp b/Swiften/Queries/IQRouter.cpp index a1689e9..7fa2dcf 100644 --- a/Swiften/Queries/IQRouter.cpp +++ b/Swiften/Queries/IQRouter.cpp @@ -33,8 +33,9 @@ void IQRouter::handleIQ(boost::shared_ptr iq) { queueRemoves_ = true; bool handled = false; - foreach(boost::shared_ptr handler, handlers_) { - handled |= handler->handleIQ(iq); + // Go through the handlers in reverse order, to give precedence to the last added handler + for (std::vector >::const_reverse_iterator i = handlers_.rbegin(); i != handlers_.rend(); ++i) { + handled |= (*i)->handleIQ(iq); if (handled) { break; } diff --git a/Swiften/Queries/UnitTest/IQRouterTest.cpp b/Swiften/Queries/UnitTest/IQRouterTest.cpp index 2d6b2cb..864108c 100644 --- a/Swiften/Queries/UnitTest/IQRouterTest.cpp +++ b/Swiften/Queries/UnitTest/IQRouterTest.cpp @@ -54,8 +54,8 @@ class IQRouterTest : public CppUnit::TestFixture void testRemoveHandler_AfterHandleIQ() { IQRouter testling(channel_); - DummyIQHandler handler1(true, &testling); DummyIQHandler handler2(true, &testling); + DummyIQHandler handler1(true, &testling); channel_->onIQReceived(boost::shared_ptr(new IQ())); testling.removeHandler(&handler1); @@ -67,8 +67,8 @@ class IQRouterTest : public CppUnit::TestFixture void testHandleIQ_SuccesfulHandlerFirst() { IQRouter testling(channel_); - DummyIQHandler handler1(true, &testling); DummyIQHandler handler2(false, &testling); + DummyIQHandler handler1(true, &testling); channel_->onIQReceived(boost::shared_ptr(new IQ())); @@ -79,8 +79,8 @@ class IQRouterTest : public CppUnit::TestFixture void testHandleIQ_SuccesfulHandlerLast() { IQRouter testling(channel_); - DummyIQHandler handler1(false, &testling); DummyIQHandler handler2(true, &testling); + DummyIQHandler handler1(false, &testling); channel_->onIQReceived(boost::shared_ptr(new IQ())); @@ -102,8 +102,8 @@ class IQRouterTest : public CppUnit::TestFixture void testHandleIQ_HandlerRemovedDuringHandle() { IQRouter testling(channel_); - RemovingIQHandler handler1(&testling); DummyIQHandler handler2(true, &testling); + RemovingIQHandler handler1(&testling); channel_->onIQReceived(boost::shared_ptr(new IQ())); channel_->onIQReceived(boost::shared_ptr(new IQ())); -- cgit v0.10.2-6-g49f6