diff options
| author | Remko Tronçon <git@el-tramo.be> | 2009-06-20 09:00:52 (GMT) | 
|---|---|---|
| committer | Remko Tronçon <git@el-tramo.be> | 2009-06-20 14:37:51 (GMT) | 
| commit | fcd2d7cfb5a05be0fd13bfa3582b46c1a1b595aa (patch) | |
| tree | 17e3eef980584b8f194d68d1d9b9eae967423885 | |
| parent | 6310bc00ceeb65f0cf6fc0ada9d1b188517d8a76 (diff) | |
| download | swift-fcd2d7cfb5a05be0fd13bfa3582b46c1a1b595aa.zip swift-fcd2d7cfb5a05be0fd13bfa3582b46c1a1b595aa.tar.bz2 | |
Added beginnings of a vCard parser.
Only implemented PHOTO subtag, because it's the only thing we
need right now.
| -rw-r--r-- | Swiften/Elements/VCard.h | 22 | ||||
| -rw-r--r-- | Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.cpp | 2 | ||||
| -rw-r--r-- | Swiften/Parser/PayloadParsers/Makefile.inc | 1 | ||||
| -rw-r--r-- | Swiften/Parser/PayloadParsers/UnitTest/Makefile.inc | 3 | ||||
| -rw-r--r-- | Swiften/Parser/PayloadParsers/UnitTest/VCardParserTest.cpp | 39 | ||||
| -rw-r--r-- | Swiften/Parser/PayloadParsers/VCardParser.cpp | 38 | ||||
| -rw-r--r-- | Swiften/Parser/PayloadParsers/VCardParser.h | 24 | ||||
| -rw-r--r-- | Swiften/Parser/PayloadParsers/VCardParserFactory.h | 11 | 
8 files changed, 139 insertions, 1 deletions
| diff --git a/Swiften/Elements/VCard.h b/Swiften/Elements/VCard.h new file mode 100644 index 0000000..53be318 --- /dev/null +++ b/Swiften/Elements/VCard.h @@ -0,0 +1,22 @@ +#pragma once + +#include "Swiften/Base/String.h" +#include "Swiften/Base/ByteArray.h" +#include "Swiften/Elements/Payload.h" + +namespace Swift { +	class VCard : public Payload { +		public: +			VCard() {} + +			void setPhoto(const ByteArray& photo) { photo_ = photo; } +			const ByteArray& getPhoto() { return photo_; } + +			void setPhotoType(const String& photoType) { photoType_ = photoType; } +			const String& getPhotoType() { return photoType_; } + +		private: +			ByteArray photo_; +			String photoType_; +	}; +} diff --git a/Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.cpp b/Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.cpp index de66278..32a8c25 100644 --- a/Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.cpp +++ b/Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.cpp @@ -15,6 +15,7 @@  #include "Swiften/Parser/PayloadParsers/SecurityLabelParserFactory.h"  #include "Swiften/Parser/PayloadParsers/SecurityLabelsCatalogParserFactory.h"  #include "Swiften/Parser/PayloadParsers/VCardUpdateParserFactory.h" +#include "Swiften/Parser/PayloadParsers/VCardParserFactory.h"  using namespace boost; @@ -34,6 +35,7 @@ FullPayloadParserFactoryCollection::FullPayloadParserFactoryCollection() {  	factories_.push_back(shared_ptr<PayloadParserFactory>(new SecurityLabelParserFactory()));  	factories_.push_back(shared_ptr<PayloadParserFactory>(new SecurityLabelsCatalogParserFactory()));  	factories_.push_back(shared_ptr<PayloadParserFactory>(new VCardUpdateParserFactory())); +	factories_.push_back(shared_ptr<PayloadParserFactory>(new VCardParserFactory()));  	foreach(shared_ptr<PayloadParserFactory> factory, factories_) {  		addFactory(factory.get());  	} diff --git a/Swiften/Parser/PayloadParsers/Makefile.inc b/Swiften/Parser/PayloadParsers/Makefile.inc index e7ea276..b6e9954 100644 --- a/Swiften/Parser/PayloadParsers/Makefile.inc +++ b/Swiften/Parser/PayloadParsers/Makefile.inc @@ -11,6 +11,7 @@ SWIFTEN_SOURCES += \  	Swiften/Parser/PayloadParsers/RosterParser.cpp \  	Swiften/Parser/PayloadParsers/ResourceBindParser.cpp \  	Swiften/Parser/PayloadParsers/VCardUpdateParser.cpp \ +	Swiften/Parser/PayloadParsers/VCardParser.cpp \  	Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.cpp  include Swiften/Parser/PayloadParsers/UnitTest/Makefile.inc diff --git a/Swiften/Parser/PayloadParsers/UnitTest/Makefile.inc b/Swiften/Parser/PayloadParsers/UnitTest/Makefile.inc index 6d492c1..26f7b3c 100644 --- a/Swiften/Parser/PayloadParsers/UnitTest/Makefile.inc +++ b/Swiften/Parser/PayloadParsers/UnitTest/Makefile.inc @@ -10,4 +10,5 @@ UNITTEST_SOURCES += \  	Swiften/Parser/PayloadParsers/UnitTest/ResourceBindParserTest.cpp \  	Swiften/Parser/PayloadParsers/UnitTest/SecurityLabelParserTest.cpp \  	Swiften/Parser/PayloadParsers/UnitTest/SecurityLabelsCatalogParserTest.cpp \ -	Swiften/Parser/PayloadParsers/UnitTest/VCardUpdateParserTest.cpp +	Swiften/Parser/PayloadParsers/UnitTest/VCardUpdateParserTest.cpp \ +	Swiften/Parser/PayloadParsers/UnitTest/VCardParserTest.cpp diff --git a/Swiften/Parser/PayloadParsers/UnitTest/VCardParserTest.cpp b/Swiften/Parser/PayloadParsers/UnitTest/VCardParserTest.cpp new file mode 100644 index 0000000..2d16636 --- /dev/null +++ b/Swiften/Parser/PayloadParsers/UnitTest/VCardParserTest.cpp @@ -0,0 +1,39 @@ +#include <cppunit/extensions/HelperMacros.h> +#include <cppunit/extensions/TestFactoryRegistry.h> + +#include "Swiften/Parser/PayloadParsers/VCardParser.h" +#include "Swiften/Parser/PayloadParsers/UnitTest/PayloadParserTester.h" + +using namespace Swift; + +class VCardParserTest : public CppUnit::TestFixture +{ +		CPPUNIT_TEST_SUITE(VCardParserTest); +		CPPUNIT_TEST(testParse_Photo); +		CPPUNIT_TEST_SUITE_END(); + +	public: +		VCardParserTest() {} + +		void testParse_Photo() { +			VCardParser testling; +			PayloadParserTester parser(&testling); + +			CPPUNIT_ASSERT(parser.parse( +				"<vCard xmlns='vcard-temp'>" +					"<PHOTO>" +						"<TYPE>image/jpeg</TYPE>" +						"<BINVAL>" +							"QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ej" +							"EyMzQ1Njc4OTA=" +						"</BINVAL>" +					"</PHOTO>" +				"</vCard>")); + +			VCard* payload = dynamic_cast<VCard*>(testling.getPayload().get()); +			CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), payload->getPhotoType()); +			CPPUNIT_ASSERT_EQUAL(ByteArray("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"), payload->getPhoto()); +		} +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(VCardParserTest); diff --git a/Swiften/Parser/PayloadParsers/VCardParser.cpp b/Swiften/Parser/PayloadParsers/VCardParser.cpp new file mode 100644 index 0000000..a6fe2be --- /dev/null +++ b/Swiften/Parser/PayloadParsers/VCardParser.cpp @@ -0,0 +1,38 @@ +#include "Swiften/Parser/PayloadParsers/VCardParser.h" +#include "Swiften/Base/foreach.h" +#include "Swiften/StringCodecs/Base64.h" + +namespace Swift { + +VCardParser::VCardParser() { +} + +void VCardParser::handleStartElement(const String& element, const String&, const AttributeMap&) { +	elementStack_.push_back(element); +	currentText_ = ""; +} + +void VCardParser::handleEndElement(const String&, const String&) { +	String elementHierarchy = getElementHierarchy(); +	if (elementHierarchy == "/vCard/PHOTO/TYPE") { +		getPayloadInternal()->setPhotoType(currentText_); +	} +	else if (elementHierarchy == "/vCard/PHOTO/BINVAL") { +		getPayloadInternal()->setPhoto(Base64::decode(currentText_)); +	} +	elementStack_.pop_back(); +} + +void VCardParser::handleCharacterData(const String& text) { +	currentText_ += text; +} + +String VCardParser::getElementHierarchy() const { +	String result; +	foreach(const String& element, elementStack_) { +		result += "/" + element; +	} +	return result; +} + +} diff --git a/Swiften/Parser/PayloadParsers/VCardParser.h b/Swiften/Parser/PayloadParsers/VCardParser.h new file mode 100644 index 0000000..c1ed46b --- /dev/null +++ b/Swiften/Parser/PayloadParsers/VCardParser.h @@ -0,0 +1,24 @@ +#pragma once + +#include "Swiften/Elements/VCard.h" +#include "Swiften/Parser/GenericPayloadParser.h" + +namespace Swift { +	class SerializingParser; + +	class VCardParser : public GenericPayloadParser<VCard> { +		public: +			VCardParser(); + +			virtual void handleStartElement(const String& element, const String&, const AttributeMap& attributes); +			virtual void handleEndElement(const String& element, const String&); +			virtual void handleCharacterData(const String& data); + +		private: +			String getElementHierarchy() const; + +		private: +			std::vector<String> elementStack_; +			String currentText_; +	}; +} diff --git a/Swiften/Parser/PayloadParsers/VCardParserFactory.h b/Swiften/Parser/PayloadParsers/VCardParserFactory.h new file mode 100644 index 0000000..2d5302b --- /dev/null +++ b/Swiften/Parser/PayloadParsers/VCardParserFactory.h @@ -0,0 +1,11 @@ +#pragma once + +#include "Swiften/Parser/GenericPayloadParserFactory.h" +#include "Swiften/Parser/PayloadParsers/VCardParser.h" + +namespace Swift { +	class VCardParserFactory : public GenericPayloadParserFactory<VCardParser> { +		public: +			VCardParserFactory() : GenericPayloadParserFactory<VCardParser>("vCard", "vcard-temp") {} +	}; +} | 
 Swift
 Swift