summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/Client/Client.cpp')
-rw-r--r--Swiften/Client/Client.cpp41
1 files changed, 28 insertions, 13 deletions
diff --git a/Swiften/Client/Client.cpp b/Swiften/Client/Client.cpp
index 60dfade..9e38626 100644
--- a/Swiften/Client/Client.cpp
+++ b/Swiften/Client/Client.cpp
@@ -7,22 +7,26 @@
#include "Swiften/Network/BoostIOServiceThread.h"
#include "Swiften/Client/ClientSession.h"
#include "Swiften/StreamStack/PlatformTLSLayerFactory.h"
#include "Swiften/Network/BoostConnectionFactory.h"
#include "Swiften/Network/DomainNameResolveException.h"
#include "Swiften/TLS/PKCS12Certificate.h"
+#include "Swiften/Session/BasicSessionStream.h"
namespace Swift {
Client::Client(const JID& jid, const String& password) :
IQRouter(this), jid_(jid), password_(password) {
connectionFactory_ = new BoostConnectionFactory(&MainBoostIOServiceThread::getInstance().getIOService());
tlsLayerFactory_ = new PlatformTLSLayerFactory();
}
Client::~Client() {
+ if (session_ || connection_) {
+ std::cerr << "Warning: Client not disconnected properly" << std::endl;
+ }
delete tlsLayerFactory_;
delete connectionFactory_;
}
bool Client::isAvailable() {
return session_;
@@ -43,29 +47,38 @@ void Client::connect() {
void Client::handleConnectionConnectFinished(bool error) {
if (error) {
onError(ClientError::ConnectionError);
}
else {
- session_ = boost::shared_ptr<ClientSession>(new ClientSession(jid_, connection_, tlsLayerFactory_, &payloadParserFactories_, &payloadSerializers_));
+ assert(!sessionStream_);
+ sessionStream_ = boost::shared_ptr<BasicSessionStream>(new BasicSessionStream(connection_, &payloadParserFactories_, &payloadSerializers_, tlsLayerFactory_));
if (!certificate_.isEmpty()) {
- session_->setCertificate(PKCS12Certificate(certificate_, password_));
+ sessionStream_->setTLSCertificate(PKCS12Certificate(certificate_, password_));
}
- session_->onSessionStarted.connect(boost::bind(boost::ref(onConnected)));
- session_->onSessionFinished.connect(boost::bind(&Client::handleSessionFinished, this, _1));
+ sessionStream_->onDataRead.connect(boost::bind(&Client::handleDataRead, this, _1));
+ sessionStream_->onDataWritten.connect(boost::bind(&Client::handleDataWritten, this, _1));
+ sessionStream_->initialize();
+
+ session_ = boost::shared_ptr<ClientSession>(new ClientSession(jid_, sessionStream_));
+ session_->onInitialized.connect(boost::bind(boost::ref(onConnected)));
+ session_->onFinished.connect(boost::bind(&Client::handleSessionFinished, this, _1));
session_->onNeedCredentials.connect(boost::bind(&Client::handleNeedCredentials, this));
- session_->onDataRead.connect(boost::bind(&Client::handleDataRead, this, _1));
- session_->onDataWritten.connect(boost::bind(&Client::handleDataWritten, this, _1));
session_->onElementReceived.connect(boost::bind(&Client::handleElement, this, _1));
- session_->startSession();
+ session_->start();
}
}
void Client::disconnect() {
if (session_) {
- session_->finishSession();
+ session_->finish();
+ session_.reset();
+ }
+ if (connection_) {
+ connection_->disconnect();
+ connection_.reset();
}
}
void Client::send(boost::shared_ptr<Stanza> stanza) {
session_->sendElement(stanza);
}
@@ -107,15 +120,16 @@ void Client::handleElement(boost::shared_ptr<Element> element) {
}
void Client::setCertificate(const String& certificate) {
certificate_ = certificate;
}
-void Client::handleSessionFinished(const boost::optional<Session::SessionError>& error) {
+void Client::handleSessionFinished(boost::shared_ptr<Error> error) {
if (error) {
ClientError clientError;
+ /*
switch (*error) {
case Session::ConnectionReadError:
clientError = ClientError(ClientError::ConnectionReadError);
break;
case Session::ConnectionWriteError:
clientError = ClientError(ClientError::ConnectionWriteError);
@@ -145,23 +159,24 @@ void Client::handleSessionFinished(const boost::optional<Session::SessionError>&
clientError = ClientError(ClientError::ClientCertificateLoadError);
break;
case Session::ClientCertificateError:
clientError = ClientError(ClientError::ClientCertificateError);
break;
}
+ */
onError(clientError);
}
}
void Client::handleNeedCredentials() {
session_->sendCredentials(password_);
}
-void Client::handleDataRead(const ByteArray& data) {
- onDataRead(String(data.getData(), data.getSize()));
+void Client::handleDataRead(const String& data) {
+ onDataRead(data);
}
-void Client::handleDataWritten(const ByteArray& data) {
- onDataWritten(String(data.getData(), data.getSize()));
+void Client::handleDataWritten(const String& data) {
+ onDataWritten(data);
}
}