diff options
| author | Remko Tronçon <git@el-tramo.be> | 2010-12-09 21:00:03 (GMT) | 
|---|---|---|
| committer | Remko Tronçon <git@el-tramo.be> | 2010-12-09 21:32:08 (GMT) | 
| commit | edabab9987aa7fd74f7db5dcfc77677472406180 (patch) | |
| tree | 4512825cc540ea9412671f3bc8f970d90415568f | |
| parent | f0fec4f31afcc91a55d72aad462a0cc571aacf5d (diff) | |
| download | swift-contrib-edabab9987aa7fd74f7db5dcfc77677472406180.zip swift-contrib-edabab9987aa7fd74f7db5dcfc77677472406180.tar.bz2 | |
Added Stream error parserialement.
| -rw-r--r-- | Swiften/Elements/StreamError.h | 68 | ||||
| -rw-r--r-- | Swiften/Parser/SConscript | 1 | ||||
| -rw-r--r-- | Swiften/Parser/StreamErrorParser.cpp | 106 | ||||
| -rw-r--r-- | Swiften/Parser/StreamErrorParser.h | 29 | ||||
| -rw-r--r-- | Swiften/Parser/XMPPParser.cpp | 4 | ||||
| -rw-r--r-- | Swiften/SConscript | 1 | ||||
| -rw-r--r-- | Swiften/Serializer/GenericElementSerializer.h | 6 | ||||
| -rw-r--r-- | Swiften/Serializer/GenericPayloadSerializer.h | 5 | ||||
| -rw-r--r-- | Swiften/Serializer/XMPPSerializer.cpp | 43 | 
9 files changed, 238 insertions, 25 deletions
| diff --git a/Swiften/Elements/StreamError.h b/Swiften/Elements/StreamError.h new file mode 100644 index 0000000..a480d5a --- /dev/null +++ b/Swiften/Elements/StreamError.h @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2010 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +#include <boost/shared_ptr.hpp> + +#include <Swiften/Elements/Element.h> +#include <Swiften/Base/String.h> + +namespace Swift { +	class StreamError : public Element { +		public: +			typedef boost::shared_ptr<StreamError> ref; + +			enum Type {  +				BadFormat, +				BadNamespacePrefix, +				Conflict, +				ConnectionTimeout, +				HostGone, +				HostUnknown, +				ImproperAddressing, +				InternalServerError, +				InvalidFrom, +				InvalidID, +				InvalidNamespace, +				InvalidXML, +				NotAuthorized, +				PolicyViolation, +				RemoteConnectionFailed, +				ResourceConstraint, +				RestrictedXML, +				SeeOtherHost, +				SystemShutdown, +				UndefinedCondition, +				UnsupportedEncoding, +				UnsupportedStanzaType, +				UnsupportedVersion, +				XMLNotWellFormed, +			}; + +			StreamError(Type type = UndefinedCondition, const String& text = String()) : type_(type), text_(text) { } + +			Type getType() const { +				return type_;  +			} + +			void setType(Type type) { +				type_ = type; +			} + +			void setText(const String& text) { +				text_ = text; +			} + +			const String& getText() const {  +				return text_;  +			} + +		private: +			Type type_; +			String text_; +	}; +} diff --git a/Swiften/Parser/SConscript b/Swiften/Parser/SConscript index 29398f0..6e77109 100644 --- a/Swiften/Parser/SConscript +++ b/Swiften/Parser/SConscript @@ -54,6 +54,7 @@ sources = [  		"PresenceParser.cpp",  		"SerializingParser.cpp",  		"StanzaParser.cpp", +		"StreamErrorParser.cpp",  		"StreamFeaturesParser.cpp",  		"XMLParser.cpp",  		"XMLParserClient.cpp", diff --git a/Swiften/Parser/StreamErrorParser.cpp b/Swiften/Parser/StreamErrorParser.cpp new file mode 100644 index 0000000..b121ef2 --- /dev/null +++ b/Swiften/Parser/StreamErrorParser.cpp @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2010 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include <Swiften/Parser/StreamErrorParser.h> + +namespace Swift { + +StreamErrorParser::StreamErrorParser() : level(TopLevel) { +} + +void StreamErrorParser::handleStartElement(const String&, const String&, const AttributeMap&) { +	++level; +} + +void StreamErrorParser::handleEndElement(const String& element, const String&) { +	--level; +	if (level == ElementLevel) { +		if (element == "text") { +			getElementGeneric()->setText(currentText); +		} +		else if (element == "bad-format") { +			getElementGeneric()->setType(StreamError::BadFormat); +		} +		else if(element == "bad-namespace-prefix") { +			getElementGeneric()->setType(StreamError::BadNamespacePrefix); +		} +		else if(element == "conflict") { +			getElementGeneric()->setType(StreamError::Conflict); +		} +		else if(element == "connection-timeout") { +			getElementGeneric()->setType(StreamError::ConnectionTimeout); +		} +		else if(element == "host-gone") { +			getElementGeneric()->setType(StreamError::HostGone); +		} +		else if(element == "host-unknown") { +			getElementGeneric()->setType(StreamError::HostUnknown); +		} +		else if(element == "improper-addressing") { +			getElementGeneric()->setType(StreamError::ImproperAddressing); +		} +		else if(element == "internal-server-error") { +			getElementGeneric()->setType(StreamError::InternalServerError); +		} +		else if(element == "invalid-from") { +			getElementGeneric()->setType(StreamError::InvalidFrom); +		} +		else if(element == "invalid-id") { +			getElementGeneric()->setType(StreamError::InvalidID); +		} +		else if(element == "invalid-namespace") { +			getElementGeneric()->setType(StreamError::InvalidNamespace); +		} +		else if(element == "invalid-xml") { +			getElementGeneric()->setType(StreamError::InvalidXML); +		} +		else if(element == "not-authorized") { +			getElementGeneric()->setType(StreamError::NotAuthorized); +		} +		else if(element == "policy-violation") { +			getElementGeneric()->setType(StreamError::PolicyViolation); +		} +		else if(element == "remote-connection-failed") { +			getElementGeneric()->setType(StreamError::RemoteConnectionFailed); +		} +		else if(element == "resource-constraint") { +			getElementGeneric()->setType(StreamError::ResourceConstraint); +		} +		else if(element == "restricted-xml") { +			getElementGeneric()->setType(StreamError::RestrictedXML); +		} +		else if(element == "see-other-host") { +			getElementGeneric()->setType(StreamError::SeeOtherHost); +		} +		else if(element == "system-shutdown") { +			getElementGeneric()->setType(StreamError::SystemShutdown); +		} +		else if(element == "undefined-condition") { +			getElementGeneric()->setType(StreamError::UndefinedCondition); +		} +		else if(element == "unsupported-encoding") { +			getElementGeneric()->setType(StreamError::UnsupportedEncoding); +		} +		else if(element == "unsupported-stanza-type") { +			getElementGeneric()->setType(StreamError::UnsupportedStanzaType); +		} +		else if(element == "unsupported-version") { +			getElementGeneric()->setType(StreamError::UnsupportedVersion); +		} +		else if(element == "xml-not-well-formed") { +			getElementGeneric()->setType(StreamError::XMLNotWellFormed); +		} +		else { +			getElementGeneric()->setType(StreamError::UndefinedCondition); +		} +	} +} + +void StreamErrorParser::handleCharacterData(const String& data) { +	currentText += data; +} + +} diff --git a/Swiften/Parser/StreamErrorParser.h b/Swiften/Parser/StreamErrorParser.h new file mode 100644 index 0000000..a2aaa67 --- /dev/null +++ b/Swiften/Parser/StreamErrorParser.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2010 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +#include <Swiften/Elements/StreamError.h> +#include <Swiften/Parser/GenericElementParser.h> + +namespace Swift { +	class StreamErrorParser : public GenericElementParser<StreamError> { +		public: +			StreamErrorParser(); + +			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: +			enum Level {  +				TopLevel = 0,  +				ElementLevel = 1 +			}; +			int level; +			String currentText; +	}; +} diff --git a/Swiften/Parser/XMPPParser.cpp b/Swiften/Parser/XMPPParser.cpp index 6bd6082..26cebe2 100644 --- a/Swiften/Parser/XMPPParser.cpp +++ b/Swiften/Parser/XMPPParser.cpp @@ -20,6 +20,7 @@  #include "Swiften/Parser/IQParser.h"  #include "Swiften/Parser/MessageParser.h"  #include "Swiften/Parser/StreamFeaturesParser.h" +#include "Swiften/Parser/StreamErrorParser.h"  #include "Swiften/Parser/AuthRequestParser.h"  #include "Swiften/Parser/AuthSuccessParser.h"  #include "Swiften/Parser/AuthFailureParser.h" @@ -136,6 +137,9 @@ ElementParser* XMPPParser::createElementParser(const String& element, const Stri  	else if (element == "features"  && ns == "http://etherx.jabber.org/streams") {  		return new StreamFeaturesParser();  	} +	else if (element == "error" && ns == "urn:ietf:params:xml:ns:xmpp-streams") { +		return new StreamErrorParser(); +	}  	else if (element == "auth") {  		return new AuthRequestParser();  	} diff --git a/Swiften/SConscript b/Swiften/SConscript index afab713..c5198a6 100644 --- a/Swiften/SConscript +++ b/Swiften/SConscript @@ -119,6 +119,7 @@ if env["SCONS_STAGE"] == "build" :  			"Serializer/PayloadSerializers/NicknameSerializer.cpp",  			"Serializer/PresenceSerializer.cpp",  			"Serializer/StanzaSerializer.cpp", +			"Serializer/StreamErrorSerializer.cpp",  			"Serializer/StreamFeaturesSerializer.cpp",  			"Serializer/XML/XMLElement.cpp",  			"Serializer/XML/XMLNode.cpp", diff --git a/Swiften/Serializer/GenericElementSerializer.h b/Swiften/Serializer/GenericElementSerializer.h index 702e374..0329411 100644 --- a/Swiften/Serializer/GenericElementSerializer.h +++ b/Swiften/Serializer/GenericElementSerializer.h @@ -6,7 +6,9 @@  #pragma once -#include "Swiften/Serializer/ElementSerializer.h" +#include <boost/shared_ptr.hpp> + +#include <Swiften/Serializer/ElementSerializer.h>  namespace Swift {  	template<typename T> @@ -15,7 +17,7 @@ namespace Swift {  			virtual String serialize(boost::shared_ptr<Element> element) const = 0;  			virtual bool canSerialize(boost::shared_ptr<Element> element) const { -				return dynamic_cast<T*>(element.get()) != 0; +				return boost::dynamic_pointer_cast<T>(element);  			}  	};  } diff --git a/Swiften/Serializer/GenericPayloadSerializer.h b/Swiften/Serializer/GenericPayloadSerializer.h index b415256..13603e5 100644 --- a/Swiften/Serializer/GenericPayloadSerializer.h +++ b/Swiften/Serializer/GenericPayloadSerializer.h @@ -8,8 +8,7 @@  #include <boost/shared_ptr.hpp> -#include "Swiften/Serializer/PayloadSerializer.h" -#include "Swiften/Elements/Body.h" +#include <Swiften/Serializer/PayloadSerializer.h>  namespace Swift {  	template<typename PAYLOAD_TYPE> @@ -20,7 +19,7 @@ namespace Swift {  			}  			virtual bool canSerialize(boost::shared_ptr<Payload> element) const { -				return dynamic_cast<PAYLOAD_TYPE*>(element.get()); +				return boost::dynamic_pointer_cast<PAYLOAD_TYPE>(element);  			}  			virtual String serializePayload(boost::shared_ptr<PAYLOAD_TYPE>) const = 0; diff --git a/Swiften/Serializer/XMPPSerializer.cpp b/Swiften/Serializer/XMPPSerializer.cpp index da4715c..ad84152 100644 --- a/Swiften/Serializer/XMPPSerializer.cpp +++ b/Swiften/Serializer/XMPPSerializer.cpp @@ -7,6 +7,7 @@  #include "Swiften/Serializer/XMPPSerializer.h"  #include <boost/bind.hpp> +#include <boost/smart_ptr/make_shared.hpp>  #include <iostream>  #include <cassert> @@ -14,6 +15,7 @@  #include "Swiften/Base/foreach.h"  #include "Swiften/Serializer/CompressRequestSerializer.h"  #include "Swiften/Serializer/CompressFailureSerializer.h" +#include "Swiften/Serializer/StreamErrorSerializer.h"  #include "Swiften/Serializer/StreamFeaturesSerializer.h"  #include "Swiften/Serializer/AuthRequestSerializer.h"  #include "Swiften/Serializer/AuthFailureSerializer.h" @@ -36,26 +38,27 @@  namespace Swift {  XMPPSerializer::XMPPSerializer(PayloadSerializerCollection* payloadSerializers, StreamType type) : type_(type) { -	serializers_.push_back(boost::shared_ptr<ElementSerializer>(new PresenceSerializer(payloadSerializers))); -	serializers_.push_back(boost::shared_ptr<ElementSerializer>(new IQSerializer(payloadSerializers))); -	serializers_.push_back(boost::shared_ptr<ElementSerializer>(new MessageSerializer(payloadSerializers))); -	serializers_.push_back(boost::shared_ptr<ElementSerializer>(new CompressRequestSerializer())); -	serializers_.push_back(boost::shared_ptr<ElementSerializer>(new CompressFailureSerializer())); -	serializers_.push_back(boost::shared_ptr<ElementSerializer>(new AuthRequestSerializer())); -	serializers_.push_back(boost::shared_ptr<ElementSerializer>(new AuthFailureSerializer())); -	serializers_.push_back(boost::shared_ptr<ElementSerializer>(new AuthSuccessSerializer())); -	serializers_.push_back(boost::shared_ptr<ElementSerializer>(new AuthChallengeSerializer())); -	serializers_.push_back(boost::shared_ptr<ElementSerializer>(new AuthResponseSerializer())); -	serializers_.push_back(boost::shared_ptr<ElementSerializer>(new StartTLSRequestSerializer())); -	serializers_.push_back(boost::shared_ptr<ElementSerializer>(new StartTLSFailureSerializer())); -	serializers_.push_back(boost::shared_ptr<ElementSerializer>(new TLSProceedSerializer())); -	serializers_.push_back(boost::shared_ptr<ElementSerializer>(new StreamFeaturesSerializer())); -	serializers_.push_back(boost::shared_ptr<ElementSerializer>(new EnableStreamManagementSerializer())); -	serializers_.push_back(boost::shared_ptr<ElementSerializer>(new StreamManagementEnabledSerializer())); -	serializers_.push_back(boost::shared_ptr<ElementSerializer>(new StreamManagementFailedSerializer())); -	serializers_.push_back(boost::shared_ptr<ElementSerializer>(new StanzaAckSerializer())); -	serializers_.push_back(boost::shared_ptr<ElementSerializer>(new StanzaAckRequestSerializer())); -	serializers_.push_back(boost::shared_ptr<ElementSerializer>(new ComponentHandshakeSerializer())); +	serializers_.push_back(boost::make_shared<PresenceSerializer>(payloadSerializers)); +	serializers_.push_back(boost::make_shared<IQSerializer>(payloadSerializers)); +	serializers_.push_back(boost::make_shared<MessageSerializer>(payloadSerializers)); +	serializers_.push_back(boost::make_shared<CompressRequestSerializer>()); +	serializers_.push_back(boost::make_shared<CompressFailureSerializer>()); +	serializers_.push_back(boost::make_shared<AuthRequestSerializer>()); +	serializers_.push_back(boost::make_shared<AuthFailureSerializer>()); +	serializers_.push_back(boost::make_shared<AuthSuccessSerializer>()); +	serializers_.push_back(boost::make_shared<AuthChallengeSerializer>()); +	serializers_.push_back(boost::make_shared<AuthResponseSerializer>()); +	serializers_.push_back(boost::make_shared<StartTLSRequestSerializer>()); +	serializers_.push_back(boost::make_shared<StartTLSFailureSerializer>()); +	serializers_.push_back(boost::make_shared<TLSProceedSerializer>()); +	serializers_.push_back(boost::make_shared<StreamFeaturesSerializer>()); +	serializers_.push_back(boost::make_shared<StreamErrorSerializer>()); +	serializers_.push_back(boost::make_shared<EnableStreamManagementSerializer>()); +	serializers_.push_back(boost::make_shared<StreamManagementEnabledSerializer>()); +	serializers_.push_back(boost::make_shared<StreamManagementFailedSerializer>()); +	serializers_.push_back(boost::make_shared<StanzaAckSerializer>()); +	serializers_.push_back(boost::make_shared<StanzaAckRequestSerializer>()); +	serializers_.push_back(boost::make_shared<ComponentHandshakeSerializer>());  }  String XMPPSerializer::serializeHeader(const ProtocolHeader& header) const { | 
 Swift
 Swift