diff options
author | Kevin Smith <git@kismith.co.uk> | 2012-03-06 08:59:26 (GMT) |
---|---|---|
committer | Kevin Smith <git@kismith.co.uk> | 2012-03-06 08:59:26 (GMT) |
commit | 54b16ff807d7f70ac7633292d773b7affece1c43 (patch) | |
tree | 566cecbcb46a0c67c48a1251361bee93b409d848 /Swiften/AdHoc/OutgoingAdHocCommandSession.cpp | |
parent | 3b308419485ce1ad50ee14488595a555777ef731 (diff) | |
download | swift-contrib-54b16ff807d7f70ac7633292d773b7affece1c43.zip swift-contrib-54b16ff807d7f70ac7633292d773b7affece1c43.tar.bz2 |
don't crash if an AdHoc is deleted while inflight
Diffstat (limited to 'Swiften/AdHoc/OutgoingAdHocCommandSession.cpp')
-rw-r--r-- | Swiften/AdHoc/OutgoingAdHocCommandSession.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/Swiften/AdHoc/OutgoingAdHocCommandSession.cpp b/Swiften/AdHoc/OutgoingAdHocCommandSession.cpp index ecc6cd0..cd6b4a3 100644 --- a/Swiften/AdHoc/OutgoingAdHocCommandSession.cpp +++ b/Swiften/AdHoc/OutgoingAdHocCommandSession.cpp @@ -11,18 +11,22 @@ #include <Swiften/Queries/GenericRequest.h> #include <Swiften/Base/Algorithm.h> namespace Swift { OutgoingAdHocCommandSession::OutgoingAdHocCommandSession(const JID& to, const std::string& commandNode, IQRouter* iqRouter) : to_(to), commandNode_(commandNode), iqRouter_(iqRouter), isMultiStage_(false) { } +OutgoingAdHocCommandSession::~OutgoingAdHocCommandSession() { + connection_.disconnect(); +} + void OutgoingAdHocCommandSession::handleResponse(boost::shared_ptr<Command> payload, ErrorPayload::ref error) { if (error) { onError(error); } else { const std::vector<Command::Action>& actions = payload->getAvailableActions(); actionStates_.clear(); if (payload->getStatus() == Command::Executing ) { actionStates_[Command::Cancel] = EnabledAndPresent; actionStates_[Command::Complete] = Present; @@ -52,19 +56,19 @@ void OutgoingAdHocCommandSession::handleResponse(boost::shared_ptr<Command> payl } } bool OutgoingAdHocCommandSession::getIsMultiStage() const { return isMultiStage_; } void OutgoingAdHocCommandSession::start() { boost::shared_ptr<GenericRequest<Command> > commandRequest = boost::make_shared< GenericRequest<Command> >(IQ::Set, to_, boost::make_shared<Command>(commandNode_), iqRouter_); - commandRequest->onResponse.connect(boost::bind(&OutgoingAdHocCommandSession::handleResponse, this, _1, _2)); + connection_ = commandRequest->onResponse.connect(boost::bind(&OutgoingAdHocCommandSession::handleResponse, this, _1, _2)); commandRequest->send(); } void OutgoingAdHocCommandSession::cancel() { if (!sessionID_.empty()) { submitForm(Form::ref(), Command::Cancel); } } @@ -78,18 +82,19 @@ void OutgoingAdHocCommandSession::complete(Form::ref form) { void OutgoingAdHocCommandSession::goNext(Form::ref form) { submitForm(form, Command::Next); } void OutgoingAdHocCommandSession::submitForm(Form::ref form, Command::Action action) { boost::shared_ptr<Command> command(boost::make_shared<Command>(commandNode_, sessionID_, action)); command->setForm(form); boost::shared_ptr<GenericRequest<Command> > commandRequest = boost::make_shared< GenericRequest<Command> >(IQ::Set, to_, command, iqRouter_); - commandRequest->onResponse.connect(boost::bind(&OutgoingAdHocCommandSession::handleResponse, this, _1, _2)); + connection_.disconnect(); + connection_ = commandRequest->onResponse.connect(boost::bind(&OutgoingAdHocCommandSession::handleResponse, this, _1, _2)); commandRequest->send(); } OutgoingAdHocCommandSession::ActionState OutgoingAdHocCommandSession::getActionState(Command::Action action) const { return get(actionStates_, action, Absent); } } |