← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2642: Allow choosing which hub to pm through

 

------------------------------------------------------------
revno: 2642
committer: Jacek Sieka <arnetheduck@xxxxxxxxx>
branch nick: dcplusplus
timestamp: Thu 2011-10-20 23:14:24 +0900
message:
  Allow choosing which hub to pm through
modified:
  dcpp/ClientManager.cpp
  dcpp/ClientManager.h
  dcpp/FavoriteManager.cpp
  dcpp/QueueManager.cpp
  dcpp/SearchManager.cpp
  dcpp/Transfer.cpp
  win32/DirectoryListingFrame.cpp
  win32/PrivateFrame.cpp
  win32/PrivateFrame.h
  win32/SearchFrame.cpp


--
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
=== modified file 'dcpp/ClientManager.cpp'
--- dcpp/ClientManager.cpp	2011-09-30 11:33:12 +0000
+++ dcpp/ClientManager.cpp	2011-10-20 14:14:24 +0000
@@ -78,8 +78,8 @@
 	return onlineUsers.size();
 }
 
-StringList ClientManager::getHubs(const CID& cid, const string& hintUrl) {
-	return getHubs(cid, hintUrl, FavoriteManager::getInstance()->isPrivate(hintUrl));
+StringList ClientManager::getHubUrls(const CID& cid, const string& hintUrl) {
+	return getHubUrls(cid, hintUrl, FavoriteManager::getInstance()->isPrivate(hintUrl));
 }
 
 StringList ClientManager::getHubNames(const CID& cid, const string& hintUrl) {
@@ -90,7 +90,7 @@
 	return getNicks(cid, hintUrl, FavoriteManager::getInstance()->isPrivate(hintUrl));
 }
 
-StringList ClientManager::getHubs(const CID& cid, const string& hintUrl, bool priv) {
+StringList ClientManager::getHubUrls(const CID& cid, const string& hintUrl, bool priv) {
 	Lock l(cs);
 	StringList lst;
 	if(!priv) {
@@ -150,6 +150,22 @@
 	return StringList(ret.begin(), ret.end());
 }
 
+StringPairList ClientManager::getHubs(const CID& cid, const string& hintUrl, bool priv) {
+	Lock l(cs);
+	StringPairList lst;
+	if(!priv) {
+		auto op = onlineUsers.equal_range(cid);
+		for(auto i = op.first; i != op.second; ++i) {
+			lst.push_back(make_pair(i->second->getClient().getHubUrl(), i->second->getClient().getHubName()));
+		}
+	} else {
+		OnlineUser* u = findOnlineUserHint(cid, hintUrl);
+		if(u)
+			lst.push_back(make_pair(u->getClient().getHubUrl(), u->getClient().getHubName()));
+	}
+	return lst;
+}
+
 vector<Identity> ClientManager::getIdentities(const UserPtr &u) const {
 	Lock l(cs);
 	auto op = onlineUsers.equal_range(u->getCID());

=== modified file 'dcpp/ClientManager.h'
--- dcpp/ClientManager.h	2011-09-30 11:33:12 +0000
+++ dcpp/ClientManager.h	2011-10-20 14:14:24 +0000
@@ -55,18 +55,20 @@
 	size_t getUserCount() const;
 	int64_t getAvailable() const;
 
-	StringList getHubs(const CID& cid, const string& hintUrl);
-	StringList getHubNames(const CID& cid, const string& hintUrl);
-	StringList getNicks(const CID& cid, const string& hintUrl);
+	StringList getHubUrls(const CID& cid, const string& hintUrl = Util::emptyString);
+	StringList getHubNames(const CID& cid, const string& hintUrl = Util::emptyString);
+	StringList getNicks(const CID& cid, const string& hintUrl = Util::emptyString);
 	string getField(const CID& cid, const string& hintUrl, const char* field) const;
 
-	StringList getHubs(const CID& cid, const string& hintUrl, bool priv);
+	StringList getHubUrls(const CID& cid, const string& hintUrl, bool priv);
 	StringList getHubNames(const CID& cid, const string& hintUrl, bool priv);
 	StringList getNicks(const CID& cid, const string& hintUrl, bool priv);
 
 	StringList getNicks(const HintedUser& user) { return getNicks(user.user->getCID(), user.hint); }
 	StringList getHubNames(const HintedUser& user) { return getHubNames(user.user->getCID(), user.hint); }
-	StringList getHubs(const HintedUser& user) { return getHubs(user.user->getCID(), user.hint); }
+	StringList getHubUrls(const HintedUser& user) { return getHubUrls(user.user->getCID(), user.hint); }
+
+	StringPairList getHubs(const CID& cid, const string& hintUrl, bool priv);
 
 	vector<Identity> getIdentities(const UserPtr &u) const;
 

=== modified file 'dcpp/FavoriteManager.cpp'
--- dcpp/FavoriteManager.cpp	2011-10-13 13:43:14 +0000
+++ dcpp/FavoriteManager.cpp	2011-10-20 14:14:24 +0000
@@ -164,8 +164,8 @@
 	{
 		Lock l(cs);
 		if(users.find(aUser->getCID()) == users.end()) {
-			StringList urls = ClientManager::getInstance()->getHubs(aUser->getCID(), Util::emptyString);
-			StringList nicks = ClientManager::getInstance()->getNicks(aUser->getCID(), Util::emptyString);
+			StringList urls = ClientManager::getInstance()->getHubUrls(aUser->getCID());
+			StringList nicks = ClientManager::getInstance()->getNicks(aUser->getCID());
 
 			/// @todo make this an error probably...
 			if(urls.empty())

=== modified file 'dcpp/QueueManager.cpp'
--- dcpp/QueueManager.cpp	2011-09-30 11:33:12 +0000
+++ dcpp/QueueManager.cpp	2011-10-20 14:14:24 +0000
@@ -1802,7 +1802,7 @@
 					}
 					hubNames.push_back(Util::toString(temp));
 
-					temp = ClientManager::getInstance()->getHubs(*i);
+					temp = ClientManager::getInstance()->getHubUrls(*i);
 					if(temp.empty()) {
 						temp.push_back(_("Offline"));
 					}

=== modified file 'dcpp/SearchManager.cpp'
--- dcpp/SearchManager.cpp	2011-09-04 15:20:46 +0000
+++ dcpp/SearchManager.cpp	2011-10-20 14:14:24 +0000
@@ -313,9 +313,9 @@
 	if(!file.empty() && freeSlots != -1 && size != -1) {
 
 		/// @todo get the hub this was sent from, to be passed as a hint? (eg by using the token?)
-		StringList names = ClientManager::getInstance()->getHubNames(from->getCID(), Util::emptyString);
+		StringList names = ClientManager::getInstance()->getHubNames(from->getCID());
 		string hubName = names.empty() ? _("Offline") : Util::toString(names);
-		StringList hubs = ClientManager::getInstance()->getHubs(from->getCID(), Util::emptyString);
+		StringList hubs = ClientManager::getInstance()->getHubUrls(from->getCID());
 		string hub = hubs.empty() ? _("Offline") : Util::toString(hubs);
 
 		SearchResult::Types type = (file[file.length() - 1] == '\\' ? SearchResult::TYPE_DIRECTORY : SearchResult::TYPE_FILE);

=== modified file 'dcpp/Transfer.cpp'
--- dcpp/Transfer.cpp	2011-09-30 11:33:12 +0000
+++ dcpp/Transfer.cpp	2011-10-20 14:14:24 +0000
@@ -80,7 +80,7 @@
 	if(hubNames.empty())
 		hubNames.push_back(_("Offline"));
 	params["hub"] = Util::toString(hubNames);
-	StringList hubs = ClientManager::getInstance()->getHubs(aSource.getUser()->getCID(), aSource.getHubUrl());
+	StringList hubs = ClientManager::getInstance()->getHubUrls(aSource.getUser()->getCID(), aSource.getHubUrl());
 	if(hubs.empty())
 		hubs.push_back(_("Offline"));
 	params["hubURL"] = Util::toString(hubs);

=== modified file 'win32/DirectoryListingFrame.cpp'
--- win32/DirectoryListingFrame.cpp	2011-10-17 19:39:46 +0000
+++ win32/DirectoryListingFrame.cpp	2011-10-20 14:14:24 +0000
@@ -566,7 +566,7 @@
 }
 
 void DirectoryListingFrame::addUserCommands(const MenuPtr& parent) {
-	prepareMenu(parent, UserCommand::CONTEXT_FILELIST, ClientManager::getInstance()->getHubs(dl->getUser().user->getCID(), dl->getUser().hint));
+	prepareMenu(parent, UserCommand::CONTEXT_FILELIST, ClientManager::getInstance()->getHubUrls(dl->getUser()));
 }
 
 void DirectoryListingFrame::addShellPaths(const ShellMenuPtr& menu, const vector<ItemInfo*>& sel) {

=== modified file 'win32/PrivateFrame.cpp'
--- win32/PrivateFrame.cpp	2011-10-10 20:18:18 +0000
+++ win32/PrivateFrame.cpp	2011-10-20 14:14:24 +0000
@@ -18,6 +18,7 @@
 
 #include "stdafx.h"
 
+#include <boost/range/algorithm/for_each.hpp>
 #include "PrivateFrame.h"
 
 #include "HoldRedraw.h"
@@ -33,6 +34,8 @@
 using dwt::Grid;
 using dwt::GridInfo;
 
+using boost::range::for_each;
+
 const string PrivateFrame::id = "PM";
 const string& PrivateFrame::getId() const { return id; }
 
@@ -141,19 +144,20 @@
 	message->onChar([this](int c) { return handleMessageChar(c); });
 
 	initStatus();
+	hubBox = addChild(WinUtil::Seeds::comboBoxStatic);
+
 	status->onDblClicked(STATUS_STATUS, [this] { openLog(); });
 
-	updateOnlineStatus();
-
 	initAccels();
 
 	layout();
 
 	readLog(logPath, SETTING(PM_LAST_LOG_LINES));
 
-	ClientManager::getInstance()->addListener(this);
-
-	callAsync([this] { updateOnlineStatus(); });
+	callAsync([this] {
+		ClientManager::getInstance()->addListener(this);
+		updateOnlineStatus();
+	});
 
 	frames.insert(std::make_pair(replyTo.getUser(), this));
 
@@ -213,7 +217,7 @@
 	const CID& cid = replyTo.getUser().user->getCID();
 	const string& hint = replyTo.getUser().hint;
 	params["hubNI"] = [&] { return Util::toString(ClientManager::getInstance()->getHubNames(cid, hint, priv)); };
-	params["hubURL"] = [&] { return Util::toString(ClientManager::getInstance()->getHubs(cid, hint, priv)); };
+	params["hubURL"] = [&] { return Util::toString(ClientManager::getInstance()->getHubUrls(cid, hint, priv)); };
 	params["userCID"] = [&cid] { return cid.toBase32(); };
 	params["userNI"] = [&] { return ClientManager::getInstance()->getNicks(cid, hint, priv)[0]; };
 	params["myCID"] = [] { return ClientManager::getInstance()->getMe()->getCID().toBase32(); };
@@ -238,12 +242,35 @@
 	const CID& cid = replyTo.getUser().user->getCID();
 	const string& hint = replyTo.getUser().hint;
 
-	pair<tstring, bool> hubs = WinUtil::getHubNames(cid, hint, priv);
-
-	setText(WinUtil::getNicks(cid, hint, priv) + _T(" - ") + hubs.first);
-
-	online = hubs.second;
+	pair<tstring, bool> hubNames = WinUtil::getHubNames(cid, hint, priv);
+
+	setText(WinUtil::getNicks(cid, hint, priv) + _T(" - ") + hubNames.first);
+
+	online = hubNames.second;
 	setIcon(online ? IDI_PRIVATE : IDI_PRIVATE_OFF);
+
+	hubs = ClientManager::getInstance()->getHubs(cid, hint, priv);
+	hubBox->clear();
+
+	if(hubs.empty()) {
+		hubBox->setEnabled(false);
+	} else {
+		hubBox->setEnabled(true);
+
+		for_each(hubs, [&](const StringPair &hub) {
+			auto idx = hubBox->addValue(Text::toT(hub.second));
+			if(hub.first == replyTo.getUser().hint) {
+				hubBox->setSelected(idx);
+			}
+		});
+
+		if(hubBox->getSelected() == -1) {
+			hubBox->setSelected(0);
+		}
+	}
+
+	status->setWidget(STATUS_HUBS, hubBox);
+	status->refresh();
 }
 
 void PrivateFrame::enterImpl(const tstring& s) {
@@ -302,7 +329,8 @@
 }
 
 void PrivateFrame::sendMessage(const tstring& msg, bool thirdPerson) {
-	ClientManager::getInstance()->privateMessage(replyTo.getUser(), Text::fromT(msg), thirdPerson);
+	auto url = hubs[hubBox->getSelected()].first;
+	ClientManager::getInstance()->privateMessage(HintedUser(replyTo.getUser().user, url), Text::fromT(msg), thirdPerson);
 }
 
 PrivateFrame::UserInfoList PrivateFrame::selectedUsersImpl() {
@@ -324,7 +352,7 @@
 
 void PrivateFrame::tabMenuImpl(dwt::MenuPtr& menu) {
 	appendUserItems(getParent(), menu, false, false);
-	prepareMenu(menu, UserCommand::CONTEXT_USER, ClientManager::getInstance()->getHubs(replyTo.getUser().user->getCID(),
+	prepareMenu(menu, UserCommand::CONTEXT_USER, ClientManager::getInstance()->getHubUrls(replyTo.getUser().user->getCID(),
 		replyTo.getUser().hint, priv));
 	menu->appendSeparator();
 }
@@ -338,7 +366,7 @@
 
 	menu->setTitle(escapeMenu(getText()), getParent()->getIcon(this));
 
-	prepareMenu(menu, UserCommand::CONTEXT_USER, ClientManager::getInstance()->getHubs(replyTo.getUser().user->getCID(),
+	prepareMenu(menu, UserCommand::CONTEXT_USER, ClientManager::getInstance()->getHubUrls(replyTo.getUser().user->getCID(),
 		replyTo.getUser().hint, priv));
 
 	menu->open(pt);

=== modified file 'win32/PrivateFrame.h'
--- win32/PrivateFrame.h	2011-09-30 11:33:12 +0000
+++ win32/PrivateFrame.h	2011-10-20 14:14:24 +0000
@@ -48,6 +48,7 @@
 
 public:
 	enum Status {
+		STATUS_HUBS,
 		STATUS_STATUS,
 		STATUS_LAST
 	};
@@ -71,6 +72,8 @@
 	void sendMessage(const tstring& msg, bool thirdPerson = false);
 
 private:
+	ComboBoxPtr hubBox;
+	StringPairList hubs;
 	ParamMap ucLineParams;
 
 	UserInfoBase replyTo;

=== modified file 'win32/SearchFrame.cpp'
--- win32/SearchFrame.cpp	2011-10-17 19:39:46 +0000
+++ win32/SearchFrame.cpp	2011-10-20 14:14:24 +0000
@@ -435,10 +435,10 @@
 	}
 
 	if(firstHubs && hubs.empty()) {
-		hubs = ClientManager::getInstance()->getHubs(sr->getUser()->getCID(), sr->getHubURL());
+		hubs = ClientManager::getInstance()->getHubUrls(sr->getUser()->getCID(), sr->getHubURL());
 		firstHubs = false;
 	} else if(!hubs.empty()) {
-		Util::intersect(hubs, ClientManager::getInstance()->getHubs(sr->getUser()->getCID(), sr->getHubURL()));
+		Util::intersect(hubs, ClientManager::getInstance()->getHubUrls(sr->getUser()->getCID(), sr->getHubURL()));
 	}
 }