diff options
Diffstat (limited to 'Swiften/Session/Session.cpp')
-rw-r--r-- | Swiften/Session/Session.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/Swiften/Session/Session.cpp b/Swiften/Session/Session.cpp new file mode 100644 index 0000000..64456db --- /dev/null +++ b/Swiften/Session/Session.cpp @@ -0,0 +1,82 @@ +#include "Swiften/Session/Session.h" + +#include <boost/bind.hpp> + +#include "Swiften/StreamStack/XMPPLayer.h" +#include "Swiften/StreamStack/StreamStack.h" + +namespace Swift { + +Session::Session( + boost::shared_ptr<Connection> connection, + PayloadParserFactoryCollection* payloadParserFactories, + PayloadSerializerCollection* payloadSerializers) : + connection(connection), + payloadParserFactories(payloadParserFactories), + payloadSerializers(payloadSerializers), + streamStack(0), + finishing(false) { +} + +Session::~Session() { + delete streamStack; +} + +void Session::startSession() { + initializeStreamStack(); + handleSessionStarted(); +} + +void Session::finishSession() { + finishing = true; + connection->disconnect(); + handleSessionFinished(boost::optional<SessionError>()); + finishing = false; + onSessionFinished(boost::optional<SessionError>()); +} + +void Session::finishSession(const SessionError& error) { + finishing = true; + connection->disconnect(); + handleSessionFinished(boost::optional<SessionError>(error)); + finishing = false; + onSessionFinished(boost::optional<SessionError>(error)); +} + +void Session::initializeStreamStack() { + xmppLayer = boost::shared_ptr<XMPPLayer>( + new XMPPLayer(payloadParserFactories, payloadSerializers)); + xmppLayer->onStreamStart.connect( + boost::bind(&Session::handleStreamStart, shared_from_this(), _1)); + xmppLayer->onElement.connect(boost::bind(&Session::handleElement, shared_from_this(), _1)); + xmppLayer->onError.connect( + boost::bind(&Session::finishSession, shared_from_this(), XMLError)); + xmppLayer->onDataRead.connect(boost::bind(boost::ref(onDataRead), _1)); + xmppLayer->onWriteData.connect(boost::bind(boost::ref(onDataWritten), _1)); + connection->onDisconnected.connect( + boost::bind(&Session::handleDisconnected, shared_from_this(), _1)); + connectionLayer = boost::shared_ptr<ConnectionLayer>(new ConnectionLayer(connection)); + streamStack = new StreamStack(xmppLayer, connectionLayer); +} + +void Session::sendElement(boost::shared_ptr<Element> stanza) { + xmppLayer->writeElement(stanza); +} + +void Session::handleDisconnected(const boost::optional<Connection::Error>& connectionError) { + if (connectionError) { + switch (*connectionError) { + case Connection::ReadError: + finishSession(ConnectionReadError); + break; + case Connection::WriteError: + finishSession(ConnectionWriteError); + break; + } + } + else { + finishSession(); + } +} + +} |