#pragma once #include #include #include #include #include "Swiften/JID/JID.h" #include "Swiften/Elements/Element.h" #include "Swiften/Network/Connection.h" #include "Swiften/StreamStack/ConnectionLayer.h" namespace Swift { class ProtocolHeader; class StreamStack; class JID; class Stanza; class ByteArray; class PayloadParserFactoryCollection; class PayloadSerializerCollection; class XMPPLayer; class Session : public boost::enable_shared_from_this { public: enum Error { ConnectionError, XMLError }; Session( boost::shared_ptr connection, PayloadParserFactoryCollection* payloadParserFactories, PayloadSerializerCollection* payloadSerializers); virtual ~Session(); void startSession(); void finishSession(); void sendStanza(boost::shared_ptr); boost::signal)> onStanzaReceived; boost::signal onSessionStarted; boost::signal&)> onSessionFinished; boost::signal onDataWritten; boost::signal onDataRead; protected: void finishSession(const Error&); virtual void handleSessionStarted() {} virtual void handleElement(boost::shared_ptr) = 0; virtual void handleStreamStart(const ProtocolHeader&) = 0; void initializeStreamStack(); boost::shared_ptr getXMPPLayer() const { return xmppLayer; } void setInitialized(); bool isInitialized() const { return initialized; } private: void handleDisconnected(const boost::optional& error); private: boost::shared_ptr connection; PayloadParserFactoryCollection* payloadParserFactories; PayloadSerializerCollection* payloadSerializers; boost::shared_ptr xmppLayer; boost::shared_ptr connectionLayer; StreamStack* streamStack; bool initialized; }; }