linuxdcpp-team team mailing list archive
-
linuxdcpp-team team
-
Mailing list archive
-
Message #04103
[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2527: Show bundles in queue frame, make bundles when adding dirs
------------------------------------------------------------
revno: 2527
committer: Jacek Sieka <arnetheduck@xxxxxxxxx>
branch nick: dcplusplus
timestamp: Sat 2011-05-07 23:20:08 +0200
message:
Show bundles in queue frame, make bundles when adding dirs
modified:
dcpp/Bundle.h
dcpp/BundleItem.h
dcpp/DirectoryListing.cpp
dcpp/DirectoryListing.h
dcpp/QueueItem.cpp
dcpp/QueueManager.cpp
dcpp/QueueManager.h
dcpp/QueueManagerListener.h
dcpp/forward.h
win32/QueueFrame.cpp
win32/QueueFrame.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
=== modified file 'dcpp/Bundle.h'
--- dcpp/Bundle.h 2011-04-24 11:27:49 +0000
+++ dcpp/Bundle.h 2011-05-07 21:20:08 +0000
@@ -41,6 +41,8 @@
class Bundle : public intrusive_ptr_base<Bundle> {
public:
struct Entry {
+ Entry() { }
+ Entry(const string& name, int64_t size, TTHValue tth, bool include) : name(name), size(size), tth(tth), include(include) { }
string name;
int64_t size;
TTHValue tth;
=== modified file 'dcpp/BundleItem.h'
--- dcpp/BundleItem.h 2011-04-24 11:27:49 +0000
+++ dcpp/BundleItem.h 2011-05-07 21:20:08 +0000
@@ -8,14 +8,20 @@
#ifndef BUNDLEITEM_H_
#define BUNDLEITEM_H_
+#include <map>
+
#include "Bundle.h"
#include "Util.h"
namespace dcpp {
+using std::map;
+
class BundleItem {
public:
- BundleItem();
+ typedef map<TTHValue, BundleItem> Map;
+
+ BundleItem() { }
BundleItem(const string& root, const BundlePtr &bundle) : root(root), bundle(bundle) { }
GETSET(string, root, Root);
=== modified file 'dcpp/DirectoryListing.cpp'
--- dcpp/DirectoryListing.cpp 2011-04-24 11:27:49 +0000
+++ dcpp/DirectoryListing.cpp 2011-05-07 21:20:08 +0000
@@ -274,13 +274,20 @@
}
void DirectoryListing::download(Directory* aDir, const string& aTarget, bool highPrio) {
+ auto bundle = BundlePtr(new Bundle);
+ bundle->name = aDir->getName();
+ download(aDir, aTarget, highPrio, "", *bundle);
+ QueueManager::getInstance()->add(aTarget, bundle, getUser(), 0);
+}
+
+void DirectoryListing::download(Directory* aDir, const string& aTarget, bool highPrio, const string& path, Bundle &bundle) {
string tmp;
string target = (aDir == getRoot()) ? aTarget : aTarget + aDir->getName() + PATH_SEPARATOR;
// First, recurse over the directories
Directory::List& lst = aDir->directories;
sort(lst.begin(), lst.end(), Directory::DirSort());
for(Directory::Iter j = lst.begin(); j != lst.end(); ++j) {
- download(*j, target, highPrio);
+ download(*j, target, highPrio, path + (*j)->getName() + PATH_SEPARATOR, bundle);
}
// Then add the files
File::List& l = aDir->files;
@@ -289,6 +296,7 @@
File* file = *i;
try {
download(file, target + file->getName(), false, highPrio);
+ bundle.entries.insert(Bundle::Entry(path + file->getName(), file->getSize(), file->getTTH(), true));
} catch(const QueueException&) {
// Catch it here to allow parts of directories to be added...
} catch(const FileException&) {
=== modified file 'dcpp/DirectoryListing.h'
--- dcpp/DirectoryListing.h 2011-04-13 19:16:51 +0000
+++ dcpp/DirectoryListing.h 2011-05-07 21:20:08 +0000
@@ -156,6 +156,8 @@
Directory* root;
Directory* find(const string& aName, Directory* current);
+
+ void download(Directory* aDir, const string& aTarget, bool highPrio, const string& path, Bundle& bundle);
};
inline bool operator==(DirectoryListing::Directory::Ptr a, const string& b) { return Util::stricmp(a->getName(), b) == 0; }
=== modified file 'dcpp/QueueItem.cpp'
--- dcpp/QueueItem.cpp 2011-04-13 19:16:51 +0000
+++ dcpp/QueueItem.cpp 2011-05-07 21:20:08 +0000
@@ -19,7 +19,6 @@
#include "stdinc.h"
#include "QueueItem.h"
-#include "HashManager.h"
#include "Download.h"
#include "File.h"
#include "Util.h"
@@ -152,7 +151,7 @@
}
}
- for(DownloadList::const_iterator i = downloads.begin(); !overlaps && i !=downloads.end(); ++i) {
+ for(auto i = downloads.begin(); !overlaps && i !=downloads.end(); ++i) {
overlaps = block.overlaps((*i)->getSegment());
}
@@ -173,7 +172,7 @@
int64_t QueueItem::getDownloadedBytes() const {
int64_t total = 0;
- for(SegmentSet::const_iterator i = done.begin(); i != done.end(); ++i) {
+ for(auto i = done.begin(); i != done.end(); ++i) {
total += i->getSize();
}
return total;
=== modified file 'dcpp/QueueManager.cpp'
--- dcpp/QueueManager.cpp 2011-04-24 11:27:49 +0000
+++ dcpp/QueueManager.cpp 2011-05-07 21:20:08 +0000
@@ -53,6 +53,23 @@
using boost::adaptors::map_values;
using boost::range::for_each;
+class DirectoryItem {
+public:
+ DirectoryItem() : priority(QueueItem::DEFAULT) { }
+ DirectoryItem(const UserPtr& aUser, const string& aName, const string& aTarget,
+ QueueItem::Priority p) : name(aName), target(aTarget), priority(p), user(aUser) { }
+ ~DirectoryItem() { }
+
+ UserPtr& getUser() { return user; }
+ void setUser(const UserPtr& aUser) { user = aUser; }
+
+ GETSET(string, name, Name);
+ GETSET(string, target, Target);
+ GETSET(QueueItem::Priority, priority, Priority);
+private:
+ UserPtr user;
+};
+
QueueManager::FileQueue::~FileQueue() {
for_each(queue | map_values, DeleteFunction());
}
@@ -152,7 +169,7 @@
QueueItem* QueueManager::FileQueue::findAutoSearch(StringList& recent) {
// We pick a start position at random, hoping that we will find something to search for...
- QueueItem::StringMap::size_type start = (QueueItem::StringMap::size_type)Util::rand((uint32_t)queue.size());
+ auto start = (QueueItem::StringMap::difference_type)Util::rand((uint32_t)queue.size());
auto i = queue.begin();
advance(i, start);
@@ -321,6 +338,7 @@
}
moveFile_(next.first, next.second);
}
+ return 0;
}
void QueueManager::Rechecker::add(const string& file) {
@@ -642,7 +660,11 @@
void QueueManager::add(const string& aRoot, const BundlePtr& bundle, const HintedUser& aUser, int aFlags) {
for_each(bundle->entries, [&](const Bundle::Entry& e) { add(aRoot + e.name, e.size, e.tth, aUser, aFlags, true, bundle); });
Lock l(cs);
- bundles.insert(make_pair(bundle->getHash(), BundleItem(aRoot, bundle)));
+
+ auto i = bundles.insert(make_pair(bundle->getHash(), BundleItem(aRoot, bundle)));
+ if(i.second) {
+ fire(QueueManagerListener::Added(), i.first->second);
+ }
}
void QueueManager::readd(const string& target, const HintedUser& aUser) {
@@ -731,9 +753,9 @@
{
Lock l(cs);
- DirectoryItem::DirectoryPair dp = directories.equal_range(aUser);
+ auto dp = directories.equal_range(aUser);
- for(DirectoryItem::DirectoryIter i = dp.first; i != dp.second; ++i) {
+ for(auto i = dp.first; i != dp.second; ++i) {
if(Util::stricmp(aTarget.c_str(), i->second->getName().c_str()) == 0)
return;
}
@@ -788,7 +810,7 @@
tthMap.clear();
buildMap(dl.getRoot());
- for(QueueItem::StringMap::const_iterator i = fileQueue.getQueue().begin(); i != fileQueue.getQueue().end(); ++i) {
+ for(auto i = fileQueue.getQueue().begin(); i != fileQueue.getQueue().end(); ++i) {
QueueItem* qi = i->second;
if(qi->isFinished())
continue;
@@ -884,11 +906,11 @@
return sl;
}
-void QueueManager::addListener(QueueManagerListener* ql, const function<void (const QueueItem::StringMap&)>& currentQueue) {
+void QueueManager::addListener(QueueManagerListener* ql, const function<void (const QueueItem::StringMap&, const BundleItem::Map&)>& currentQueue) {
Lock l(cs);
Speaker<QueueManagerListener>::addListener(ql);
if(currentQueue) {
- currentQueue(fileQueue.getQueue());
+ currentQueue(fileQueue.getQueue(), bundles);
}
}
@@ -1159,6 +1181,11 @@
fire(QueueManagerListener::Finished(), q, dir, aDownload->getAverageSpeed());
+ auto bi = getBundle(q);
+ if(bi && isFinished(*bi)) {
+ fire(QueueManagerListener::Finished(), *bi);
+ }
+
userQueue.remove(q);
if(!BOOLSETTING(KEEP_FINISHED_FILES) || aDownload->getType() == Transfer::TYPE_FULL_LIST) {
@@ -1229,17 +1256,15 @@
}
if(flags & QueueItem::FLAG_DIRECTORY_DOWNLOAD) {
- DirectoryItem::List dl;
+ vector<DirectoryItemPtr> dl;
{
Lock l(cs);
- DirectoryItem::DirectoryPair dp = directories.equal_range(user);
- for(DirectoryItem::DirectoryIter i = dp.first; i != dp.second; ++i) {
- dl.push_back(i->second);
- }
+ auto dp = directories.equal_range(user) | map_values;
+ dl.assign(begin(dp), end(dp));
directories.erase(user);
}
- for(DirectoryItem::Iter i = dl.begin(); i != dl.end(); ++i) {
+ for(auto i = dl.begin(); i != dl.end(); ++i) {
DirectoryItem* di = *i;
dirList.download(di->getName(), di->getTarget(), false);
delete di;
@@ -1267,10 +1292,7 @@
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;
- }
+ for_each(directories.equal_range(q->getSources()[0].getUser()) | map_values, DeleteFunction());
directories.erase(q->getSources()[0].getUser());
}
@@ -1292,11 +1314,21 @@
setDirty();
}
- for(UserList::iterator i = x.begin(); i != x.end(); ++i) {
+ for(auto i = x.begin(); i != x.end(); ++i) {
ConnectionManager::getInstance()->disconnect(*i, true);
}
}
+void QueueManager::removeBundle(const TTHValue& tth) noexcept {
+ Lock l(cs);
+ // TODO remove queueitems (probably...)
+ auto i = bundles.find(tth);
+ if(i != bundles.end()) {
+ fire(QueueManagerListener::Removed(), i->second);
+ bundles.erase(i);
+ }
+}
+
void QueueManager::removeSource(const string& aTarget, const UserPtr& aUser, int reason, bool removeConn /* = true */) noexcept {
bool isRunning = false;
bool removeCompletely = false;
@@ -1475,6 +1507,34 @@
}
}
+ for(auto i = bundles.begin(); i != bundles.end(); ++i) {
+ auto& bi = i->second;
+
+ f.write(LIT("\t<BundleItem Root=\""));
+ f.write(SimpleXML::escape(bi.getRoot(), tmp, true));
+ f.write(LIT("\">\r\n"));
+
+ auto& b = *bi.getBundle();
+
+ f.write(LIT("\t\t<Bundle Name=\""));
+ f.write(SimpleXML::escape(b.name, tmp, true));
+ f.write(LIT("\">\r\n"));
+ for(auto j = b.entries.begin(); j != b.entries.end(); ++j) {
+ f.write(LIT("\t\t\t<Entry Name=\""));
+ f.write(SimpleXML::escape(j->name, tmp, true));
+ f.write(LIT("\" Size=\""));
+ f.write(Util::toString(j->size));
+ f.write(LIT("\" Include=\""));
+ f.write(Util::toString((int)j->include));
+ b32tmp.clear();
+ f.write(LIT("\" TTH=\""));
+ f.write(j->tth.toBase32(b32tmp));
+ f.write(LIT("\"/>\r\n"));
+ }
+ f.write(LIT("\t\t</Bundle>\r\n"));
+ f.write(LIT("\t</BundleItem>\r\n"));
+ }
+
f.write("</Downloads>\r\n");
f.flush();
ff.close();
@@ -1493,7 +1553,7 @@
class QueueLoader : public SimpleXMLReader::CallBack {
public:
- QueueLoader() : cur(NULL), inDownloads(false) { }
+ QueueLoader() : cur(NULL), inDownloads(false), bundle(0) { }
virtual ~QueueLoader() { }
virtual void startTag(const string& name, StringPairList& attribs, bool simple);
virtual void endTag(const string& name, const string& data);
@@ -1502,6 +1562,8 @@
QueueItem* cur;
bool inDownloads;
+
+ BundleItem* bundle;
};
void QueueManager::loadQueue() noexcept {
@@ -1538,14 +1600,18 @@
static const string sDownloaded = "Downloaded";
static const string sPriority = "Priority";
static const string sSource = "Source";
-static const string sNick = "Nick";
-static const string sDirectory = "Directory";
static const string sAdded = "Added";
static const string sTTH = "TTH";
static const string sCID = "CID";
static const string sHubHint = "Hub";
static const string sSegment = "Segment";
static const string sStart = "Start";
+static const string sBundleItem = "BundleItem";
+static const string sRoot = "Root";
+static const string sBundle = "Bundle";
+static const string sInclude = "Include";
+static const string sEntry = "Entry";
+static const string sName = "Name";
void QueueLoader::startTag(const string& name, StringPairList& attribs, bool simple) {
QueueManager* qm = QueueManager::getInstance();
@@ -1613,16 +1679,32 @@
} catch(const Exception&) {
return;
}
+ } else if(!bundle && name == sBundleItem) {
+ const string& root = getAttrib(attribs, sRoot, 0);
+ bundle = new BundleItem(root, BundlePtr(new Bundle));
+ } else if(bundle && name == sBundle) {
+ bundle->getBundle()->name = getAttrib(attribs, sName, 0);
+ } else if(bundle && name == sEntry) {
+ auto &n = getAttrib(attribs, sName, 0);
+ auto s = Util::toInt64(getAttrib(attribs, sSize, 1));
+ auto i = getAttrib(attribs, sInclude, 2) == "1";
+ auto t = TTHValue(getAttrib(attribs, sTTH, 3));
+ bundle->getBundle()->entries.insert(Bundle::Entry(n, s, t, i));
}
}
}
void QueueLoader::endTag(const string& name, const string&) {
+ QueueManager* qm = QueueManager::getInstance();
if(inDownloads) {
if(name == sDownload) {
cur = NULL;
} else if(name == "Downloads") {
inDownloads = false;
+ } else if(name == sBundleItem) {
+ qm->bundles[bundle->getBundle()->getHash()] = *bundle;
+ delete bundle;
+ bundle = 0;
}
}
}
@@ -1830,4 +1912,23 @@
LOG(LogManager::FINISHED_DOWNLOAD, params);
}
+
+BundleItem* QueueManager::getBundle(QueueItem *qi) noexcept {
+ for(auto i = bundles.begin(); i != bundles.end(); ++i) {
+ if(find_if(i->second.getBundle()->entries, [&](const Bundle::Entry& e) {
+ return Util::stricmp(i->second.getRoot() + e.name, qi->getTarget()) == 0;
+ }) != i->second.getBundle()->entries.end()) {
+ return &i->second;
+ }
+ }
+ return 0;
+}
+
+bool QueueManager::isFinished(const BundleItem &bi) noexcept {
+ return find_if(bi.getBundle()->entries, [&](const Bundle::Entry &e) {
+ auto qi = fileQueue.find(bi.getRoot() + e.name);
+ return qi && !qi->isFinished();
+ }) != bi.getBundle()->entries.end();
+}
+
} // namespace dcpp
=== modified file 'dcpp/QueueManager.h'
--- dcpp/QueueManager.h 2011-05-04 20:04:45 +0000
+++ dcpp/QueueManager.h 2011-05-07 21:20:08 +0000
@@ -50,31 +50,6 @@
class UserConnection;
-class DirectoryItem {
-public:
- typedef DirectoryItem* Ptr;
- typedef unordered_multimap<UserPtr, Ptr, User::Hash> DirectoryMap;
- typedef DirectoryMap::iterator DirectoryIter;
- typedef pair<DirectoryIter, DirectoryIter> DirectoryPair;
-
- typedef vector<Ptr> List;
- typedef List::iterator Iter;
-
- DirectoryItem() : priority(QueueItem::DEFAULT) { }
- DirectoryItem(const UserPtr& aUser, const string& aName, const string& aTarget,
- QueueItem::Priority p) : name(aName), target(aTarget), priority(p), user(aUser) { }
- ~DirectoryItem() { }
-
- UserPtr& getUser() { return user; }
- void setUser(const UserPtr& aUser) { user = aUser; }
-
- GETSET(string, name, Name);
- GETSET(string, target, Target);
- GETSET(QueueItem::Priority, priority, Priority);
-private:
- UserPtr user;
-};
-
class ConnectionQueueItem;
class QueueLoader;
@@ -108,6 +83,7 @@
void move(const string& aSource, const string& aTarget) noexcept;
void remove(const string& aTarget) noexcept;
+ void removeBundle(const TTHValue &tth) noexcept;
void removeSource(const string& aTarget, const UserPtr& aUser, int reason, bool removeConn = true) noexcept;
void removeSource(const UserPtr& aUser, int reason) noexcept;
@@ -118,7 +94,7 @@
StringList getTargets(const TTHValue& tth);
using Speaker<QueueManagerListener>::addListener;
- void addListener(QueueManagerListener* l, const function<void(const QueueItem::StringMap&)>& currentQueue);
+ void addListener(QueueManagerListener* l, const function<void(const QueueItem::StringMap&, const BundleItem::Map&)>& currentQueue);
Download* getDownload(UserConnection& aSource, bool supportsTrees) noexcept;
void putDownload(Download* aDownload, bool finished) noexcept;
@@ -237,13 +213,13 @@
mutable CriticalSection cs;
/** Bundles queued for download */
- map<TTHValue, BundleItem> bundles;
+ BundleItem::Map bundles;
/** QueueItems by target */
FileQueue fileQueue;
/** QueueItems by user */
UserQueue userQueue;
/** Directories queued for downloading */
- DirectoryItem::DirectoryMap directories;
+ unordered_multimap<UserPtr, DirectoryItemPtr, User::Hash> directories;
/** Recent searches list, to avoid searching for the same thing too often */
StringList recent;
/** The queue needs to be saved */
@@ -265,6 +241,9 @@
void moveStuckFile(QueueItem* qi);
void rechecked(QueueItem* qi);
+ BundleItem* getBundle(QueueItem* qi) noexcept;
+ bool isFinished(const BundleItem &bi) noexcept;
+
void setDirty();
string getListPath(const HintedUser& user);
=== modified file 'dcpp/QueueManagerListener.h'
--- dcpp/QueueManagerListener.h 2011-03-29 20:40:28 +0000
+++ dcpp/QueueManagerListener.h 2011-05-07 21:20:08 +0000
@@ -71,7 +71,11 @@
virtual void on(FileMoved, const string&) noexcept { }
virtual void on(CRCFailed, Download*, const string&) noexcept { }
- virtual void on(CRCChecked, Download*) noexcept { }
+ virtual void on(CRCChecked, Download*) noexcept { }
+
+ virtual void on(Added, const BundleItem&) noexcept { }
+ virtual void on(Finished, const BundleItem&) noexcept { }
+ virtual void on(Removed, const BundleItem&) noexcept { }
};
} // namespace dcpp
=== modified file 'dcpp/forward.h'
--- dcpp/forward.h 2011-05-04 19:32:00 +0000
+++ dcpp/forward.h 2011-05-07 21:20:08 +0000
@@ -36,6 +36,8 @@
class Bundle;
typedef boost::intrusive_ptr<Bundle> BundlePtr;
+class BundleItem;
+
struct ChatMessage;
class CID;
@@ -48,6 +50,9 @@
class CRC32Filter;
+class DirectoryItem;
+typedef DirectoryItem* DirectoryItemPtr;
+
class Download;
typedef Download* DownloadPtr;
=== modified file 'win32/QueueFrame.cpp'
--- win32/QueueFrame.cpp 2011-05-04 19:32:00 +0000
+++ win32/QueueFrame.cpp 2011-05-07 21:20:08 +0000
@@ -59,6 +59,7 @@
};
#define FILE_LIST_NAME _T("File Lists")
+#define BUNDLE_INFO_NAME _T("Bundles")
QueueFrame::QueueFrame(TabViewPtr parent) :
BaseType(parent, T_("Download Queue"), IDH_QUEUE, IDI_QUEUE),
@@ -70,7 +71,8 @@
usingDirMenu(false),
queueSize(0),
queueItems(0),
-fileLists(0)
+fileLists(0),
+bundles(0)
{
paned = addChild(SplitterContainer::Seed(SETTING(QUEUE_PANED_POS)));
@@ -111,7 +113,7 @@
status->setHelpId(STATUS_TOTAL_COUNT, IDH_QUEUE_TOTAL_COUNT);
status->setHelpId(STATUS_TOTAL_BYTES, IDH_QUEUE_TOTAL_BYTES);
- QueueManager::getInstance()->addListener(this, [this](const QueueItem::StringMap& qsm) { addQueueList(qsm); });
+ QueueManager::getInstance()->addListener(this, [this](const QueueItem::StringMap& qsm, const BundleItem::Map &bim) { addQueueList(qsm, bim); });
updateStatus();
@@ -150,23 +152,27 @@
return false;
}
-void QueueFrame::addQueueList(const QueueItem::StringMap& li) {
+void QueueFrame::addQueueList(const QueueItem::StringMap& li, const BundleItem::Map& bim) {
HoldRedraw hold(files);
HoldRedraw hold2(dirs);
- for(QueueItem::StringMap::const_iterator j = li.begin(); j != li.end(); ++j) {
+ for(auto j = li.begin(); j != li.end(); ++j) {
QueueItem* aQI = j->second;
QueueItemInfo* ii = new QueueItemInfo(*aQI);
addQueueItem(ii, true);
}
+ for(auto i = bim.begin(); i != bim.end(); ++i) {
+ addBundle(i->second);
+ }
+
files->resort();
}
QueueFrame::QueueItemInfo* QueueFrame::getItemInfo(const string& target) {
string path = Util::getFilePath(target);
- DirectoryPair items = directories.equal_range(path);
- for(DirectoryIter i = items.first; i != items.second; ++i) {
+ auto items = directories.equal_range(path);
+ for(auto i = items.first; i != items.second; ++i) {
if(i->second->getTarget() == target) {
return i->second;
}
@@ -224,7 +230,7 @@
SettingsManager::getInstance()->set(SettingsManager::QUEUEFRAME_SHOW_TREE, showTree->getChecked());
SettingsManager::getInstance()->set(SettingsManager::QUEUE_PANED_POS, paned->getSplitterPos(0));
- for(DirectoryIter i = directories.begin(); i != directories.end(); ++i) {
+ for(auto i = directories.begin(); i != directories.end(); ++i) {
delete i->second;
}
directories.clear();
@@ -279,15 +285,11 @@
HoldRedraw hold(files);
files->clear();
- pair<DirectoryIter, DirectoryIter> i;
- if(showTree->getChecked()) {
- i = directories.equal_range(getSelectedDir());
- } else {
- i.first = directories.begin();
- i.second = directories.end();
- }
+ auto i = showTree->getChecked()
+ ? directories.equal_range(getSelectedDir())
+ : make_pair(directories.begin(), directories.end());
- for(DirectoryIter j = i.first; j != i.second; ++j) {
+ for(auto j = i.first; j != i.second; ++j) {
QueueItemInfo* ii = j->second;
ii->update();
files->insert(files->size(), ii);
@@ -670,9 +672,9 @@
}
const string& dir = getDir(ht);
- DirectoryPair p = directories.equal_range(dir);
+ auto p = directories.equal_range(dir);
- for(DirectoryIter i = p.first; i != p.second; ++i) {
+ for(auto i = p.first; i != p.second; ++i) {
QueueItemInfo* ii = i->second;
QueueManager::getInstance()->move(ii->getTarget(), target + Util::getFileName(ii->getTarget()));
}
@@ -765,8 +767,8 @@
child = dirs->getNextSibling(child);
}
const string& name = getDir(ht);
- DirectoryPair dp = directories.equal_range(name);
- for(DirectoryIter i = dp.first; i != dp.second; ++i) {
+ auto dp = directories.equal_range(name);
+ for(auto i = dp.first; i != dp.second; ++i) {
QueueManager::getInstance()->remove(i->second->getTarget());
}
}
@@ -808,8 +810,8 @@
child = dirs->getNextSibling(child);
}
const string& name = getDir(ht);
- DirectoryPair dp = directories.equal_range(name);
- for(DirectoryIter i = dp.first; i != dp.second; ++i) {
+ auto dp = directories.equal_range(name);
+ for(auto i = dp.first; i != dp.second; ++i) {
QueueManager::getInstance()->setPriority(i->second->getTarget(), p);
}
}
@@ -1005,6 +1007,35 @@
return false;
}
+
+void QueueFrame::addBundle(const BundleItem& bi) {
+ bundleInfos[bi.getBundle()->getHash()] = new BundleItemInfo(bi);
+ if(!bundles) {
+ bundles = dirs->insert(NULL, new DirItemInfo("", BUNDLE_INFO_NAME), true);
+ }
+ dirs->insert(bundles, new DirItemInfo(bi.getBundle()->getHash().toBase32(), Text::toT(bi.getBundle()->name)));
+}
+
+void QueueFrame::removeBundle(const TTHValue& tth) {
+ auto b = bundleInfos.find(tth);
+ if(b == bundleInfos.end()) {
+ return;
+ }
+
+ auto hash = tth.toBase32();
+ if(bundles != NULL) {
+ for(auto h = dirs->getChild(bundles); h; h = dirs->getNextSibling(h)) {
+ auto di = dirs->getData(h);
+ if(di->getDir() == hash) {
+ dirs->erase(h);
+ break;
+ }
+ }
+ }
+
+ bundleInfos.erase(tth);
+}
+
void QueueFrame::onAdded(QueueItemInfo* ii) {
dcassert(files->find(ii) == -1);
addQueueItem(ii, false);
@@ -1032,9 +1063,9 @@
queueItems--;
dcassert(queueItems >= 0);
- pair<DirectoryIter, DirectoryIter> i = directories.equal_range(ii->getPath());
- DirectoryIter j;
- for(j = i.first; j != i.second; ++j) {
+ auto i = directories.equal_range(ii->getPath());
+ auto j = i.first;
+ for(; j != i.second; ++j) {
if(j->second == ii)
break;
}
@@ -1120,3 +1151,12 @@
void QueueFrame::on(QueueManagerListener::RecheckDone, const string& target) noexcept {
onRechecked(target, T_("Done."));
}
+
+void QueueFrame::on(Added, const BundleItem& bi) noexcept {
+ callAsync([=] { addBundle(bi); });
+}
+
+void QueueFrame::on(Removed, const BundleItem& bi) noexcept {
+ auto tth = bi.getBundle()->getHash();
+ callAsync([=] { removeBundle(tth); });
+}
=== modified file 'win32/QueueFrame.h'
--- win32/QueueFrame.h 2011-05-04 19:32:00 +0000
+++ win32/QueueFrame.h 2011-05-07 21:20:08 +0000
@@ -25,9 +25,11 @@
#include <dcpp/FastAlloc.h>
#include <dcpp/QueueManagerListener.h>
#include <dcpp/QueueItem.h>
+#include <dcpp/BundleItem.h>
#include "StaticFrame.h"
+using std::unordered_map;
using std::unordered_multimap;
class QueueFrame :
@@ -187,6 +189,12 @@
QueueItemInfo& operator=(const QueueItemInfo&);
};
+ class BundleItemInfo {
+ public:
+ BundleItemInfo(const BundleItem &b) : bundleItem(b) { }
+ GETSET(BundleItem, bundleItem, BundleItem);
+ };
+
SplitterContainerPtr paned;
typedef TypedTree<DirItemInfo> WidgetDirs;
@@ -200,9 +208,9 @@
CheckBoxPtr showTree;
typedef unordered_multimap<string, QueueItemInfo*, noCaseStringHash, noCaseStringEq> DirectoryMap;
- typedef DirectoryMap::iterator DirectoryIter;
- typedef pair<DirectoryIter, DirectoryIter> DirectoryPair;
DirectoryMap directories;
+ typedef unordered_map<TTHValue, BundleItemInfo*> BundleInfoMap;
+ BundleInfoMap bundleInfos;
std::string curDir;
@@ -213,6 +221,7 @@
int queueItems;
HTREEITEM fileLists;
+ HTREEITEM bundles;
QueueFrame(TabViewPtr parent);
virtual ~QueueFrame();
@@ -221,7 +230,10 @@
void updateFiles();
void addQueueItem(QueueItemInfo* qi, bool noSort);
- void addQueueList(const QueueItem::StringMap& l);
+ void addQueueList(const QueueItem::StringMap& l, const BundleItem::Map &b);
+
+ void addBundle(const BundleItem &bi);
+ void removeBundle(const TTHValue& tth);
HTREEITEM addDirectory(const string& dir, bool isFileList = false, HTREEITEM startAt = NULL);
void removeDirectories(HTREEITEM ht);
@@ -300,6 +312,9 @@
virtual void on(QueueManagerListener::RecheckNoTree, const string& target) noexcept;
virtual void on(QueueManagerListener::RecheckAlreadyFinished, const string& target) noexcept;
virtual void on(QueueManagerListener::RecheckDone, const string& target) noexcept;
+
+ virtual void on(Added, const BundleItem&) noexcept;
+ virtual void on(Removed, const BundleItem&) noexcept;
};
#endif // !defined(QUEUE_FRAME_H)