#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 LinkLocalSession : public boost::enable_shared_from_this { public: enum Error { ConnectionError, UnknownError }; LinkLocalSession( const JID& localJID, boost::shared_ptr connection, PayloadParserFactoryCollection* payloadParserFactories, PayloadSerializerCollection* payloadSerializers); virtual ~LinkLocalSession(); void finishSession(); // TODO: Make non-virtual when OutgoingSession is fixed virtual void sendElement(boost::shared_ptr); virtual const JID& getRemoteJID() const = 0; virtual void start() = 0; boost::signal)> onElementReceived; boost::signal)> onSessionFinished; boost::signal onSessionStarted; boost::signal onDataWritten; boost::signal onDataRead; protected: void initializeStreamStack(); const JID& getLocalJID() const { return localJID; } boost::shared_ptr getXMPPLayer() const { return xmppLayer; } // TODO: Remove later void setConnection(boost::shared_ptr c) { connection = c; } virtual void handleElement(boost::shared_ptr) = 0; virtual void handleStreamStart(const ProtocolHeader&) = 0; void setInitialized(); bool isInitialized() const { return initialized; } private: void handleDisconnected(const boost::optional& error); private: JID localJID; PayloadParserFactoryCollection* payloadParserFactories; PayloadSerializerCollection* payloadSerializers; boost::shared_ptr connection; boost::shared_ptr xmppLayer; boost::shared_ptr connectionLayer; StreamStack* streamStack; bool initialized; }; }