From ef9ce71646ddf6bdaeafc0776724bf1a6ff18d9d Mon Sep 17 00:00:00 2001
From: Kevin Smith <git@kismith.co.uk>
Date: Wed, 28 Sep 2011 11:11:52 +0100
Subject: Parse MUC status codes correctly again.

Means rooms will be unlocked after creation correctly.

diff --git a/Swiften/Elements/MUCUserPayload.h b/Swiften/Elements/MUCUserPayload.h
index 158258b..699badd 100644
--- a/Swiften/Elements/MUCUserPayload.h
+++ b/Swiften/Elements/MUCUserPayload.h
@@ -23,6 +23,7 @@ namespace Swift {
 
 			struct StatusCode {
 				StatusCode() : code(0) {}
+				StatusCode(int code) : code(code) {}
 				int code;
 			};
 
diff --git a/Swiften/MUC/MUC.cpp b/Swiften/MUC/MUC.cpp
index d4c1287..c450c6d 100644
--- a/Swiften/MUC/MUC.cpp
+++ b/Swiften/MUC/MUC.cpp
@@ -96,7 +96,7 @@ void MUC::handleIncomingPresence(Presence::ref presence) {
 
 	MUCUserPayload::ref mucPayload;
 	foreach (MUCUserPayload::ref payload, presence->getPayloads<MUCUserPayload>()) {
-		if (payload->getItems().size() > 0 || payload->getStatusCodes().size() > 0) {
+		if (!payload->getItems().empty() || !payload->getStatusCodes().empty()) {
 			mucPayload = payload;
 		}
 	}
@@ -199,7 +199,6 @@ void MUC::handleIncomingPresence(Presence::ref presence) {
 			}
 		}
 	}
-
 }
 
 void MUC::handleCreationConfigResponse(MUCOwnerPayload::ref /*unused*/, ErrorPayload::ref error) {
diff --git a/Swiften/MUC/UnitTest/MUCTest.cpp b/Swiften/MUC/UnitTest/MUCTest.cpp
index 117760c..427e938 100644
--- a/Swiften/MUC/UnitTest/MUCTest.cpp
+++ b/Swiften/MUC/UnitTest/MUCTest.cpp
@@ -15,6 +15,11 @@
 #include <Swiften/Presence/StanzaChannelPresenceSender.h>
 #include <Swiften/Presence/DirectedPresenceSender.h>
 #include <Swiften/Queries/IQRouter.h>
+#include <Swiften/Elements/MUCUserPayload.h>
+#include <Swiften/Elements/MUCOwnerPayload.h>
+#include <Swiften/Elements/VCard.h>
+#include <Swiften/Elements/CapsInfo.h>
+
 
 using namespace Swift;
 
@@ -23,6 +28,8 @@ class MUCTest : public CppUnit::TestFixture {
 		CPPUNIT_TEST(testJoin);
 		CPPUNIT_TEST(testJoin_ChangePresenceDuringJoinDoesNotSendPresenceBeforeJoinSuccess);
 		CPPUNIT_TEST(testJoin_ChangePresenceDuringJoinResendsPresenceAfterJoinSuccess);
+		CPPUNIT_TEST(testCreateInstant);
+		CPPUNIT_TEST(testReplicateBug);
 		/*CPPUNIT_TEST(testJoin_Success);
 		CPPUNIT_TEST(testJoin_Fail);*/
 		CPPUNIT_TEST_SUITE_END();
@@ -76,6 +83,64 @@ class MUCTest : public CppUnit::TestFixture {
 			CPPUNIT_ASSERT_EQUAL(std::string("Test"), p->getStatus());
 		}
 
+		void testCreateInstant() {
+			MUC::ref testling = createMUC(JID("rabbithole@wonderland.lit"));
+			testling->joinAs("Alice");
+			Presence::ref serverRespondsLocked = boost::make_shared<Presence>();
+			serverRespondsLocked->setFrom(JID("rabbithole@wonderland.lit/Alice"));
+			MUCUserPayload::ref mucPayload(new MUCUserPayload());
+			MUCItem myItem;
+			myItem.affiliation = MUCOccupant::Owner;
+			myItem.role = MUCOccupant::Moderator;
+			mucPayload->addItem(myItem);
+			mucPayload->addStatusCode(MUCUserPayload::StatusCode(110));
+			mucPayload->addStatusCode(MUCUserPayload::StatusCode(201));
+			serverRespondsLocked->addPayload(mucPayload);
+			channel->onPresenceReceived(serverRespondsLocked);
+			CPPUNIT_ASSERT_EQUAL(2, static_cast<int>(channel->sentStanzas.size()));
+			IQ::ref iq = channel->getStanzaAtIndex<IQ>(1);
+			CPPUNIT_ASSERT(iq);
+			CPPUNIT_ASSERT(iq->getPayload<MUCOwnerPayload>());
+			CPPUNIT_ASSERT(iq->getPayload<MUCOwnerPayload>()->getForm());
+			CPPUNIT_ASSERT_EQUAL(Form::SubmitType, iq->getPayload<MUCOwnerPayload>()->getForm()->getType());
+		}
+
+		void testReplicateBug() {
+			Presence::ref initialPresence = boost::make_shared<Presence>();
+			initialPresence->setStatus("");
+			VCard::ref vcard = boost::make_shared<VCard>();
+			vcard->setPhoto(createByteArray("15c30080ae98ec48be94bf0e191d43edd06e500a"));
+			initialPresence->addPayload(vcard);
+			CapsInfo::ref caps = boost::make_shared<CapsInfo>();
+			caps->setNode("http://swift.im");
+			caps->setVersion("p2UP0DrcVgKM6jJqYN/B92DKK0o=");
+			initialPresence->addPayload(caps);
+			channel->sendPresence(initialPresence);
+
+			MUC::ref testling = createMUC(JID("test@rooms.swift.im"));
+			testling->joinAs("Test");
+			Presence::ref serverRespondsLocked = boost::make_shared<Presence>();
+			serverRespondsLocked->setFrom(JID("test@rooms.swift.im/Test"));
+			serverRespondsLocked->setTo(JID("test@swift.im/6913d576d55f0b67"));
+			serverRespondsLocked->addPayload(vcard);
+			serverRespondsLocked->addPayload(caps);
+			serverRespondsLocked->setStatus("");
+			MUCUserPayload::ref mucPayload(new MUCUserPayload());
+			MUCItem myItem;
+			myItem.affiliation = MUCOccupant::Owner;
+			myItem.role = MUCOccupant::Moderator;
+			mucPayload->addItem(myItem);
+			mucPayload->addStatusCode(MUCUserPayload::StatusCode(201));
+			serverRespondsLocked->addPayload(mucPayload);
+			channel->onPresenceReceived(serverRespondsLocked);
+			CPPUNIT_ASSERT_EQUAL(3, static_cast<int>(channel->sentStanzas.size()));
+			IQ::ref iq = channel->getStanzaAtIndex<IQ>(2);
+			CPPUNIT_ASSERT(iq);
+			CPPUNIT_ASSERT(iq->getPayload<MUCOwnerPayload>());
+			CPPUNIT_ASSERT(iq->getPayload<MUCOwnerPayload>()->getForm());
+			CPPUNIT_ASSERT_EQUAL(Form::SubmitType, iq->getPayload<MUCOwnerPayload>()->getForm()->getType());
+		}
+
 		/*void testJoin_Success() {
 			MUC::ref testling = createMUC(JID("foo@bar.com"));
 			testling->onJoinFinished.connect(boost::bind(&MUCTest::handleJoinFinished, this, _1, _2));
diff --git a/Swiften/Parser/PayloadParsers/MUCUserPayloadParser.cpp b/Swiften/Parser/PayloadParsers/MUCUserPayloadParser.cpp
index 71ae571..e6ccbbe 100644
--- a/Swiften/Parser/PayloadParsers/MUCUserPayloadParser.cpp
+++ b/Swiften/Parser/PayloadParsers/MUCUserPayloadParser.cpp
@@ -18,7 +18,7 @@ void MUCUserPayloadParser::handleTree(ParserElement::ref root) {
 		MUCItem item = MUCItemParser::itemFromTree(itemElement);
 		getPayloadInternal()->addItem(item);
 	}
-	foreach (ParserElement::ref statusElement, root->getChildren("item", "http://jabber.org/protocol/muc#user")) {
+	foreach (ParserElement::ref statusElement, root->getChildren("status", "http://jabber.org/protocol/muc#user")) {
 		MUCUserPayload::StatusCode status;
 		try {
 			status.code = boost::lexical_cast<int>(statusElement->getAttributes().getAttribute("code").c_str());
diff --git a/Swiften/SConscript b/Swiften/SConscript
index e496fbe..0dda91f 100644
--- a/Swiften/SConscript
+++ b/Swiften/SConscript
@@ -305,6 +305,7 @@ if env["SCONS_STAGE"] == "build" :
 			File("Parser/PayloadParsers/UnitTest/VCardUpdateParserTest.cpp"),
 			File("Parser/PayloadParsers/UnitTest/ReplaceTest.cpp"),
 			File("Parser/PayloadParsers/UnitTest/MUCAdminPayloadParserTest.cpp"),
+			File("Parser/PayloadParsers/UnitTest/MUCUserPayloadParserTest.cpp"),
 			File("Parser/UnitTest/AttributeMapTest.cpp"),
 			File("Parser/UnitTest/IQParserTest.cpp"),
 			File("Parser/UnitTest/GenericPayloadTreeParserTest.cpp"),
-- 
cgit v0.10.2-6-g49f6