Prepare for libtorrent v1.1 support

This commit is contained in:
Vladimir Golovnev (Glassez) 2016-01-20 09:57:02 +03:00
parent 31be920ba4
commit c93ada1e7b
6 changed files with 48 additions and 34 deletions

View file

@ -47,6 +47,8 @@ using namespace BitTorrent;
#include <queue> #include <queue>
#include <vector> #include <vector>
#include <boost/bind.hpp>
#include <libtorrent/session.hpp> #include <libtorrent/session.hpp>
#include <libtorrent/lazy_entry.hpp> #include <libtorrent/lazy_entry.hpp>
#include <libtorrent/bencode.hpp> #include <libtorrent/bencode.hpp>
@ -951,10 +953,8 @@ bool Session::addTorrent(QString source, const AddTorrentParams &params)
adjustLimits(); adjustLimits();
// use common 2nd step of torrent addition // 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)); m_addingTorrents.insert(hash, addDataFromParams(params));
handleAddTorrentAlert(alert); createTorrentHandle(handle);
delete alert;
return true; return true;
} }
@ -2060,26 +2060,18 @@ void Session::dispatchTorrentAlert(libt::alert *a)
torrent->handleAlert(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 // 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); m_torrents.insert(torrent->hash(), torrent);
Preferences *const pref = Preferences::instance(); Preferences *const pref = Preferences::instance();
Logger *const logger = Logger::instance();
bool fromMagnetUri = !torrent->hasMetadata(); bool fromMagnetUri = !torrent->hasMetadata();
@ -2133,7 +2125,20 @@ void Session::handleAddTorrentAlert(libtorrent::add_torrent_alert *p)
emit torrentAdded(torrent); 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)) if (m_loadedMetadata.contains(p->info_hash))
emit metadataLoaded(m_loadedMetadata.take(p->info_hash)); emit metadataLoaded(m_loadedMetadata.take(p->info_hash));
@ -2271,7 +2276,7 @@ void Session::handleListenFailedAlert(libt::listen_failed_alert *p)
qDebug() << "Failed listening on " << proto << p->endpoint.address().to_string(ec).c_str() << "/" << p->endpoint.port(); qDebug() << "Failed listening on " << proto << p->endpoint.address().to_string(ec).c_str() << "/" << p->endpoint.port();
Logger::instance()->addMessage( Logger::instance()->addMessage(
tr("qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4.", 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(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); .arg(QString::fromLocal8Bit(p->error.message().c_str())), Log::CRITICAL);
} }

View file

