From ebccdadcae24932b299a8612a9c6e0cdc4e00249 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Mon, 6 Sep 2010 18:20:30 +0200
Subject: Only request acks after a message was sent.


diff --git a/Swiften/Elements/Presence.h b/Swiften/Elements/Presence.h
index 311c2cf..0789b18 100644
--- a/Swiften/Elements/Presence.h
+++ b/Swiften/Elements/Presence.h
@@ -6,14 +6,14 @@
 
 #pragma once
 
+#include "Swiften/Base/Shared.h"
 #include "Swiften/Elements/Stanza.h"
 #include "Swiften/Elements/Status.h"
 #include "Swiften/Elements/StatusShow.h"
 #include "Swiften/Elements/Priority.h"
 
 namespace Swift {
-	class Presence : public Stanza
-	{
+	class Presence : public Stanza, public Shared<Presence> {
 		public:
 			enum Type { Available, Error, Probe, Subscribe, Subscribed, Unavailable, Unsubscribe, Unsubscribed };
 
diff --git a/Swiften/StreamManagement/StanzaAckRequester.cpp b/Swiften/StreamManagement/StanzaAckRequester.cpp
index b007675..f7d603b 100644
--- a/Swiften/StreamManagement/StanzaAckRequester.cpp
+++ b/Swiften/StreamManagement/StanzaAckRequester.cpp
@@ -8,6 +8,8 @@
 
 #include <boost/numeric/conversion/cast.hpp>
 
+#include "Swiften/Elements/Message.h"
+
 namespace Swift {
 
 static const unsigned int MAX_HANDLED_STANZA_COUNT = boost::numeric_cast<unsigned int>((1ULL<<32) - 1);
@@ -18,7 +20,9 @@ StanzaAckRequester::StanzaAckRequester() : lastHandledStanzasCount(0) {
 
 void StanzaAckRequester::handleStanzaSent(boost::shared_ptr<Stanza> stanza) {
 	unackedStanzas.push_back(stanza);
-	onRequestAck();
+	if (boost::dynamic_pointer_cast<Message>(stanza)) {
+		onRequestAck();
+	}
 }
 
 void StanzaAckRequester::handleAckReceived(unsigned int handledStanzasCount) {
diff --git a/Swiften/StreamManagement/UnitTest/StanzaAckRequesterTest.cpp b/Swiften/StreamManagement/UnitTest/StanzaAckRequesterTest.cpp
index 70fe6eb..e53b8c6 100644
--- a/Swiften/StreamManagement/UnitTest/StanzaAckRequesterTest.cpp
+++ b/Swiften/StreamManagement/UnitTest/StanzaAckRequesterTest.cpp
@@ -11,6 +11,8 @@
 
 #include "Swiften/StreamManagement/StanzaAckRequester.h"
 #include "Swiften/Elements/Message.h"
+#include "Swiften/Elements/Presence.h"
+#include "Swiften/Elements/IQ.h"
 
 using namespace Swift;
 
@@ -18,8 +20,11 @@ namespace Swift {
 
 class StanzaAckRequesterTest : public CppUnit::TestFixture {
 		CPPUNIT_TEST_SUITE(StanzaAckRequesterTest);
-		CPPUNIT_TEST(testHandleStanzaSent_RequestsAck);
+		CPPUNIT_TEST(testHandleStanzaSent_MessageRequestsAck);
+		CPPUNIT_TEST(testHandleStanzaSent_IQDoesNotRequestAck);
+		CPPUNIT_TEST(testHandleStanzaSent_PresenceDoesNotRequestAck);
 		CPPUNIT_TEST(testHandleAckReceived_AcksStanza);
+		CPPUNIT_TEST(testHandleAckReceived_AcksMultipleMessages);
 		CPPUNIT_TEST(testHandleAckReceived_AcksMultipleStanzas);
 		CPPUNIT_TEST(testHandleAckReceived_MultipleAcks);
 		CPPUNIT_TEST(testHandleAckReceived_WrapAround);
@@ -30,13 +35,27 @@ class StanzaAckRequesterTest : public CppUnit::TestFixture {
 			acksRequested = 0;
 		}
 
-		void testHandleStanzaSent_RequestsAck() {
+		void testHandleStanzaSent_MessageRequestsAck() {
 			std::auto_ptr<StanzaAckRequester> testling(createRequester());
 			testling->handleStanzaSent(createMessage("m1"));
 
 			CPPUNIT_ASSERT_EQUAL(1, acksRequested);
 		}
 
+		void testHandleStanzaSent_IQDoesNotRequestAck() {
+			std::auto_ptr<StanzaAckRequester> testling(createRequester());
+			testling->handleStanzaSent(createIQ("iq1"));
+
+			CPPUNIT_ASSERT_EQUAL(0, acksRequested);
+		}
+
+		void testHandleStanzaSent_PresenceDoesNotRequestAck() {
+			std::auto_ptr<StanzaAckRequester> testling(createRequester());
+			testling->handleStanzaSent(createPresence("p1"));
+
+			CPPUNIT_ASSERT_EQUAL(0, acksRequested);
+		}
+
 		void testHandleAckReceived_AcksStanza() {
 			std::auto_ptr<StanzaAckRequester> testling(createRequester());
 			testling->handleStanzaSent(createMessage("m1"));
@@ -47,7 +66,7 @@ class StanzaAckRequesterTest : public CppUnit::TestFixture {
 			CPPUNIT_ASSERT_EQUAL(String("m1"), ackedStanzas[0]->getID());
 		}
 
-		void testHandleAckReceived_AcksMultipleStanzas() {
+		void testHandleAckReceived_AcksMultipleMessages() {
 			std::auto_ptr<StanzaAckRequester> testling(createRequester());
 			testling->handleStanzaSent(createMessage("m1"));
 			testling->handleStanzaSent(createMessage("m2"));
@@ -59,6 +78,20 @@ class StanzaAckRequesterTest : public CppUnit::TestFixture {
 			CPPUNIT_ASSERT_EQUAL(String("m2"), ackedStanzas[1]->getID());
 		}
 
+		void testHandleAckReceived_AcksMultipleStanzas() {
+			std::auto_ptr<StanzaAckRequester> testling(createRequester());
+			testling->handleStanzaSent(createIQ("iq1"));
+			testling->handleStanzaSent(createPresence("p1"));
+			testling->handleStanzaSent(createMessage("m1"));
+
+			testling->handleAckReceived(3);
+
+			CPPUNIT_ASSERT_EQUAL(3, static_cast<int>(ackedStanzas.size()));
+			CPPUNIT_ASSERT_EQUAL(String("iq1"), ackedStanzas[0]->getID());
+			CPPUNIT_ASSERT_EQUAL(String("p1"), ackedStanzas[1]->getID());
+			CPPUNIT_ASSERT_EQUAL(String("m1"), ackedStanzas[2]->getID());
+		}
+
 		void testHandleAckReceived_MultipleAcks() {
 			std::auto_ptr<StanzaAckRequester> testling(createRequester());
 			testling->handleStanzaSent(createMessage("m1"));
@@ -95,6 +128,18 @@ class StanzaAckRequesterTest : public CppUnit::TestFixture {
 			return result;
 		}
 
+		IQ::ref createIQ(const String& id) {
+			IQ::ref result(new IQ());
+			result->setID(id);
+			return result;
+		}
+
+		Presence::ref createPresence(const String& id) {
+			Presence::ref result(new Presence());
+			result->setID(id);
+			return result;
+		}
+
 		StanzaAckRequester* createRequester() {
 			StanzaAckRequester* requester = new StanzaAckRequester();
 			requester->onRequestAck.connect(boost::bind(&StanzaAckRequesterTest::handleRequestAck, this));
-- 
cgit v0.10.2-6-g49f6