#include "Swiften/Serializer/StreamFeaturesSerializer.h" #include "Swiften/Serializer/XML/XMLElement.h" #include "Swiften/Serializer/XML/XMLTextNode.h" #include "Swiften/Base/foreach.h" namespace Swift { StreamFeaturesSerializer::StreamFeaturesSerializer() { } String StreamFeaturesSerializer::serialize(boost::shared_ptr element) const { boost::shared_ptr streamFeatures(boost::dynamic_pointer_cast(element)); XMLElement streamFeaturesElement("stream:features"); if (streamFeatures->hasStartTLS()) { streamFeaturesElement.addNode(boost::shared_ptr(new XMLElement("starttls", "urn:ietf:params:xml:ns:xmpp-tls"))); } if (!streamFeatures->getCompressionMethods().empty()) { boost::shared_ptr compressionElement(new XMLElement("compression", "http://jabber.org/features/compress")); foreach(const String& method, streamFeatures->getCompressionMethods()) { boost::shared_ptr methodElement(new XMLElement("method")); methodElement->addNode(boost::shared_ptr(new XMLTextNode(method))); compressionElement->addNode(methodElement); } streamFeaturesElement.addNode(compressionElement); } if (!streamFeatures->getAuthenticationMechanisms().empty()) { boost::shared_ptr mechanismsElement(new XMLElement("mechanisms", "urn:ietf:params:xml:ns:xmpp-sasl")); foreach(const String& mechanism, streamFeatures->getAuthenticationMechanisms()) { boost::shared_ptr mechanismElement(new XMLElement("mechanism")); mechanismElement->addNode(boost::shared_ptr(new XMLTextNode(mechanism))); mechanismsElement->addNode(mechanismElement); } streamFeaturesElement.addNode(mechanismsElement); } if (streamFeatures->hasResourceBind()) { streamFeaturesElement.addNode(boost::shared_ptr(new XMLElement("bind", "urn:ietf:params:xml:ns:xmpp-bind"))); } if (streamFeatures->hasSession()) { streamFeaturesElement.addNode(boost::shared_ptr(new XMLElement("session", "urn:ietf:params:xml:ns:xmpp-session"))); } return streamFeaturesElement.serialize(); } }