diff --git a/spectrum/src/frontends/xmpp/XMPPFrontend.cpp b/spectrum/src/frontends/xmpp/XMPPFrontend.cpp index 3639925a4bc0e6b6e5be7ab9499249fd92a19faa..649c6c03b9f8336bd38796493afdb96351988843 100644 --- a/spectrum/src/frontends/xmpp/XMPPFrontend.cpp +++ b/spectrum/src/frontends/xmpp/XMPPFrontend.cpp @@ -32,6 +32,7 @@ #include "transport/Config.h" #include "transport/Transport.h" #include "storageparser.h" +#include "Swiften/SwiftenCompat.h" #ifdef _WIN32 #include #include "Swiften/TLS/Schannel/SchannelServerContext.h" @@ -59,7 +60,16 @@ #include "BlockSerializer.h" #include "Swiften/Parser/PayloadParsers/InvisibleParser.h" #include "Swiften/Serializer/PayloadSerializers/InvisibleSerializer.h" +#include "Swiften/Parser/PayloadParsers/HintPayloadParser.h" +#include "Swiften/Serializer/PayloadSerializers/HintPayloadSerializer.h" +#ifdef SWIFTEN_SUPPORTS_PRIVILEGE +#include "Swiften/Parser/PayloadParsers/PrivilegeParser.h" +#include "Swiften/Serializer/PayloadSerializers/PrivilegeSerializer.h" +#endif #include "Swiften/Parser/GenericPayloadParserFactory.h" +#if SWIFTEN_VERSION >= 0x030000 +#include "Swiften/Parser/GenericPayloadParserFactory2.h" +#endif #include "Swiften/Queries/IQRouter.h" #include "Swiften/Elements/RosterPayload.h" #include "discoitemsresponder.h" @@ -74,6 +84,20 @@ DEFINE_LOGGER(logger, "XMPPFrontend"); XMPPFrontend::XMPPFrontend() { } +class SwiftServerExposed: public Swift::Server +{ +public: + PayloadParserFactoryCollection* getPayloadParserFactories() { return Swift::Server::getPayloadParserFactories(); } + PayloadSerializerCollection* getPayloadSerializers() { return Swift::Server::getPayloadSerializers(); } +}; + +class SwiftComponentExposed: public Swift::Component +{ +public: + PayloadParserFactoryCollection* getPayloadParserFactories() { return Swift::Component::getPayloadParserFactories(); } + PayloadSerializerCollection* getPayloadSerializers() { return Swift::Component::getPayloadSerializers(); } +}; + void XMPPFrontend::init(Component *transport, Swift::EventLoop *loop, Swift::NetworkFactories *factories, Config *config, Transport::UserRegistry *userRegistry) { m_transport = transport; m_component = NULL; @@ -93,6 +117,10 @@ void XMPPFrontend::init(Component *transport, Swift::EventLoop *loop, Swift::Net m_parserFactories.push_back(new Swift::GenericPayloadParserFactory("query", "http://jabber.org/protocol/stats")); m_parserFactories.push_back(new Swift::GenericPayloadParserFactory("query", "jabber:iq:gateway")); m_parserFactories.push_back(new Swift::GenericPayloadParserFactory("x", "http://jabber.org/protocol/muc")); + m_parserFactories.push_back(new Swift::GenericPayloadParserFactory("no-permanent-store", "urn:xmpp:hints")); + m_parserFactories.push_back(new Swift::GenericPayloadParserFactory("no-store", "urn:xmpp:hints")); + m_parserFactories.push_back(new Swift::GenericPayloadParserFactory("no-copy", "urn:xmpp:hints")); + m_parserFactories.push_back(new Swift::GenericPayloadParserFactory("store", "urn:xmpp:hints")); m_payloadSerializers.push_back(new Swift::AttentionSerializer()); m_payloadSerializers.push_back(new Swift::XHTMLIMSerializer()); @@ -101,6 +129,7 @@ void XMPPFrontend::init(Component *transport, Swift::EventLoop *loop, Swift::Net m_payloadSerializers.push_back(new Swift::StatsSerializer()); m_payloadSerializers.push_back(new Swift::SpectrumErrorSerializer()); m_payloadSerializers.push_back(new Swift::GatewayPayloadSerializer()); + m_payloadSerializers.push_back(new Swift::HintPayloadSerializer()); if (CONFIG_BOOL(m_config, "service.server_mode")) { LOG4CXX_INFO(logger, "Creating component in server mode on port " << CONFIG_INT(m_config, "service.port")); @@ -125,6 +154,12 @@ void XMPPFrontend::init(Component *transport, Swift::EventLoop *loop, Swift::Net m_stanzaChannel = m_server->getStanzaChannel(); m_iqRouter = m_server->getIQRouter(); + SwiftServerExposed* entity(reinterpret_cast(m_server)); +#ifdef SWIFTEN_SUPPORTS_PRIVILEGE + m_parserFactories.push_back(new Swift::GenericPayloadParserFactory2("privilege", "urn:xmpp:privilege:1", entity->getPayloadParserFactories())); + m_payloadSerializers.push_back(new Swift::PrivilegeSerializer(entity->getPayloadSerializers())); +#endif + BOOST_FOREACH(Swift::PayloadParserFactory *factory, m_parserFactories) { m_server->addPayloadParserFactory(factory); } @@ -149,6 +184,12 @@ void XMPPFrontend::init(Component *transport, Swift::EventLoop *loop, Swift::Net m_component->onDataRead.connect(boost::bind(&XMPPFrontend::handleDataRead, this, _1)); m_component->onDataWritten.connect(boost::bind(&XMPPFrontend::handleDataWritten, this, _1)); + SwiftComponentExposed* entity(reinterpret_cast(m_component)); +#ifdef SWIFTEN_SUPPORTS_PRIVILEGE + m_parserFactories.push_back(new Swift::GenericPayloadParserFactory2("privilege", "urn:xmpp:privilege:1", entity->getPayloadParserFactories())); + m_payloadSerializers.push_back(new Swift::PrivilegeSerializer(entity->getPayloadSerializers())); +#endif + BOOST_FOREACH(Swift::PayloadParserFactory *factory, m_parserFactories) { m_component->addPayloadParserFactory(factory); } @@ -161,6 +202,7 @@ void XMPPFrontend::init(Component *transport, Swift::EventLoop *loop, Swift::Net m_iqRouter = m_component->getIQRouter(); } + m_capsMemoryStorage = new CapsMemoryStorage(); #if HAVE_SWIFTEN_3 m_capsManager = new CapsManager(m_capsMemoryStorage, m_stanzaChannel, m_iqRouter, factories->getCryptoProvider());