From 71ac2cc8e1e3897b4850b8470ec9a1f20a6b3130 Mon Sep 17 00:00:00 2001 From: rakshasa Date: Mon, 10 Dec 2007 17:17:40 +0000 Subject: [PATCH] * Partial implementation of better detection and handling of deleted files in a torrent. git-svn-id: svn://rakshasa.no/libtorrent/trunk/rtorrent@1017 e378c898-3ddf-0310-93e7-cc216c733640 --- src/command_download.cc | 1 + src/core/download_factory.cc | 5 ++++- src/core/download_list.cc | 9 +++++---- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/command_download.cc b/src/command_download.cc index 93c25d40..9a3539f7 100644 --- a/src/command_download.cc +++ b/src/command_download.cc @@ -452,6 +452,7 @@ initialize_command_download() { // value, it indicates the last time the torrent changed its state, // resume/pause. ADD_CD_VARIABLE_VALUE("state_changed", "rtorrent", "state_changed"); + ADD_CD_VARIABLE_VALUE("state_counter", "rtorrent", "state_counter"); ADD_CD_VARIABLE_VALUE_PUBLIC("ignore_commands", "rtorrent", "ignore_commands"); ADD_CD_STRING_BI("connection_current", std::ptr_fun(&apply_d_connection_type), std::ptr_fun(&retrieve_d_connection_type)); diff --git a/src/core/download_factory.cc b/src/core/download_factory.cc index a9313a4c..2835db8d 100644 --- a/src/core/download_factory.cc +++ b/src/core/download_factory.cc @@ -310,10 +310,13 @@ DownloadFactory::initialize_rtorrent(Download* download, torrent::Object* rtorre if (!rtorrent->has_key_value("state") || rtorrent->get_key_value("state") > 1) { rtorrent->insert_key("state", (int64_t)m_start); rtorrent->insert_key("state_changed", cachedTime.seconds()); + rtorrent->insert_key("state_counter", int64_t()); } else if (!rtorrent->has_key_value("state_changed") || - rtorrent->get_key_value("state_changed") > cachedTime.seconds() || rtorrent->get_key_value("state_changed") == 0) { + rtorrent->get_key_value("state_changed") > cachedTime.seconds() || rtorrent->get_key_value("state_changed") == 0 || + !rtorrent->has_key_value("state_counter") || (uint64_t)rtorrent->get_key_value("state_counter") > (1 << 20)) { rtorrent->insert_key("state_changed", cachedTime.seconds()); + rtorrent->insert_key("state_counter", int64_t()); } rtorrent->insert_preserve_value("complete", 0); diff --git a/src/core/download_list.cc b/src/core/download_list.cc index 1058135e..3a09a707 100644 --- a/src/core/download_list.cc +++ b/src/core/download_list.cc @@ -221,8 +221,7 @@ DownloadList::open_throw(Download* download) { if (download->download()->is_open()) return; -// download->download()->open(torrent::Download::open_no_create); - download->download()->open(0); + download->download()->open(download->resume_flags()); std::for_each(slot_map_open().begin(), slot_map_open().end(), download_list_call(download)); } @@ -395,6 +394,7 @@ DownloadList::resume(Download* download, int flags) { // open_throw(download); rpc::call_command("d.set_state_changed", cachedTime.seconds(), rpc::make_target(download)); + rpc::call_command("d.set_state_counter", rpc::call_command_value("d.get_state_counter", rpc::make_target(download)) + 1, rpc::make_target(download)); if (download->is_done()) { rpc::call_command("d.set_connection_current", rpc::call_command_void("d.get_connection_seed", rpc::make_target(download)), rpc::make_target(download)); @@ -452,6 +452,7 @@ DownloadList::pause(Download* download, int flags) { std::for_each(slot_map_stop().begin(), slot_map_stop().end(), download_list_call(download)); rpc::call_command("d.set_state_changed", cachedTime.seconds(), rpc::make_target(download)); + rpc::call_command("d.set_state_counter", rpc::call_command_value("d.get_state_counter", rpc::make_target(download)), rpc::make_target(download)); // Save the state after all the slots, etc have been called so we // include the modifications they may make. @@ -522,7 +523,7 @@ DownloadList::hash_done(Download* download) { torrent::resume_save_progress(*download->download(), download->download()->bencode()->get_key("libtorrent_resume")); if (rpc::call_command_value("d.get_state", rpc::make_target(download)) == 1) - resume(download); + resume(download, download->resume_flags()); break; @@ -623,7 +624,7 @@ DownloadList::confirm_finished(Download* download) { throw torrent::internal_error("DownloadList::confirm_finished(...) download->resume_flags() != ~uint32_t()."); if (!download->is_active() && rpc::call_command_value("d.get_state", rpc::make_target(download)) == 1) - resume(download, torrent::Download::start_skip_tracker | torrent::Download::start_keep_baseline); + resume(download, torrent::Download::start_no_create | torrent::Download::start_skip_tracker | torrent::Download::start_keep_baseline); } }