From 509973e7e5978c2225fb89a10a1e2343fce21e7b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Tue, 12 Apr 2011 20:35:30 +0200
Subject: Small tweaks to the roster item exchange payload.


diff --git a/Swiften/Elements/RosterItemExchangePayload.cpp b/Swiften/Elements/RosterItemExchangePayload.cpp
index 846e184..f4f3a57 100644
--- a/Swiften/Elements/RosterItemExchangePayload.cpp
+++ b/Swiften/Elements/RosterItemExchangePayload.cpp
@@ -9,6 +9,9 @@
 
 namespace Swift {
 
+RosterItemExchangePayload::Item::Item() {
+}
+
 RosterItemExchangePayload::RosterItemExchangePayload() {
 }
 
diff --git a/Swiften/Elements/RosterItemExchangePayload.h b/Swiften/Elements/RosterItemExchangePayload.h
index f573039..d9e2912 100644
--- a/Swiften/Elements/RosterItemExchangePayload.h
+++ b/Swiften/Elements/RosterItemExchangePayload.h
@@ -8,7 +8,6 @@
 
 #include <vector>
 #include <string>
-#include <boost/optional.hpp>
 #include <boost/shared_ptr.hpp>
 
 #include "Swiften/Elements/Payload.h"
@@ -20,13 +19,49 @@ namespace Swift {
 		public:
 			typedef boost::shared_ptr<RosterItemExchangePayload> ref;
 
-			enum Action { Add, Modify, Delete };
+			class Item {
+				public:
+					enum Action { Add, Modify, Delete };
 
-			struct Item {
-				Action action;
-				JID jid;
-				std::string name;
-				std::vector<std::string> groups;
+					Item();
+
+					Action getAction() const {
+						return action;
+					}
+
+					void setAction(Action action) {
+						this->action = action;
+					}
+
+					const JID& getJID() const {
+						return jid;
+					}
+
+					void setJID(const JID& jid) {
+						this->jid = jid;
+					}
+
+					const std::string& getName() const {
+						return name;
+					}
+
+					void setName(const std::string& name) {
+						this->name = name;
+					}
+
+					const std::vector<std::string>& getGroups() const {
+						return groups;
+					}
+
+					void addGroup(const std::string& group) {
+						groups.push_back(group);
+					}
+
+				private:
+					Action action;
+					JID jid;
+					std::string name;
+					std::vector<std::string> groups;
 			};
 
 			typedef std::vector<RosterItemExchangePayload::Item> RosterItemExchangePayloadItems;
diff --git a/Swiften/Parser/PayloadParsers/RosterItemExchangeParser.cpp b/Swiften/Parser/PayloadParsers/RosterItemExchangeParser.cpp
index 7d59cc3..ff2a73b 100644
--- a/Swiften/Parser/PayloadParsers/RosterItemExchangeParser.cpp
+++ b/Swiften/Parser/PayloadParsers/RosterItemExchangeParser.cpp
@@ -19,22 +19,22 @@ void RosterItemExchangeParser::handleStartElement(const std::string& element, co
 
 			currentItem_ = RosterItemExchangePayload::Item();
 
-			currentItem_.jid = JID(attributes.getAttribute("jid"));
-			currentItem_.name = attributes.getAttribute("name");
+			currentItem_.setJID(JID(attributes.getAttribute("jid")));
+			currentItem_.setName(attributes.getAttribute("name"));
 
 			std::string action = attributes.getAttribute("action");
 			if (action == "add") {
-				currentItem_.action = RosterItemExchangePayload::Add;
+				currentItem_.setAction(RosterItemExchangePayload::Item::Add);
 			}
 			else if (action == "modify") {
-				currentItem_.action = RosterItemExchangePayload::Modify;
+				currentItem_.setAction(RosterItemExchangePayload::Item::Modify);
 			}
 			else if (action == "delete") {
-				currentItem_.action = RosterItemExchangePayload::Delete;
+				currentItem_.setAction(RosterItemExchangePayload::Item::Delete);
 			}
 			else {
 				// Add is default action according to XEP
-				currentItem_.action = RosterItemExchangePayload::Add;
+				currentItem_.setAction(RosterItemExchangePayload::Item::Add);
 			}
 		}
 	}
@@ -56,7 +56,7 @@ void RosterItemExchangeParser::handleEndElement(const std::string& element, cons
 	}
 	else if (level_ == ItemLevel) {
 		if (element == "group") {
-			currentItem_.groups.push_back(currentText_);
+			currentItem_.addGroup(currentText_);
 		}
 	}
 }
diff --git a/Swiften/Parser/PayloadParsers/UnitTest/RosterItemExchangeParserTest.cpp b/Swiften/Parser/PayloadParsers/UnitTest/RosterItemExchangeParserTest.cpp
index ceba45f..9533e15 100644
--- a/Swiften/Parser/PayloadParsers/UnitTest/RosterItemExchangeParserTest.cpp
+++ b/Swiften/Parser/PayloadParsers/UnitTest/RosterItemExchangeParserTest.cpp
@@ -35,17 +35,17 @@ class RosterItemExchangeParserTest : public CppUnit::TestFixture
 
 			CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), items.size());
 
