/* * Copyright (c) 2010 Remko Tronçon * Licensed under the GNU General Public License v3. * See Documentation/Licenses/GPLv3.txt for more information. */ #pragma once #include #include "Swiften/Base/boost_signalslib.h" #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 Element; class ByteArray; class PayloadParserFactoryCollection; class PayloadSerializerCollection; class XMPPLayer; class Session : public boost::enable_shared_from_this { public: enum SessionError { ConnectionReadError, ConnectionWriteError, XMLError, AuthenticationFailedError, NoSupportedAuthMechanismsError, UnexpectedElementError, ResourceBindError, SessionStartError, TLSError, ClientCertificateLoadError, ClientCertificateError }; Session( boost::shared_ptr connection, PayloadParserFactoryCollection* payloadParserFactories, PayloadSerializerCollection* payloadSerializers); virtual ~Session(); void startSession(); void finishSession(); void sendElement(boost::shared_ptr); const JID& getLocalJID() const { return localJID; } const JID& getRemoteJID() const { return remoteJID; } boost::signal)> onElementReceived; boost::signal&)> onSessionFinished; boost::signal onDataWritten; boost::signal onDataRead; protected: void setRemoteJID(const JID& j) { remoteJID = j; } void setLocalJID(const JID& j) { localJID = j; } void finishSession(const SessionError&); virtual void handleSessionStarted() {} virtual void handleSessionFinished(const boost::optional&) {} virtual void handleElement(boost::shared_ptr) = 0; virtual void handleStreamStart(const ProtocolHeader&) = 0; void initializeStreamStack(); boost::shared_ptr getXMPPLayer() const { return xmppLayer; } StreamStack* getStreamStack() const { return streamStack; } void setFinished(); private: void handleDisconnected(const boost::optional& error); private: JID localJID; JID remoteJID; boost::shared_ptr connection; PayloadParserFactoryCollection* payloadParserFactories; PayloadSerializerCollection* payloadSerializers; boost::shared_ptr xmppLayer; boost::shared_ptr connectionLayer; StreamStack* streamStack; bool finishing; }; }