diff --git a/include/Swiften/Parser/PayloadParsers/PrivilegeParser.cpp b/include/Swiften/Parser/PayloadParsers/PrivilegeParser.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7a6ed12afcff62d93db471556fc6eb47eee8dd1d --- /dev/null +++ b/include/Swiften/Parser/PayloadParsers/PrivilegeParser.cpp @@ -0,0 +1,60 @@ +/* + * Implements Privilege tag for XEP-0356: Privileged Entity + * Licensed under the Simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include +#ifdef SWIFTEN_SUPPORTS_FORWARDED +#include +#else +#include +#include +#include +#endif + +namespace Swift { + +PrivilegeParser::PrivilegeParser(PayloadParserFactoryCollection* factories) : factories_(factories), level_(TopLevel) { +} + +void PrivilegeParser::handleStartElement(const std::string& element, const std::string& ns, const AttributeMap& attributes) { + if (level_ == PayloadLevel) { + if (element == "forwarded" && ns == "urn:xmpp:forward:0") { +#ifdef SWIFTEN_SUPPORTS_FORWARDED + childParser_ = SWIFTEN_SHRPTR_NAMESPACE::dynamic_pointer_cast(SWIFTEN_SHRPTR_NAMESPACE::make_shared(factories_)); +#else + PayloadParserFactory* parserFactory = factories_->getPayloadParserFactory(element, ns, attributes); + if (parserFactory) { + childParser_.reset(parserFactory->createPayloadParser()); + } + else { + childParser_.reset(new UnknownPayloadParser()); + } +#endif + }; + } + if (childParser_) { + childParser_->handleStartElement(element, ns, attributes); + } + ++level_; +} + +void PrivilegeParser::handleEndElement(const std::string& element, const std::string& ns) { + --level_; + if (childParser_ && level_ >= PayloadLevel) { + childParser_->handleEndElement(element, ns); + } + if (childParser_ && level_ == PayloadLevel) { + getPayloadInternal()->setForwarded(SWIFTEN_SHRPTR_NAMESPACE::dynamic_pointer_cast(childParser_->getPayload())); + childParser_.reset(); + } +} + +void PrivilegeParser::handleCharacterData(const std::string& data) { + if (childParser_) { + childParser_->handleCharacterData(data); + } +} + +}