added force_recheck to torrent_handle. Fixes #120

This commit is contained in:
Arvid Norberg
2008-06-07 16:24:56 +00:00
parent b856e0f15a
commit a1857f9699
6 changed files with 85 additions and 9 deletions

View File

@@ -201,11 +201,9 @@ namespace libtorrent
, m_got_tracker_response(false)
, m_connections_initialized(true)
, m_has_incoming(false)
, m_files_checked(false)
{
if (resume_data) m_resume_data = *resume_data;
#ifndef NDEBUG
m_files_checked = false;
#endif
}
torrent::torrent(
@@ -308,10 +306,10 @@ namespace libtorrent
if (m_ses.m_listen_sockets.empty()) return false;
if (!m_ses.m_dht) return false;
if (!m_files_checked) return false;
// don't announce private torrents
if (m_torrent_file->is_valid() && m_torrent_file->priv()) return false;
if (m_trackers.empty()) return true;
return m_failed_trackers > 0 || !m_ses.settings().use_dht_as_fallback;
@@ -619,6 +617,51 @@ namespace libtorrent
}
}
void torrent::force_recheck()
{
disconnect_all();
m_owning_storage->async_release_files();
m_owning_storage = new piece_manager(shared_from_this(), m_torrent_file
, m_save_path, m_ses.m_files, m_ses.m_disk_thread, m_storage_constructor
, m_storage_mode);
m_storage = m_owning_storage.get();
m_picker.reset(new piece_picker);
m_picker->init(m_torrent_file->piece_length() / m_block_size
, int((m_torrent_file->total_size()+m_block_size-1)/m_block_size));
// assume that we don't have anything
m_files_checked = false;
m_state = torrent_status::queued_for_checking;
m_resume_data = entry();
m_storage->async_check_fastresume(&m_resume_data
, bind(&torrent::on_force_recheck
, shared_from_this(), _1, _2));
}
void torrent::on_force_recheck(int ret, disk_io_job const& j)
{
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
if (ret == piece_manager::fatal_disk_error)
{
if (m_ses.m_alerts.should_post(alert::fatal))
{
m_ses.m_alerts.post_alert(file_error_alert(j.error_file, get_handle(), j.str));
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_LOGGING || defined TORRENT_ERROR_LOGGING
(*m_ses.m_logger) << time_now_string() << ": fatal disk error ["
" error: " << j.str <<
" torrent: " << torrent_file().name() <<
" ]\n";
#endif
}
m_error = j.str;
pause();
return;
}
m_ses.check_torrent(shared_from_this());
}
void torrent::start_checking()
{
m_state = torrent_status::checking_files;
@@ -770,6 +813,7 @@ namespace libtorrent
// INVARIANT_CHECK;
if (m_trackers.empty()) return false;
if (!m_files_checked) return false;
if (m_just_paused)
{
@@ -3148,9 +3192,7 @@ namespace libtorrent
, "torrent finished checking"));
}
#ifndef NDEBUG
m_files_checked = true;
#endif
}
alert_manager& torrent::alerts() const