diff --git a/src/base/bittorrent/cachestatus.cpp b/src/base/bittorrent/cachestatus.cpp index b7a7e960d..5117f531a 100644 --- a/src/base/bittorrent/cachestatus.cpp +++ b/src/base/bittorrent/cachestatus.cpp @@ -26,6 +26,7 @@ * exception statement from your version. */ +#include #include "cachestatus.h" using namespace BitTorrent; @@ -50,7 +51,11 @@ qreal CacheStatus::readRatio() const int CacheStatus::jobQueueLength() const { +#if LIBTORRENT_VERSION_NUM < 10100 return m_nativeStatus.job_queue_length; +#else + return m_nativeStatus.queued_jobs; +#endif } int CacheStatus::averageJobTime() const diff --git a/src/base/bittorrent/cachestatus.h b/src/base/bittorrent/cachestatus.h index d42a7b4ae..7f03cff82 100644 --- a/src/base/bittorrent/cachestatus.h +++ b/src/base/bittorrent/cachestatus.h @@ -29,8 +29,8 @@ #ifndef BITTORRENT_CACHESTATUS_H #define BITTORRENT_CACHESTATUS_H -#include #include +#include namespace BitTorrent { diff --git a/src/base/bittorrent/session.cpp b/src/base/bittorrent/session.cpp index 73fbf321a..e80fdd0f4 100644 --- a/src/base/bittorrent/session.cpp +++ b/src/base/bittorrent/session.cpp @@ -47,6 +47,8 @@ using namespace BitTorrent; #include #include +#include + #include #include #include @@ -358,7 +360,12 @@ void Session::setSessionSettings() sessionSettings.active_lsd_limit = -1; // Outgoing ports +#if LIBTORRENT_VERSION_NUM < 10100 sessionSettings.outgoing_ports = std::make_pair(pref->outgoingPortsMin(), pref->outgoingPortsMax()); +#else + sessionSettings.outgoing_port = pref->outgoingPortsMin(); + sessionSettings.num_outgoing_ports = pref->outgoingPortsMax() - pref->outgoingPortsMin(); +#endif // Ignore limits on LAN qDebug() << "Ignore limits on LAN" << pref->getIgnoreLimitsOnLAN(); sessionSettings.ignore_limits_on_local_network = pref->getIgnoreLimitsOnLAN(); @@ -951,10 +958,8 @@ bool Session::addTorrent(QString source, const AddTorrentParams ¶ms) adjustLimits(); // use common 2nd step of torrent addition - libt::add_torrent_alert *alert = new libt::add_torrent_alert(handle, libt::add_torrent_params(), libt::error_code()); m_addingTorrents.insert(hash, addDataFromParams(params)); - handleAddTorrentAlert(alert); - delete alert; + createTorrentHandle(handle); return true; } @@ -2060,26 +2065,18 @@ void Session::dispatchTorrentAlert(libt::alert *a) torrent->handleAlert(a); } -void Session::handleAddTorrentAlert(libtorrent::add_torrent_alert *p) +void Session::createTorrentHandle(const libt::torrent_handle &nativeHandle) { - Logger *const logger = Logger::instance(); - if (p->error) { - qDebug("/!\\ Error: Failed to add torrent!"); - QString msg = Utils::String::fromStdString(p->message()); - logger->addMessage(tr("Couldn't add torrent. Reason: %1").arg(msg), Log::WARNING); - emit addTorrentFailed(msg); - return; - } - // Magnet added for preload its metadata - if (!m_addingTorrents.contains(p->handle.info_hash())) return; + if (!m_addingTorrents.contains(nativeHandle.info_hash())) return; - AddTorrentData data = m_addingTorrents.take(p->handle.info_hash()); + AddTorrentData data = m_addingTorrents.take(nativeHandle.info_hash()); - TorrentHandle *const torrent = new TorrentHandle(this, p->handle, data); + TorrentHandle *const torrent = new TorrentHandle(this, nativeHandle, data); m_torrents.insert(torrent->hash(), torrent); Preferences *const pref = Preferences::instance(); + Logger *const logger = Logger::instance(); bool fromMagnetUri = !torrent->hasMetadata(); @@ -2133,7 +2130,20 @@ void Session::handleAddTorrentAlert(libtorrent::add_torrent_alert *p) emit torrentAdded(torrent); } -void Session::handleTorrentRemovedAlert(libtorrent::torrent_removed_alert *p) +void Session::handleAddTorrentAlert(libt::add_torrent_alert *p) +{ + if (p->error) { + qDebug("/!\\ Error: Failed to add torrent!"); + QString msg = Utils::String::fromStdString(p->message()); + Logger::instance()->addMessage(tr("Couldn't add torrent. Reason: %1").arg(msg), Log::WARNING); + emit addTorrentFailed(msg); + } + else { + createTorrentHandle(p->handle); + } +} + +void Session::handleTorrentRemovedAlert(libt::torrent_removed_alert *p) { if (m_loadedMetadata.contains(p->info_hash)) emit metadataLoaded(m_loadedMetadata.take(p->info_hash)); @@ -2256,7 +2266,6 @@ void Session::handleListenSucceededAlert(libt::listen_succeeded_alert *p) void Session::handleListenFailedAlert(libt::listen_failed_alert *p) { - boost::system::error_code ec; QString proto = "TCP"; if (p->sock_type == libt::listen_failed_alert::udp) proto = "UDP"; @@ -2268,12 +2277,24 @@ void Session::handleListenFailedAlert(libt::listen_failed_alert *p) proto = "I2P"; else if (p->sock_type == libt::listen_failed_alert::socks5) proto = "SOCKS5"; + +#if LIBTORRENT_VERSION_NUM < 10100 + boost::system::error_code ec; qDebug() << "Failed listening on " << proto << p->endpoint.address().to_string(ec).c_str() << "/" << p->endpoint.port(); Logger::instance()->addMessage( tr("qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4.", - "e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use") + "e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use.") .arg(p->endpoint.address().to_string(ec).c_str()).arg(proto).arg(QString::number(p->endpoint.port())) .arg(QString::fromLocal8Bit(p->error.message().c_str())), Log::CRITICAL); +#else + qDebug() << "Failed listening on " << proto << p->listen_interface(); + Logger::instance()->addMessage( + tr("qBittorrent failed listening on interface %1 [%2]. Reason: %3.", + "e.g: qBittorrent failed listening on interface 192.168.0.1 [TCP]. Reason: already in use.") + .arg(QString::fromUtf8(p->listen_interface())) + .arg(proto) + .arg(Utils::String::fromStdString(p->error.message())), Log::CRITICAL); +#endif } void Session::handleExternalIPAlert(libt::external_ip_alert *p) diff --git a/src/base/bittorrent/session.h b/src/base/bittorrent/session.h index ee945512b..6eea60981 100644 --- a/src/base/bittorrent/session.h +++ b/src/base/bittorrent/session.h @@ -38,6 +38,8 @@ #include #include +#include + #include "base/tristatebool.h" #include "base/types.h" #include "torrentinfo.h" @@ -45,13 +47,24 @@ namespace libtorrent { class session; + struct torrent_handle; class entry; struct add_torrent_params; struct pe_settings; - struct proxy_settings; struct session_settings; struct session_status; +#if LIBTORRENT_VERSION_NUM < 10100 + struct proxy_settings; +#else + namespace aux + { + struct proxy_settings; + } + + typedef aux::proxy_settings proxy_settings; +#endif + class alert; struct torrent_alert; struct state_update_alert; @@ -313,6 +326,8 @@ namespace BitTorrent void handleListenFailedAlert(libtorrent::listen_failed_alert *p); void handleExternalIPAlert(libtorrent::external_ip_alert *p); + void createTorrentHandle(const libtorrent::torrent_handle &nativeHandle); + void saveResumeData(); bool writeResumeDataFile(TorrentHandle *const torrent, const libtorrent::entry &data); diff --git a/src/base/bittorrent/torrentcreatorthread.cpp b/src/base/bittorrent/torrentcreatorthread.cpp index ea82c44e1..2669c5af1 100644 --- a/src/base/bittorrent/torrentcreatorthread.cpp +++ b/src/base/bittorrent/torrentcreatorthread.cpp @@ -55,7 +55,7 @@ using namespace BitTorrent; // name starts with a . bool fileFilter(const std::string &f) { - return (libt::filename(f)[0] != '.'); + return !Utils::Fs::fileName(Utils::String::fromStdString(f)).startsWith('.'); } TorrentCreatorThread::TorrentCreatorThread(QObject *parent) diff --git a/src/base/bittorrent/torrenthandle.cpp b/src/base/bittorrent/torrenthandle.cpp index 708ac482e..4707b5f77 100644 --- a/src/base/bittorrent/torrenthandle.cpp +++ b/src/base/bittorrent/torrenthandle.cpp @@ -40,6 +40,10 @@ #include #include #include +#if LIBTORRENT_VERSION_NUM >= 10100 +#include +#endif + #include #ifdef Q_OS_WIN @@ -433,7 +437,7 @@ bool TorrentHandle::connectPeer(const PeerAddress &peerAddress) libt::address addr = libt::address::from_string(Utils::String::toStdString(peerAddress.ip.toString()), ec); if (ec) return false; - libt::asio::ip::tcp::endpoint ep(addr, peerAddress.port); + boost::asio::ip::tcp::endpoint ep(addr, peerAddress.port); SAFE_CALL_BOOL(connect_peer, ep); } @@ -847,7 +851,7 @@ qulonglong TorrentHandle::eta() const QVector TorrentHandle::filesProgress() const { - std::vector fp; + std::vector fp; QVector result; SAFE_CALL(file_progress, fp, libt::torrent_handle::piece_granularity); @@ -1022,9 +1026,9 @@ qreal TorrentHandle::maxRatio(bool *usesGlobalRatio) const qreal TorrentHandle::realRatio() const { - libt::size_type upload = m_nativeStatus.all_time_upload; + boost::int64_t upload = m_nativeStatus.all_time_upload; // special case for a seeder who lost its stats, also assume nobody will import a 99% done torrent - libt::size_type download = (m_nativeStatus.all_time_download < m_nativeStatus.total_done * 0.01) ? m_nativeStatus.total_done : m_nativeStatus.all_time_download; + boost::int64_t download = (m_nativeStatus.all_time_download < m_nativeStatus.total_done * 0.01) ? m_nativeStatus.total_done : m_nativeStatus.all_time_download; if (download == 0) return (upload == 0) ? 0.0 : MAX_RATIO; @@ -1066,7 +1070,11 @@ int TorrentHandle::connectionsLimit() const qlonglong TorrentHandle::nextAnnounce() const { +#if LIBTORRENT_VERSION_NUM < 10100 return m_nativeStatus.next_announce.total_seconds(); +#else + return libt::duration_cast(m_nativeStatus.next_announce).count(); +#endif } void TorrentHandle::setName(const QString &name) @@ -1689,8 +1697,11 @@ libtorrent::torrent_handle TorrentHandle::nativeHandle() const void TorrentHandle::updateTorrentInfo() { if (!hasMetadata()) return; - +#if LIBTORRENT_VERSION_NUM < 10100 m_torrentInfo = TorrentInfo(m_nativeStatus.torrent_file); +#else + m_torrentInfo = TorrentInfo(m_nativeStatus.torrent_file.lock()); +#endif } void TorrentHandle::initialize() diff --git a/src/base/bittorrent/torrenthandle.h b/src/base/bittorrent/torrenthandle.h index d6679cbe8..882cdb029 100644 --- a/src/base/bittorrent/torrenthandle.h +++ b/src/base/bittorrent/torrenthandle.h @@ -38,6 +38,11 @@ #include #include +#include +#if LIBTORRENT_VERSION_NUM >= 10100 +#include +#endif + #include #include "base/tristatebool.h" diff --git a/src/base/bittorrent/torrentinfo.cpp b/src/base/bittorrent/torrentinfo.cpp index d7da2f517..ffe2ad90c 100644 --- a/src/base/bittorrent/torrentinfo.cpp +++ b/src/base/bittorrent/torrentinfo.cpp @@ -43,8 +43,8 @@ namespace libt = libtorrent; using namespace BitTorrent; -TorrentInfo::TorrentInfo(boost::intrusive_ptr nativeInfo) - : m_nativeInfo(const_cast(nativeInfo.get())) +TorrentInfo::TorrentInfo(NativeConstPtr nativeInfo) + : m_nativeInfo(nativeInfo) { } @@ -63,7 +63,7 @@ TorrentInfo TorrentInfo::loadFromFile(const QString &path, QString &error) { error.clear(); libt::error_code ec; - TorrentInfo info(new libt::torrent_info(Utils::String::toStdString(Utils::Fs::toNativePath(path)), ec)); + TorrentInfo info(NativePtr(new libt::torrent_info(Utils::String::toStdString(Utils::Fs::toNativePath(path)), ec))); if (ec) { error = QString::fromUtf8(ec.message().c_str()); qDebug("Cannot load .torrent file: %s", qPrintable(error)); @@ -214,10 +214,10 @@ QByteArray TorrentInfo::metadata() const void TorrentInfo::renameFile(uint index, const QString &newPath) { if (!isValid()) return; - m_nativeInfo->rename_file(index, Utils::String::toStdString(newPath)); + nativeInfo()->rename_file(index, Utils::String::toStdString(newPath)); } -boost::intrusive_ptr TorrentInfo::nativeInfo() const +TorrentInfo::NativePtr TorrentInfo::nativeInfo() const { - return m_nativeInfo; + return *reinterpret_cast(&m_nativeInfo); } diff --git a/src/base/bittorrent/torrentinfo.h b/src/base/bittorrent/torrentinfo.h index 392fa8b46..f3900a825 100644 --- a/src/base/bittorrent/torrentinfo.h +++ b/src/base/bittorrent/torrentinfo.h @@ -30,7 +30,9 @@ #define BITTORRENT_TORRENTINFO_H #include + #include +#include class QString; class QUrl; @@ -47,7 +49,15 @@ namespace BitTorrent class TorrentInfo { public: - explicit TorrentInfo(boost::intrusive_ptr nativeInfo = boost::intrusive_ptr()); +#if LIBTORRENT_VERSION_NUM < 10100 + typedef boost::intrusive_ptr NativeConstPtr; + typedef boost::intrusive_ptr NativePtr; +#else + typedef boost::shared_ptr NativeConstPtr; + typedef boost::shared_ptr NativePtr; +#endif + + explicit TorrentInfo(NativeConstPtr nativeInfo = NativeConstPtr()); TorrentInfo(const TorrentInfo &other); static TorrentInfo loadFromFile(const QString &path, QString &error); @@ -77,10 +87,11 @@ namespace BitTorrent QByteArray metadata() const; void renameFile(uint index, const QString &newPath); - boost::intrusive_ptr nativeInfo() const; + + NativePtr nativeInfo() const; private: - boost::intrusive_ptr m_nativeInfo; + NativeConstPtr m_nativeInfo; }; } diff --git a/src/base/bittorrent/trackerentry.h b/src/base/bittorrent/trackerentry.h index edfcac434..f9d2187c4 100644 --- a/src/base/bittorrent/trackerentry.h +++ b/src/base/bittorrent/trackerentry.h @@ -30,6 +30,10 @@ #define BITTORRENT_TRACKERENTRY_H #include +#include +#if LIBTORRENT_VERSION_NUM >= 10100 +#include +#endif class QString; diff --git a/winconf-msvc.pri b/winconf-msvc.pri index 7dec4f6d9..ca77d8b96 100644 --- a/winconf-msvc.pri +++ b/winconf-msvc.pri @@ -15,9 +15,6 @@ QMAKE_LFLAGS += "/OPT:REF /OPT:ICF" RC_FILE = qbittorrent.rc -# Enable Wide characters -DEFINES += TORRENT_USE_WPATH - # Adapt the lib names/versions accordingly CONFIG(debug, debug|release) { LIBS += libtorrentd.lib \