summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Swiften/Disco/DiscoServiceWalker.cpp8
-rw-r--r--Swiften/FileTransfer/DefaultFileTransferTransporter.cpp5
-rw-r--r--Swiften/FileTransfer/SOCKS5BytestreamClientSession.cpp2
-rw-r--r--Swiften/FileTransfer/SOCKS5BytestreamProxiesManager.cpp1
-rw-r--r--Swiften/QA/FileTransferTest/FileTransferTest.cpp35
5 files changed, 33 insertions, 18 deletions
diff --git a/Swiften/Disco/DiscoServiceWalker.cpp b/Swiften/Disco/DiscoServiceWalker.cpp
index f84262b..5803602 100644
--- a/Swiften/Disco/DiscoServiceWalker.cpp
+++ b/Swiften/Disco/DiscoServiceWalker.cpp
@@ -1,22 +1,22 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2015 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <Swiften/Disco/DiscoServiceWalker.h>
+#include <boost/bind.hpp>
+
#include <Swiften/Base/Log.h>
#include <Swiften/Base/foreach.h>
-#include <boost/bind.hpp>
-
namespace Swift {
DiscoServiceWalker::DiscoServiceWalker(const JID& service, IQRouter* iqRouter, size_t maxSteps) : service_(service), iqRouter_(iqRouter), maxSteps_(maxSteps), active_(false) {
}
void DiscoServiceWalker::beginWalk() {
SWIFT_LOG(debug) << "Starting walk to " << service_ << std::endl;
assert(!active_);
@@ -51,18 +51,19 @@ void DiscoServiceWalker::walkNode(const JID& jid) {
void DiscoServiceWalker::handleDiscoInfoResponse(boost::shared_ptr<DiscoInfo> info, ErrorPayload::ref error, GetDiscoInfoRequest::ref request) {
/* If we got canceled, don't do anything */
if (!active_) {
return;
}
SWIFT_LOG(debug) << "Disco info response from " << request->getReceiver() << std::endl;
+ request->onResponse.disconnect(boost::bind(&DiscoServiceWalker::handleDiscoInfoResponse, this, _1, _2, request));
pendingDiscoInfoRequests_.erase(request);
if (error) {
handleDiscoError(request->getReceiver(), error);
return;
}
bool couldContainServices = false;
foreach (DiscoInfo::Identity identity, info->getIdentities()) {
if (identity.getCategory() == "server") {
@@ -85,18 +86,19 @@ void DiscoServiceWalker::handleDiscoInfoResponse(boost::shared_ptr<DiscoInfo> in
}
void DiscoServiceWalker::handleDiscoItemsResponse(boost::shared_ptr<DiscoItems> items, ErrorPayload::ref error, GetDiscoItemsRequest::ref request) {
/* If we got canceled, don't do anything */
if (!active_) {
return;
}
SWIFT_LOG(debug) << "Received disco items from " << request->getReceiver() << std::endl;
+ request->onResponse.disconnect(boost::bind(&DiscoServiceWalker::handleDiscoItemsResponse, this, _1, _2, request));
pendingDiscoItemsRequests_.erase(request);
if (error) {
handleDiscoError(request->getReceiver(), error);
return;
}
foreach (DiscoItems::Item item, items->getItems()) {
if (item.getNode().empty()) {
/* Don't look at noded items. It's possible that this will exclude some services,
* but I've never seen one in the wild, and it's an easy fix for not looping.
diff --git a/Swiften/FileTransfer/DefaultFileTransferTransporter.cpp b/Swiften/FileTransfer/DefaultFileTransferTransporter.cpp
index dffc39b..ca29898 100644
--- a/Swiften/FileTransfer/DefaultFileTransferTransporter.cpp
+++ b/Swiften/FileTransfer/DefaultFileTransferTransporter.cpp
@@ -67,19 +67,24 @@ DefaultFileTransferTransporter::DefaultFileTransferTransporter(
connectionFactory,
timerFactory,
options);
remoteCandidateSelector->onCandidateSelectFinished.connect(
boost::bind(&DefaultFileTransferTransporter::handleRemoteCandidateSelectFinished, this, _1, _2));
}
DefaultFileTransferTransporter::~DefaultFileTransferTransporter() {
stopGeneratingLocalCandidates();
+ remoteCandidateSelector->onCandidateSelectFinished.disconnect(
+ boost::bind(&DefaultFileTransferTransporter::handleRemoteCandidateSelectFinished, this, _1, _2));
delete remoteCandidateSelector;
+
+ localCandidateGenerator->onLocalTransportCandidatesGenerated.disconnect(
+ boost::bind(&DefaultFileTransferTransporter::handleLocalCandidatesGenerated, this, _1));
delete localCandidateGenerator;
}
void DefaultFileTransferTransporter::initialize() {
s5bSessionID = s5bRegistry->generateSessionID();
}
void DefaultFileTransferTransporter::initialize(const std::string& s5bSessionID) {
this->s5bSessionID = s5bSessionID;
diff --git a/Swiften/FileTransfer/SOCKS5BytestreamClientSession.cpp b/Swiften/FileTransfer/SOCKS5BytestreamClientSession.cpp
index 04d5d86..a38501b 100644
--- a/Swiften/FileTransfer/SOCKS5BytestreamClientSession.cpp
+++ b/Swiften/FileTransfer/SOCKS5BytestreamClientSession.cpp
@@ -36,18 +36,20 @@ SOCKS5BytestreamClientSession::SOCKS5BytestreamClientSession(
destination(destination),
state(Initial),
chunkSize(131072) {
weFailedTimeout = timerFactory->createTimer(3000);
weFailedTimeout->onTick.connect(
boost::bind(&SOCKS5BytestreamClientSession::handleWeFailedTimeout, this));
}
SOCKS5BytestreamClientSession::~SOCKS5BytestreamClientSession() {
+ weFailedTimeout->onTick.disconnect(
+ boost::bind(&SOCKS5BytestreamClientSession::handleWeFailedTimeout, this));
weFailedTimeout->stop();
}
void SOCKS5BytestreamClientSession::start() {
assert(state == Initial);
SWIFT_LOG(debug) << "Trying to connect via TCP to " << addressPort.toString() << "." << std::endl;
weFailedTimeout->start();
connectFinishedConnection = connection->onConnectFinished.connect(
boost::bind(&SOCKS5BytestreamClientSession::handleConnectFinished, this, _1));
diff --git a/Swiften/FileTransfer/SOCKS5BytestreamProxiesManager.cpp b/Swiften/FileTransfer/SOCKS5BytestreamProxiesManager.cpp
index 25a12ea..3221790 100644
--- a/Swiften/FileTransfer/SOCKS5BytestreamProxiesManager.cpp
+++ b/Swiften/FileTransfer/SOCKS5BytestreamProxiesManager.cpp
@@ -107,18 +107,19 @@ boost::shared_ptr<SOCKS5BytestreamClientSession> SOCKS5BytestreamProxiesManager:
return activeSession;
}
boost::shared_ptr<SOCKS5BytestreamClientSession> SOCKS5BytestreamProxiesManager::createSOCKS5BytestreamClientSession(HostAddressPort addressPort, const std::string& destAddr) {
SOCKS5BytestreamClientSession::ref connection = boost::make_shared<SOCKS5BytestreamClientSession>(connectionFactory_->createConnection(), addressPort, destAddr, timerFactory_);
return connection;
}
void SOCKS5BytestreamProxiesManager::handleProxiesFound(std::vector<S5BProxyRequest::ref> proxyHosts) {
+ proxyFinder_->onProxiesFound.disconnect(boost::bind(&SOCKS5BytestreamProxiesManager::handleProxiesFound, this, _1));
foreach(S5BProxyRequest::ref proxy, proxyHosts) {
if (proxy) {
if (HostAddress(proxy->getStreamHost().get().host).isValid()) {
addS5BProxy(proxy);
onDiscoveredProxiesChanged();
}
else {
DomainNameAddressQuery::ref resolveRequest = resolver_->createAddressQuery(proxy->getStreamHost().get().host);
resolveRequest->onResult.connect(boost::bind(&SOCKS5BytestreamProxiesManager::handleNameLookupResult, this, _1, _2, proxy));
diff --git a/Swiften/QA/FileTransferTest/FileTransferTest.cpp b/Swiften/QA/FileTransferTest/FileTransferTest.cpp
index 2d2d6c8..8faf8a9 100644
--- a/Swiften/QA/FileTransferTest/FileTransferTest.cpp
+++ b/Swiften/QA/FileTransferTest/FileTransferTest.cpp
@@ -1,40 +1,40 @@
/*
* Copyright (c) 2014-2015 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <fstream>
#include <boost/algorithm/string.hpp>
-#include <boost/numeric/conversion/cast.hpp>
#include <boost/filesystem.hpp>
+#include <boost/numeric/conversion/cast.hpp>
-#include <Swiften/Base/sleep.h>
-#include <Swiften/Base/foreach.h>
+#include <Swiften/Base/BoostRandomGenerator.h>
+#include <Swiften/Base/Debug.h>
#include <Swiften/Base/Log.h>
-#include <Swiften/Client/ClientXMLTracer.h>
+#include <Swiften/Base/foreach.h>
+#include <Swiften/Base/sleep.h>
#include <Swiften/Client/Client.h>
-#include <Swiften/EventLoop/SimpleEventLoop.h>
-#include <Swiften/Network/BoostNetworkFactories.h>
-#include <Swiften/Network/Timer.h>
-#include <Swiften/Network/TimerFactory.h>
+#include <Swiften/Client/ClientXMLTracer.h>
+#include <Swiften/Disco/ClientDiscoManager.h>
#include <Swiften/Disco/EntityCapsProvider.h>
#include <Swiften/Elements/Presence.h>
-#include <Swiften/FileTransfer/ReadBytestream.h>
-#include <Swiften/Base/BoostRandomGenerator.h>
+#include <Swiften/EventLoop/SimpleEventLoop.h>
#include <Swiften/FileTransfer/FileReadBytestream.h>
-#include <Swiften/FileTransfer/OutgoingFileTransfer.h>
#include <Swiften/FileTransfer/FileTransferManager.h>
-#include <Swiften/Disco/ClientDiscoManager.h>
#include <Swiften/FileTransfer/FileWriteBytestream.h>
-#include <Swiften/Base/Debug.h>
+#include <Swiften/FileTransfer/OutgoingFileTransfer.h>
+#include <Swiften/FileTransfer/ReadBytestream.h>
+#include <Swiften/Network/BoostNetworkFactories.h>
+#include <Swiften/Network/Timer.h>
+#include <Swiften/Network/TimerFactory.h>
using namespace Swift;
static const std::string CLIENT_NAME = "Swiften FT Test";
static const std::string CLIENT_NODE = "http://swift.im";
static boost::shared_ptr<SimpleEventLoop> eventLoop;
static boost::shared_ptr<BoostNetworkFactories> networkFactories;
@@ -53,20 +53,20 @@ class FileTransferTest {
sender_ = boost::make_shared<Client>(JID(getenv("SWIFT_FILETRANSFERTEST_JID")), getenv("SWIFT_FILETRANSFERTEST_PASS"), networkFactories.get());
sender_->onDisconnected.connect(boost::bind(&FileTransferTest::handleSenderDisconnected, this, _1));
sender_->onConnected.connect(boost::bind(&FileTransferTest::handleSenderConnected, this));
sender_->getEntityCapsProvider()->onCapsChanged.connect(boost::bind(&FileTransferTest::handleSenderCapsChanged, this, _1));
receiver_ = boost::make_shared<Client>(JID(getenv("SWIFT_FILETRANSFERTEST2_JID")), getenv("SWIFT_FILETRANSFERTEST2_PASS"), networkFactories.get());
receiver_->onConnected.connect(boost::bind(&FileTransferTest::handleReceiverConnected, this));
receiver_->onDisconnected.connect(boost::bind(&FileTransferTest::handleReceiverDisconnected, this, _1));
- new ClientXMLTracer(sender_.get());
- new ClientXMLTracer(receiver_.get());
+ senderTracer_ = new ClientXMLTracer(sender_.get());
+ receiverTracer_ = new ClientXMLTracer(receiver_.get());
ClientOptions options;
options.useTLS = ClientOptions::NeverUseTLS;
options.useStreamCompression = false;
options.useStreamResumption = false;
options.useAcks = false;
sender_->connect(options);
receiver_->connect(options);
@@ -86,18 +86,21 @@ class FileTransferTest {
std::ofstream outfile(sendFilePath_.native().c_str(), std::ios::out | std::ios::binary);
outfile.write(reinterpret_cast<char *>(&sendData_[0]), sendData_.size());
outfile.close();
}
~FileTransferTest() {
timeOut_->stop();
+ delete senderTracer_;
+ delete receiverTracer_;
+
if(boost::filesystem::exists(sendFilePath_)) {
boost::filesystem::remove(sendFilePath_);
}
if(boost::filesystem::exists(receiveFilePath_)) {
boost::filesystem::remove(receiveFilePath_);
}
}
@@ -233,26 +236,28 @@ class FileTransferTest {
}
bool wasSuccessful() const {
return !senderError_ && !receiverError_;
}
private:
int senderCandidates_;
boost::shared_ptr<Client> sender_;
+ ClientXMLTracer* senderTracer_;
ByteArray sendData_;
OutgoingFileTransfer::ref outgoingFileTransfer_;
boost::filesystem::path sendFilePath_;
boost::optional<FileTransferError> senderError_;
bool senderIsDone_;
int receiverCandidates_;
boost::shared_ptr<Client> receiver_;
+ ClientXMLTracer* receiverTracer_;
ByteArray receiveData_;
std::vector<IncomingFileTransfer::ref> incomingFileTransfers_;
boost::filesystem::path receiveFilePath_;
boost::optional<FileTransferError> receiverError_;
bool receiverIsDone_;
Timer::ref timeOut_;
};