From 10cdbef4bb0e70810f87daf708b5009852903d99 Mon Sep 17 00:00:00 2001 From: "Vladimir Golovnev (Glassez)" Date: Thu, 6 Feb 2025 12:49:41 +0300 Subject: [PATCH] Support libtorrent master --- src/base/bittorrent/peerinfo.cpp | 24 +++++++++++---- src/base/bittorrent/sessionimpl.cpp | 45 ++++++++++++++++++++++++----- src/base/bittorrent/torrentimpl.cpp | 12 ++++++-- 3 files changed, 65 insertions(+), 16 deletions(-) diff --git a/src/base/bittorrent/peerinfo.cpp b/src/base/bittorrent/peerinfo.cpp index 3706b1e81174..1e6d59644547 100644 --- a/src/base/bittorrent/peerinfo.cpp +++ b/src/base/bittorrent/peerinfo.cpp @@ -28,6 +28,8 @@ #include "peerinfo.h" +#include + #include #include "base/bittorrent/ltqbitarray.h" @@ -36,6 +38,17 @@ #include "base/utils/bytearray.h" #include "peeraddress.h" +namespace +{ +#ifdef QBT_USES_LIBTORRENT2 + QString toI2PAddress(const lt::sha256_hash &destHash) + { + const QByteArray base32Dest = Utils::ByteArray::toBase32({destHash.data(), destHash.size()}).replace('=', "").toLower(); + return QString::fromLatin1(base32Dest) + u".b32.i2p"; + } +#endif +} + using namespace BitTorrent; PeerInfo::PeerInfo(const lt::peer_info &nativeInfo, const QBitArray &allPieces) @@ -172,11 +185,16 @@ PeerAddress PeerInfo::address() const if (useI2PSocket()) return {}; +#if LIBTORRENT_VERSION_NUM < 20100 // fast path for platforms which boost.asio internal struct maps to `sockaddr` return {QHostAddress(m_nativeInfo.ip.data()), m_nativeInfo.ip.port()}; // slow path for the others //return {QHostAddress(QString::fromStdString(m_nativeInfo.ip.address().to_string())) // , m_nativeInfo.ip.port()}; +#else + const lt::tcp::endpoint remoteEndpoint = m_nativeInfo.remote_endpoint(); + return {QHostAddress(remoteEndpoint.data()), remoteEndpoint.port()}; +#endif } QString PeerInfo::I2PAddress() const @@ -186,11 +204,7 @@ QString PeerInfo::I2PAddress() const #if defined(QBT_USES_LIBTORRENT2) && TORRENT_USE_I2P if (m_I2PAddress.isEmpty()) - { - const lt::sha256_hash destHash = m_nativeInfo.i2p_destination(); - const QByteArray base32Dest = Utils::ByteArray::toBase32({destHash.data(), destHash.size()}).replace('=', "").toLower(); - m_I2PAddress = QString::fromLatin1(base32Dest) + u".b32.i2p"; - } + m_I2PAddress = toI2PAddress(m_nativeInfo.i2p_destination()); #endif return m_I2PAddress; diff --git a/src/base/bittorrent/sessionimpl.cpp b/src/base/bittorrent/sessionimpl.cpp index 0275dea4ed74..f1ca9614ec76 100644 --- a/src/base/bittorrent/sessionimpl.cpp +++ b/src/base/bittorrent/sessionimpl.cpp @@ -83,6 +83,7 @@ #include "base/preferences.h" #include "base/profile.h" #include "base/unicodestrings.h" +#include "base/utils/bytearray.h" #include "base/utils/fs.h" #include "base/utils/io.h" #include "base/utils/net.h" @@ -199,6 +200,10 @@ namespace #endif case lt::socket_type_t::i2p: return u"I2P"_s; +#if LIBTORRENT_VERSION_NUM >= 20100 + case lt::socket_type_t::rtc: + return u"WebRTC"_s; +#endif case lt::socket_type_t::socks5: return u"SOCKS5"_s; #ifdef QBT_USES_LIBTORRENT2 @@ -235,6 +240,14 @@ namespace return {}; } +#ifdef QBT_USES_LIBTORRENT2 + QString toI2PAddress(const lt::sha256_hash &destHash) + { + const QByteArray base32Dest = Utils::ByteArray::toBase32({destHash.data(), destHash.size()}).replace('=', "").toLower(); + return QString::fromLatin1(base32Dest) + u".b32.i2p"; + } +#endif + template struct LowerLimited { @@ -6031,6 +6044,15 @@ void SessionImpl::handlePortmapAlert(const lt::portmap_alert *alert) void SessionImpl::handlePeerBlockedAlert(const lt::peer_blocked_alert *alert) { +#if LIBTORRENT_VERSION_NUM < 20100 + const lt::tcp::endpoint peerIPEndpoint = alert->endpoint; + const QString peerAddress = toString(peerIPEndpoint.address()); +#else + const auto peerIPEndpointPtr = std::get_if(&alert->ep); + const auto peerIPEndpoint = peerIPEndpointPtr ? static_cast(*peerIPEndpointPtr) : lt::tcp::endpoint(); + const QString peerAddress = peerIPEndpointPtr + ? toString(peerIPEndpoint.address()) : toI2PAddress(std::get(alert->ep)); +#endif QString reason; switch (alert->reason) { @@ -6038,13 +6060,13 @@ void SessionImpl::handlePeerBlockedAlert(const lt::peer_blocked_alert *alert) reason = tr("IP filter", "this peer was blocked. Reason: IP filter."); break; case lt::peer_blocked_alert::port_filter: - reason = tr("filtered port (%1)", "this peer was blocked. Reason: filtered port (8899).").arg(QString::number(alert->endpoint.port())); + reason = tr("filtered port (%1)", "this peer was blocked. Reason: filtered port (8899).").arg(QString::number(peerIPEndpoint.port())); break; case lt::peer_blocked_alert::i2p_mixed: reason = tr("%1 mixed mode restrictions", "this peer was blocked. Reason: I2P mixed mode restrictions.").arg(u"I2P"_s); // don't translate I2P break; case lt::peer_blocked_alert::privileged_ports: - reason = tr("privileged port (%1)", "this peer was blocked. Reason: privileged port (80).").arg(QString::number(alert->endpoint.port())); + reason = tr("privileged port (%1)", "this peer was blocked. Reason: privileged port (80).").arg(QString::number(peerIPEndpoint.port())); break; case lt::peer_blocked_alert::utp_disabled: reason = tr("%1 is disabled", "this peer was blocked. Reason: uTP is disabled.").arg(C_UTP); // don't translate μTP @@ -6054,16 +6076,23 @@ void SessionImpl::handlePeerBlockedAlert(const lt::peer_blocked_alert *alert) break; } - const QString ip {toString(alert->endpoint.address())}; - if (!ip.isEmpty()) - Logger::instance()->addPeer(ip, true, reason); + if (!peerAddress.isEmpty()) + Logger::instance()->addPeer(peerAddress, true, reason); } void SessionImpl::handlePeerBanAlert(const lt::peer_ban_alert *alert) { - const QString ip {toString(alert->endpoint.address())}; - if (!ip.isEmpty()) - Logger::instance()->addPeer(ip, false); +#if LIBTORRENT_VERSION_NUM < 20100 + const lt::tcp::endpoint peerIPEndpoint = alert->endpoint; + const QString peerAddress = toString(peerIPEndpoint.address()); +#else + const auto peerIPEndpointPtr = std::get_if(&alert->ep); + const auto peerIPEndpoint = peerIPEndpointPtr ? static_cast(*peerIPEndpointPtr) : lt::tcp::endpoint(); + const QString peerAddress = peerIPEndpointPtr + ? toString(peerIPEndpoint.address()) : toI2PAddress(std::get(alert->ep)); +#endif + if (!peerAddress.isEmpty()) + Logger::instance()->addPeer(peerAddress, false); } void SessionImpl::handleUrlSeedAlert(const lt::url_seed_alert *alert) diff --git a/src/base/bittorrent/torrentimpl.cpp b/src/base/bittorrent/torrentimpl.cpp index af1afc49863f..fe01b01bc0f9 100644 --- a/src/base/bittorrent/torrentimpl.cpp +++ b/src/base/bittorrent/torrentimpl.cpp @@ -837,7 +837,11 @@ bool TorrentImpl::connectPeer(const PeerAddress &peerAddress) bool TorrentImpl::needSaveResumeData() const { +#if LIBTORRENT_VERSION_NUM < 20100 return m_nativeStatus.need_save_resume; +#else + return static_cast(m_nativeStatus.need_save_resume_data); +#endif } void TorrentImpl::requestResumeData(const lt::resume_data_flags_t flags) @@ -1885,9 +1889,11 @@ void TorrentImpl::reload() m_nativeSession->remove_torrent(m_nativeHandle, lt::session::delete_partfile); lt::add_torrent_params p = m_ltAddTorrentParams; - p.flags |= lt::torrent_flags::update_subscribe - | lt::torrent_flags::override_trackers + p.flags |= lt::torrent_flags::update_subscribe; +#if LIBTORRENT_VERSION_NUM < 20100 + p.flags |= lt::torrent_flags::override_trackers | lt::torrent_flags::override_web_seeds; +#endif if (m_isStopped) { @@ -2096,7 +2102,7 @@ void TorrentImpl::handleTorrentCheckedAlert([[maybe_unused]] const lt::torrent_c } } - if (m_nativeStatus.need_save_resume) + if (needSaveResumeData()) deferredRequestResumeData(); m_session->handleTorrentChecked(this);