------------------------------------------------------------ revno: 3017 committer: iceman50 <bdcde...@gmail.com> branch nick: dcplusplus timestamp: Wed 2012-08-01 19:25:23 -0500 message: Add QP support along with fixing L#305811 and some compiler warnings modified: dcpp/ConnectionManager.cpp dcpp/StringMatch.cpp dcpp/UploadManager.cpp dcpp/UploadManager.h dcpp/UserConnection.cpp dcpp/UserConnection.h dcpp/UserConnectionListener.h dcpp/UserMatch.cpp dwt/src/widgets/TabView.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/ConnectionManager.cpp' --- dcpp/ConnectionManager.cpp 2012-06-21 18:52:47 +0000 +++ dcpp/ConnectionManager.cpp 2012-08-02 00:25:23 +0000 @@ -682,6 +682,7 @@ /** @todo check tokens for upload connections */ } + aSource->setToken(token); if(down) { aSource->setFlag(UserConnection::FLAG_DOWNLOAD); addDownloadConnection(aSource); === modified file 'dcpp/StringMatch.cpp' --- dcpp/StringMatch.cpp 2012-03-03 19:33:45 +0000 +++ dcpp/StringMatch.cpp 2012-08-02 00:25:23 +0000 @@ -34,6 +34,7 @@ case PARTIAL: search = StringSearch::List(); break; case EXACT: search = string(); break; case REGEX: search = boost::regex(); break; + case METHOD_LAST: break; } } === modified file 'dcpp/UploadManager.cpp' --- dcpp/UploadManager.cpp 2012-06-21 18:52:47 +0000 +++ dcpp/UploadManager.cpp 2012-08-02 00:25:23 +0000 @@ -105,22 +105,22 @@ if(!aSource.isSet(UserConnection::FLAG_HASSLOT)) { bool hasReserved = hasReservedSlot(aSource.getUser()); bool isFavorite = FavoriteManager::getInstance()->hasSlot(aSource.getUser()); + bool hasFreeSlot = (getFreeSlots() > 0) && ((waitingFiles.empty() && connectingUsers.empty()) || isConnecting(aSource.getUser())); - if(!(hasReserved || isFavorite || getFreeSlots() > 0 || getAutoSlot())) { + if(!(hasReserved || isFavorite || getAutoSlot() || hasFreeSlot)) { bool supportsMini = aSource.isSet(UserConnection::FLAG_SUPPORTS_MINISLOTS); bool allowedMini = aSource.isSet(UserConnection::FLAG_HASEXTRASLOT) || aSource.isSet(UserConnection::FLAG_OP) || getFreeExtraSlots() > 0; if(miniSlot && supportsMini && allowedMini) { extraSlot = true; } else { - aSource.maxedOut(); // Check for tth root identifier string tFile = aFile; if (tFile.compare(0, 4, "TTH/") == 0) tFile = ShareManager::getInstance()->toVirtual(TTHValue(aFile.substr(4))); - addFailedUpload(aSource, tFile + - " (" + Util::formatBytes(aStartPos) + " - " + Util::formatBytes(aStartPos + aBytes) + ")"); + aSource.maxedOut(addFailedUpload(aSource, tFile + + " (" + Util::formatBytes(aStartPos) + " - " + Util::formatBytes(aStartPos + aBytes) + ")")); aSource.disconnect(); return false; } @@ -199,6 +199,7 @@ is = mis; break; } + case Transfer::TYPE_LAST: break; } } catch(const ShareException& e) { @@ -243,6 +244,12 @@ if(gotFullSlot) { clearUserFiles(aSource.getUser()); // this user is using a full slot, nix them. + + // remove user from connecting list + auto cu = connectingUsers.find(aSource.getUser()); + if(cu != connectingUsers.end()) { + connectingUsers.erase(cu); + } } } @@ -281,8 +288,12 @@ Lock l(cs); reservedSlots.insert(aUser); } - if(aUser.user->isOnline()) - ClientManager::getInstance()->connect(aUser, Util::toString(Util::rand())); + if(aUser.user->isOnline()) { + auto it = find_if(waitingUsers.cbegin(), waitingUsers.cend(), [&](const UserPtr& u) { return u == aUser.user; }); + if(it != waitingUsers.cend()) { + ClientManager::getInstance()->connect(aUser, it->token); + } + } } bool UploadManager::hasReservedSlot(const UserPtr& user) const { @@ -392,30 +403,29 @@ removeUpload(u); } -void UploadManager::addFailedUpload(const UserConnection& source, string filename) { +size_t UploadManager::addFailedUpload(const UserConnection& source, string filename) { + size_t queue_position = 0; { Lock l(cs); - auto it = find_if(waitingUsers.begin(), waitingUsers.end(), CompareFirst<UserPtr, uint32_t>(source.getUser())); + auto it = find_if(waitingUsers.begin(), waitingUsers.end(), [&](const UserPtr& u) -> bool { ++queue_position; return u == source.getUser(); }); if (it==waitingUsers.end()) { - waitingUsers.emplace_back(source.getHintedUser(), GET_TICK()); - } else { - it->second = GET_TICK(); + waitingUsers.emplace_back(source.getHintedUser(), source.getToken()); } waitingFiles[source.getUser()].insert(filename); //files for which user's asked } - fire(UploadManagerListener::WaitingAddFile(), source.getHintedUser(), filename); + return queue_position; } void UploadManager::clearUserFiles(const UserPtr& source) { Lock l(cs); //run this when a user's got a slot or goes offline. - auto sit = find_if(waitingUsers.begin(), waitingUsers.end(), CompareFirst<UserPtr, uint32_t>(source)); + auto sit = find_if(waitingUsers.begin(), waitingUsers.end(), [&source](const UserPtr& other) { return other == source; }); if (sit == waitingUsers.end()) return; - auto fit = waitingFiles.find(sit->first); + auto fit = waitingFiles.find(sit->user); if (fit != waitingFiles.end()) waitingFiles.erase(fit); - fire(UploadManagerListener::WaitingRemoveUser(), sit->first); + fire(UploadManagerListener::WaitingRemoveUser(), sit->user); waitingUsers.erase(sit); } @@ -424,7 +434,7 @@ Lock l(cs); HintedUserList u; for(auto i = waitingUsers.begin(), iend = waitingUsers.end(); i != iend; ++i) { - u.push_back(i->first); + u.push_back(i->user); } return u; } @@ -462,20 +472,42 @@ } } -void UploadManager::on(TimerManagerListener::Minute, uint64_t /* aTick */) noexcept { +void UploadManager::notifyQueuedUsers() { + if(waitingUsers.empty()) return; //no users to notify + + int freeSlots = getFreeSlots(); + if(freeSlots > 0) { + freeSlots -= connectingUsers.size(); + while(!waitingUsers.empty() && freeSlots > 0) { + // let's keep him in the connectingList until he asks for a file + WaitingUser queuedUser = waitingUsers.front(); + auto isOnline = queuedUser.user.user->isOnline(); + if(isOnline) { + clearUserFiles(queuedUser.user); + connectingUsers[queuedUser.user] = GET_TICK(); + ClientManager::getInstance()->connect(queuedUser.user, queuedUser.token); + freeSlots--; + } else { + clearUserFiles(queuedUser.user); + } + } + } +} + +void UploadManager::on(TimerManagerListener::Minute, uint64_t aTick ) noexcept { UserList disconnects; { Lock l(cs); - auto i = stable_partition(waitingUsers.begin(), waitingUsers.end(), WaitingUserFresh()); - for (auto j = i; j != waitingUsers.end(); ++j) { - auto fit = waitingFiles.find(j->first); - if (fit != waitingFiles.end()) waitingFiles.erase(fit); - fire(UploadManagerListener::WaitingRemoveUser(), j->first); + for(auto i = connectingUsers.begin(); i != connectingUsers.end();) { + if((i->second + (90 * 1000)) < aTick) { + clearUserFiles(i->first); + connectingUsers.erase(i++); + } else { + ++i; + } } - waitingUsers.erase(i, waitingUsers.end()); - if( SETTING(AUTO_KICK) ) { for(auto u: uploads) { if(u->getUser()->isOnline()) { @@ -554,6 +586,8 @@ if(!uploads.empty()) fire(UploadManagerListener::Tick(), UploadList(uploads)); + + notifyQueuedUsers(); } void UploadManager::on(ClientManagerListener::UserDisconnected, const UserPtr& aUser) noexcept { === modified file 'dcpp/UploadManager.h' --- dcpp/UploadManager.h 2012-05-27 12:53:12 +0000 +++ dcpp/UploadManager.h 2012-08-02 00:25:23 +0000 @@ -34,6 +34,7 @@ #include "Speaker.h" #include "SettingsManager.h" #include "HintedUser.h" +#include "UserConnection.h" #include "GetSet.h" namespace dcpp { @@ -43,6 +44,15 @@ using std::set; using std::unordered_map; +struct WaitingUser { + HintedUser user; + string token; + + WaitingUser(const HintedUser& _user, const std::string& _token) : user(_user), token(_token) { } + + operator const UserPtr&() const { return user.user; } +}; + class UploadManager : private ClientManagerListener, private UserConnectionListener, public Speaker<UploadManagerListener>, private TimerManagerListener, public Singleton<UploadManager> { public: @@ -65,6 +75,7 @@ /** @param aUser Reserve an upload slot for this user and connect. */ void reserveSlot(const HintedUser& aUser); + bool isConnecting(const UserPtr& aUser) const { return connectingUsers.find(aUser) != connectingUsers.end(); } typedef set<string> FileSet; typedef unordered_map<UserPtr, FileSet, User::Hash> FilesMap; @@ -87,20 +98,20 @@ typedef unordered_set<UserPtr, User::Hash> SlotSet; typedef SlotSet::iterator SlotIter; SlotSet reservedSlots; + + typedef unordered_map<UserPtr, uint64_t, User::Hash> SlotMap; + typedef SlotMap::iterator SlotMapIter; + SlotMap connectingUsers; int lastFreeSlots; /// amount of free slots at the previous minute - typedef pair<HintedUser, uint64_t> WaitingUser; typedef list<WaitingUser> WaitingUserList; - struct WaitingUserFresh { - bool operator()(const WaitingUser& wu) { return wu.second > GET_TICK() - 5*60*1000; } - }; - //functions for manipulating waitingFiles and waitingUsers WaitingUserList waitingUsers; //this one merely lists the users waiting for slots FilesMap waitingFiles; //set of files which this user has asked for - void addFailedUpload(const UserConnection& source, string filename); + size_t addFailedUpload(const UserConnection& source, string filename); + void notifyQueuedUsers(); friend class Singleton<UploadManager>; UploadManager() noexcept; === modified file 'dcpp/UserConnection.cpp' --- dcpp/UserConnection.cpp 2012-07-20 13:55:11 +0000 +++ dcpp/UserConnection.cpp 2012-08-02 00:25:23 +0000 @@ -127,7 +127,7 @@ } else if(cmd == "$Send") { fire(UserConnectionListener::Send(), this); } else if(cmd == "$MaxedOut") { - fire(UserConnectionListener::MaxedOut(), this); + fire(UserConnectionListener::MaxedOut(), this, param); } else if(cmd == "$Supports") { if(!param.empty()) { fire(UserConnectionListener::Supports(), this, StringTokenizer<string>(param, ' ').getTokens()); === modified file 'dcpp/UserConnection.h' --- dcpp/UserConnection.h 2012-07-01 18:41:13 +0000 +++ dcpp/UserConnection.h 2012-08-02 00:25:23 +0000 @@ -110,7 +110,21 @@ void fileLength(const string& aLength) { send("$FileLength " + aLength + '|'); } void error(const string& aError) { send("$Error " + aError + '|'); } void listLen(const string& aLength) { send("$ListLen " + aLength + '|'); } - void maxedOut() { isSet(FLAG_NMDC) ? send("$MaxedOut|") : send(AdcCommand(AdcCommand::SEV_RECOVERABLE, AdcCommand::ERROR_SLOTS_FULL, "Slots full")); } + + void maxedOut(size_t queue_position = 0) { + bool sendPos = queue_position > 0; + + if(isSet(FLAG_NMDC)) { + send("$MaxedOut" + (sendPos ? (" " + Util::toString(queue_position)) : Util::emptyString) + "|"); + } else { + AdcCommand cmd(AdcCommand::SEV_RECOVERABLE, AdcCommand::ERROR_SLOTS_FULL, "Slots full"); + if(sendPos) { + cmd.addParam("QP", Util::toString(queue_position)); + } + send(cmd); + } + } + void fileNotAvail(const std::string& msg = FILE_NOT_AVAILABLE) { isSet(FLAG_NMDC) ? send("$Error " + msg + "|") : send(AdcCommand(AdcCommand::SEV_RECOVERABLE, AdcCommand::ERROR_FILE_NOT_AVAILABLE, msg)); } void supports(const StringList& feat); === modified file 'dcpp/UserConnectionListener.h' --- dcpp/UserConnectionListener.h 2012-01-13 20:55:20 +0000 +++ dcpp/UserConnectionListener.h 2012-08-02 00:25:23 +0000 @@ -22,6 +22,7 @@ #include "forward.h" #include "AdcCommand.h" #include "noexcept.h" +#include "Util.h" namespace dcpp { @@ -60,7 +61,7 @@ virtual void on(Get, UserConnection*, const string&, int64_t) noexcept { } virtual void on(Send, UserConnection*) noexcept { } virtual void on(GetListLength, UserConnection*) noexcept { } - virtual void on(MaxedOut, UserConnection*) noexcept { } + virtual void on(MaxedOut, UserConnection*, string param = Util::emptyString) noexcept { } virtual void on(ModeChange, UserConnection*) noexcept { } virtual void on(MyNick, UserConnection*, const string&) noexcept { } virtual void on(TransmitDone, UserConnection*) noexcept { } === modified file 'dcpp/UserMatch.cpp' --- dcpp/UserMatch.cpp 2012-06-18 15:56:01 +0000 +++ dcpp/UserMatch.cpp 2012-08-02 00:25:23 +0000 @@ -61,6 +61,7 @@ case UserMatch::Rule::CID: str = identity.getUser()->getCID().toBase32(); break; case UserMatch::Rule::IP: str = identity.getIp(); break; case UserMatch::Rule::HUB_ADDRESS: str = user.getClient().getHubUrl(); break; + case UserMatch::Rule::FIELD_LAST: break; } if(!i.match(str)) { return false; === modified file 'dwt/src/widgets/TabView.cpp' --- dwt/src/widgets/TabView.cpp 2012-03-03 19:33:45 +0000 +++ dwt/src/widgets/TabView.cpp 2012-08-02 00:25:23 +0000 @@ -633,6 +633,11 @@ switch(mouseEvent.ButtonPressed) { case MouseEvent::X1: next(true); break; case MouseEvent::X2: next(); break; + + case MouseEvent::OTHER: break; + case MouseEvent::LEFT: break; + case MouseEvent::RIGHT: break; + case MouseEvent::MIDDLE: break; } return true; }
_______________________________________________ Mailing list: https://launchpad.net/~linuxdcpp-team Post to : linuxdcpp-team@lists.launchpad.net Unsubscribe : https://launchpad.net/~linuxdcpp-team More help : https://help.launchpad.net/ListHelp