/* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once #include #include #include #include #include #include #include namespace Swift { class PayloadParser; class PayloadParserFactoryCollection; class SWIFTEN_API StanzaParser : public ElementParser, public boost::noncopyable { public: StanzaParser(PayloadParserFactoryCollection* factories); ~StanzaParser(); void handleStartElement(const std::string& element, const std::string& ns, const AttributeMap& attributes); void handleEndElement(const std::string& element, const std::string& ns); void handleCharacterData(const std::string& data); virtual std::shared_ptr getElement() const = 0; virtual void handleStanzaAttributes(const AttributeMap&) {} virtual std::shared_ptr getStanza() const { return std::dynamic_pointer_cast(getElement()); } private: bool inPayload() const { return currentDepth_ > 1; } bool inStanza() const { return currentDepth_ > 0; } private: int currentDepth_; PayloadParserFactoryCollection* factories_; std::shared_ptr currentPayloadParser_; }; }