diff options
6 files changed, 59 insertions, 0 deletions
| diff --git a/Swiften/Elements/Storage.h b/Swiften/Elements/Storage.h index 515cd52..dcc4b85 100644 --- a/Swiften/Elements/Storage.h +++ b/Swiften/Elements/Storage.h @@ -25,6 +25,13 @@ namespace Swift {  				String password;  			}; +			struct URL { +				URL() {} + +				String name; +				String url; +			}; +  			Storage() {  			} @@ -36,7 +43,16 @@ namespace Swift {  				conferences.push_back(conference);  			} +			const std::vector<URL>& getURLs() const { +				return urls; +			} + +			void addURL(const URL& url) { +				urls.push_back(url); +			} +  		private:  			std::vector<Conference> conferences; +			std::vector<URL> urls;  	};  } diff --git a/Swiften/Parser/PayloadParsers/StorageParser.cpp b/Swiften/Parser/PayloadParsers/StorageParser.cpp index f6fd29d..660bdd0 100644 --- a/Swiften/Parser/PayloadParsers/StorageParser.cpp +++ b/Swiften/Parser/PayloadParsers/StorageParser.cpp @@ -22,6 +22,12 @@ void StorageParser::handleStartElement(const String& element, const String&, con  			conference->jid = JID(attributes.getAttribute("jid"));  			conference->name = attributes.getAttribute("name");  		} +		else if (element == "url") { +			assert(!url); +			url = Storage::URL(); +			url->name = attributes.getAttribute("name"); +			url->url = attributes.getAttribute("url"); +		}  	}  	else if (level == DetailLevel) {  		currentText = ""; @@ -37,6 +43,11 @@ void StorageParser::handleEndElement(const String& element, const String&) {  			getPayloadInternal()->addConference(*conference);  			conference.reset();  		} +		else if (element == "url") { +			assert(url); +			getPayloadInternal()->addURL(*url); +			url.reset(); +		}  	}  	else if (level == DetailLevel && conference) {  		if (element == "nick") { diff --git a/Swiften/Parser/PayloadParsers/StorageParser.h b/Swiften/Parser/PayloadParsers/StorageParser.h index 735513e..e8fcbd8 100644 --- a/Swiften/Parser/PayloadParsers/StorageParser.h +++ b/Swiften/Parser/PayloadParsers/StorageParser.h @@ -29,5 +29,6 @@ namespace Swift {  			int level;  			String currentText;  			boost::optional<Storage::Conference> conference; +			boost::optional<Storage::URL> url;  	};  } diff --git a/Swiften/Parser/PayloadParsers/UnitTest/StorageParserTest.cpp b/Swiften/Parser/PayloadParsers/UnitTest/StorageParserTest.cpp index 88dd125..03dc144 100644 --- a/Swiften/Parser/PayloadParsers/UnitTest/StorageParserTest.cpp +++ b/Swiften/Parser/PayloadParsers/UnitTest/StorageParserTest.cpp @@ -16,6 +16,7 @@ class StorageParserTest : public CppUnit::TestFixture {  		CPPUNIT_TEST_SUITE(StorageParserTest);  		CPPUNIT_TEST(testParse_Conference);  		CPPUNIT_TEST(testParse_MultipleConferences); +		CPPUNIT_TEST(testParse_URL);  		CPPUNIT_TEST_SUITE_END();  	public: @@ -65,6 +66,22 @@ class StorageParserTest : public CppUnit::TestFixture {  			CPPUNIT_ASSERT_EQUAL(String("Tea party"), conferences[1].name);  			CPPUNIT_ASSERT_EQUAL(JID("teaparty@wonderland.lit"), conferences[1].jid);  		} + +		void testParse_URL() { +			PayloadsParserTester parser; + +			CPPUNIT_ASSERT(parser.parse( +				"<storage xmlns='storage:bookmarks'>" +					"<url name='Complete Works of Shakespeare' url='http://the-tech.mit.edu/Shakespeare/'/>" +				"</storage>")); + +			Storage* payload = dynamic_cast<Storage*>(parser.getPayload().get()); +			std::vector<Storage::URL> urls = payload->getURLs(); +			CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(urls.size())); +			CPPUNIT_ASSERT_EQUAL(String("Complete Works of Shakespeare"), urls[0].name); +			CPPUNIT_ASSERT_EQUAL(String("http://the-tech.mit.edu/Shakespeare/"), urls[0].url); +		} +  };  CPPUNIT_TEST_SUITE_REGISTRATION(StorageParserTest); diff --git a/Swiften/Serializer/PayloadSerializers/StorageSerializer.cpp b/Swiften/Serializer/PayloadSerializers/StorageSerializer.cpp index f7beecd..b4a2a49 100644 --- a/Swiften/Serializer/PayloadSerializers/StorageSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/StorageSerializer.cpp @@ -19,6 +19,7 @@ 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); @@ -36,6 +37,14 @@ String StorageSerializer::serializePayload(boost::shared_ptr<Storage> storage)	c  		}  		storageElement.addNode(conferenceElement);  	} + +	foreach(const Storage::URL& url, storage->getURLs()) { +		boost::shared_ptr<XMLElement> urlElement(new XMLElement("url")); +		urlElement->setAttribute("name", url.name); +		urlElement->setAttribute("url", url.url); +		storageElement.addNode(urlElement); +	} +  	return storageElement.serialize();  } diff --git a/Swiften/Serializer/PayloadSerializers/UnitTest/StorageSerializerTest.cpp b/Swiften/Serializer/PayloadSerializers/UnitTest/StorageSerializerTest.cpp index 714de42..5888731 100644 --- a/Swiften/Serializer/PayloadSerializers/UnitTest/StorageSerializerTest.cpp +++ b/Swiften/Serializer/PayloadSerializers/UnitTest/StorageSerializerTest.cpp @@ -31,6 +31,10 @@ class StorageSerializerTest : public CppUnit::TestFixture {  			conference.nick = "Puck";  			conference.password = "MyPass";  			storage->addConference(conference); +			Storage::URL url; +			url.name = "Complete Works of Shakespeare"; +			url.url = "http://the-tech.mit.edu/Shakespeare/"; +			storage->addURL(url);  			CPPUNIT_ASSERT_EQUAL(String(  				"<storage xmlns=\"storage:bookmarks\">" @@ -41,6 +45,7 @@ class StorageSerializerTest : public CppUnit::TestFixture {  						"<nick>Puck</nick>"  						"<password>MyPass</password>"  					"</conference>" +					"<url name=\"Complete Works of Shakespeare\" url=\"http://the-tech.mit.edu/Shakespeare/\"/>"  				"</storage>"), serializer.serialize(storage));  		} | 
 Swift
 Swift