-			CPPUNIT_ASSERT_EQUAL(JID("foo@bar.com"), items[0].jid);
-			CPPUNIT_ASSERT_EQUAL(std::string("Foo @ Bar"), items[0].name);
-			CPPUNIT_ASSERT_EQUAL(RosterItemExchangePayload::Add, items[0].action);
-			CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), items[0].groups.size());
-			CPPUNIT_ASSERT_EQUAL(std::string("Group 1"), items[0].groups[0]);
-			CPPUNIT_ASSERT_EQUAL(std::string("Group 2"), items[0].groups[1]);
-
-			CPPUNIT_ASSERT_EQUAL(JID("baz@blo.com"), items[1].jid);
-			CPPUNIT_ASSERT_EQUAL(std::string("Baz"), items[1].name);
-			CPPUNIT_ASSERT_EQUAL(RosterItemExchangePayload::Modify, items[1].action);
-			CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), items[1].groups.size());
+			CPPUNIT_ASSERT_EQUAL(JID("foo@bar.com"), items[0].getJID());
+			CPPUNIT_ASSERT_EQUAL(std::string("Foo @ Bar"), items[0].getName());
+			CPPUNIT_ASSERT_EQUAL(RosterItemExchangePayload::Item::Add, items[0].getAction());
+			CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), items[0].getGroups().size());
+			CPPUNIT_ASSERT_EQUAL(std::string("Group 1"), items[0].getGroups()[0]);
+			CPPUNIT_ASSERT_EQUAL(std::string("Group 2"), items[0].getGroups()[1]);
+
+			CPPUNIT_ASSERT_EQUAL(JID("baz@blo.com"), items[1].getJID());
+			CPPUNIT_ASSERT_EQUAL(std::string("Baz"), items[1].getName());
+			CPPUNIT_ASSERT_EQUAL(RosterItemExchangePayload::Item::Modify, items[1].getAction());
+			CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), items[1].getGroups().size());
 		}
 };
 
