refactor: use std::function for announcer callback (#4575)

This commit is contained in:
Dmitry Antipov 2023-01-15 21:37:54 +03:00 committed by GitHub
parent 854e01e893
commit bd461e1081
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 48 additions and 46 deletions

View File

@ -622,7 +622,7 @@ struct tr_torrent_announcer
std::vector<tr_tier> tiers;
tr_tracker_callback callback = nullptr;
tr_tracker_callback callback;
private:
[[nodiscard]] static tr_announce_list getAnnounceList(tr_torrent const* tor)
@ -660,7 +660,7 @@ void publishMessage(tr_tier* tier, std::string_view msg, tr_tracker_event::Type
event.announce_url = current_tracker->announce_url;
}
(*ta->callback)(tier->tor, &event);
ta->callback(*tier->tor, &event);
}
}
@ -689,7 +689,7 @@ void publishPeerCounts(tr_tier* tier, int seeders, int leechers)
e.leechers = leechers;
tr_logAddDebugTier(tier, fmt::format("peer counts: {} seeders, {} leechers.", seeders, leechers));
(*tier->tor->torrent_announcer->callback)(tier->tor, &e);
tier->tor->torrent_announcer->callback(*tier->tor, &e);
}
}
@ -710,7 +710,7 @@ void publishPeersPex(tr_tier* tier, int seeders, int leechers, std::vector<tr_pe
leechers,
std::size(pex)));
(*tier->tor->torrent_announcer->callback)(tier->tor, &e);
tier->tor->torrent_announcer->callback(*tier->tor, &e);
}
}
} // namespace publish_helpers

View File

@ -59,7 +59,7 @@ struct tr_tracker_event
int seeders;
};
using tr_tracker_callback = void (*)(tr_torrent* tor, tr_tracker_event const* event);
using tr_tracker_callback = std::function<void(tr_torrent&, tr_tracker_event const*)>;
class tr_announcer
{

View File

@ -1025,46 +1025,6 @@ bool isNewTorrentASeed(tr_torrent* tor)
return tor->ensurePieceIsChecked(0);
}
void onTrackerResponse(tr_torrent* tor, tr_tracker_event const* event)
{
switch (event->type)
{
case tr_tracker_event::Type::Peers:
tr_logAddTraceTor(tor, fmt::format("Got {} peers from tracker", std::size(event->pex)));
tr_peerMgrAddPex(tor, TR_PEER_FROM_TRACKER, std::data(event->pex), std::size(event->pex));
break;
case tr_tracker_event::Type::Counts:
if (tor->isPrivate() && (event->leechers == 0))
{
tr_peerMgrSetSwarmIsAllSeeds(tor);
}
break;
case tr_tracker_event::Type::Warning:
tr_logAddWarnTor(tor, fmt::format(_("Tracker warning: '{warning}'"), fmt::arg("warning", event->text)));
tor->error = TR_STAT_TRACKER_WARNING;
tor->error_announce_url = event->announce_url;
tor->error_string = event->text;
break;
case tr_tracker_event::Type::Error:
tor->error = TR_STAT_TRACKER_ERROR;
tor->error_announce_url = event->announce_url;
tor->error_string = event->text;
break;
case tr_tracker_event::Type::ErrorClear:
if (tor->error != TR_STAT_LOCAL_ERROR)
{
tr_torrentClearError(tor);
}
break;
}
}
void torrentInitFromInfoDict(tr_torrent* tor)
{
tor->completion = tr_completion{ tor, &tor->blockInfo() };
@ -1212,7 +1172,7 @@ void torrentInit(tr_torrent* tor, tr_ctor const* ctor)
}
}
tor->torrent_announcer = session->announcer_->addTorrent(tor, onTrackerResponse);
tor->torrent_announcer = session->announcer_->addTorrent(tor, &tr_torrent::onTrackerResponse);
if (is_new_torrent)
{
@ -2235,6 +2195,46 @@ bool tr_torrent::setTrackerList(std::string_view text)
return true;
}
void tr_torrent::onTrackerResponse(tr_tracker_event const* event)
{
switch (event->type)
{
case tr_tracker_event::Type::Peers:
tr_logAddTraceTor(this, fmt::format("Got {} peers from tracker", std::size(event->pex)));
tr_peerMgrAddPex(this, TR_PEER_FROM_TRACKER, std::data(event->pex), std::size(event->pex));
break;
case tr_tracker_event::Type::Counts:
if (isPrivate() && (event->leechers == 0))
{
tr_peerMgrSetSwarmIsAllSeeds(this);
}
break;
case tr_tracker_event::Type::Warning:
tr_logAddWarnTor(this, fmt::format(_("Tracker warning: '{warning}'"), fmt::arg("warning", event->text)));
error = TR_STAT_TRACKER_WARNING;
error_announce_url = event->announce_url;
error_string = event->text;
break;
case tr_tracker_event::Type::Error:
error = TR_STAT_TRACKER_ERROR;
error_announce_url = event->announce_url;
error_string = event->text;
break;
case tr_tracker_event::Type::ErrorClear:
if (error != TR_STAT_LOCAL_ERROR)
{
tr_torrentClearError(this);
}
break;
}
}
bool tr_torrentSetTrackerList(tr_torrent* tor, char const* text)
{
return text != nullptr && tor->setTrackerList(text);

View File

@ -432,6 +432,8 @@ public:
bool setTrackerList(std::string_view text);
void onTrackerResponse(tr_tracker_event const* event);
/// METAINFO - WEBSEEDS
[[nodiscard]] TR_CONSTEXPR20 auto webseedCount() const noexcept