diff options
Diffstat (limited to 'Swiften/Client/Client.cpp')
| -rw-r--r-- | Swiften/Client/Client.cpp | 41 |
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); } } |
Swift