diff --git a/Swiften/Roster/SetRosterRequest.h b/Swiften/Roster/SetRosterRequest.h
index 2066089..606b431 100644
--- a/Swiften/Roster/SetRosterRequest.h
+++ b/Swiften/Roster/SetRosterRequest.h
@@ -18,12 +18,16 @@ namespace Swift {
 		public:
 			typedef boost::shared_ptr<SetRosterRequest> ref;
 
-			static ref create(RosterPayload::ref payload, IQRouter* router, const JID& to = JID()) {
-				return ref(new SetRosterRequest(payload, router, to));
+			static ref create(RosterPayload::ref payload, IQRouter* router) {
+				return ref(new SetRosterRequest(JID(), payload, router));
+			}
+
+			static ref create(RosterPayload::ref payload, const JID& to, IQRouter* router) {
+				return ref(new SetRosterRequest(to, payload, router));
 			}
 
 		private:
-			SetRosterRequest(boost::shared_ptr<RosterPayload> payload, IQRouter* router, const JID& to) : Request(IQ::Set, to, boost::shared_ptr<RosterPayload>(payload), router) {
+			SetRosterRequest(const JID& to, boost::shared_ptr<RosterPayload> payload, IQRouter* router) : Request(IQ::Set, to, boost::shared_ptr<RosterPayload>(payload), router) {
 			}
 
 			virtual void handleResponse(boost::shared_ptr<Payload> /*payload*/, ErrorPayload::ref error) {
diff --git a/Swiften/Serializer/PayloadSerializers/RosterItemExchangeSerializer.cpp b/Swiften/Serializer/PayloadSerializers/RosterItemExchangeSerializer.cpp
index 76c742c..c9ed6ea 100644
--- a/Swiften/Serializer/PayloadSerializers/RosterItemExchangeSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/RosterItemExchangeSerializer.cpp
@@ -22,17 +22,16 @@ std::string RosterItemExchangeSerializer::serializePayload(boost::shared_ptr<Ros
 	XMLElement queryElement("x", "http://jabber.org/protocol/rosterx");
 	foreach(const RosterItemExchangePayload::Item& item, roster->getItems()) {
 		boost::shared_ptr<XMLElement> itemElement(new XMLElement("item"));
-		itemElement->setAttribute("jid", item.jid);
-		itemElement->setAttribute("name", item.name);
-
-		switch (item.action) {
-			case RosterItemExchangePayload::Add: itemElement->setAttribute("action", "add"); break;
-			case RosterItemExchangePayload::Modify: itemElement->setAttribute("action", "modify"); break;
-			case RosterItemExchangePayload::Delete: itemElement->setAttribute("action", "delete"); break;
-			default: itemElement->setAttribute("action", "add"); break;
+		itemElement->setAttribute("jid", item.getJID());
+		itemElement->setAttribute("name", item.getName());
+
+		switch (item.getAction()) {
+			case RosterItemExchangePayload::Item::Add: itemElement->setAttribute("action", "add"); break;
+			case RosterItemExchangePayload::Item::Modify: itemElement->setAttribute("action", "modify"); break;
+			case RosterItemExchangePayload::Item::Delete: itemElement->setAttribute("action", "delete"); break;
 		}
 
-		foreach(const std::string& group, item.groups) {
+		foreach(const std::string& group, item.getGroups()) {
 			boost::shared_ptr<XMLElement> groupElement(new XMLElement("group"));
 			groupElement->addNode(boost::shared_ptr<XMLTextNode>(new XMLTextNode(group)));
 			itemElement->addNode(groupElement);
diff --git a/Swiften/Serializer/PayloadSerializers/UnitTest/RosterItemExchangeSerializerTest.cpp b/Swiften/Serializer/PayloadSerializers/UnitTest/RosterItemExchangeSerializerTest.cpp
index 0fb44c9..f4de783 100644
--- a/Swiften/Serializer/PayloadSerializers/UnitTest/RosterItemExchangeSerializerTest.cpp
+++ b/Swiften/Serializer/PayloadSerializers/UnitTest/RosterItemExchangeSerializerTest.cpp
@@ -25,17 +25,17 @@ class RosterItemExchangeSerializerTest : public CppUnit::TestFixture
 			boost::shared_ptr<RosterItemExchangePayload> roster(new RosterItemExchangePayload());
 
 			RosterItemExchangePayload::Item item1;
-			item1.jid = JID("foo@bar.com");
-			item1.name = "Foo @ Bar";
-			item1.action = RosterItemExchangePayload::Add;
-			item1.groups.push_back("Group 1");
-			item1.groups.push_back("Group 2");
+			item1.setJID("foo@bar.com");
+			item1.setName("Foo @ Bar");
+			item1.setAction(RosterItemExchangePayload::Item::Add);
+			item1.addGroup("Group 1");
+			item1.addGroup("Group 2");
 			roster->addItem(item1);
 
 			RosterItemExchangePayload::Item item2;
-			item2.jid = JID("baz@blo.com");
-			item2.name = "Baz";
-			item2.action = RosterItemExchangePayload::Modify;
+			item2.setJID("baz@blo.com");
+			item2.setName("Baz");
+			item2.setAction(RosterItemExchangePayload::Item::Modify);
 			roster->addItem(item2);
 
 			std::string expectedResult = 
-- 
cgit v0.10.2-6-g49f6