diff options
Diffstat (limited to 'Swiften/Client/Client.cpp')
| -rw-r--r-- | Swiften/Client/Client.cpp | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/Swiften/Client/Client.cpp b/Swiften/Client/Client.cpp index 1b662f5..85db4ac 100644 --- a/Swiften/Client/Client.cpp +++ b/Swiften/Client/Client.cpp @@ -30,12 +30,13 @@ Client::~Client() { bool Client::isAvailable() { return session_; } void Client::connect() { + assert(!connection_); DomainNameResolver resolver; try { HostAddressPort remote = resolver.resolve(jid_.getDomain().getUTF8String()); connection_ = connectionFactory_->createConnection(); connection_->onConnectFinished.connect(boost::bind(&Client::handleConnectionConnectFinished, this, _1)); connection_->connect(remote); @@ -70,12 +71,16 @@ void Client::handleConnectionConnectFinished(bool error) { void Client::disconnect() { if (session_) { session_->finish(); session_.reset(); } + closeConnection(); +} + +void Client::closeConnection() { if (connection_) { connection_->disconnect(); connection_.reset(); } } @@ -121,12 +126,13 @@ void Client::handleElement(boost::shared_ptr<Element> element) { void Client::setCertificate(const String& certificate) { certificate_ = certificate; } void Client::handleSessionFinished(boost::shared_ptr<Error> error) { + closeConnection(); if (error) { ClientError clientError; if (boost::shared_ptr<ClientSession::Error> actualError = boost::dynamic_pointer_cast<ClientSession::Error>(error)) { switch(actualError->type) { case ClientSession::Error::AuthenticationFailedError: clientError = ClientError(ClientError::AuthenticationFailedError); @@ -169,12 +175,13 @@ void Client::handleSessionFinished(boost::shared_ptr<Error> error) { clientError = ClientError(ClientError::ConnectionWriteError); break; } } onError(clientError); } + session_.reset(); } void Client::handleNeedCredentials() { session_->sendCredentials(password_); } |
Swift