added pause and resume to the session. Fixes #349
This commit is contained in:
@@ -82,6 +82,10 @@ The ``session`` class has the following synopsis::
|
|||||||
|
|
||||||
torrent_handle add_torrent(add_torrent_params const& params);
|
torrent_handle add_torrent(add_torrent_params const& params);
|
||||||
|
|
||||||
|
void pause();
|
||||||
|
void resume();
|
||||||
|
bool is_paused() const;
|
||||||
|
|
||||||
session_proxy abort();
|
session_proxy abort();
|
||||||
|
|
||||||
enum options_t
|
enum options_t
|
||||||
@@ -194,10 +198,23 @@ returns. So, it's advised that any kind of interface (such as windows) are close
|
|||||||
destructing the session object. Because it can take a few second for it to finish. The
|
destructing the session object. Because it can take a few second for it to finish. The
|
||||||
timeout can be set with ``set_settings()``.
|
timeout can be set with ``set_settings()``.
|
||||||
|
|
||||||
|
pause() resume() is_paused()
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
::
|
||||||
|
void pause();
|
||||||
|
void resume();
|
||||||
|
bool is_paused() const;
|
||||||
|
|
||||||
|
Pausing the session has the same effect as pausing every torrent in it. Resuming
|
||||||
|
will restore the torrents to their previous paused state. i.e. the session pause
|
||||||
|
state is separate from the torrent pause state. A torrent is inactive if it is
|
||||||
|
paused or if the session is paused.
|
||||||
|
|
||||||
abort()
|
abort()
|
||||||
-------
|
-------
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
session_proxy abort();
|
session_proxy abort();
|
||||||
|
|
||||||
|
@@ -982,6 +982,12 @@ int main(int ac, char* av[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (c == ' ')
|
||||||
|
{
|
||||||
|
if (ses.is_paused()) ses.resume();
|
||||||
|
else ses.pause();
|
||||||
|
}
|
||||||
|
|
||||||
if (c == 'm')
|
if (c == 'm')
|
||||||
{
|
{
|
||||||
std::cout << "saving peers for torrents" << std::endl;
|
std::cout << "saving peers for torrents" << std::endl;
|
||||||
@@ -1198,7 +1204,7 @@ int main(int ac, char* av[])
|
|||||||
std::stringstream out;
|
std::stringstream out;
|
||||||
out << "[q] quit [i] toggle peers [d] toggle downloading pieces [p] toggle paused "
|
out << "[q] quit [i] toggle peers [d] toggle downloading pieces [p] toggle paused "
|
||||||
"[a] toggle piece bar [s] toggle download sequential [f] toggle files "
|
"[a] toggle piece bar [s] toggle download sequential [f] toggle files "
|
||||||
"[j] force recheck\n"
|
"[j] force recheck [space] toggle session pause\n"
|
||||||
"[1] toggle IP [2] toggle AS [3] toggle timers [4] toggle block progress "
|
"[1] toggle IP [2] toggle AS [3] toggle timers [4] toggle block progress "
|
||||||
"[5] toggle peer rate [6] toggle failures [7] toggle send buffers\n";
|
"[5] toggle peer rate [6] toggle failures [7] toggle send buffers\n";
|
||||||
|
|
||||||
|
@@ -189,6 +189,10 @@ namespace libtorrent
|
|||||||
, int nat_transport);
|
, int nat_transport);
|
||||||
|
|
||||||
bool is_aborted() const { return m_abort; }
|
bool is_aborted() const { return m_abort; }
|
||||||
|
bool is_paused() const { return m_paused; }
|
||||||
|
|
||||||
|
void pause();
|
||||||
|
void resume();
|
||||||
|
|
||||||
void set_ip_filter(ip_filter const& f);
|
void set_ip_filter(ip_filter const& f);
|
||||||
void set_port_filter(port_filter const& f);
|
void set_port_filter(port_filter const& f);
|
||||||
@@ -454,6 +458,9 @@ namespace libtorrent
|
|||||||
// should exit
|
// should exit
|
||||||
volatile bool m_abort;
|
volatile bool m_abort;
|
||||||
|
|
||||||
|
// is true if the session is paused
|
||||||
|
bool m_paused;
|
||||||
|
|
||||||
// the max number of unchoked peers as set by the user
|
// the max number of unchoked peers as set by the user
|
||||||
int m_max_uploads;
|
int m_max_uploads;
|
||||||
|
|
||||||
|
@@ -212,6 +212,10 @@ namespace libtorrent
|
|||||||
|
|
||||||
session_proxy abort() { return session_proxy(m_impl); }
|
session_proxy abort() { return session_proxy(m_impl); }
|
||||||
|
|
||||||
|
void pause();
|
||||||
|
void resume();
|
||||||
|
bool is_paused() const;
|
||||||
|
|
||||||
session_status status() const;
|
session_status status() const;
|
||||||
cache_status get_cache_status() const;
|
cache_status get_cache_status() const;
|
||||||
|
|
||||||
|
@@ -195,7 +195,12 @@ namespace libtorrent
|
|||||||
bool has_error() const { return !m_error.empty(); }
|
bool has_error() const { return !m_error.empty(); }
|
||||||
void pause();
|
void pause();
|
||||||
void resume();
|
void resume();
|
||||||
bool is_paused() const { return m_paused; }
|
|
||||||
|
void do_pause();
|
||||||
|
void do_resume();
|
||||||
|
|
||||||
|
bool is_paused() const;
|
||||||
|
bool is_torrent_paused() const { return m_paused; }
|
||||||
void force_recheck();
|
void force_recheck();
|
||||||
void save_resume_data();
|
void save_resume_data();
|
||||||
|
|
||||||
|
@@ -324,6 +324,10 @@ namespace libtorrent
|
|||||||
return m_impl->status();
|
return m_impl->status();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void session::pause() { m_impl->pause(); }
|
||||||
|
void session::resume() { m_impl->resume(); }
|
||||||
|
bool session::is_paused() const { return m_impl->is_paused(); }
|
||||||
|
|
||||||
void session::get_cache_info(sha1_hash const& ih
|
void session::get_cache_info(sha1_hash const& ih
|
||||||
, std::vector<cached_piece_info>& ret) const
|
, std::vector<cached_piece_info>& ret) const
|
||||||
{
|
{
|
||||||
|
@@ -158,6 +158,7 @@ namespace aux {
|
|||||||
, m_listen_port_retries(listen_port_range.second - listen_port_range.first)
|
, m_listen_port_retries(listen_port_range.second - listen_port_range.first)
|
||||||
, m_listen_interface(address::from_string(listen_interface), listen_port_range.first)
|
, m_listen_interface(address::from_string(listen_interface), listen_port_range.first)
|
||||||
, m_abort(false)
|
, m_abort(false)
|
||||||
|
, m_paused(false)
|
||||||
, m_max_uploads(8)
|
, m_max_uploads(8)
|
||||||
, m_allowed_upload_slots(8)
|
, m_allowed_upload_slots(8)
|
||||||
, m_max_connections(200)
|
, m_max_connections(200)
|
||||||
@@ -389,6 +390,32 @@ namespace aux {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void session_impl::pause()
|
||||||
|
{
|
||||||
|
mutex_t::scoped_lock l(m_mutex);
|
||||||
|
if (m_paused) return;
|
||||||
|
m_paused = true;
|
||||||
|
for (torrent_map::iterator i = m_torrents.begin()
|
||||||
|
, end(m_torrents.end()); i != end; ++i)
|
||||||
|
{
|
||||||
|
torrent& t = *i->second;
|
||||||
|
if (!t.is_torrent_paused()) t.do_pause();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void session_impl::resume()
|
||||||
|
{
|
||||||
|
mutex_t::scoped_lock l(m_mutex);
|
||||||
|
if (!m_paused) return;
|
||||||
|
m_paused = false;
|
||||||
|
for (torrent_map::iterator i = m_torrents.begin()
|
||||||
|
, end(m_torrents.end()); i != end; ++i)
|
||||||
|
{
|
||||||
|
torrent& t = *i->second;
|
||||||
|
t.do_resume();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void session_impl::abort()
|
void session_impl::abort()
|
||||||
{
|
{
|
||||||
mutex_t::scoped_lock l(m_mutex);
|
mutex_t::scoped_lock l(m_mutex);
|
||||||
|
@@ -761,8 +761,7 @@ namespace libtorrent
|
|||||||
bind(&torrent::on_announce_disp, self, _1));
|
bind(&torrent::on_announce_disp, self, _1));
|
||||||
|
|
||||||
// announce with the local discovery service
|
// announce with the local discovery service
|
||||||
if (!m_paused)
|
if (!is_paused()) m_ses.announce_lsd(m_torrent_file->info_hash());
|
||||||
m_ses.announce_lsd(m_torrent_file->info_hash());
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -772,7 +771,7 @@ namespace libtorrent
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_DHT
|
#ifndef TORRENT_DISABLE_DHT
|
||||||
if (m_paused) return;
|
if (is_paused()) return;
|
||||||
if (!m_ses.m_dht) return;
|
if (!m_ses.m_dht) return;
|
||||||
ptime now = time_now();
|
ptime now = time_now();
|
||||||
if (should_announce_dht() && now - m_last_dht_announce > minutes(14))
|
if (should_announce_dht() && now - m_last_dht_announce > minutes(14))
|
||||||
@@ -842,7 +841,7 @@ namespace libtorrent
|
|||||||
m_just_paused = false;
|
m_just_paused = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return !m_paused && m_next_request < time_now();
|
return !is_paused() && m_next_request < time_now();
|
||||||
}
|
}
|
||||||
|
|
||||||
void torrent::tracker_warning(tracker_request const& req, std::string const& msg)
|
void torrent::tracker_warning(tracker_request const& req, std::string const& msg)
|
||||||
@@ -1501,7 +1500,7 @@ namespace libtorrent
|
|||||||
m_abort = true;
|
m_abort = true;
|
||||||
// if the torrent is paused, it doesn't need
|
// if the torrent is paused, it doesn't need
|
||||||
// to announce with even=stopped again.
|
// to announce with even=stopped again.
|
||||||
if (!m_paused)
|
if (!is_paused())
|
||||||
m_event = tracker_request::stopped;
|
m_event = tracker_request::stopped;
|
||||||
// disconnect all peers and close all
|
// disconnect all peers and close all
|
||||||
// files belonging to the torrents
|
// files belonging to the torrents
|
||||||
@@ -2865,7 +2864,7 @@ namespace libtorrent
|
|||||||
bool torrent::want_more_peers() const
|
bool torrent::want_more_peers() const
|
||||||
{
|
{
|
||||||
return int(m_connections.size()) < m_max_connections
|
return int(m_connections.size()) < m_max_connections
|
||||||
&& !m_paused
|
&& !is_paused()
|
||||||
&& m_state != torrent_status::checking_files
|
&& m_state != torrent_status::checking_files
|
||||||
&& (m_state != torrent_status::queued_for_checking
|
&& (m_state != torrent_status::queued_for_checking
|
||||||
|| !valid_metadata())
|
|| !valid_metadata())
|
||||||
@@ -3596,7 +3595,7 @@ namespace libtorrent
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
disconnect_all();
|
disconnect_all();
|
||||||
if (!m_paused)
|
if (!is_paused())
|
||||||
m_just_paused = true;
|
m_just_paused = true;
|
||||||
m_paused = true;
|
m_paused = true;
|
||||||
// tell the tracker that we stopped
|
// tell the tracker that we stopped
|
||||||
@@ -3711,11 +3710,24 @@ namespace libtorrent
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool torrent::is_paused() const
|
||||||
|
{
|
||||||
|
return m_paused || m_ses.is_paused();
|
||||||
|
}
|
||||||
|
|
||||||
void torrent::pause()
|
void torrent::pause()
|
||||||
{
|
{
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
if (m_paused) return;
|
if (m_paused) return;
|
||||||
|
m_paused = true;
|
||||||
|
if (m_ses.is_paused()) return;
|
||||||
|
do_pause();
|
||||||
|
}
|
||||||
|
|
||||||
|
void torrent::do_pause()
|
||||||
|
{
|
||||||
|
if (!is_paused()) return;
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_EXTENSIONS
|
#ifndef TORRENT_DISABLE_EXTENSIONS
|
||||||
for (extension_list_t::iterator i = m_extensions.begin()
|
for (extension_list_t::iterator i = m_extensions.begin()
|
||||||
@@ -3740,7 +3752,6 @@ namespace libtorrent
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
disconnect_all();
|
disconnect_all();
|
||||||
m_paused = true;
|
|
||||||
// tell the tracker that we stopped
|
// tell the tracker that we stopped
|
||||||
m_event = tracker_request::stopped;
|
m_event = tracker_request::stopped;
|
||||||
m_just_paused = true;
|
m_just_paused = true;
|
||||||
@@ -3766,6 +3777,13 @@ namespace libtorrent
|
|||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
if (!m_paused) return;
|
if (!m_paused) return;
|
||||||
|
m_paused = false;
|
||||||
|
do_resume();
|
||||||
|
}
|
||||||
|
|
||||||
|
void torrent::do_resume()
|
||||||
|
{
|
||||||
|
if (is_paused()) return;
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_EXTENSIONS
|
#ifndef TORRENT_DISABLE_EXTENSIONS
|
||||||
for (extension_list_t::iterator i = m_extensions.begin()
|
for (extension_list_t::iterator i = m_extensions.begin()
|
||||||
@@ -3781,7 +3799,6 @@ namespace libtorrent
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_paused = false;
|
|
||||||
m_started = time_now();
|
m_started = time_now();
|
||||||
m_error.clear();
|
m_error.clear();
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user