mirror of
https://github.com/rakshasa/rtorrent.git
synced 2026-08-12 21:22:31 +00:00
* Added groups and started reworking the ratio handling.
git-svn-id: svn://rakshasa.no/libtorrent/trunk/rtorrent@1078 e378c898-3ddf-0310-93e7-cc216c733640
This commit is contained in:
+30
-33
@@ -93,54 +93,52 @@ apply_on_state_change(const char* name, const torrent::Object& rawArgs) {
|
||||
}
|
||||
|
||||
torrent::Object
|
||||
apply_on_ratio(int action, const torrent::Object& rawArgs) {
|
||||
const torrent::Object::list_type& args = rawArgs.as_list();
|
||||
apply_on_ratio(const torrent::Object& rawArgs) {
|
||||
const std::string& groupName = rawArgs.as_string();
|
||||
|
||||
if (args.empty())
|
||||
throw torrent::input_error("Too few arguments.");
|
||||
char buffer[32 + groupName.size()];
|
||||
sprintf(buffer, "group.%s.view", groupName.c_str());
|
||||
|
||||
torrent::Object::list_const_iterator argItr = args.begin();
|
||||
core::ViewManager::iterator viewItr = control->view_manager()->find(rpc::commands.call(buffer, rpc::make_target()).as_string());
|
||||
|
||||
if (viewItr == control->view_manager()->end())
|
||||
throw torrent::input_error("Could not find view.");
|
||||
|
||||
char* bufferStart = buffer + sprintf(buffer, "group.%s.ratio.", groupName.c_str());
|
||||
|
||||
// first argument: minimum ratio to reach
|
||||
// second argument: minimum upload amount to reach [optional]
|
||||
// third argument: maximum ratio to reach [optional]
|
||||
int64_t minRatio = rpc::convert_to_value(*argItr++);
|
||||
int64_t minUpload = argItr != args.end() ? rpc::convert_to_value(*argItr++) : 0;
|
||||
int64_t maxRatio = argItr != args.end() ? rpc::convert_to_value(*argItr++) : 0;
|
||||
std::strcpy(bufferStart, "min");
|
||||
int64_t minRatio = rpc::commands.call(buffer, rpc::make_target()).as_value();
|
||||
std::strcpy(bufferStart, "max");
|
||||
int64_t maxRatio = rpc::commands.call(buffer, rpc::make_target()).as_value();
|
||||
std::strcpy(bufferStart, "upload");
|
||||
int64_t minUpload = rpc::commands.call(buffer, rpc::make_target()).as_value();
|
||||
|
||||
core::DownloadList* downloadList = control->core()->download_list();
|
||||
std::vector<core::Download*> downloads;
|
||||
|
||||
for (core::Manager::DListItr itr = downloadList->begin();
|
||||
(itr = std::find_if(itr, downloadList->end(), std::mem_fun(&core::Download::is_seeding))) != downloadList->end(); ) {
|
||||
core::Download* current = *itr++;
|
||||
|
||||
if (rpc::call_command_value("d.get_ignore_commands", rpc::make_target(current)) != 0)
|
||||
for (core::View::iterator itr = (*viewItr)->begin_visible(), last = (*viewItr)->end_visible(); itr != last; itr++) {
|
||||
if (rpc::call_command_value("d.get_ignore_commands", rpc::make_target(*itr)) != 0)
|
||||
continue;
|
||||
|
||||
int64_t totalDone = current->download()->bytes_done();
|
||||
int64_t totalUpload = current->download()->up_rate()->total();
|
||||
rpc::parse_command_single(rpc::make_target(*itr), "print={Checked ratio of download.}");
|
||||
|
||||
int64_t totalDone = (*itr)->download()->bytes_done();
|
||||
int64_t totalUpload = (*itr)->download()->up_rate()->total();
|
||||
|
||||
if (!(totalUpload >= minUpload && totalUpload * 100 >= totalDone * minRatio) &&
|
||||
!(maxRatio > 0 && totalUpload * 100 > totalDone * maxRatio))
|
||||
continue;
|
||||
|
||||
bool success = true;
|
||||
downloads.push_back(*itr);
|
||||
}
|
||||
|
||||
switch (action) {
|
||||
// case core::DownloadList::SLOTS_CLOSE: success = downloadList->close_try(current); break;
|
||||
// case core::DownloadList::SLOTS_STOP: success = downloadList->stop_try(current); break;
|
||||
case core::DownloadList::D_SLOTS_CLOSE: rpc::parse_command_single(rpc::make_target(current), "d.try_close="); break;
|
||||
case core::DownloadList::D_SLOTS_STOP: rpc::parse_command_single(rpc::make_target(current), "d.try_stop="); break;
|
||||
default: success = false; break;
|
||||
}
|
||||
std::strcpy(bufferStart, "command");
|
||||
|
||||
if (!success)
|
||||
continue;
|
||||
|
||||
rpc::call_command("d.set_ignore_commands", (int64_t)1, rpc::make_target(current));
|
||||
|
||||
for (torrent::Object::list_const_iterator itr2 = argItr; itr2 != args.end(); itr2++)
|
||||
rpc::parse_command_object(rpc::make_target(current), *itr2);
|
||||
for (std::vector<core::Download*>::iterator itr = downloads.begin(), last = downloads.end(); itr != last; itr++) {
|
||||
rpc::commands.call("print", rpc::make_target(*itr), "Calling ratio command.");
|
||||
rpc::commands.call_catch(buffer, rpc::make_target(*itr), torrent::Object(), "Ratio reached, but command failed: ");
|
||||
}
|
||||
|
||||
return torrent::Object();
|
||||
@@ -369,8 +367,7 @@ initialize_command_events() {
|
||||
ADD_COMMAND_LIST("on_hash_removed", rak::bind_ptr_fn(&apply_on_state_change, "event.download.hash_removed"));
|
||||
ADD_COMMAND_LIST("on_finished", rak::bind_ptr_fn(&apply_on_state_change, "event.download.finished"));
|
||||
|
||||
ADD_COMMAND_LIST("stop_on_ratio", rak::bind_ptr_fn(&apply_on_ratio, (int)core::DownloadList::D_SLOTS_STOP));
|
||||
ADD_COMMAND_LIST("close_on_ratio", rak::bind_ptr_fn(&apply_on_ratio, (int)core::DownloadList::D_SLOTS_CLOSE));
|
||||
ADD_COMMAND_STRING("on_ratio", rak::ptr_fn(&apply_on_ratio));
|
||||
|
||||
ADD_COMMAND_VOID("start_tied", &apply_start_tied);
|
||||
ADD_COMMAND_VOID("stop_untied", &apply_stop_untied);
|
||||
|
||||
Reference in New Issue
Block a user