mirror of
https://github.com/rakshasa/rtorrent.git
synced 2026-10-06 22:29:23 +00:00
* The curl bind address was being set by set_local_address(...), urgh.
* Made IPv6 stuff configurable. * Improved the view stuff. git-svn-id: svn://rakshasa.no/libtorrent/trunk/rtorrent@672 e378c898-3ddf-0310-93e7-cc216c733640
This commit is contained in:
+82
-33
@@ -46,13 +46,83 @@
|
||||
|
||||
namespace core {
|
||||
|
||||
class ViewSortFirst : public ViewSort {
|
||||
public:
|
||||
virtual bool compare(Download* d1, Download* d2) const {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class ViewSortName : public ViewSort {
|
||||
public:
|
||||
virtual bool compare(Download* d1, Download* d2) const {
|
||||
return d1->download()->name() < d2->download()->name();
|
||||
}
|
||||
};
|
||||
|
||||
class ViewSortVariable : public ViewSort {
|
||||
public:
|
||||
ViewSortVariable(const std::string& name, const std::string& value) :
|
||||
m_name(name), m_value(value) {}
|
||||
|
||||
virtual bool compare(Download* d1, Download* d2) const {
|
||||
return
|
||||
d1->variable()->get_string(m_name) == m_value ||
|
||||
d2->variable()->get_string(m_name) != m_value;
|
||||
}
|
||||
|
||||
private:
|
||||
std::string m_name;
|
||||
std::string m_value;
|
||||
};
|
||||
|
||||
class ViewSortReverse : public ViewSort {
|
||||
public:
|
||||
ViewSortReverse(ViewSort* s) : m_sort(s) {}
|
||||
~ViewSortReverse() { delete m_sort; }
|
||||
|
||||
virtual bool compare(Download* d1, Download* d2) const {
|
||||
return m_sort->compare(d2, d1);
|
||||
}
|
||||
|
||||
private:
|
||||
ViewSort* m_sort;
|
||||
};
|
||||
|
||||
// Hmm, use a list in ViewDownloads instead?
|
||||
class ViewSortAnd : public ViewSort {
|
||||
public:
|
||||
ViewSortAnd(ViewSort* s1, ViewSort* s2) : m_sort1(s1), m_sort2(s2) {}
|
||||
~ViewSortAnd() { delete m_sort1; delete m_sort2; }
|
||||
|
||||
virtual bool compare(Download* d1, Download* d2) const {
|
||||
return m_sort1->compare(d1, d2) && m_sort2->compare(d1, d2);
|
||||
}
|
||||
|
||||
private:
|
||||
ViewSort* m_sort1;
|
||||
ViewSort* m_sort2;
|
||||
};
|
||||
|
||||
ViewManager::ViewManager(DownloadList* dl) :
|
||||
m_list(dl) {
|
||||
|
||||
m_sort["first"] = new ViewSortFirst();
|
||||
m_sort["last"] = new ViewSortReverse(new ViewSortFirst());
|
||||
m_sort["name"] = new ViewSortName();
|
||||
m_sort["name_reverse"] = new ViewSortReverse(new ViewSortName());
|
||||
|
||||
m_sort["started"] = new ViewSortVariable("state", "started");
|
||||
m_sort["started_name"] = new ViewSortAnd(new ViewSortVariable("state", "started"), new ViewSortName());
|
||||
|
||||
m_sort["stopped"] = new ViewSortVariable("state", "stopped");
|
||||
m_sort["stopped_name"] = new ViewSortAnd(new ViewSortVariable("state", "stopped"), new ViewSortName());
|
||||
}
|
||||
|
||||
void
|
||||
ViewManager::clear() {
|
||||
std::for_each(begin(), end(), rak::call_delete<ViewDownloads>());
|
||||
std::for_each(m_sort.begin(), m_sort.end(), rak::on(rak::mem_ptr_ref(&sort_map::value_type::second), rak::call_delete<ViewSort>()));
|
||||
|
||||
base_type::clear();
|
||||
}
|
||||
@@ -63,6 +133,8 @@ ViewManager::insert(const std::string& name) {
|
||||
throw torrent::internal_error("ViewManager::insert(...) name already inserted.");
|
||||
|
||||
ViewDownloads* view = new ViewDownloads();
|
||||
|
||||
view->set_sort_new(m_sort["last"]);
|
||||
view->initialize(name, m_list);
|
||||
|
||||
return base_type::insert(end(), view);
|
||||
@@ -83,51 +155,28 @@ ViewManager::find_throw(const std::string& name) {
|
||||
return itr;
|
||||
}
|
||||
|
||||
// Put this somewhere else.
|
||||
bool
|
||||
view_sort_name(core::Download* d1, core::Download* d2) {
|
||||
return d1->download()->name() < d2->download()->name();
|
||||
}
|
||||
|
||||
bool
|
||||
view_sort_name_reverse(core::Download* d1, core::Download* d2) {
|
||||
return d1->download()->name() > d2->download()->name();
|
||||
}
|
||||
|
||||
void
|
||||
ViewManager::sort(const std::string& name, const std::string& sort) {
|
||||
iterator itr = find_throw(name);
|
||||
iterator viewItr = find_throw(name);
|
||||
|
||||
// Quick and dirty hack.
|
||||
if (sort == "none")
|
||||
(*itr)->sort(NULL);
|
||||
sort_map::const_iterator sortItr = m_sort.find(sort);
|
||||
|
||||
else if (sort == "name")
|
||||
(*itr)->sort(&view_sort_name);
|
||||
|
||||
else if (sort == "name_reverse")
|
||||
(*itr)->sort(&view_sort_name_reverse);
|
||||
|
||||
else
|
||||
if (sortItr == m_sort.end())
|
||||
throw torrent::input_error("Invalid sorting identifier.");
|
||||
|
||||
(*viewItr)->sort(sortItr->second);
|
||||
}
|
||||
|
||||
void
|
||||
ViewManager::set_sort_new(const std::string& name, const std::string& sort) {
|
||||
iterator itr = find_throw(name);
|
||||
iterator viewItr = find_throw(name);
|
||||
|
||||
// Quick and dirty hack.
|
||||
if (sort == "none")
|
||||
(*itr)->set_sort_new(NULL);
|
||||
sort_map::const_iterator sortItr = m_sort.find(sort);
|
||||
|
||||
else if (sort == "name")
|
||||
(*itr)->set_sort_new(&view_sort_name);
|
||||
|
||||
else if (sort == "name_reverse")
|
||||
(*itr)->set_sort_new(&view_sort_name_reverse);
|
||||
|
||||
else
|
||||
if (sortItr == m_sort.end())
|
||||
throw torrent::input_error("Invalid sorting identifier.");
|
||||
|
||||
(*viewItr)->set_sort_new(sortItr->second);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user