← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 3240: ditch TaskQueue

 

------------------------------------------------------------
revno: 3240
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Tue 2013-03-26 23:03:28 +0100
message:
  ditch TaskQueue
removed:
  dcpp/TaskQueue.h
modified:
  win32/HubFrame.cpp
  win32/HubFrame.h
  win32/TransferView.cpp
  win32/TransferView.h


--
lp:dcplusplus
https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk

Your team Dcplusplus-team is subscribed to branch lp:dcplusplus.
To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk/+edit-subscription
=== removed file 'dcpp/TaskQueue.h'
--- dcpp/TaskQueue.h	2013-01-18 21:28:38 +0000
+++ dcpp/TaskQueue.h	1970-01-01 00:00:00 +0000
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2001-2013 Jacek Sieka, arnetheduck on gmail point com
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef DCPLUSPLUS_DCPP_TASK_H
-#define DCPLUSPLUS_DCPP_TASK_H
-
-#include <memory>
-#include <vector>
-
-#include <boost/noncopyable.hpp>
-
-#include "CriticalSection.h"
-
-namespace dcpp {
-
-using std::pair;
-using std::unique_ptr;
-using std::vector;
-
-struct Task {
-	virtual ~Task() { };
-};
-
-struct StringTask : Task {
-	StringTask(string str) : str(move(str)) { }
-	string str;
-};
-
-template<bool threadsafe>
-class TaskQueue : private boost::noncopyable {
-protected:
-	typedef vector<pair<int, unique_ptr<Task>>> List;
-
-public:
-	void add(int type, std::unique_ptr<Task> && data) { tasks.emplace_back(type, move(data)); }
-	List get() { return move(tasks); }
-	void clear() { tasks.clear(); }
-
-private:
-	List tasks;
-};
-
-template<>
-class TaskQueue<true> : public TaskQueue<false> {
-	typedef TaskQueue<false> BaseType;
-
-public:
-	void add(int type, std::unique_ptr<Task> && data) { Lock l(cs); BaseType::add(type, move(data)); }
-	List get() { Lock l(cs); return BaseType::get(); }
-	void clear() { Lock l(cs); BaseType::clear(); }
-
-private:
-	CriticalSection cs;
-};
-
-} // namespace dcpp
-
-#endif

=== modified file 'win32/HubFrame.cpp'
--- win32/HubFrame.cpp	2013-03-16 14:57:07 +0000
+++ win32/HubFrame.cpp	2013-03-26 22:03:28 +0000
@@ -66,7 +66,7 @@
 	{ N_("CID"), 300, false}
 };
 
