diff options
-rw-r--r-- | Swiften/Component/ComponentSessionStanzaChannel.cpp | 11 | ||||
-rw-r--r-- | Swiften/Component/ComponentSessionStanzaChannel.h | 4 |
2 files changed, 13 insertions, 2 deletions
diff --git a/Swiften/Component/ComponentSessionStanzaChannel.cpp b/Swiften/Component/ComponentSessionStanzaChannel.cpp index fd61594..e4bf231 100644 --- a/Swiften/Component/ComponentSessionStanzaChannel.cpp +++ b/Swiften/Component/ComponentSessionStanzaChannel.cpp @@ -1,44 +1,53 @@ /* - * Copyright (c) 2010-2016 Isode Limited. + * Copyright (c) 2010-2017 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Component/ComponentSessionStanzaChannel.h> #include <boost/bind.hpp> #include <Swiften/Base/Log.h> namespace Swift { +ComponentSessionStanzaChannel::~ComponentSessionStanzaChannel() { + if (session) { + session->onInitialized.disconnect(boost::bind(&ComponentSessionStanzaChannel::handleSessionInitialized, this)); + session->onFinished.disconnect(boost::bind(&ComponentSessionStanzaChannel::handleSessionFinished, this, _1)); + session->onStanzaReceived.disconnect(boost::bind(&ComponentSessionStanzaChannel::handleStanza, this, _1)); + session.reset(); + } +} + void ComponentSessionStanzaChannel::setSession(std::shared_ptr<ComponentSession> session) { assert(!this->session); this->session = session; session->onInitialized.connect(boost::bind(&ComponentSessionStanzaChannel::handleSessionInitialized, this)); session->onFinished.connect(boost::bind(&ComponentSessionStanzaChannel::handleSessionFinished, this, _1)); session->onStanzaReceived.connect(boost::bind(&ComponentSessionStanzaChannel::handleStanza, this, _1)); } void ComponentSessionStanzaChannel::sendIQ(std::shared_ptr<IQ> iq) { send(iq); } void ComponentSessionStanzaChannel::sendMessage(std::shared_ptr<Message> message) { send(message); } void ComponentSessionStanzaChannel::sendPresence(std::shared_ptr<Presence> presence) { send(presence); } std::string ComponentSessionStanzaChannel::getNewIQID() { return idGenerator.generateID(); } void ComponentSessionStanzaChannel::send(std::shared_ptr<Stanza> stanza) { if (!isAvailable()) { SWIFT_LOG(warning) << "Component: Trying to send a stanza while disconnected." << std::endl; return; } session->sendStanza(stanza); diff --git a/Swiften/Component/ComponentSessionStanzaChannel.h b/Swiften/Component/ComponentSessionStanzaChannel.h index ad38edc..d8a4501 100644 --- a/Swiften/Component/ComponentSessionStanzaChannel.h +++ b/Swiften/Component/ComponentSessionStanzaChannel.h @@ -1,54 +1,56 @@ /* - * Copyright (c) 2010-2016 Isode Limited. + * Copyright (c) 2010-2017 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once #include <memory> #include <Swiften/Base/API.h> #include <Swiften/Base/IDGenerator.h> #include <Swiften/Client/StanzaChannel.h> #include <Swiften/Component/ComponentSession.h> #include <Swiften/Elements/IQ.h> #include <Swiften/Elements/Message.h> #include <Swiften/Elements/Presence.h> namespace Swift { /** * StanzaChannel implementation around a ComponentSession. */ class SWIFTEN_API ComponentSessionStanzaChannel : public StanzaChannel { public: + virtual ~ComponentSessionStanzaChannel(); + void setSession(std::shared_ptr<ComponentSession> session); void sendIQ(std::shared_ptr<IQ> iq); void sendMessage(std::shared_ptr<Message> message); void sendPresence(std::shared_ptr<Presence> presence); bool getStreamManagementEnabled() const { return false; } std::vector<Certificate::ref> getPeerCertificateChain() const { // TODO: actually implement this method return std::vector<Certificate::ref>(); } bool isAvailable() const { return session && session->getState() == ComponentSession::Initialized; } private: std::string getNewIQID(); void send(std::shared_ptr<Stanza> stanza); void handleSessionFinished(std::shared_ptr<Error> error); void handleStanza(std::shared_ptr<Stanza> stanza); void handleSessionInitialized(); private: IDGenerator idGenerator; std::shared_ptr<ComponentSession> session; }; |