summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/Client')
-rw-r--r--Swiften/Client/Client.cpp25
-rw-r--r--Swiften/Client/Client.h3
-rw-r--r--Swiften/Client/ClientSession.cpp5
3 files changed, 20 insertions, 13 deletions
diff --git a/Swiften/Client/Client.cpp b/Swiften/Client/Client.cpp
index 9fb4ca0..9e38626 100644
--- a/Swiften/Client/Client.cpp
+++ b/Swiften/Client/Client.cpp
@@ -21,6 +21,9 @@ Client::Client(const JID& jid, const String& password) :
}
Client::~Client() {
+ if (session_ || connection_) {
+ std::cerr << "Warning: Client not disconnected properly" << std::endl;
+ }
delete tlsLayerFactory_;
delete connectionFactory_;
}
@@ -52,24 +55,28 @@ void Client::handleConnectionConnectFinished(bool error) {
if (!certificate_.isEmpty()) {
sessionStream_->setTLSCertificate(PKCS12Certificate(certificate_, password_));
}
- sessionStream_->onDataRead.connect(boost::bind(&Client::handleDataRead, shared_from_this(), _1));
- sessionStream_->onDataWritten.connect(boost::bind(&Client::handleDataWritten, shared_from_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, shared_from_this(), _1));
- session_->onNeedCredentials.connect(boost::bind(&Client::handleNeedCredentials, shared_from_this()));
- session_->onElementReceived.connect(boost::bind(&Client::handleElement, shared_from_this(), _1));
+ session_->onFinished.connect(boost::bind(&Client::handleSessionFinished, this, _1));
+ session_->onNeedCredentials.connect(boost::bind(&Client::handleNeedCredentials, this));
+ session_->onElementReceived.connect(boost::bind(&Client::handleElement, this, _1));
session_->start();
}
}
void Client::disconnect() {
- // TODO
- //if (session_) {
- // session_->finishSession();
- //}
+ if (session_) {
+ session_->finish();
+ session_.reset();
+ }
+ if (connection_) {
+ connection_->disconnect();
+ connection_.reset();
+ }
}
void Client::send(boost::shared_ptr<Stanza> stanza) {
diff --git a/Swiften/Client/Client.h b/Swiften/Client/Client.h
index 16127dd..5188789 100644
--- a/Swiften/Client/Client.h
+++ b/Swiften/Client/Client.h
@@ -3,7 +3,6 @@
#include <boost/signals.hpp>
#include <boost/shared_ptr.hpp>
-#include <boost/enable_shared_from_this.hpp>
#include "Swiften/Base/Error.h"
#include "Swiften/Client/ClientSession.h"
@@ -24,7 +23,7 @@ namespace Swift {
class ClientSession;
class BasicSessionStream;
- class Client : public StanzaChannel, public IQRouter, public boost::enable_shared_from_this<Client> {
+ class Client : public StanzaChannel, public IQRouter, public boost::bsignals::trackable {
public:
Client(const JID& jid, const String& password);
~Client();
diff --git a/Swiften/Client/ClientSession.cpp b/Swiften/Client/ClientSession.cpp
index ed5d27d..a185ea0 100644
--- a/Swiften/Client/ClientSession.cpp
+++ b/Swiften/Client/ClientSession.cpp
@@ -25,13 +25,14 @@ ClientSession::ClientSession(
state(Initial),
stream(stream),
needSessionStart(false) {
+}
+
+void ClientSession::start() {
stream->onStreamStartReceived.connect(boost::bind(&ClientSession::handleStreamStart, shared_from_this(), _1));
stream->onElementReceived.connect(boost::bind(&ClientSession::handleElement, shared_from_this(), _1));
stream->onError.connect(boost::bind(&ClientSession::handleStreamError, shared_from_this(), _1));
stream->onTLSEncrypted.connect(boost::bind(&ClientSession::handleTLSEncrypted, shared_from_this()));
-}
-void ClientSession::start() {
assert(state == Initial);
state = WaitingForStreamStart;
sendStreamHeader();