diff --git a/libi2pd_client/TorrentsRPC.cpp b/libi2pd_client/TorrentsRPC.cpp index 3957d06d..ba852dcd 100644 --- a/libi2pd_client/TorrentsRPC.cpp +++ b/libi2pd_client/TorrentsRPC.cpp @@ -274,10 +274,8 @@ namespace torrents deleteFiles = arguments.at ("delete-local-data").as_bool (); auto torrentIds = GetTorrentIds (arguments); if (!torrentIds.empty ()) - { for (auto id: torrentIds) m_Tunnel->RemoveTorrent (id, deleteFiles); - } else m_Tunnel->RemoveAllTorrents (deleteFiles); boost::json::object response; // always empty @@ -288,8 +286,11 @@ namespace torrents { auto arguments = jsonRequest.at ("arguments").as_object (); auto torrentIds = GetTorrentIds (arguments); - for (auto id: torrentIds) - m_Tunnel->ReannounceTorrent (id); + if (!torrentIds.empty ()) + for (auto id: torrentIds) + m_Tunnel->ReannounceTorrent (id); + else + m_Tunnel->ReannounceAllTorrents (); boost::json::object response; // always empty return SuccessResponse (GetTag (jsonRequest), std::move (response)); } @@ -725,8 +726,12 @@ namespace torrents std::string JSONRPCHandler::HandleTorrentStop (boost::json::object&& jsonRequest) { auto arguments = jsonRequest.at ("arguments").as_object (); - for (auto id: GetTorrentIds (arguments)) - m_Tunnel->StopTorrent (id); + auto torrentIds = GetTorrentIds (arguments); + if (!torrentIds.empty ()) + for (auto id: torrentIds) + m_Tunnel->StopTorrent (id); + else + m_Tunnel->StopAllTorrents (); boost::json::object response; // always empty return SuccessResponse (GetTag (jsonRequest), std::move (response)); } @@ -734,8 +739,12 @@ namespace torrents std::string JSONRPCHandler::HandleTorrentStart (boost::json::object&& jsonRequest) { auto arguments = jsonRequest.at ("arguments").as_object (); - for (auto id: GetTorrentIds (arguments)) - m_Tunnel->StartTorrent (id); + auto torrentIds = GetTorrentIds (arguments); + if (!torrentIds.empty ()) + for (auto id: torrentIds) + m_Tunnel->StartTorrent (id); + else + m_Tunnel->StartAllTorrents (); boost::json::object response; // always empty return SuccessResponse (GetTag (jsonRequest), std::move (response)); } diff --git a/libi2pd_client/TorrentsTunnel.cpp b/libi2pd_client/TorrentsTunnel.cpp index 59eccc17..135bf937 100644 --- a/libi2pd_client/TorrentsTunnel.cpp +++ b/libi2pd_client/TorrentsTunnel.cpp @@ -551,6 +551,21 @@ namespace torrents it->Close (); } + void TorrentsTunnel::StopAllTorrents () + { + std::list > torrentsToStop; + { + std::lock_guard l(m_TorrentsMutex); + for (const auto& it: m_Torrents) + torrentsToStop.push_back (it.second); + } + boost::asio::post (GetService (), [this, torrentsToStop = std::move (torrentsToStop)]() + { + for (auto it: torrentsToStop) // TODO: announce with random intervals + StopTorrent (it); + }); + } + bool TorrentsTunnel::StartTorrent (int id) { std::shared_ptr torrent; @@ -570,6 +585,24 @@ namespace torrents return true; } + void TorrentsTunnel::StartAllTorrents () + { + std::list > torrentsToStart; + { + std::lock_guard l(m_TorrentsMutex); + for (const auto& it: m_Torrents) + torrentsToStart.push_back (it.second); + } + boost::asio::post (GetService (), [this, torrentsToStart = std::move (torrentsToStart)]() + { + for (auto it: torrentsToStart) // TODO: announce with random intervals + { + it->SetStopped (false); + RequestTorrentTrackers (it, eTrackerAnnounceEventStarted); + } + }); + } + bool TorrentsTunnel::ReannounceTorrent (int id) { std::shared_ptr torrent; @@ -588,6 +621,24 @@ namespace torrents return true; } + void TorrentsTunnel::ReannounceAllTorrents () + { + std::list > torrentsToReannounce; + { + std::lock_guard l(m_TorrentsMutex); + for (const auto& it: m_Torrents) + torrentsToReannounce.push_back (it.second); + } + boost::asio::post (GetService (), [this, torrentsToReannounce = std::move (torrentsToReannounce)]() + { + for (auto it: torrentsToReannounce) // TODO: announce with random intervals + { + RequestTorrentTrackers (it, eTrackerAnnounceEventNone); + if (m_DHT) m_DHT->GetPeersAndAnnounce (it); + } + }); + } + void TorrentsTunnel::UpdateTorrentInfo (std::shared_ptr torrent, std::string_view info) { if (!torrent || torrent->IsStopped ()) return; diff --git a/libi2pd_client/TorrentsTunnel.h b/libi2pd_client/TorrentsTunnel.h index 7989b7f4..aaa02120 100644 --- a/libi2pd_client/TorrentsTunnel.h +++ b/libi2pd_client/TorrentsTunnel.h @@ -112,8 +112,11 @@ namespace torrents bool RemoveTorrent (int id, bool deleteFiles); void RemoveAllTorrents (bool deleteFiles); bool StopTorrent (int id); + void StopAllTorrents (); bool StartTorrent (int id); + void StartAllTorrents (); bool ReannounceTorrent (int id); + void ReannounceAllTorrents (); void ConnectToNewPeers (std::shared_ptr torrent, std::unordered_set& newPeers, PeerConnectionOrigin origin); void SendDHTPingQuery (const i2p::data::IdentHash& toIdent, uint16_t toPort); std::pair GetDHTPorts () const { return { m_DHT ? m_DHT->GetPort () : 0, m_DHT ? m_DHT->GetRPort () : 0 }; }