-HubFrame::FrameList HubFrame::frames;
+decltype(HubFrame::frames) HubFrame::frames;
 
 void HubFrame::openWindow(TabViewPtr parent, string url, bool activate, bool connect) {
 	Util::sanitizeUrl(url);
@@ -175,12 +175,12 @@
 showUsers(0),
 client(0),
 url(url),
-updateUsers(false),
 selCount(0),
 statusDirty(true),
 waitingForPW(false),
 resort(false),
 confirmClose(true),
+updateUsers(false),
 currentUser(0),
 hubMenu(false),
 inTabComplete(false)
@@ -619,28 +619,14 @@
 
 void HubFrame::execTasks() {
 	updateUsers = false;
-	auto t = tasks.get();
 
 	HoldRedraw hold { users };
 
-	for(auto& i: t) {
-		if(i.first == UPDATE_USER) {
-			updateUser(static_cast<UserTask&>(*i.second));
-		} else if(i.first == UPDATE_USER_JOIN) {
-			UserTask& u = static_cast<UserTask&>(*i.second);
-			if(updateUser(u)) {
-				if(client->get(HubSettings::ShowJoins) || (client->get(HubSettings::FavShowJoins) && FavoriteManager::getInstance()->isFavoriteUser(u.user))) {
-					addStatus(str(TF_("Joins: %1%") % Text::toT(u.identity.getNick())));
-				}
-			}
-		} else if(i.first == REMOVE_USER) {
-			UserTask& u = static_cast<UserTask&>(*i.second);
-			removeUser(u.user);
-			if(client->get(HubSettings::ShowJoins) || (client->get(HubSettings::FavShowJoins) && FavoriteManager::getInstance()->isFavoriteUser(u.user))) {
-				addStatus(str(TF_("Parts: %1%") % Text::toT(u.identity.getNick())));
-			}
-		}
+	for(auto& task: tasks) {
+		task.first(*task.second);
 	}
+	tasks.clear();
+
 	if(resort && showUsers->getChecked()) {
 		users->resort();
 		resort = false;
@@ -889,7 +875,7 @@
 }
 
 HubFrame::UserTask::UserTask(const OnlineUser& ou) :
-user(ou.getUser(), ou.getClient().getHubUrl()),
+user(ou),
 identity(ou.getIdentity())
 {
 }
@@ -932,7 +918,15 @@
 void HubFrame::on(ClientListener::UserUpdated, Client*, const OnlineUser& user) noexcept {
 	auto task = new UserTask(user);
 	callAsync([this, task] {
-		tasks.add(UPDATE_USER_JOIN, unique_ptr<Task>(task));
+		tasks.emplace_back([=](const UserTask& u) {
+			if(updateUser(u)) {
+				if(client->get(HubSettings::ShowJoins) ||
+					(client->get(HubSettings::FavShowJoins) && FavoriteManager::getInstance()->isFavoriteUser(u.user)))
+				{
+					addStatus(str(TF_("Joins: %1%") % Text::toT(u.identity.getNick())));
+				}
+			}
+		}, unique_ptr<UserTask>(task));
 		updateUsers = true;
 	});
 }
@@ -940,7 +934,7 @@
 void HubFrame::on(UsersUpdated, Client*, const OnlineUserList& aList) noexcept {
 	for(auto& i: aList) {
 		auto task = new UserTask(*i);
-		callAsync([this, task] { tasks.add(UPDATE_USER, unique_ptr<Task>(task)); });
+		callAsync([this, task] { tasks.emplace_back([=](const UserTask& u) { updateUser(u); }, unique_ptr<UserTask>(task)); });
 	}
 	callAsync([this] { updateUsers = true; });
 }
@@ -948,7 +942,14 @@
 void HubFrame::on(ClientListener::UserRemoved, Client*, const OnlineUser& user) noexcept {
 	auto task = new UserTask(user);
 	callAsync([this, task] {
-		tasks.add(REMOVE_USER, unique_ptr<Task>(task));
+		tasks.emplace_back([=](const UserTask& u) {
+			removeUser(u.user);
+			if(client->get(HubSettings::ShowJoins) ||
+				(client->get(HubSettings::FavShowJoins) && FavoriteManager::getInstance()->isFavoriteUser(u.user)))
+			{
+				addStatus(str(TF_("Parts: %1%") % Text::toT(u.identity.getNick())));
+			}
+		}, unique_ptr<UserTask>(task));
 		updateUsers = true;
 	});
 }

=== modified file 'win32/HubFrame.h'
--- win32/HubFrame.h	2013-01-21 18:43:48 +0000
+++ win32/HubFrame.h	2013-03-26 22:03:28 +0000
@@ -19,10 +19,11 @@
 #ifndef DCPLUSPLUS_WIN32_HUB_FRAME_H
 #define DCPLUSPLUS_WIN32_HUB_FRAME_H
 
+#include <functional>
+
 #include <dcpp/forward.h>
 #include <dcpp/OnlineUser.h>
 #include <dcpp/ClientListener.h>
-#include <dcpp/TaskQueue.h>
 #include <dcpp/User.h>
 #include <dcpp/FavoriteManagerListener.h>
 
@@ -33,6 +34,8 @@
 #include "MDIChildFrame.h"
 #include "UserInfoBase.h"
 
+using std::function;
+
 class HubFrame :
 	public MDIChildFrame<HubFrame>,
 	public IRecent<HubFrame>,
@@ -101,11 +104,7 @@
 		COLUMN_LAST
 	};
 
-	enum Tasks {
-		UPDATE_USER_JOIN, UPDATE_USER, REMOVE_USER
-	};
-
-	struct UserTask : Task {
+	struct UserTask {
 		UserTask(const OnlineUser& ou);
 
 		HintedUser user;
@@ -137,7 +136,6 @@
 	};
 
 	typedef unordered_map<UserPtr, UserInfo*, User::Hash> UserMap;
-	typedef UserMap::iterator UserMapIter;
 
 	struct CountAvailable {
 		CountAvailable() : available(0) { }
@@ -167,14 +165,14 @@
 
 	Client* client;
 	string url;
-	bool updateUsers;
 	size_t selCount;
 	bool statusDirty;
 	bool waitingForPW;
 	bool resort;
 	bool confirmClose;
 
-	TaskQueue<false> tasks;
+	vector<pair<function<void (const UserTask&)>, unique_ptr<UserTask>>> tasks;
+	bool updateUsers;
 
 	UserInfo* currentUser; /// only for situations when the user list is hidden
 
@@ -185,8 +183,7 @@
 	StringList tabCompleteNicks;
 	bool inTabComplete;
 
-	typedef std::vector<HubFrame*> FrameList;
-	static FrameList frames;
+	static vector<HubFrame*> frames;
 
 	HubFrame(TabViewPtr parent, string&& url, bool connect);
 	virtual ~HubFrame();

=== modified file 'win32/TransferView.cpp'
--- win32/TransferView.cpp	2013-03-23 16:45:15 +0000
+++ win32/TransferView.cpp	2013-03-26 22:03:28 +0000
@@ -61,7 +61,8 @@
 	transfers(0),
 	mdi(mdi_),
 	downloadIcon(WinUtil::createIcon(IDI_DOWNLOAD, 16)),
-	uploadIcon(WinUtil::createIcon(IDI_UPLOAD, 16))
+	uploadIcon(WinUtil::createIcon(IDI_UPLOAD, 16)),
+	updateList(false)
 {
 	create();
 	setHelpId(IDH_TRANSFERS);
@@ -85,6 +86,8 @@
 
 	layout();
 
+	setTimer([this] { return handleTimer(); }, 500);
+
 	ConnectionManager::getInstance()->addListener(this);
 	DownloadManager::getInstance()->addListener(this);
 	UploadManager::getInstance()->addListener(this);
@@ -578,10 +581,76 @@
 	}
 }
 
+bool TransferView::handleTimer() {
+	if(updateList) {
+		updateList = false;
+		callAsync([this] { execTasks(); });
+	}
+	return true;
+}
+
 void TransferView::layout() {
 	transfers->resize(dwt::Rectangle(getClientSize()));
 }
 
+void TransferView::addConn(const UpdateInfo& ui) {
+	TransferInfo* transfer = nullptr;
+	auto conn = findConn(ui.user, ui.download);
+	if(ui.updateMask & UpdateInfo::MASK_FILE) {
+		transfer = findTransfer(ui.path, ui.download);
+		if(!transfer) {
+			transferItems.emplace_back(ui.tth, ui.download, ui.path);
+			transfer = &transferItems.back();
+			transfers->insert(transfer);
+		}
+		if(conn && &conn->parent != transfer) {
+			removeTransfer(conn->parent);
+			conn = nullptr;
+		}
+		if(ui.download) {
+			QueueManager::getInstance()->getSizeInfo(transfer->size, transfer->startPos, ui.path);
+		} else {
+			transfer->transferred = ui.transferred;
+			transfer->size = ui.size;
+		}
+	} else {
+		if(conn) {
+			removeConn(*conn);
+			conn = nullptr;
+		}
+		// we don't know what file this connection is for yet.
+		transferItems.emplace_back(TTHValue(), ui.download, ui.user.user->getCID().toBase32());
+		transfer = &transferItems.back();
+		transfers->insert(transfer);
+	}
+	if(!conn) {
+		transfer->conns.emplace_back(ui.user, *transfer);
+		conn = &transfer->conns.back();
+		transfers->insertChild(reinterpret_cast<LPARAM>(transfer), reinterpret_cast<LPARAM>(conn));
+	}
+	conn->update(ui);
+	transfer->update();
+}
+
+void TransferView::updateConn(const UpdateInfo& ui) {
+	auto conn = findConn(ui.user, ui.download);
+	if(conn) {
+		conn->update(ui);
+		conn->parent.update();
+	}
+}
+
+void TransferView::removeConn(const UpdateInfo& ui) {
+	auto conn = findConn(ui.user, ui.download);
+	if(conn) {
+		removeConn(*conn);
+	}
+	auto transfer = findTransfer(ui.path, ui.download);
+	if(transfer) {
+		removeTransfer(*transfer);
+	}
+}
+
 TransferView::ConnectionInfo* TransferView::findConn(const HintedUser& user, bool download) {
 	if(!user) { return nullptr; }
 	for(auto& transfer: transferItems) {
@@ -640,88 +709,15 @@
 	return users;
 }
 
-void TransferView::addTask(int type, Task* ui) {
-	tasks.add(type, unique_ptr<Task>(ui));
-	callAsync([this] { execTasks(); });
-}
-
 void TransferView::execTasks() {
-	auto t = tasks.get();
-	if(t.empty())
-		return;
+	updateList = false;
 
 	HoldRedraw hold { transfers };
 
-	for(auto& i: t) {
-		switch(i.first) {
-		case ADD_CONNECTION:
-			{
-				auto& ui = static_cast<UpdateInfo&>(*i.second);
-				TransferInfo* transfer = nullptr;
-				auto conn = findConn(ui.user, ui.download);
-				if(ui.updateMask & UpdateInfo::MASK_FILE) {
-					transfer = findTransfer(ui.path, ui.download);
-					if(!transfer) {
-						transferItems.emplace_back(ui.tth, ui.download, ui.path);
-						transfer = &transferItems.back();
-						transfers->insert(transfer);
-					}
-					if(conn && &conn->parent != transfer) {
-						removeTransfer(conn->parent);
-						conn = nullptr;
-					}
-					if(ui.download) {
-						QueueManager::getInstance()->getSizeInfo(transfer->size, transfer->startPos, ui.path);
-					} else {
-						transfer->transferred = ui.transferred;
-						transfer->size = ui.size;
-					}
-				} else {
-					if(conn) {
-						removeConn(*conn);
-						conn = nullptr;
-					}
-					// we don't know what file this connection is for yet.
-					transferItems.emplace_back(TTHValue(), ui.download, ui.user.user->getCID().toBase32());
-					transfer = &transferItems.back();
-					transfers->insert(transfer);
-				}
-				if(!conn) {
-					transfer->conns.emplace_back(ui.user, *transfer);
-					conn = &transfer->conns.back();
-					transfers->insertChild(reinterpret_cast<LPARAM>(transfer), reinterpret_cast<LPARAM>(conn));
-				}
-				conn->update(ui);
-				transfer->update();
-				break;
-			}
-
-		case UPDATE_CONNECTION:
-			{
-				auto& ui = static_cast<UpdateInfo&>(*i.second);
-				auto conn = findConn(ui.user, ui.download);
-				if(conn) {
-					conn->update(ui);
-					conn->parent.update();
-				}
-				break;
-			}
-
-		case REMOVE_CONNECTION:
-			{
-				auto& ui = static_cast<UpdateInfo&>(*i.second);
-				auto conn = findConn(ui.user, ui.download);
-				if(conn) {
-					removeConn(*conn);
-				}
-				auto transfer = findTransfer(ui.path, ui.download);
-				if(transfer) {
-					removeTransfer(*transfer);
-				}
-				break;
-			}
-		}
+	for(auto& task: tasks) {
+		task.first(*task.second);
 	}
+	tasks.clear();
 
 	transfers->resort();
 }
@@ -731,11 +727,11 @@
 	ui->setStatus(ConnectionInfo::STATUS_WAITING);
 	ui->setStatusString(T_("Connecting"));
 
-	addTask(ADD_CONNECTION, ui);
+	addedConn(ui);
 }
 
 void TransferView::on(ConnectionManagerListener::Removed, ConnectionQueueItem* aCqi) noexcept {
-	addTask(REMOVE_CONNECTION, new UpdateInfo(aCqi->getUser(), aCqi->getDownload()));
+	removedConn(new UpdateInfo(aCqi->getUser(), aCqi->getDownload()));
 }
 
 void TransferView::on(ConnectionManagerListener::Failed, ConnectionQueueItem* aCqi, const string& aReason) noexcept {
@@ -744,14 +740,14 @@
 		T_("Remote client does not fully support TTH - cannot download") :
 		Text::toT(aReason));
 
-	addTask(UPDATE_CONNECTION, ui);
+	updatedConn(ui);
 }
 
 void TransferView::on(ConnectionManagerListener::StatusChanged, ConnectionQueueItem* aCqi) noexcept {
 	auto ui = new UpdateInfo(aCqi->getUser(), aCqi->getDownload());
 	ui->setStatusString((aCqi->getState() == ConnectionQueueItem::CONNECTING) ? T_("Connecting") : T_("Waiting to retry"));
 
-	addTask(UPDATE_CONNECTION, ui);
+	updatedConn(ui);
 }
 
 namespace { tstring getFile(Transfer* t) {
@@ -804,15 +800,13 @@
 	statusString += str(TF_("Downloading %1%") % getFile(d));
 	ui->setStatusString(statusString);
 
-	addTask(UPDATE_CONNECTION, ui);
+	updatedConn(ui);
 }
 
 void TransferView::on(DownloadManagerListener::Tick, const DownloadList& dl) noexcept  {
 	for(auto i: dl) {
 		onTransferTick(i, true);
 	}
-
-	callAsync([this] { execTasks(); });
 }
 
 void TransferView::on(DownloadManagerListener::Requesting, Download* d) noexcept {
@@ -820,7 +814,7 @@
 	starting(ui, d);
 	ui->setStatusString(str(TF_("Requesting %1%") % getFile(d)));
 
-	addTask(ADD_CONNECTION, ui);
+	addedConn(ui);
 }
 
 void TransferView::on(UploadManagerListener::Complete, Upload* u) noexcept {
@@ -848,35 +842,54 @@
 	statusString += str(TF_("Uploading %1%") % getFile(u));
 	ui->setStatusString(statusString);
 
-	addTask(UPDATE_CONNECTION, ui);
+	updatedConn(ui);
 }
 
 void TransferView::on(UploadManagerListener::Tick, const UploadList& ul) noexcept {
 	for(auto i: ul) {
 		onTransferTick(i, false);
 	}
-
-	callAsync([this] { execTasks(); });
 }
 
 void TransferView::on(QueueManagerListener::Removed, QueueItem* qi) noexcept {
-	auto ui = new UpdateInfo(HintedUser(), true);
+	/*auto ui = new UpdateInfo(HintedUser(), true);
 	ui->setFile(qi->getTTH(), qi->getTarget());
-	addTask(REMOVE_CONNECTION, ui);
+	removedConn(ui);*/
 }
 
 void TransferView::on(QueueManagerListener::StatusUpdated, QueueItem* qi) noexcept {
-	if(qi->isFinished() || qi->getPriority() == QueueItem::PAUSED || qi->countOnlineUsers() == 0) {
+	/*if(qi->isFinished() || qi->getPriority() == QueueItem::PAUSED || qi->countOnlineUsers() == 0) {
 		auto ui = new UpdateInfo(HintedUser(), true);
 		ui->setFile(qi->getTTH(), qi->getTarget());
-		addTask(REMOVE_CONNECTION, ui);
-	}
+		removedConn(ui);
+	}*/
 }
 
 void TransferView::on(QueueManagerListener::CRCFailed, Download* d, const string& aReason) noexcept {
 	onFailed(d, aReason);
 }
 
+void TransferView::addedConn(UpdateInfo* ui) {
+	callAsync([this, ui] {
+		tasks.emplace_back([=](const UpdateInfo& ui) { addConn(ui); }, unique_ptr<UpdateInfo>(ui));
+		updateList = true;
+	});
+}
+
+void TransferView::updatedConn(UpdateInfo* ui) {
+	callAsync([this, ui] {
+		tasks.emplace_back([=](const UpdateInfo& ui) { updateConn(ui); }, unique_ptr<UpdateInfo>(ui));
+		updateList = true;
+	});
+}
+
+void TransferView::removedConn(UpdateInfo* ui) {
+	callAsync([this, ui] {
+		tasks.emplace_back([=](const UpdateInfo& ui) { removeConn(ui); }, unique_ptr<UpdateInfo>(ui));
+		updateList = true;
+	});
+}
+
 void TransferView::starting(UpdateInfo* ui, Transfer* t) {
 	ui->setFile(t->getTTH(), t->getPath());
 	ui->setStatus(ConnectionInfo::STATUS_RUNNING);
@@ -892,7 +905,7 @@
 	ui->setFile(t->getTTH(), t->getPath());
 	ui->setTransferred(t->getPos(), t->getActual(), t->getSize());
 	ui->setSpeed(t->getAverageSpeed());
-	tasks.add(UPDATE_CONNECTION, unique_ptr<Task>(ui));
+	updatedConn(ui);
 }
 
 void TransferView::onTransferComplete(Transfer* t, bool download) {
@@ -902,7 +915,7 @@
 	ui->setStatusString(T_("Idle"));
 	ui->setTransferred(t->getPos(), t->getActual(), t->getSize());
 
-	addTask(UPDATE_CONNECTION, ui);
+	updatedConn(ui);
 }
 
 void TransferView::onFailed(Download* d, const string& aReason) {
@@ -911,5 +924,5 @@
 	ui->setStatus(ConnectionInfo::STATUS_WAITING);
 	ui->setStatusString(Text::toT(aReason));
 
-	addTask(UPDATE_CONNECTION, ui);
+	updatedConn(ui);
 }

=== modified file 'win32/TransferView.h'
--- win32/TransferView.h	2013-03-22 16:30:58 +0000
+++ win32/TransferView.h	2013-03-26 22:03:28 +0000
@@ -19,13 +19,13 @@
 #ifndef DCPLUSPLUS_WIN32_TRANSFER_VIEW_H
 #define DCPLUSPLUS_WIN32_TRANSFER_VIEW_H
 
+#include <functional>
 #include <list>
 
 #include <dcpp/DownloadManagerListener.h>
 #include <dcpp/UploadManagerListener.h>
 #include <dcpp/ConnectionManagerListener.h>
 #include <dcpp/QueueManagerListener.h>
-#include <dcpp/TaskQueue.h>
 #include <dcpp/forward.h>
 #include <dcpp/MerkleTree.h>
 #include <dcpp/Util.h>
@@ -36,6 +36,7 @@
 
 #include "UserInfoBase.h"
 
+using std::function;
 using std::list;
 
 class TransferView :
@@ -73,12 +74,6 @@
 		COLUMN_LAST
 	};
 
-	enum {
-		ADD_CONNECTION,
-		UPDATE_CONNECTION,
-		REMOVE_CONNECTION
-	};
-
 	struct TransferInfo;
 	struct UpdateInfo;
 
@@ -152,7 +147,7 @@
 		list<ConnectionInfo> conns;
 	};
 
-	struct UpdateInfo : public Task {
+	struct UpdateInfo {
 		enum {
 			MASK_STATUS = 1 << 0,
 			MASK_STATUS_STRING = 1 << 1,
@@ -210,9 +205,8 @@
 	const dwt::IconPtr downloadIcon;
 	const dwt::IconPtr uploadIcon;
 
-	bool startup;
-
-	TaskQueue<true> tasks; // todo get rid of TaskQueue
+	vector<pair<function<void (const UpdateInfo&)>, unique_ptr<UpdateInfo>>> tasks;
+	bool updateList;
 
 	ParamMap ucLineParams;
 
@@ -224,9 +218,14 @@
 	bool handleKeyDown(int c);
 	void handleDblClicked();
 	LRESULT handleCustomDraw(NMLVCUSTOMDRAW& data);
+	bool handleTimer();
 
 	void layout();
 
+	void addConn(const UpdateInfo& ui);
+	void updateConn(const UpdateInfo& ui);
+	void removeConn(const UpdateInfo& ui);
+
 	ConnectionInfo* findConn(const HintedUser& user, bool download);
 	TransferInfo* findTransfer(const string& path, bool download);
 	void removeConn(ConnectionInfo& conn);
@@ -235,7 +234,6 @@
 	// AspectUserInfo
 	UserInfoList selectedUsersImpl() const;
 
-	void addTask(int type, Task* ui);
 	void execTasks();
 
 	virtual void on(ConnectionManagerListener::Added, ConnectionQueueItem* aCqi) noexcept;
@@ -257,6 +255,10 @@
 	virtual void on(QueueManagerListener::StatusUpdated, QueueItem* qi) noexcept;
 	virtual void on(QueueManagerListener::CRCFailed, Download* d, const string& aReason) noexcept;
 
+	void addedConn(UpdateInfo* ui);
+	void updatedConn(UpdateInfo* ui);
+	void removedConn(UpdateInfo* ui);
+
 	void starting(UpdateInfo* ui, Transfer* t);
 	void onTransferTick(Transfer* t, bool download);
 	void onTransferComplete(Transfer* t, bool download);