From: <arn...@us...> - 2006-02-26 21:20:15
|
Revision: 582 Author: arnetheduck Date: 2006-02-26 13:19:47 -0800 (Sun, 26 Feb 2006) ViewCVS: http://svn.sourceforge.net/dcplusplus/?rev=582&view=rev Log Message: ----------- Lots of small fixes Modified Paths: -------------- dcplusplus/trunk/DCPlusPlus.rc dcplusplus/trunk/Example.xml dcplusplus/trunk/changelog.txt dcplusplus/trunk/client/AdcHub.cpp dcplusplus/trunk/client/BufferedSocket.cpp dcplusplus/trunk/client/Client.cpp dcplusplus/trunk/client/Client.h dcplusplus/trunk/client/CriticalSection.h dcplusplus/trunk/client/NmdcHub.cpp dcplusplus/trunk/client/QueueManager.cpp dcplusplus/trunk/client/StringDefs.cpp dcplusplus/trunk/client/Thread.h dcplusplus/trunk/client/version.h dcplusplus/trunk/help/changelog.html dcplusplus/trunk/windows/HubFrame.cpp dcplusplus/trunk/windows/HubFrame.h Property Changed: ---------------- dcplusplus/trunk/ dcplusplus/trunk/stlport/ dcplusplus/trunk/wtl/ Property changes on: dcplusplus/trunk ___________________________________________________________________ Name: svn:ignore + vc7 ADC* App* Modified: dcplusplus/trunk/DCPlusPlus.rc =================================================================== --- dcplusplus/trunk/DCPlusPlus.rc 2006-02-25 19:14:25 UTC (rev 581) +++ dcplusplus/trunk/DCPlusPlus.rc 2006-02-26 21:19:47 UTC (rev 582) @@ -933,8 +933,8 @@ // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,6,8,6 - PRODUCTVERSION 0,6,8,6 + FILEVERSION 0,6,8,7 + PRODUCTVERSION 0,6,8,7 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -951,12 +951,12 @@ BEGIN VALUE "Comments", "http://dcplusplus.sourceforge.net" VALUE "FileDescription", "DC++" - VALUE "FileVersion", "0, 6, 8, 6" + VALUE "FileVersion", "0, 6, 8, 7" VALUE "InternalName", "DC++" VALUE "LegalCopyright", "Copyright 2001-2006 Jacek Sieka" VALUE "OriginalFilename", "DCPlusPlus.exe" VALUE "ProductName", "DC++" - VALUE "ProductVersion", "0, 6, 8, 6" + VALUE "ProductVersion", "0, 6, 8, 7" END END BLOCK "VarFileInfo" Modified: dcplusplus/trunk/Example.xml =================================================================== --- dcplusplus/trunk/Example.xml 2006-02-25 19:14:25 UTC (rev 581) +++ dcplusplus/trunk/Example.xml 2006-02-26 21:19:47 UTC (rev 582) @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<Language Name="Example Language" Author="arnetheduck" Version="0.686" Revision="1" RightToLeft="0"> +<Language Name="Example Language" Author="arnetheduck" Version="0.687" Revision="1" RightToLeft="0"> <Strings> <String Name="Active">Active</String> <String Name="ActiveSearchString">Enabled / Search String</String> @@ -363,6 +363,7 @@ <String Name="SettingsAntiFrag">Use antifragmentation method for downloads</String> <String Name="SettingsAppearance">Appearance</String> <String Name="SettingsAppearance2">Appearance\Colors and sounds</String> + <String Name="SettingsAutodropAutodropsettings">Autodrop settings</String> <String Name="SettingsAutodropSpeed">Drop sources below</String> <String Name="SettingsAutodropInterval">Check every</String> <String Name="SettingsAutodropElapsed">Min elapsed</String> @@ -445,6 +446,7 @@ <String Name="SettingsOpenNewWindow">Open new window when using /join</String> <String Name="SettingsOpenUserCmdHelp">Always open help file with this dialog</String> <String Name="SettingsOptions">Options</String> + <String Name="SettingsOtherQueueOptions">Other queue options</String> <String Name="SettingsOutgoing">Outgoing connection settings</String> <String Name="SettingsOverride">Don't allow hub/UPnP to override</String> <String Name="SettingsPersonalInformation">Personal Information</String> @@ -472,7 +474,7 @@ <String Name="SettingsShareSize">Total size:</String> <String Name="SettingsSharedDirectories">Shared directories</String> <String Name="SettingsShowJoins">Show joins / parts in chat by default</String> - <String Name="SettingsShowProgressBars">Show progress bars for transfers (uses some CPU)</String> + <String Name="SettingsShowProgressBars">Show progress bars for transfers</String> <String Name="SettingsSkipZeroByte">Skip zero-byte files</String> <String Name="SettingsSmallSendBuffer">Use small send buffer (enable if uploads slow downloads a lot)</String> <String Name="SettingsSocks5">SOCKS5</String> @@ -485,6 +487,7 @@ <String Name="SettingsStatusInChat">View status messages in main chat</String> <String Name="SettingsTcpPort">TCP Port</String> <String Name="SettingsTextMinislot">Mini slot size</String> + <String Name="SettingsPrioAutoprio">Autoprio settings</String> <String Name="SettingsPrioHighest">Highest prio max size</String> <String Name="SettingsPrioHigh">High prio max size</String> <String Name="SettingsPrioNormal">Normal prio max size</String> Modified: dcplusplus/trunk/changelog.txt =================================================================== --- dcplusplus/trunk/changelog.txt 2006-02-25 19:14:25 UTC (rev 581) +++ dcplusplus/trunk/changelog.txt 2006-02-26 21:19:47 UTC (rev 582) @@ -10,7 +10,8 @@ * Added possiblity to sort transfer view by all downloads first (thanks guitarm) * Some cleanup for frame creation (thanks martin) * Fixed some translation strings (thanks fleetcommand) -* Fixed some finished transfer frame issues (thanks trem) +* Fixed some finished transfers frames issues (thanks trem) +* /pm and and a few other things work without user list in hub frame -- 0.686 2006-02-13 -- * Fixed active search (oops) Modified: dcplusplus/trunk/client/AdcHub.cpp =================================================================== --- dcplusplus/trunk/client/AdcHub.cpp 2006-02-25 19:14:25 UTC (rev 581) +++ dcplusplus/trunk/client/AdcHub.cpp 2006-02-26 21:19:47 UTC (rev 582) @@ -54,9 +54,13 @@ SIDIter i = users.find(aSID); if(i != users.end()) return *i->second; + } - User::Ptr p = ClientManager::getInstance()->getUser(aCID); + User::Ptr p = ClientManager::getInstance()->getUser(aCID); + + { + Lock l(cs); u = users.insert(make_pair(aSID, new OnlineUser(p, *this, aSID))).first->second; } @@ -145,7 +149,7 @@ && find(c.getParameters().begin(), c.getParameters().end(), "ADBAS0") == c.getParameters().end()) { fire(ClientListener::StatusMessage(), this, "Failed to negotiate base protocol"); // @todo internationalize - disconnect(false); + socket->disconnect(false); return; } } @@ -337,12 +341,9 @@ } void AdcHub::disconnect(bool graceless) { + Client::disconnect(graceless); state = STATE_PROTOCOL; - Client::disconnect(graceless); - { - Lock l(cs); - clearUsers(); - } + clearUsers(); } void AdcHub::hubMessage(const string& aMessage) { @@ -413,7 +414,7 @@ if(state != STATE_IDENTIFY && state != STATE_NORMAL) return; - reloadSettings(); + reloadSettings(false); AdcCommand c(AdcCommand::CMD_INF, AdcCommand::TYPE_BROADCAST); string tmp; Modified: dcplusplus/trunk/client/BufferedSocket.cpp =================================================================== --- dcplusplus/trunk/client/BufferedSocket.cpp 2006-02-25 19:14:25 UTC (rev 581) +++ dcplusplus/trunk/client/BufferedSocket.cpp 2006-02-26 21:19:47 UTC (rev 582) @@ -106,9 +106,9 @@ sock = secure ? SSLSocketFactory::getInstance()->getClientSocket() : new Socket; sock->create(); - if(SETTING(SOCKET_IN_BUFFER) > 0) + if(SETTING(SOCKET_IN_BUFFER) >= 1024) sock->setSocketOpt(SO_RCVBUF, SETTING(SOCKET_IN_BUFFER)); - if(SETTING(SOCKET_OUT_BUFFER) > 0) + if(SETTING(SOCKET_OUT_BUFFER) >= 1024) sock->setSocketOpt(SO_SNDBUF, SETTING(SOCKET_OUT_BUFFER)); sock->setBlocking(false); @@ -261,35 +261,72 @@ dcassert(file != NULL); size_t sockSize = (size_t)sock->getSocketOptInt(SO_SNDBUF); size_t bufSize = max(sockSize, (size_t)64*1024); - dcdebug("threadSendFile buffer size: %lu\n", bufSize); - AutoArray<u_int8_t> buf(bufSize); + + vector<u_int8_t> readBuf(bufSize); + vector<u_int8_t> writeBuf(bufSize); + size_t readPos = 0; + + bool readDone = false; + dcdebug("Starting threadSend"); while(true) { - size_t bytesRead = bufSize; - size_t actual = file->read(&buf[0], bytesRead); - if(actual == 0) { + if(!readDone && readBuf.size() > readPos) { + // Fill read buffer + size_t bytesRead = readBuf.size() - readPos; + size_t actual = file->read(&readBuf[readPos], bytesRead); + + if(bytesRead > 0) { + fire(BufferedSocketListener::BytesSent(), bytesRead, 0); + } + + if(actual == 0) { + readDone = true; + } else { + readPos += actual; + } + } + + if(readDone && readPos == 0) { fire(BufferedSocketListener::TransmitDone()); return; } - size_t done = 0; - size_t doneRead = 0; - while(done < actual) { + readBuf.swap(writeBuf); + readBuf.resize(bufSize); + writeBuf.resize(readPos); + readPos = 0; + + size_t writePos = 0; + + while(writePos < writeBuf.size()) { if(disconnecting) return; - - int written = sock->write(buf + done, min(sockSize, actual - done)); + size_t writeSize = min(sockSize / 2, writeBuf.size() - writePos); + int written = sock->write(&writeBuf[writePos], writeSize); if(written > 0) { - done += written; + writePos += written; - size_t doneReadNow = static_cast<size_t>((static_cast<double>(done)/actual) * bytesRead); + fire(BufferedSocketListener::BytesSent(), 0, written); + } else if(written == -1) { + if(readPos < readBuf.size()) { + // Read a little since we're blocking anyway... + size_t bytesRead = min(readBuf.size() - readPos, readBuf.size() / 2); + size_t actual = file->read(&readBuf[readPos], bytesRead); - fire(BufferedSocketListener::BytesSent(), doneReadNow - doneRead, written); - doneRead = doneReadNow; - } else if(written == -1) { - int w = sock->wait(POLL_TIMEOUT, Socket::WAIT_WRITE | Socket::WAIT_READ); - if(w & Socket::WAIT_READ) { - threadRead(); + if(bytesRead > 0) { + fire(BufferedSocketListener::BytesSent(), bytesRead, 0); + } + + if(actual == 0) { + readDone = true; + } else { + readPos += actual; + } + } else { + int w = sock->wait(POLL_TIMEOUT, Socket::WAIT_WRITE | Socket::WAIT_READ); + if(w & Socket::WAIT_READ) { + threadRead(); + } } } } Modified: dcplusplus/trunk/client/Client.cpp =================================================================== --- dcplusplus/trunk/client/Client.cpp 2006-02-25 19:14:25 UTC (rev 581) +++ dcplusplus/trunk/client/Client.cpp 2006-02-26 21:19:47 UTC (rev 582) @@ -30,7 +30,7 @@ Client::Client(const string& hubURL, char separator_, bool secure_) : reconnDelay(120), lastActivity(0), registered(false), socket(NULL), - hubUrl(hubURL), port(0), separator(separator_), + hubUrl(hubURL), port(0), separator(separator_), secure(secure_), countType(COUNT_UNCOUNTED) { string file; @@ -49,10 +49,11 @@ } } -void Client::reloadSettings() { +void Client::reloadSettings(bool updateNick) { FavoriteHubEntry* hub = FavoriteManager::getInstance()->getFavoriteHubEntry(getHubUrl()); if(hub) { - getMyIdentity().setNick(checkNick(hub->getNick(true))); + if(updateNick) + getMyIdentity().setNick(checkNick(hub->getNick(true))); if(!hub->getUserDescription().empty()) { getMyIdentity().setDescription(hub->getUserDescription()); } else { @@ -72,7 +73,7 @@ BufferedSocket::putSocket(socket); setReconnDelay(120 + Util::rand(0, 60)); - reloadSettings(); + reloadSettings(true); setRegistered(false); try { @@ -89,6 +90,13 @@ updateActivity(); } +void Client::disconnect(bool graceLess) { + if(!socket) + return; + socket->removeListener(this); + socket->disconnect(graceLess); +} + void Client::updateActivity() { lastActivity = GET_TICK(); } Modified: dcplusplus/trunk/client/Client.h =================================================================== --- dcplusplus/trunk/client/Client.h 2006-02-25 19:14:25 UTC (rev 581) +++ dcplusplus/trunk/client/Client.h 2006-02-26 21:19:47 UTC (rev 582) @@ -84,7 +84,7 @@ typedef List::iterator Iter; virtual void connect(); - virtual void disconnect(bool graceless) { if(socket) socket->disconnect(graceless); } + virtual void disconnect(bool graceless); virtual void connect(const OnlineUser& user) = 0; virtual void hubMessage(const string& aMessage) = 0; @@ -173,8 +173,8 @@ void updateCounts(bool aRemove); void updateActivity(); - // reload nick from settings, other details from favmanager - void reloadSettings(); + /** Reload details from favmanager or settings */ + void reloadSettings(bool updateNick); virtual string checkNick(const string& nick) = 0; Modified: dcplusplus/trunk/client/CriticalSection.h =================================================================== --- dcplusplus/trunk/client/CriticalSection.h 2006-02-25 19:14:25 UTC (rev 581) +++ dcplusplus/trunk/client/CriticalSection.h 2006-02-26 21:19:47 UTC (rev 582) @@ -127,21 +127,19 @@ ~RWLock() throw() { dcassert(readers==0); } void enterRead() throw() { - Lock l(cs); + cs.enter(); readers++; dcassert(readers < 100); + cs.leave(); } - void leaveRead() throw() { + dcassert(readers > 0); Thread::safeDec(readers); - dcassert(readers >= 0); } void enterWrite() throw() { cs.enter(); while(readers > 0) { - cs.leave(); Thread::yield(); - cs.enter(); } } void leaveWrite() { Modified: dcplusplus/trunk/client/NmdcHub.cpp =================================================================== --- dcplusplus/trunk/client/NmdcHub.cpp 2006-02-25 19:14:25 UTC (rev 581) +++ dcplusplus/trunk/client/NmdcHub.cpp 2006-02-26 21:19:47 UTC (rev 582) @@ -1,5 +1,5 @@ /* - * Copyright (C) 2001-2005 Jacek Sieka, arnetheduck on gmail point com + * Copyright (C) 2001-2006 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 @@ -59,7 +59,7 @@ void NmdcHub::connect(const OnlineUser& aUser) { checkstate(); - dcdebug("NmdcHub::connectToMe %s\n", aUser.getIdentity().getNick().c_str()); + dcdebug("NmdcHub::connect %s\n", aUser.getIdentity().getNick().c_str()); if(ClientManager::getInstance()->isActive()) { connectToMe(aUser); } else { @@ -84,15 +84,19 @@ NickIter i = users.find(aNick); if(i != users.end()) return *i->second; + } - User::Ptr p; - if(aNick == getMyNick()) { - p = ClientManager::getInstance()->getMe(); - getMyIdentity().setUser(p); - getMyIdentity().setHubUrl(getHubUrl()); - } else { - p = ClientManager::getInstance()->getUser(aNick, getHubUrl()); - } + User::Ptr p; + if(aNick == getMyNick()) { + p = ClientManager::getInstance()->getMe(); + getMyIdentity().setUser(p); + getMyIdentity().setHubUrl(getHubUrl()); + } else { + p = ClientManager::getInstance()->getUser(aNick, getHubUrl()); + } + + { + Lock l(cs); u = users.insert(make_pair(aNick, new OnlineUser(p, *this, 0))).first->second; u->getIdentity().setNick(aNick); } @@ -525,12 +529,12 @@ fire(ClientListener::UserUpdated(), this, u); } } else if(cmd == "$ForceMove") { - disconnect(false); + socket->disconnect(false); fire(ClientListener::Redirect(), this, param); } else if(cmd == "$HubIsFull") { fire(ClientListener::HubFull(), this); } else if(cmd == "$ValidateDenide") { // Mind the spelling... - disconnect(false); + socket->disconnect(false); fire(ClientListener::NickTaken(), this); } else if(cmd == "$UserIP") { if(!param.empty()) { @@ -684,7 +688,7 @@ void NmdcHub::myInfo(bool alwaysSend) { checkstate(); - reloadSettings(); + reloadSettings(false); dcdebug("MyInfo %s...\n", getMyNick().c_str()); lastCounts = counts; @@ -726,8 +730,8 @@ } void NmdcHub::disconnect(bool graceless) throw() { + Client::disconnect(graceless); state = STATE_CONNECT; - Client::disconnect(graceless); clearUsers(); } Modified: dcplusplus/trunk/client/QueueManager.cpp =================================================================== --- dcplusplus/trunk/client/QueueManager.cpp 2006-02-25 19:14:25 UTC (rev 581) +++ dcplusplus/trunk/client/QueueManager.cpp 2006-02-26 21:19:47 UTC (rev 582) @@ -270,6 +270,7 @@ } void QueueManager::UserQueue::setWaiting(QueueItem* qi) { + dcassert(qi->getCurrentDownload() != NULL); dcassert(qi->getCurrent() != NULL); dcassert(qi->getStatus() == QueueItem::STATUS_RUNNING); @@ -278,8 +279,9 @@ running.erase(qi->getCurrent()->getUser()); // Set flag to waiting + qi->setStatus(QueueItem::STATUS_WAITING); qi->setCurrent(NULL); - qi->setStatus(QueueItem::STATUS_WAITING); + qi->setCurrentDownload(NULL); // Add to the userQueue add(qi); @@ -559,7 +561,7 @@ /** Add a source to an existing queue item */ bool QueueManager::addSource(QueueItem* qi, const string& aFile, User::Ptr aUser, Flags::MaskType addBad, bool utf8) throw(QueueException, FileException) { QueueItem::Source* s = NULL; - bool wantConnection = (qi->getPriority() != QueueItem::PAUSED); + bool wantConnection = (qi->getPriority() != QueueItem::PAUSED) && (qi->getStatus() != QueueItem::STATUS_RUNNING); if(qi->isSource(aUser)) { throw QueueException(STRING(DUPLICATE_SOURCE)); @@ -582,9 +584,7 @@ wantConnection = false; } else if(qi->getStatus() != QueueItem::STATUS_RUNNING) { userQueue.add(qi, aUser); - } else { - wantConnection = false; - } + } aUser->setFlag(User::SAVE_NICK); @@ -768,7 +768,6 @@ } } - Download* QueueManager::getDownload(User::Ptr& aUser, bool supportsTrees) throw() { Lock l(cs); @@ -789,10 +788,10 @@ userQueue.setRunning(q, aUser); - fire(QueueManagerListener::StatusUpdated(), q); - Download* d = new Download(q); + q->setCurrentDownload(d); + if(d->getSize() != -1 && d->getTTH()) { if(HashManager::getInstance()->getTree(*d->getTTH(), d->getTigerTree())) { d->setTreeValid(true); @@ -814,8 +813,8 @@ d->setStartPos(q->getDownloadedBytes()); } - q->setCurrentDownload(d); + fire(QueueManagerListener::StatusUpdated(), q); return d; } @@ -837,7 +836,6 @@ fire(QueueManagerListener::PartialList(), aDownload->getUserConnection()->getUser(), aDownload->getPFS()); } } else { - QueueItem* q = fileQueue.find(aDownload->getTarget()); if(q != NULL) { @@ -849,7 +847,6 @@ } } - if(finished) { dcassert(q->getStatus() == QueueItem::STATUS_RUNNING); if(aDownload->isSet(Download::FLAG_TREE_DOWNLOAD)) { @@ -857,12 +854,10 @@ dcassert(aDownload->getTreeValid()); HashManager::getInstance()->addTree(aDownload->getTigerTree()); - q->setCurrentDownload(NULL); userQueue.setWaiting(q); fire(QueueManagerListener::StatusUpdated(), q); } else { - userQueue.remove(q); fire(QueueManagerListener::Finished(), q, aDownload->getAverageSpeed()); fire(QueueManagerListener::Removed(), q); // Now, let's see if this was a directory download filelist... @@ -874,6 +869,7 @@ flag = (q->isSet(QueueItem::FLAG_DIRECTORY_DOWNLOAD) ? QueueItem::FLAG_DIRECTORY_DOWNLOAD : 0) | (q->isSet(QueueItem::FLAG_MATCH_QUEUE) ? QueueItem::FLAG_MATCH_QUEUE : 0); } + userQueue.remove(q); fileQueue.remove(q); setDirty(); } @@ -893,15 +889,9 @@ } if(q->getPriority() != QueueItem::PAUSED) { - for(QueueItem::Source::Iter j = q->getSources().begin(); j != q->getSources().end(); ++j) { - if((*j)->getUser()->isOnline()) { - getConn.push_back((*j)->getUser()); - } - } + q->getOnlineUsers(getConn); } - q->setCurrentDownload(NULL); - // This might have been set to wait by removesource already... if(q->getStatus() == QueueItem::STATUS_RUNNING) { userQueue.setWaiting(q); @@ -963,49 +953,58 @@ void QueueManager::remove(const string& aTarget) throw() { string x; + { Lock l(cs); QueueItem* q = fileQueue.find(aTarget); - if(q != NULL) { - if(q->isSet(QueueItem::FLAG_DIRECTORY_DOWNLOAD)) { - dcassert(q->getSources().size() == 1); - DirectoryItem::DirectoryPair dp = directories.equal_range(q->getSources()[0]->getUser()); - for(DirectoryItem::DirectoryIter i = dp.first; i != dp.second; ++i) { - delete i->second; - } - directories.erase(q->getSources()[0]->getUser()); - } + if(q == NULL) + return; - if(q->getStatus() == QueueItem::STATUS_RUNNING) { - x = q->getTarget(); - } else if(!q->getTempTarget().empty() && q->getTempTarget() != q->getTarget()) { - File::deleteFile(q->getTempTarget() + Download::ANTI_FRAG_EXT); - File::deleteFile(q->getTempTarget()); + if(q->isSet(QueueItem::FLAG_DIRECTORY_DOWNLOAD)) { + dcassert(q->getSources().size() == 1); + DirectoryItem::DirectoryPair dp = directories.equal_range(q->getSources()[0]->getUser()); + for(DirectoryItem::DirectoryIter i = dp.first; i != dp.second; ++i) { + delete i->second; } + directories.erase(q->getSources()[0]->getUser()); + } - userQueue.remove(q); + if(q->getStatus() == QueueItem::STATUS_RUNNING) { + x = q->getTarget(); + } else if(!q->getTempTarget().empty() && q->getTempTarget() != q->getTarget()) { + File::deleteFile(q->getTempTarget() + Download::ANTI_FRAG_EXT); + File::deleteFile(q->getTempTarget()); + } - fire(QueueManagerListener::Removed(), q); - fileQueue.remove(q); + fire(QueueManagerListener::Removed(), q); - setDirty(); - } + userQueue.remove(q); + fileQueue.remove(q); + + setDirty(); } + if(!x.empty()) { DownloadManager::getInstance()->abortDownload(x); } } void QueueManager::removeSource(const string& aTarget, User::Ptr& aUser, int reason, bool removeConn /* = true */) throw() { - Lock l(cs); - QueueItem* q = fileQueue.find(aTarget); string x; - if(q != NULL) { - dcassert(q->isSource(aUser)); + bool removeCompletely = false; + { + Lock l(cs); + QueueItem* q = fileQueue.find(aTarget); + if(q == NULL) + return; + + if(!q->isSource(aUser)) + return; + if(q->isSet(QueueItem::FLAG_USER_LIST)) { - remove(q->getTarget()); - return; + removeCompletely = true; + goto endCheck; } if(reason == QueueItem::Source::FLAG_NO_TREE) { @@ -1034,23 +1033,28 @@ } q->removeSource(aUser, reason); - + fire(QueueManagerListener::SourcesUpdated(), q); setDirty(); } +endCheck: if(!x.empty()) { DownloadManager::getInstance()->abortDownload(x); } + if(removeCompletely) { + remove(aTarget); + } } void QueueManager::removeSource(User::Ptr& aUser, int reason) throw() { string x; + StringList removeList; { Lock l(cs); QueueItem* qi = NULL; while( (qi = userQueue.getNext(aUser, QueueItem::PAUSED)) != NULL) { if(qi->isSet(QueueItem::FLAG_USER_LIST)) { - remove(qi->getTarget()); + removeList.push_back(qi->getTarget()); } else { userQueue.remove(qi, aUser); qi->removeSource(aUser, reason); @@ -1062,7 +1066,7 @@ qi = userQueue.getRunning(aUser); if(qi != NULL) { if(qi->isSet(QueueItem::FLAG_USER_LIST)) { - remove(qi->getTarget()); + removeList.push_back(qi->getTarget()); } else { userQueue.setWaiting(qi); userQueue.remove(qi, aUser); @@ -1073,9 +1077,13 @@ } } } + if(!x.empty()) { DownloadManager::getInstance()->abortDownload(x); } + for(StringIter i = removeList.begin(); i != removeList.end(); ++i) { + remove(*i); + } } void QueueManager::setPriority(const string& aTarget, QueueItem::Priority p) throw() { @@ -1086,7 +1094,7 @@ QueueItem* q = fileQueue.find(aTarget); if( (q != NULL) && (q->getPriority() != p) ) { - if( q->getStatus() != QueueItem::STATUS_RUNNING ) { + if( q->getStatus() == QueueItem::STATUS_WAITING ) { if(q->getPriority() == QueueItem::PAUSED || p == QueueItem::HIGHEST) { // Problem, we have to request connections to all these users... q->getOnlineUsers(ul); Modified: dcplusplus/trunk/client/StringDefs.cpp =================================================================== --- dcplusplus/trunk/client/StringDefs.cpp 2006-02-25 19:14:25 UTC (rev 581) +++ dcplusplus/trunk/client/StringDefs.cpp 2006-02-26 21:19:47 UTC (rev 582) @@ -364,6 +364,7 @@ "Use antifragmentation method for downloads", "Appearance", "Appearance\\Colors and sounds", +"Autodrop settings", "Drop sources below", "Check every", "Min elapsed", @@ -446,6 +447,7 @@ "Open new window when using /join", "Always open help file with this dialog", "Options", +"Other queue options", "Outgoing connection settings", "Don't allow hub/UPnP to override", "Personal Information", @@ -473,7 +475,7 @@ "Total size:", "Shared directories", "Show joins / parts in chat by default", -"Show progress bars for transfers (uses some CPU)", +"Show progress bars for transfers", "Skip zero-byte files", "Use small send buffer (enable if uploads slow downloads a lot)", "SOCKS5", @@ -486,6 +488,7 @@ "View status messages in main chat", "TCP Port", "Mini slot size", +"Autoprio settings", "Highest prio max size", "High prio max size", "Normal prio max size", @@ -961,6 +964,7 @@ "SettingsAntiFrag", "SettingsAppearance", "SettingsAppearance2", +"SettingsAutodropAutodropsettings", "SettingsAutodropSpeed", "SettingsAutodropInterval", "SettingsAutodropElapsed", @@ -1043,6 +1047,7 @@ "SettingsOpenNewWindow", "SettingsOpenUserCmdHelp", "SettingsOptions", +"SettingsOtherQueueOptions", "SettingsOutgoing", "SettingsOverride", "SettingsPersonalInformation", @@ -1083,6 +1088,7 @@ "SettingsStatusInChat", "SettingsTcpPort", "SettingsTextMinislot", +"SettingsPrioAutoprio", "SettingsPrioHighest", "SettingsPrioHigh", "SettingsPrioNormal", Modified: dcplusplus/trunk/client/Thread.h =================================================================== --- dcplusplus/trunk/client/Thread.h 2006-02-25 19:14:25 UTC (rev 581) +++ dcplusplus/trunk/client/Thread.h 2006-02-26 21:19:47 UTC (rev 582) @@ -67,7 +67,7 @@ void setThreadPriority(Priority p) throw() { ::SetThreadPriority(threadHandle, p); } static void sleep(u_int32_t millis) { ::Sleep(millis); } - static void yield() { ::Sleep(0); } + static void yield() { ::Sleep(1); } static long safeInc(volatile long& v) { return InterlockedIncrement(&v); } static long safeDec(volatile long& v) { return InterlockedDecrement(&v); } static long safeExchange(volatile long& target, long value) { return InterlockedExchange(&target, value); } Modified: dcplusplus/trunk/client/version.h =================================================================== --- dcplusplus/trunk/client/version.h 2006-02-25 19:14:25 UTC (rev 581) +++ dcplusplus/trunk/client/version.h 2006-02-26 21:19:47 UTC (rev 582) @@ -17,8 +17,8 @@ */ #define APPNAME "DC++" -#define VERSIONSTRING "0.686" -#define VERSIONFLOAT 0.686 +#define VERSIONSTRING "0.687" +#define VERSIONFLOAT 0.687 /* Update the .rc file as well... */ Modified: dcplusplus/trunk/help/changelog.html =================================================================== --- dcplusplus/trunk/help/changelog.html 2006-02-25 19:14:25 UTC (rev 581) +++ dcplusplus/trunk/help/changelog.html 2006-02-26 21:19:47 UTC (rev 582) @@ -12,6 +12,7 @@ <body> <h1>DC++ Changelog</h1> See the version history of DC++ below. + <h2>0.686 <span style="color: gray;">(2006-02-13)</span></h2> <ul> <li>Fixed active search (oops)</li> Property changes on: dcplusplus/trunk/stlport ___________________________________________________________________ Name: svn:ignore + * Modified: dcplusplus/trunk/windows/HubFrame.cpp =================================================================== --- dcplusplus/trunk/windows/HubFrame.cpp 2006-02-25 19:14:25 UTC (rev 581) +++ dcplusplus/trunk/windows/HubFrame.cpp 2006-02-26 21:19:47 UTC (rev 582) @@ -221,9 +221,9 @@ removeFavoriteHub(); } else if(Util::stricmp(cmd.c_str(), _T("getlist")) == 0){ if( !param.empty() ){ - int k = ctrlUsers.findItem(param); - if(k != -1) { - ctrlUsers.getItemData(k)->getList(); + UserInfo* ui = findUser(param); + if(ui) { + ui->getList(); } } } else if(Util::stricmp(cmd.c_str(), _T("log")) == 0) { @@ -242,18 +242,17 @@ string::size_type j = param.find(_T(' ')); if(j != string::npos) { tstring nick = param.substr(0, j); - int k = ctrlUsers.findItem(nick); - if(k != -1) { - UserInfo* ui = ctrlUsers.getItemData(k); - if(param.size() > j + 1) + UserInfo* ui = findUser(nick); + + if(ui) { + if(param.size() > j + 1) PrivateFrame::openWindow(ui->user, param.substr(j+1)); - else + else PrivateFrame::openWindow(ui->user); } } else if(!param.empty()) { - int k = ctrlUsers.findItem(param); - if(k != -1) { - UserInfo* ui = ctrlUsers.getItemData(k); + UserInfo* ui = findUser(param); + if(ui) { PrivateFrame::openWindow(ui->user); } } @@ -287,21 +286,6 @@ const int col; }; -int HubFrame::findUser(const User::Ptr& aUser) { - UserMapIter i = userMap.find(aUser); - if(i == userMap.end()) - return -1; - - UserInfo* ui = i->second; - - if(ctrlUsers.getSortColumn() == COLUMN_NICK) { - // Sort order of the other columns changes too late when the user's updated - dcassert(ctrlUsers.getItemData(ctrlUsers.getSortPos(ui)) == ui); - return ctrlUsers.getSortPos(ui); - } - return ctrlUsers.findItem(ui); -} - const tstring& HubFrame::getNick(const User::Ptr& aUser) { UserMapIter i = userMap.find(aUser); if(i == userMap.end()) @@ -420,6 +404,14 @@ delete ui; } +HubFrame::UserInfo* HubFrame::findUser(const tstring& nick) { + for(UserMapIter i = userMap.begin(); i != userMap.end(); ++i) { + if(i->second->columns[COLUMN_NICK] == nick) + return i->second; + } + return 0; +} + bool HubFrame::UserInfo::update(const Identity& identity, int sortCol) { bool needsSort = (getIdentity().isOp() != identity.isOp()); tstring old; @@ -661,21 +653,25 @@ return 0; // Nickname click, let's see if we can find one like it in the name list... - int pos = ctrlUsers.findItem(x.substr(start, end - start)); - if(pos != -1) { + tstring nick = x.substr(start, end - start); + UserInfo* ui = findUser(nick); + if(ui) { bHandled = true; if (wParam & MK_CONTROL) { // MK_CONTROL = 0x0008 - PrivateFrame::openWindow(ctrlUsers.getItemData(pos)->user); + PrivateFrame::openWindow(ui->user); } else if (wParam & MK_SHIFT) { try { - QueueManager::getInstance()->addList(ctrlUsers.getItemData(pos)->user, QueueItem::FLAG_CLIENT_VIEW); + QueueManager::getInstance()->addList(ui->user, QueueItem::FLAG_CLIENT_VIEW); } catch(const Exception& e) { addClientLine(Text::toT(e.getError())); } - } else { + } else if(showUsers) { int items = ctrlUsers.GetItemCount(); + int pos = -1; ctrlUsers.SetRedraw(FALSE); for(int i = 0; i < items; ++i) { + if(ctrlUsers.getItemData(i) == ui) + pos = i; ctrlUsers.SetItemState(i, (i == pos) ? LVIS_SELECTED | LVIS_FOCUSED : 0, LVIS_SELECTED | LVIS_FOCUSED); } ctrlUsers.SetRedraw(TRUE); @@ -739,6 +735,18 @@ return TRUE; } +LRESULT HubFrame::onCtlColor(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) { + HWND hWnd = (HWND)lParam; + HDC hDC = (HDC)wParam; + if(hWnd == ctrlClient.m_hWnd || hWnd == ctrlMessage.m_hWnd) { + ::SetBkColor(hDC, WinUtil::bgColor); + ::SetTextColor(hDC, WinUtil::textColor); + return (LRESULT)WinUtil::bgBrush; + } else { + return 0; + } +} + LRESULT HubFrame::onContextMenu(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; @@ -763,6 +771,7 @@ } // Nickname click, let's see if we can find one like it in the name list... + int pos = ctrlUsers.findItem(x.substr(start, end - start)); if(pos != -1) { int items = ctrlUsers.GetItemCount(); Modified: dcplusplus/trunk/windows/HubFrame.h =================================================================== --- dcplusplus/trunk/windows/HubFrame.h 2006-02-25 19:14:25 UTC (rev 581) +++ dcplusplus/trunk/windows/HubFrame.h 2006-02-26 21:19:47 UTC (rev 582) @@ -97,6 +97,7 @@ LRESULT onLButton(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled); LRESULT onEnterUsers(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/); LRESULT onGetToolTip(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/); + LRESULT onCtlColor(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/); void UpdateLayout(BOOL bResizeBars = TRUE); void addLine(const tstring& aLine); @@ -128,18 +129,6 @@ return 0; } - LRESULT onCtlColor(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) { - HWND hWnd = (HWND)lParam; - HDC hDC = (HDC)wParam; - if(hWnd == ctrlClient.m_hWnd || hWnd == ctrlMessage.m_hWnd) { - ::SetBkColor(hDC, WinUtil::bgColor); - ::SetTextColor(hDC, WinUtil::textColor); - return (LRESULT)WinUtil::bgBrush; - } else { - return 0; - } - } - LRESULT OnFileReconnect(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { client->disconnect(false); clearUserList(); @@ -259,10 +248,6 @@ bool favShowJoins; tstring complete; - tstring lastKick; - tstring lastRedir; - tstring lastServer; - bool waitingForPW; bool extraSort; @@ -280,7 +265,7 @@ size_t getUserCount() const { size_t sel = ctrlUsers.GetSelectedCount(); - return sel>1?sel:client->getUserCount(); + return sel > 1 ? sel : client->getUserCount(); } int64_t getAvailable() { @@ -333,11 +318,11 @@ static int columnIndexes[COLUMN_LAST]; static int columnSizes[COLUMN_LAST]; - int findUser(const User::Ptr& aUser); - bool updateUser(const UpdateInfo& u); void removeUser(const User::Ptr& aUser); + UserInfo* findUser(const tstring& nick); + void addAsFavorite(); void removeFavoriteHub(); Property changes on: dcplusplus/trunk/wtl ___________________________________________________________________ Name: svn:ignore + *.h This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |