diff options
5 files changed, 112 insertions, 0 deletions
diff --git a/Swiften/SConscript b/Swiften/SConscript index 6a1dde1..ece2c0e 100644 --- a/Swiften/SConscript +++ b/Swiften/SConscript @@ -135,6 +135,7 @@ sources = [  		"Serializer/PayloadSerializers/SoftwareVersionSerializer.cpp",  		"Serializer/PayloadSerializers/VCardSerializer.cpp",  		"Serializer/PayloadSerializers/VCardUpdateSerializer.cpp", +		"Serializer/PayloadSerializers/StorageSerializer.cpp",  		"Serializer/PresenceSerializer.cpp",  		"Serializer/StanzaSerializer.cpp",  		"Serializer/StreamFeaturesSerializer.cpp", @@ -258,6 +259,7 @@ env.Append(UNITTEST_SOURCES = [  		File("Serializer/PayloadSerializers/UnitTest/StatusSerializerTest.cpp"),  		File("Serializer/PayloadSerializers/UnitTest/StatusShowSerializerTest.cpp"),  		File("Serializer/PayloadSerializers/UnitTest/VCardUpdateSerializerTest.cpp"), +		File("Serializer/PayloadSerializers/UnitTest/StorageSerializerTest.cpp"),  		File("Serializer/UnitTest/StreamFeaturesSerializerTest.cpp"),  		File("Serializer/XML/UnitTest/XMLElementTest.cpp"),  		File("Server/UnitTest/ServerStanzaRouterTest.cpp"), diff --git a/Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.cpp b/Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.cpp index 6a24008..998dce8 100644 --- a/Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.cpp +++ b/Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.cpp @@ -18,6 +18,7 @@  #include "Swiften/Serializer/PayloadSerializers/VCardSerializer.h"  #include "Swiften/Serializer/PayloadSerializers/VCardUpdateSerializer.h"  #include "Swiften/Serializer/PayloadSerializers/RawXMLPayloadSerializer.h" +#include "Swiften/Serializer/PayloadSerializers/StorageSerializer.h"  namespace Swift { @@ -39,6 +40,7 @@ FullPayloadSerializerCollection::FullPayloadSerializerCollection() {  	serializers_.push_back(new VCardSerializer());  	serializers_.push_back(new VCardUpdateSerializer());  	serializers_.push_back(new RawXMLPayloadSerializer()); +	serializers_.push_back(new StorageSerializer());  	foreach(PayloadSerializer* serializer, serializers_) {  		addSerializer(serializer);  	} diff --git a/Swiften/Serializer/PayloadSerializers/StorageSerializer.cpp b/Swiften/Serializer/PayloadSerializers/StorageSerializer.cpp new file mode 100644 index 0000000..4268381 --- /dev/null +++ b/Swiften/Serializer/PayloadSerializers/StorageSerializer.cpp @@ -0,0 +1,36 @@ +#include "Swiften/Serializer/PayloadSerializers/StorageSerializer.h" + +#include <boost/shared_ptr.hpp> + +#include "Swiften/Base/foreach.h" +#include "Swiften/Serializer/XML/XMLElement.h" +#include "Swiften/Serializer/XML/XMLTextNode.h" + +namespace Swift { + +StorageSerializer::StorageSerializer() : GenericPayloadSerializer<Storage>() { +} + +String StorageSerializer::serializePayload(boost::shared_ptr<Storage> storage)	const { +	XMLElement storageElement("storage", "storage:bookmarks"); +	foreach(const Storage::Conference& conference, storage->getConferences()) { +		boost::shared_ptr<XMLElement> conferenceElement(new XMLElement("conference")); +		conferenceElement->setAttribute("name", conference.name); +		conferenceElement->setAttribute("jid", conference.jid); +		conferenceElement->setAttribute("autojoin", conference.autoJoin ? "1" : "0"); +		if (!conference.nick.isEmpty()) { +			boost::shared_ptr<XMLElement> nickElement(new XMLElement("nick")); +			nickElement->addNode(boost::shared_ptr<XMLTextNode>(new XMLTextNode(conference.nick))); +			conferenceElement->addNode(nickElement); +		} +		if (!conference.password.isEmpty()) { +			boost::shared_ptr<XMLElement> passwordElement(new XMLElement("password")); +			passwordElement->addNode(boost::shared_ptr<XMLTextNode>(new XMLTextNode(conference.password))); +			conferenceElement->addNode(passwordElement); +		} +		storageElement.addNode(conferenceElement); +	} +	return storageElement.serialize(); +} + +} diff --git a/Swiften/Serializer/PayloadSerializers/StorageSerializer.h b/Swiften/Serializer/PayloadSerializers/StorageSerializer.h new file mode 100644 index 0000000..e657376 --- /dev/null +++ b/Swiften/Serializer/PayloadSerializers/StorageSerializer.h @@ -0,0 +1,13 @@ +#pragma once + +#include "Swiften/Serializer/GenericPayloadSerializer.h" +#include "Swiften/Elements/Storage.h" + +namespace Swift { +	class StorageSerializer : public GenericPayloadSerializer<Storage> { +		public: +			StorageSerializer(); + +			virtual String serializePayload(boost::shared_ptr<Storage>)  const; +	}; +} diff --git a/Swiften/Serializer/PayloadSerializers/UnitTest/StorageSerializerTest.cpp b/Swiften/Serializer/PayloadSerializers/UnitTest/StorageSerializerTest.cpp new file mode 100644 index 0000000..158e7f1 --- /dev/null +++ b/Swiften/Serializer/PayloadSerializers/UnitTest/StorageSerializerTest.cpp @@ -0,0 +1,59 @@ +#include <cppunit/extensions/HelperMacros.h> +#include <cppunit/extensions/TestFactoryRegistry.h> + +#include "Swiften/Serializer/PayloadSerializers/StorageSerializer.h" + +using namespace Swift; + +class StorageSerializerTest : public CppUnit::TestFixture { +		CPPUNIT_TEST_SUITE(StorageSerializerTest); +		CPPUNIT_TEST(testSerialize); +		CPPUNIT_TEST(testSerialize_NoNickOrPassword); +		CPPUNIT_TEST_SUITE_END(); + +	public: +		StorageSerializerTest() {} + +		void testSerialize() { +			StorageSerializer testling; +			boost::shared_ptr<Storage> storage(new Storage()); +			Storage::Conference conference; +			conference.name = "Council of Oberon"; +			conference.autoJoin = true; +			conference.jid = JID("council@conference.underhill.org"); +			conference.nick = "Puck"; +			conference.password = "MyPass"; +			storage->addConference(conference); + +			CPPUNIT_ASSERT_EQUAL(String( +				"<storage xmlns=\"storage:bookmarks\">" +					"<conference " +							"autojoin=\"1\" " +							"jid=\"council@conference.underhill.org\" " +							"name=\"Council of Oberon\">" +						"<nick>Puck</nick>" +						"<password>MyPass</password>" +					"</conference>" +				"</storage>"), testling.serialize(storage)); +		} + +		void testSerialize_NoNickOrPassword() { +			StorageSerializer testling; +			boost::shared_ptr<Storage> storage(new Storage()); +			Storage::Conference conference; +			conference.name = "Council of Oberon"; +			conference.autoJoin = true; +			conference.jid = JID("council@conference.underhill.org"); +			storage->addConference(conference); + +			CPPUNIT_ASSERT_EQUAL(String( +				"<storage xmlns=\"storage:bookmarks\">" +					"<conference " +							"autojoin=\"1\" " +							"jid=\"council@conference.underhill.org\" " +							"name=\"Council of Oberon\"/>" +				"</storage>"), testling.serialize(storage)); +		} +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(StorageSerializerTest);  | 
 Swift