@ -45,13 +45,15 @@
namespace libtorrent namespace libtorrent
{ {
class session; class session;
struct torrent_handle;
class entry; class entry;
struct add_torrent_params; struct add_torrent_params;
struct pe_settings; struct pe_settings;
struct proxy_settings;
struct session_settings; struct session_settings;
struct session_status; struct session_status;
struct proxy_settings;
class alert; class alert;
struct torrent_alert; struct torrent_alert;
struct state_update_alert; struct state_update_alert;
@ -313,6 +315,8 @@ namespace BitTorrent
void handleListenFailedAlert(libtorrent::listen_failed_alert *p); void handleListenFailedAlert(libtorrent::listen_failed_alert *p);
void handleExternalIPAlert(libtorrent::external_ip_alert *p); void handleExternalIPAlert(libtorrent::external_ip_alert *p);
void createTorrentHandle(const libtorrent::torrent_handle &nativeHandle);
void saveResumeData(); void saveResumeData();
bool writeResumeDataFile(TorrentHandle *const torrent, const libtorrent::entry &data); bool writeResumeDataFile(TorrentHandle *const torrent, const libtorrent::entry &data);

View file

@ -55,7 +55,7 @@ using namespace BitTorrent;
// name starts with a . // name starts with a .
bool fileFilter(const std::string &f) bool fileFilter(const std::string &f)
{ {
return (libt::filename(f)[0] != '.'); return !Utils::Fs::fileName(Utils::String::fromStdString(f)).startsWith('.');
} }
TorrentCreatorThread::TorrentCreatorThread(QObject *parent) TorrentCreatorThread::TorrentCreatorThread(QObject *parent)

View file

@ -40,6 +40,7 @@
#include <libtorrent/alert_types.hpp> #include <libtorrent/alert_types.hpp>
#include <libtorrent/create_torrent.hpp> #include <libtorrent/create_torrent.hpp>
#include <libtorrent/magnet_uri.hpp> #include <libtorrent/magnet_uri.hpp>
#include <boost/bind.hpp> #include <boost/bind.hpp>
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
@ -433,7 +434,7 @@ bool TorrentHandle::connectPeer(const PeerAddress &peerAddress)
libt::address addr = libt::address::from_string(Utils::String::toStdString(peerAddress.ip.toString()), ec); libt::address addr = libt::address::from_string(Utils::String::toStdString(peerAddress.ip.toString()), ec);
if (ec) return false; 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); SAFE_CALL_BOOL(connect_peer, ep);
} }
@ -847,7 +848,7 @@ qulonglong TorrentHandle::eta() const
QVector<qreal> TorrentHandle::filesProgress() const QVector<qreal> TorrentHandle::filesProgress() const
{ {
std::vector<libt::size_type> fp; std::vector<boost::int64_t> fp;
QVector<qreal> result; QVector<qreal> result;
SAFE_CALL(file_progress, fp, libt::torrent_handle::piece_granularity); SAFE_CALL(file_progress, fp, libt::torrent_handle::piece_granularity);
@ -1022,9 +1023,9 @@ qreal TorrentHandle::maxRatio(bool *usesGlobalRatio) const
qreal TorrentHandle::realRatio() 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 // 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) if (download == 0)
return (upload == 0) ? 0.0 : MAX_RATIO; return (upload == 0) ? 0.0 : MAX_RATIO;
@ -1689,7 +1690,6 @@ libtorrent::torrent_handle TorrentHandle::nativeHandle() const
void TorrentHandle::updateTorrentInfo() void TorrentHandle::updateTorrentInfo()
{ {
if (!hasMetadata()) return; if (!hasMetadata()) return;
m_torrentInfo = TorrentInfo(m_nativeStatus.torrent_file); m_torrentInfo = TorrentInfo(m_nativeStatus.torrent_file);
} }

View file

@ -43,8 +43,8 @@
namespace libt = libtorrent; namespace libt = libtorrent;
using namespace BitTorrent; using namespace BitTorrent;
TorrentInfo::TorrentInfo(boost::intrusive_ptr<const libt::torrent_info> nativeInfo) TorrentInfo::TorrentInfo(NativeConstPtr nativeInfo)
: m_nativeInfo(const_cast<libt::torrent_info *>(nativeInfo.get())) : m_nativeInfo(nativeInfo)
{ {
} }
@ -63,7 +63,7 @@ TorrentInfo TorrentInfo::loadFromFile(const QString &path, QString &error)
{ {
error.clear(); error.clear();
libt::error_code ec; 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) { if (ec) {
error = QString::fromUtf8(ec.message().c_str()); error = QString::fromUtf8(ec.message().c_str());
qDebug("Cannot load .torrent file: %s", qPrintable(error)); qDebug("Cannot load .torrent file: %s", qPrintable(error));
@ -214,10 +214,10 @@ QByteArray TorrentInfo::metadata() const
void TorrentInfo::renameFile(uint index, const QString &newPath) void TorrentInfo::renameFile(uint index, const QString &newPath)
{ {
if (!isValid()) return; if (!isValid()) return;
m_nativeInfo->rename_file(index, Utils::String::toStdString(newPath)); nativeInfo()->rename_file(index, Utils::String::toStdString(newPath));
} }
boost::intrusive_ptr<libtorrent::torrent_info> TorrentInfo::nativeInfo() const TorrentInfo::NativePtr TorrentInfo::nativeInfo() const
{ {
return m_nativeInfo; return *reinterpret_cast<const NativePtr *>(&m_nativeInfo);
} }

View file

@ -30,6 +30,7 @@
#define BITTORRENT_TORRENTINFO_H #define BITTORRENT_TORRENTINFO_H
#include <QtGlobal> #include <QtGlobal>
#include <libtorrent/torrent_info.hpp> #include <libtorrent/torrent_info.hpp>
class QString; class QString;
@ -47,7 +48,10 @@ namespace BitTorrent
class TorrentInfo class TorrentInfo
{ {
public: public:
explicit TorrentInfo(boost::intrusive_ptr<const libtorrent::torrent_info> nativeInfo = boost::intrusive_ptr<const libtorrent::torrent_info>()); typedef boost::intrusive_ptr<const libtorrent::torrent_info> NativeConstPtr;
typedef boost::intrusive_ptr<libtorrent::torrent_info> NativePtr;
explicit TorrentInfo(NativeConstPtr nativeInfo = NativeConstPtr());
TorrentInfo(const TorrentInfo &other); TorrentInfo(const TorrentInfo &other);
static TorrentInfo loadFromFile(const QString &path, QString &error); static TorrentInfo loadFromFile(const QString &path, QString &error);
@ -77,10 +81,11 @@ namespace BitTorrent
QByteArray metadata() const; QByteArray metadata() const;
void renameFile(uint index, const QString &newPath); void renameFile(uint index, const QString &newPath);
boost::intrusive_ptr<libtorrent::torrent_info> nativeInfo() const;
NativePtr nativeInfo() const;
private: private:
boost::intrusive_ptr<libtorrent::torrent_info> m_nativeInfo; NativeConstPtr m_nativeInfo;
}; };
} }