summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Swiften/Client/Client.cpp30
-rw-r--r--Swiften/Client/Client.h8
-rw-r--r--Swiften/Client/ClientSession.cpp (renamed from Swiften/Client/Session.cpp)48
-rw-r--r--Swiften/Client/ClientSession.h (renamed from Swiften/Client/Session.h)12
-rw-r--r--Swiften/Client/Makefile.inc2
-rw-r--r--Swiften/Client/UnitTest/ClientSessionTest.cpp (renamed from Swiften/Client/UnitTest/SessionTest.cpp)90
-rw-r--r--Swiften/Client/UnitTest/Makefile.inc2
-rw-r--r--Swiften/Session/Makefile.inc2
-rw-r--r--Swiften/Session/Session.cpp72
-rw-r--r--Swiften/Session/Session.h76
10 files changed, 244 insertions, 98 deletions
diff --git a/Swiften/Client/Client.cpp b/Swiften/Client/Client.cpp
index 04a24bf..a38416a 100644
--- a/Swiften/Client/Client.cpp
+++ b/Swiften/Client/Client.cpp
@@ -3,7 +3,7 @@
#include <boost/bind.hpp>
#include "Swiften/Network/DomainNameResolver.h"
-#include "Swiften/Client/Session.h"
+#include "Swiften/Client/ClientSession.h"
#include "Swiften/StreamStack/PlatformTLSLayerFactory.h"
#include "Swiften/Network/BoostConnectionFactory.h"
#include "Swiften/Network/DomainNameResolveException.h"
@@ -44,7 +44,7 @@ void Client::handleConnectionConnectFinished(bool error) {
onError(ClientError::ConnectionError);
}
else {
- session_ = new Session(jid_, connection_, tlsLayerFactory_, &payloadParserFactories_, &payloadSerializers_);
+ session_ = new ClientSession(jid_, connection_, tlsLayerFactory_, &payloadParserFactories_, &payloadSerializers_);
if (!certificate_.isEmpty()) {
session_->setCertificate(PKCS12Certificate(certificate_, password_));
}
@@ -108,43 +108,43 @@ void Client::setCertificate(const String& certificate) {
certificate_ = certificate;
}
-void Client::handleSessionError(Session::SessionError error) {
+void Client::handleSessionError(ClientSession::SessionError error) {
ClientError clientError;
switch (error) {
- case Session::NoError:
+ case ClientSession::NoError:
assert(false);
break;
- case Session::ConnectionReadError:
+ case ClientSession::ConnectionReadError:
clientError = ClientError(ClientError::ConnectionReadError);
break;
- case Session::ConnectionWriteError:
+ case ClientSession::ConnectionWriteError:
clientError = ClientError(ClientError::ConnectionWriteError);
break;
- case Session::XMLError:
+ case ClientSession::XMLError:
clientError = ClientError(ClientError::XMLError);
break;
- case Session::AuthenticationFailedError:
+ case ClientSession::AuthenticationFailedError:
clientError = ClientError(ClientError::AuthenticationFailedError);
break;
- case Session::NoSupportedAuthMechanismsError:
+ case ClientSession::NoSupportedAuthMechanismsError:
clientError = ClientError(ClientError::NoSupportedAuthMechanismsError);
break;
- case Session::UnexpectedElementError:
+ case ClientSession::UnexpectedElementError:
clientError = ClientError(ClientError::UnexpectedElementError);
break;
- case Session::ResourceBindError:
+ case ClientSession::ResourceBindError:
clientError = ClientError(ClientError::ResourceBindError);
break;
- case Session::SessionStartError:
+ case ClientSession::SessionStartError:
clientError = ClientError(ClientError::SessionStartError);
break;
- case Session::TLSError:
+ case ClientSession::TLSError:
clientError = ClientError(ClientError::TLSError);
break;
- case Session::ClientCertificateLoadError:
+ case ClientSession::ClientCertificateLoadError:
clientError = ClientError(ClientError::ClientCertificateLoadError);
break;
- case Session::ClientCertificateError:
+ case ClientSession::ClientCertificateError:
clientError = ClientError(ClientError::ClientCertificateError);
break;
}
diff --git a/Swiften/Client/Client.h b/Swiften/Client/Client.h
index 66f9b01..48b76d9 100644
--- a/Swiften/Client/Client.h
+++ b/Swiften/Client/Client.h
@@ -4,7 +4,7 @@
#include <boost/signals.hpp>
#include <boost/shared_ptr.hpp>
-#include "Swiften/Client/Session.h"
+#include "Swiften/Client/ClientSession.h"
#include "Swiften/Client/ClientError.h"
#include "Swiften/Elements/Presence.h"
#include "Swiften/Elements/Message.h"
@@ -20,7 +20,7 @@
namespace Swift {
class TLSLayerFactory;
class ConnectionFactory;
- class Session;
+ class ClientSession;
class Client : public StanzaChannel, public IQRouter {
public:
@@ -47,7 +47,7 @@ namespace Swift {
void send(boost::shared_ptr<Stanza>);
virtual String getNewIQID();
void handleElement(boost::shared_ptr<Element>);
- void handleSessionError(Session::SessionError error);
+ void handleSessionError(ClientSession::SessionError error);
void handleNeedCredentials();
void handleDataRead(const ByteArray&);
void handleDataWritten(const ByteArray&);
@@ -61,7 +61,7 @@ namespace Swift {
TLSLayerFactory* tlsLayerFactory_;
FullPayloadParserFactoryCollection payloadParserFactories_;
FullPayloadSerializerCollection payloadSerializers_;
- Session* session_;
+ ClientSession* session_;
boost::shared_ptr<Connection> connection_;
String certificate_;
};
diff --git a/Swiften/Client/Session.cpp b/Swiften/Client/ClientSession.cpp
index 1bd2b22..11317e8 100644
--- a/Swiften/Client/Session.cpp
+++ b/Swiften/Client/ClientSession.cpp
@@ -1,4 +1,4 @@
-#include "Swiften/Client/Session.h"
+#include "Swiften/Client/ClientSession.h"
#include <boost/bind.hpp>
@@ -24,7 +24,7 @@
namespace Swift {
-Session::Session(
+ClientSession::ClientSession(
const JID& jid,
boost::shared_ptr<Connection> connection,
TLSLayerFactory* tlsLayerFactory,
@@ -41,42 +41,42 @@ Session::Session(
needSessionStart_(false) {
}
-Session::~Session() {
+ClientSession::~ClientSession() {
delete streamStack_;
}
-void Session::start() {
+void ClientSession::start() {
assert(state_ == Initial);
- connection_->onDisconnected.connect(boost::bind(&Session::handleDisconnected, this, _1));
+ connection_->onDisconnected.connect(boost::bind(&ClientSession::handleDisconnected, this, _1));
initializeStreamStack();
state_ = WaitingForStreamStart;
sendStreamHeader();
}
-void Session::stop() {
+void ClientSession::stop() {
// TODO: Send end stream header if applicable
connection_->disconnect();
}
-void Session::sendStreamHeader() {
+void ClientSession::sendStreamHeader() {
ProtocolHeader header;
header.setTo(jid_.getDomain());
xmppLayer_->writeHeader(header);
}
-void Session::initializeStreamStack() {
+void ClientSession::initializeStreamStack() {
xmppLayer_ = boost::shared_ptr<XMPPLayer>(new XMPPLayer(payloadParserFactories_, payloadSerializers_));
- xmppLayer_->onStreamStart.connect(boost::bind(&Session::handleStreamStart, this));
- xmppLayer_->onElement.connect(boost::bind(&Session::handleElement, this, _1));
- xmppLayer_->onError.connect(boost::bind(&Session::setError, this, XMLError));
+ xmppLayer_->onStreamStart.connect(boost::bind(&ClientSession::handleStreamStart, this));
+ xmppLayer_->onElement.connect(boost::bind(&ClientSession::handleElement, this, _1));
+ xmppLayer_->onError.connect(boost::bind(&ClientSession::setError, this, XMLError));
xmppLayer_->onDataRead.connect(boost::bind(boost::ref(onDataRead), _1));
xmppLayer_->onWriteData.connect(boost::bind(boost::ref(onDataWritten), _1));
connectionLayer_ = boost::shared_ptr<ConnectionLayer>(new ConnectionLayer(connection_));
streamStack_ = new StreamStack(xmppLayer_, connectionLayer_);
}
-void Session::handleDisconnected(const boost::optional<Connection::Error>& error) {
+void ClientSession::handleDisconnected(const boost::optional<Connection::Error>& error) {
if (error) {
switch (*error) {
case Connection::ReadError:
@@ -89,16 +89,16 @@ void Session::handleDisconnected(const boost::optional<Connection::Error>& error
}
}
-void Session::setCertificate(const PKCS12Certificate& certificate) {
+void ClientSession::setCertificate(const PKCS12Certificate& certificate) {
certificate_ = certificate;
}
-void Session::handleStreamStart() {
+void ClientSession::handleStreamStart() {
checkState(WaitingForStreamStart);
state_ = Negotiating;
}
-void Session::handleElement(boost::shared_ptr<Element> element) {
+void ClientSession::handleElement(boost::shared_ptr<Element> element) {
if (getState() == SessionStarted) {
onElementReceived(element);
}
@@ -173,8 +173,8 @@ void Session::handleElement(boost::shared_ptr<Element> element) {
setError(ClientCertificateLoadError);
}
else {
- tlsLayer_->onConnected.connect(boost::bind(&Session::handleTLSConnected, this));
- tlsLayer_->onError.connect(boost::bind(&Session::handleTLSError, this));
+ tlsLayer_->onConnected.connect(boost::bind(&ClientSession::handleTLSConnected, this));
+ tlsLayer_->onError.connect(boost::bind(&ClientSession::handleTLSError, this));
tlsLayer_->connect();
}
}
@@ -229,19 +229,19 @@ void Session::handleElement(boost::shared_ptr<Element> element) {
}
}
-void Session::sendSessionStart() {
+void ClientSession::sendSessionStart() {
state_ = StartingSession;
xmppLayer_->writeElement(IQ::createRequest(IQ::Set, JID(), "session-start", boost::shared_ptr<StartSession>(new StartSession())));
}
-void Session::setError(SessionError error) {
+void ClientSession::setError(SessionError error) {
assert(error != NoError);
state_ = Error;
error_ = error;
onError(error);
}
-bool Session::checkState(State state) {
+bool ClientSession::checkState(State state) {
if (state_ != state) {
setError(UnexpectedElementError);
return false;
@@ -249,24 +249,24 @@ bool Session::checkState(State state) {
return true;
}
-void Session::sendCredentials(const String& password) {
+void ClientSession::sendCredentials(const String& password) {
assert(WaitingForCredentials);
state_ = Authenticating;
xmppLayer_->writeElement(boost::shared_ptr<Element>(new AuthRequest("PLAIN", PLAINMessage(jid_.getNode(), password).getValue())));
}
-void Session::sendElement(boost::shared_ptr<Element> element) {
+void ClientSession::sendElement(boost::shared_ptr<Element> element) {
assert(SessionStarted);
xmppLayer_->writeElement(element);
}
-void Session::handleTLSConnected() {
+void ClientSession::handleTLSConnected() {
state_ = WaitingForStreamStart;
xmppLayer_->resetParser();
sendStreamHeader();
}
-void Session::handleTLSError() {
+void ClientSession::handleTLSError() {
setError(TLSError);
}
diff --git a/Swiften/Client/Session.h b/Swiften/Client/ClientSession.h
index 58531b3..50dae24 100644
--- a/Swiften/Client/Session.h
+++ b/Swiften/Client/ClientSession.h
@@ -1,5 +1,4 @@
-#ifndef SWIFTEN_Session_H
-#define SWIFTEN_Session_H
+#pragma once
#include <boost/signal.hpp>
#include <boost/shared_ptr.hpp>
@@ -22,7 +21,7 @@ namespace Swift {
class TLSLayer;
class WhitespacePingLayer;
- class Session {
+ class ClientSession {
public:
enum State {
Initial,
@@ -52,13 +51,13 @@ namespace Swift {
ClientCertificateError
};
- Session(
+ ClientSession(
const JID& jid,
boost::shared_ptr<Connection>,
TLSLayerFactory*,
PayloadParserFactoryCollection*,
PayloadSerializerCollection*);
- ~Session();
+ ~ClientSession();
State getState() const {
return state_;
@@ -122,7 +121,4 @@ namespace Swift {
bool needSessionStart_;
PKCS12Certificate certificate_;
};
-
}
-
-#endif
diff --git a/Swiften/Client/Makefile.inc b/Swiften/Client/Makefile.inc
index 75eb08f..8171ed1 100644
--- a/Swiften/Client/Makefile.inc
+++ b/Swiften/Client/Makefile.inc
@@ -1,5 +1,5 @@
SWIFTEN_SOURCES += \
Swiften/Client/Client.cpp \
- Swiften/Client/Session.cpp
+ Swiften/Client/ClientSession.cpp
include Swiften/Client/UnitTest/Makefile.inc
diff --git a/Swiften/Client/UnitTest/SessionTest.cpp b/Swiften/Client/UnitTest/ClientSessionTest.cpp
index eb7281c..1e66019 100644
--- a/Swiften/Client/UnitTest/SessionTest.cpp
+++ b/Swiften/Client/UnitTest/ClientSessionTest.cpp
@@ -29,15 +29,15 @@
#include "Swiften/EventLoop/DummyEventLoop.h"
#include "Swiften/Network/Connection.h"
#include "Swiften/Network/ConnectionFactory.h"
-#include "Swiften/Client/Session.h"
+#include "Swiften/Client/ClientSession.h"
#include "Swiften/TLS/PKCS12Certificate.h"
#include "Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h"
#include "Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h"
using namespace Swift;
-class SessionTest : public CppUnit::TestFixture {
- CPPUNIT_TEST_SUITE(SessionTest);
+class ClientSessionTest : public CppUnit::TestFixture {
+ CPPUNIT_TEST_SUITE(ClientSessionTest);
CPPUNIT_TEST(testConstructor);
CPPUNIT_TEST(testStart_Error);
CPPUNIT_TEST(testStart_XMLError);
@@ -62,7 +62,7 @@ class SessionTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE_END();
public:
- SessionTest() {}
+ ClientSessionTest() {}
void setUp() {
eventLoop_ = new DummyEventLoop();
@@ -79,7 +79,7 @@ class SessionTest : public CppUnit::TestFixture {
void testConstructor() {
std::auto_ptr<MockSession> session(createSession("me@foo.com/Bar"));
- CPPUNIT_ASSERT_EQUAL(Session::Initial, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::Initial, session->getState());
}
void testStart_Error() {
@@ -88,13 +88,13 @@ class SessionTest : public CppUnit::TestFixture {
getMockServer()->expectStreamStart();
session->start();
processEvents();
- CPPUNIT_ASSERT_EQUAL(Session::WaitingForStreamStart, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::WaitingForStreamStart, session->getState());
getMockServer()->setError();
processEvents();
- CPPUNIT_ASSERT_EQUAL(Session::Error, session->getState());
- CPPUNIT_ASSERT_EQUAL(Session::ConnectionReadError, session->getError());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::Error, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::ConnectionReadError, session->getError());
}
void testStart_XMLError() {
@@ -103,13 +103,13 @@ class SessionTest : public CppUnit::TestFixture {
getMockServer()->expectStreamStart();
session->start();
processEvents();
- CPPUNIT_ASSERT_EQUAL(Session::WaitingForStreamStart, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::WaitingForStreamStart, session->getState());
getMockServer()->sendInvalidXML();
processEvents();
- CPPUNIT_ASSERT_EQUAL(Session::Error, session->getState());
- CPPUNIT_ASSERT_EQUAL(Session::XMLError, session->getError());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::Error, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::XMLError, session->getError());
}
void testStartTLS_NoTLSSupport() {
@@ -120,7 +120,7 @@ class SessionTest : public CppUnit::TestFixture {
getMockServer()->sendStreamFeaturesWithStartTLS();
session->start();
processEvents();
- CPPUNIT_ASSERT_EQUAL(Session::SessionStarted, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::SessionStarted, session->getState());
}
void testStartTLS() {
@@ -133,7 +133,7 @@ class SessionTest : public CppUnit::TestFixture {
getMockServer()->sendTLSProceed();
session->start();
processEvents();
- CPPUNIT_ASSERT_EQUAL(Session::Encrypting, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::Encrypting, session->getState());
CPPUNIT_ASSERT(session->getTLSLayer());
CPPUNIT_ASSERT(session->getTLSLayer()->isConnecting());
@@ -143,7 +143,7 @@ class SessionTest : public CppUnit::TestFixture {
session->getTLSLayer()->setConnected();
// FIXME: Test 'WatingForStreamStart' state
processEvents();
- CPPUNIT_ASSERT_EQUAL(Session::Negotiating, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::Negotiating, session->getState());
}
void testStartTLS_ServerError() {
@@ -156,8 +156,8 @@ class SessionTest : public CppUnit::TestFixture {
session->start();
processEvents();
- CPPUNIT_ASSERT_EQUAL(Session::Error, session->getState());
- CPPUNIT_ASSERT_EQUAL(Session::TLSError, session->getError());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::Error, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::TLSError, session->getError());
}
void testStartTLS_ConnectError() {
@@ -171,8 +171,8 @@ class SessionTest : public CppUnit::TestFixture {
processEvents();
session->getTLSLayer()->setError();
- CPPUNIT_ASSERT_EQUAL(Session::Error, session->getState());
- CPPUNIT_ASSERT_EQUAL(Session::TLSError, session->getError());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::Error, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::TLSError, session->getError());
}
void testStartTLS_ErrorAfterConnect() {
@@ -192,19 +192,19 @@ class SessionTest : public CppUnit::TestFixture {
session->getTLSLayer()->setError();
- CPPUNIT_ASSERT_EQUAL(Session::Error, session->getState());
- CPPUNIT_ASSERT_EQUAL(Session::TLSError, session->getError());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::Error, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::TLSError, session->getError());
}
void testAuthenticate() {
std::auto_ptr<MockSession> session(createSession("me@foo.com/Bar"));
- session->onNeedCredentials.connect(boost::bind(&SessionTest::setNeedCredentials, this));
+ session->onNeedCredentials.connect(boost::bind(&ClientSessionTest::setNeedCredentials, this));
getMockServer()->expectStreamStart();
getMockServer()->sendStreamStart();
getMockServer()->sendStreamFeaturesWithAuthentication();
session->start();
processEvents();
- CPPUNIT_ASSERT_EQUAL(Session::WaitingForCredentials, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::WaitingForCredentials, session->getState());
CPPUNIT_ASSERT(needCredentials_);
getMockServer()->expectAuth("me", "mypass");
@@ -212,9 +212,9 @@ class SessionTest : public CppUnit::TestFixture {
getMockServer()->expectStreamStart();
getMockServer()->sendStreamStart();
session->sendCredentials("mypass");
- CPPUNIT_ASSERT_EQUAL(Session::Authenticating, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::Authenticating, session->getState());
processEvents();
- CPPUNIT_ASSERT_EQUAL(Session::Negotiating, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::Negotiating, session->getState());
}
void testAuthenticate_Unauthorized() {
@@ -230,8 +230,8 @@ class SessionTest : public CppUnit::TestFixture {
session->sendCredentials("mypass");
processEvents();
- CPPUNIT_ASSERT_EQUAL(Session::Error, session->getState());
- CPPUNIT_ASSERT_EQUAL(Session::AuthenticationFailedError, session->getError());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::Error, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::AuthenticationFailedError, session->getError());
}
void testAuthenticate_NoValidAuthMechanisms() {
@@ -242,8 +242,8 @@ class SessionTest : public CppUnit::TestFixture {
session->start();
processEvents();
- CPPUNIT_ASSERT_EQUAL(Session::Error, session->getState());
- CPPUNIT_ASSERT_EQUAL(Session::NoSupportedAuthMechanismsError, session->getError());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::Error, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::NoSupportedAuthMechanismsError, session->getError());
}
void testResourceBind() {
@@ -252,13 +252,13 @@ class SessionTest : public CppUnit::TestFixture {
getMockServer()->sendStreamStart();
getMockServer()->sendStreamFeaturesWithResourceBind();
getMockServer()->expectResourceBind("Bar", "session-bind");
- // FIXME: Check CPPUNIT_ASSERT_EQUAL(Session::BindingResource, session->getState());
+ // FIXME: Check CPPUNIT_ASSERT_EQUAL(ClientSession::BindingResource, session->getState());
getMockServer()->sendResourceBindResponse("me@foo.com/Bar", "session-bind");
session->start();
processEvents();
- CPPUNIT_ASSERT_EQUAL(Session::SessionStarted, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::SessionStarted, session->getState());
CPPUNIT_ASSERT_EQUAL(JID("me@foo.com/Bar"), session->getJID());
}
@@ -272,7 +272,7 @@ class SessionTest : public CppUnit::TestFixture {
session->start();
processEvents();
- CPPUNIT_ASSERT_EQUAL(Session::SessionStarted, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::SessionStarted, session->getState());
CPPUNIT_ASSERT_EQUAL(JID("me@foo.com/Bar123"), session->getJID());
}
@@ -286,7 +286,7 @@ class SessionTest : public CppUnit::TestFixture {
session->start();
processEvents();
- CPPUNIT_ASSERT_EQUAL(Session::SessionStarted, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::SessionStarted, session->getState());
CPPUNIT_ASSERT_EQUAL(JID("me@foo.com/NewResource"), session->getJID());
}
@@ -300,23 +300,23 @@ class SessionTest : public CppUnit::TestFixture {
session->start();
processEvents();
- CPPUNIT_ASSERT_EQUAL(Session::Error, session->getState());
- CPPUNIT_ASSERT_EQUAL(Session::ResourceBindError, session->getError());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::Error, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::ResourceBindError, session->getError());
}
void testSessionStart() {
std::auto_ptr<MockSession> session(createSession("me@foo.com/Bar"));
- session->onSessionStarted.connect(boost::bind(&SessionTest::setSessionStarted, this));
+ session->onSessionStarted.connect(boost::bind(&ClientSessionTest::setSessionStarted, this));
getMockServer()->expectStreamStart();
getMockServer()->sendStreamStart();
getMockServer()->sendStreamFeaturesWithSession();
getMockServer()->expectSessionStart("session-start");
- // FIXME: Check CPPUNIT_ASSERT_EQUAL(Session::StartingSession, session->getState());
+ // FIXME: Check CPPUNIT_ASSERT_EQUAL(ClientSession::StartingSession, session->getState());
getMockServer()->sendSessionStartResponse("session-start");
session->start();
processEvents();
- CPPUNIT_ASSERT_EQUAL(Session::SessionStarted, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::SessionStarted, session->getState());
CPPUNIT_ASSERT(sessionStarted_);
}
@@ -330,13 +330,13 @@ class SessionTest : public CppUnit::TestFixture {
session->start();
processEvents();
- CPPUNIT_ASSERT_EQUAL(Session::Error, session->getState());
- CPPUNIT_ASSERT_EQUAL(Session::SessionStartError, session->getError());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::Error, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::SessionStartError, session->getError());
}
void testSessionStart_AfterResourceBind() {
std::auto_ptr<MockSession> session(createSession("me@foo.com/Bar"));
- session->onSessionStarted.connect(boost::bind(&SessionTest::setSessionStarted, this));
+ session->onSessionStarted.connect(boost::bind(&ClientSessionTest::setSessionStarted, this));
getMockServer()->expectStreamStart();
getMockServer()->sendStreamStart();
getMockServer()->sendStreamFeaturesWithResourceBindAndSession();
@@ -347,7 +347,7 @@ class SessionTest : public CppUnit::TestFixture {
session->start();
processEvents();
- CPPUNIT_ASSERT_EQUAL(Session::SessionStarted, session->getState());
+ CPPUNIT_ASSERT_EQUAL(ClientSession::SessionStarted, session->getState());
CPPUNIT_ASSERT(sessionStarted_);
}
@@ -375,7 +375,7 @@ class SessionTest : public CppUnit::TestFixture {
void testSendElement() {
std::auto_ptr<MockSession> session(createSession("me@foo.com/Bar"));
- session->onElementReceived.connect(boost::bind(&SessionTest::addReceivedElement, this, _1));
+ session->onElementReceived.connect(boost::bind(&ClientSessionTest::addReceivedElement, this, _1));
getMockServer()->expectStreamStart();
getMockServer()->sendStreamStart();
getMockServer()->sendStreamFeatures();
@@ -673,8 +673,8 @@ class SessionTest : public CppUnit::TestFixture {
bool haveTLS_;
};
- struct MockSession : public Session {
- MockSession(const JID& jid, boost::shared_ptr<Connection> connection, TLSLayerFactory* tlsLayerFactory, PayloadParserFactoryCollection* payloadParserFactories, PayloadSerializerCollection* payloadSerializers) : Session(jid, connection, tlsLayerFactory, payloadParserFactories, payloadSerializers) {}
+ struct MockSession : public ClientSession {
+ MockSession(const JID& jid, boost::shared_ptr<Connection> connection, TLSLayerFactory* tlsLayerFactory, PayloadParserFactoryCollection* payloadParserFactories, PayloadSerializerCollection* payloadSerializers) : ClientSession(jid, connection, tlsLayerFactory, payloadParserFactories, payloadSerializers) {}
boost::shared_ptr<MockTLSLayer> getTLSLayer() const {
return getStreamStack()->getLayer<MockTLSLayer>();
@@ -701,4 +701,4 @@ class SessionTest : public CppUnit::TestFixture {
EventQueue events_;
};
-CPPUNIT_TEST_SUITE_REGISTRATION(SessionTest);
+CPPUNIT_TEST_SUITE_REGISTRATION(ClientSessionTest);
diff --git a/Swiften/Client/UnitTest/Makefile.inc b/Swiften/Client/UnitTest/Makefile.inc
index 3ef87e5..14dac57 100644
--- a/Swiften/Client/UnitTest/Makefile.inc
+++ b/Swiften/Client/UnitTest/Makefile.inc
@@ -1,2 +1,2 @@
UNITTEST_SOURCES += \
- Swiften/Client/UnitTest/SessionTest.cpp
+ Swiften/Client/UnitTest/ClientSessionTest.cpp
diff --git a/Swiften/Session/Makefile.inc b/Swiften/Session/Makefile.inc
new file mode 100644
index 0000000..faa73c8
--- /dev/null
+++ b/Swiften/Session/Makefile.inc
@@ -0,0 +1,2 @@
+SWIFTEN_SOURCES += \
+ Swiften/Session/Session.cpp
diff --git a/Swiften/Session/Session.cpp b/Swiften/Session/Session.cpp
new file mode 100644
index 0000000..9ab8e4d
--- /dev/null
+++ b/Swiften/Session/Session.cpp
@@ -0,0 +1,72 @@
+#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),
+ initialized(false) {
+}
+
+Session::~Session() {
+ delete streamStack;
+}
+
+void Session::startSession() {
+ initializeStreamStack();
+ handleSessionStarted();
+}
+
+void Session::finishSession() {
+ connection->disconnect();
+ onSessionFinished(boost::optional<Error>());
+}
+
+void Session::finishSession(const Error& error) {
+ connection->disconnect();
+ onSessionFinished(boost::optional<Error>(error));
+}
+
+void Session::initializeStreamStack() {
+ xmppLayer = boost::shared_ptr<XMPPLayer>(
+ new XMPPLayer(payloadParserFactories, payloadSerializers));
+ xmppLayer->onStreamStart.connect(
+ boost::bind(&Session::handleStreamStart, this, _1));
+ xmppLayer->onElement.connect(
+ boost::bind(&Session::handleElement, this, _1));
+ xmppLayer->onError.connect(
+ boost::bind(&Session::finishSession, this, XMLError));
+ 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::sendStanza(boost::shared_ptr<Stanza> stanza) {
+ xmppLayer->writeElement(stanza);
+}
+
+void Session::handleDisconnected(const boost::optional<Connection::Error>& connectionError) {
+ if (connectionError) {
+ finishSession(ConnectionError);
+ }
+ else {
+ finishSession();
+ }
+}
+
+void Session::setInitialized() {
+ initialized = true;
+ onSessionStarted();
+}
+
+}
diff --git a/Swiften/Session/Session.h b/Swiften/Session/Session.h
new file mode 100644
index 0000000..bf8049a
--- /dev/null
+++ b/Swiften/Session/Session.h
@@ -0,0 +1,76 @@
+#pragma once
+
+#include <boost/shared_ptr.hpp>
+#include <boost/signal.hpp>
+#include <boost/optional.hpp>
+#include <boost/enable_shared_from_this.hpp>
+
+#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<Session> {
+ public:
+ enum Error {
+ ConnectionError,
+ XMLError
+ };
+
+ Session(
+ boost::shared_ptr<Connection> connection,
+ PayloadParserFactoryCollection* payloadParserFactories,
+ PayloadSerializerCollection* payloadSerializers);
+ virtual ~Session();
+
+ void startSession();
+ void finishSession();
+ void sendStanza(boost::shared_ptr<Stanza>);
+
+ boost::signal<void (boost::shared_ptr<Stanza>)> onStanzaReceived;
+ boost::signal<void ()> onSessionStarted;
+ boost::signal<void (const boost::optional<Error>&)> onSessionFinished;
+ boost::signal<void (const ByteArray&)> onDataWritten;
+ boost::signal<void (const ByteArray&)> onDataRead;
+
+ protected:
+ void finishSession(const Error&);
+
+ virtual void handleSessionStarted() {}
+ virtual void handleElement(boost::shared_ptr<Element>) = 0;
+ virtual void handleStreamStart(const ProtocolHeader&) = 0;
+
+ void initializeStreamStack();
+
+ boost::shared_ptr<XMPPLayer> getXMPPLayer() const {
+ return xmppLayer;
+ }
+
+ void setInitialized();
+ bool isInitialized() const {
+ return initialized;
+ }
+
+ private:
+ void handleDisconnected(const boost::optional<Connection::Error>& error);
+
+ private:
+ boost::shared_ptr<Connection> connection;
+ PayloadParserFactoryCollection* payloadParserFactories;
+ PayloadSerializerCollection* payloadSerializers;
+ boost::shared_ptr<XMPPLayer> xmppLayer;
+ boost::shared_ptr<ConnectionLayer> connectionLayer;
+ StreamStack* streamStack;
+ bool initialized;
+ };
+}