refactor: use tr_torrent_metainfo in transmission-qt (#2342)
This commit is contained in:
parent
bc4f513191
commit
68582d2ca6
|
@ -12,7 +12,9 @@
|
||||||
#include <libtransmission/transmission.h>
|
#include <libtransmission/transmission.h>
|
||||||
|
|
||||||
#include <libtransmission/crypto-utils.h> // tr_base64_encode()
|
#include <libtransmission/crypto-utils.h> // tr_base64_encode()
|
||||||
|
#include <libtransmission/torrent-metainfo.h>
|
||||||
#include <libtransmission/utils.h>
|
#include <libtransmission/utils.h>
|
||||||
|
#include <libtransmission/error.h>
|
||||||
|
|
||||||
#include "AddData.h"
|
#include "AddData.h"
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
|
@ -20,22 +22,16 @@
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
|
|
||||||
QString getNameFromMetainfo(QByteArray const& metainfo)
|
QString getNameFromMetainfo(QByteArray const& benc)
|
||||||
{
|
{
|
||||||
QString name;
|
auto metainfo = tr_torrent_metainfo{};
|
||||||
|
if (metainfo.parseBenc({ benc.constData(), size_t(benc.size()) }))
|
||||||
tr_ctor* ctor = tr_ctorNew(nullptr);
|
|
||||||
tr_ctorSetMetainfo(ctor, metainfo.constData(), metainfo.size());
|
|
||||||
|
|
||||||
auto inf = tr_info{};
|
|
||||||
if (tr_torrentParse(ctor, &inf) == TR_PARSE_OK)
|
|
||||||
{
|
{
|
||||||
name = QString::fromUtf8(inf.name); // metainfo is required to be UTF-8
|
auto const& mname = metainfo.name();
|
||||||
tr_metainfoFree(&inf);
|
return QString::fromUtf8(std::data(mname), std::size(mname));
|
||||||
}
|
}
|
||||||
|
|
||||||
tr_ctorFree(ctor);
|
return {};
|
||||||
return name;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include <libtransmission/transmission.h>
|
#include <libtransmission/transmission.h>
|
||||||
#include <libtransmission/utils.h> /* mime64 */
|
#include <libtransmission/utils.h> /* mime64 */
|
||||||
#include <libtransmission/variant.h>
|
#include <libtransmission/variant.h>
|
||||||
|
#include <libtransmission/torrent-metainfo.h>
|
||||||
|
|
||||||
#include "AddData.h"
|
#include "AddData.h"
|
||||||
#include "FileTreeModel.h"
|
#include "FileTreeModel.h"
|
||||||
|
@ -131,12 +132,7 @@ OptionsDialog::~OptionsDialog()
|
||||||
|
|
||||||
void OptionsDialog::clearInfo()
|
void OptionsDialog::clearInfo()
|
||||||
{
|
{
|
||||||
if (have_info_)
|
metainfo_.reset();
|
||||||
{
|
|
||||||
tr_metainfoFree(&info_);
|
|
||||||
}
|
|
||||||
|
|
||||||
have_info_ = false;
|
|
||||||
files_.clear();
|
files_.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,55 +140,68 @@ void OptionsDialog::reload()
|
||||||
{
|
{
|
||||||
clearInfo();
|
clearInfo();
|
||||||
|
|
||||||
tr_ctor* ctor = tr_ctorNew(nullptr);
|
auto metainfo = tr_torrent_metainfo{};
|
||||||
|
auto ok = bool{};
|
||||||
|
|
||||||
switch (add_.type)
|
switch (add_.type)
|
||||||
{
|
{
|
||||||
case AddData::MAGNET:
|
case AddData::MAGNET:
|
||||||
tr_ctorSetMetainfoFromMagnetLink(ctor, add_.magnet.toUtf8().constData());
|
{
|
||||||
break;
|
auto magnet = add_.magnet.toUtf8();
|
||||||
|
ok = metainfo.parseMagnet({ std::data(magnet), size_t(std::size(magnet)) });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case AddData::FILENAME:
|
case AddData::FILENAME:
|
||||||
tr_ctorSetMetainfoFromFile(ctor, add_.filename.toUtf8().constData());
|
{
|
||||||
break;
|
auto filename = add_.filename.toUtf8();
|
||||||
|
ok = metainfo.parseTorrentFile({ std::data(filename), size_t(std::size(filename)) });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case AddData::METAINFO:
|
case AddData::METAINFO:
|
||||||
tr_ctorSetMetainfo(ctor, add_.metainfo.constData(), add_.metainfo.size());
|
ok = metainfo.parseBenc({ std::data(add_.metainfo), size_t(std::size(add_.metainfo)) });
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
int const err = tr_torrentParse(ctor, &info_);
|
metainfo_.reset();
|
||||||
have_info_ = err == 0;
|
|
||||||
tr_ctorFree(ctor);
|
|
||||||
|
|
||||||
ui_.filesView->clear();
|
ui_.filesView->clear();
|
||||||
files_.clear();
|
files_.clear();
|
||||||
priorities_.clear();
|
priorities_.clear();
|
||||||
wanted_.clear();
|
wanted_.clear();
|
||||||
|
|
||||||
bool const have_files_to_show = have_info_ && info_.fileCount > 0;
|
if (ok)
|
||||||
|
{
|
||||||
|
metainfo_ = metainfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool const have_files_to_show = metainfo_ && !std::empty(metainfo_->files());
|
||||||
|
|
||||||
ui_.filesView->setVisible(have_files_to_show);
|
ui_.filesView->setVisible(have_files_to_show);
|
||||||
layout()->setSizeConstraint(have_files_to_show ? QLayout::SetDefaultConstraint : QLayout::SetFixedSize);
|
layout()->setSizeConstraint(have_files_to_show ? QLayout::SetDefaultConstraint : QLayout::SetFixedSize);
|
||||||
|
|
||||||
if (have_info_)
|
if (metainfo_)
|
||||||
{
|
{
|
||||||
priorities_.assign(info_.fileCount, TR_PRI_NORMAL);
|
size_t i = 0;
|
||||||
wanted_.assign(info_.fileCount, true);
|
auto const n_files = std::size(metainfo_->files());
|
||||||
|
priorities_.assign(n_files, TR_PRI_NORMAL);
|
||||||
|
wanted_.assign(n_files, true);
|
||||||
|
|
||||||
for (tr_file_index_t i = 0; i < info_.fileCount; ++i)
|
for (auto const& file : metainfo_->files())
|
||||||
{
|
{
|
||||||
TorrentFile file;
|
auto f = TorrentFile{};
|
||||||
file.index = i;
|
f.index = i;
|
||||||
file.priority = priorities_[i];
|
f.priority = priorities_[i];
|
||||||
file.wanted = wanted_[i];
|
f.wanted = wanted_[i];
|
||||||
file.size = info_.files[i].length;
|
f.size = file.length();
|
||||||
file.have = 0;
|
f.have = 0;
|
||||||
file.filename = QString::fromUtf8(info_.files[i].name);
|
f.filename = QString::fromUtf8(std::data(file.path()), std::size(file.path()));
|
||||||
files_.push_back(file);
|
files_.push_back(f);
|
||||||
|
|
||||||
|
++i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
@ -23,6 +24,10 @@
|
||||||
#include "Torrent.h" // FileList
|
#include "Torrent.h" // FileList
|
||||||
#include "ui_OptionsDialog.h"
|
#include "ui_OptionsDialog.h"
|
||||||
|
|
||||||
|
#include <libtransmission/transmission.h>
|
||||||
|
|
||||||
|
#include <libtransmission/torrent-metainfo.h>
|
||||||
|
|
||||||
class Prefs;
|
class Prefs;
|
||||||
class Session;
|
class Session;
|
||||||
|
|
||||||
|
@ -66,7 +71,6 @@ private:
|
||||||
std::vector<int> priorities_;
|
std::vector<int> priorities_;
|
||||||
Session& session_;
|
Session& session_;
|
||||||
Ui::OptionsDialog ui_ = {};
|
Ui::OptionsDialog ui_ = {};
|
||||||
tr_info info_ = {};
|
std::optional<tr_torrent_metainfo> metainfo_;
|
||||||
bool have_info_ = {};
|
|
||||||
bool is_local_ = {};
|
bool is_local_ = {};
|
||||||
};
|
};
|
||||||
|
|
|
@ -117,6 +117,11 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
explicit TorrentHash(tr_sha1_digest_t const& data)
|
||||||
|
: data_{ data }
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
explicit TorrentHash(char const* str)
|
explicit TorrentHash(char const* str)
|
||||||
{
|
{
|
||||||
data_ = tr_sha1_from_string(str != nullptr ? str : "");
|
data_ = tr_sha1_from_string(str != nullptr ? str : "");
|
||||||
|
|
|
@ -12,6 +12,8 @@
|
||||||
|
|
||||||
#include <libtransmission/transmission.h>
|
#include <libtransmission/transmission.h>
|
||||||
|
|
||||||
|
#include <libtransmission/torrent-metainfo.h>
|
||||||
|
|
||||||
#include "Prefs.h"
|
#include "Prefs.h"
|
||||||
#include "TorrentModel.h"
|
#include "TorrentModel.h"
|
||||||
#include "WatchDir.h"
|
#include "WatchDir.h"
|
||||||
|
@ -31,35 +33,18 @@ WatchDir::WatchDir(TorrentModel const& model)
|
||||||
|
|
||||||
int WatchDir::metainfoTest(QString const& filename) const
|
int WatchDir::metainfoTest(QString const& filename) const
|
||||||
{
|
{
|
||||||
int ret;
|
auto metainfo = tr_torrent_metainfo();
|
||||||
auto inf = tr_info{};
|
if (!metainfo.parseTorrentFile(filename.toUtf8().constData()))
|
||||||
tr_ctor* ctor = tr_ctorNew(nullptr);
|
|
||||||
|
|
||||||
// parse
|
|
||||||
tr_ctorSetMetainfoFromFile(ctor, filename.toUtf8().constData());
|
|
||||||
int const err = tr_torrentParse(ctor, &inf);
|
|
||||||
|
|
||||||
if (err != 0)
|
|
||||||
{
|
{
|
||||||
ret = ERROR;
|
return ERROR;
|
||||||
}
|
|
||||||
else if (model_.hasTorrent(TorrentHash(inf.hashString)))
|
|
||||||
{
|
|
||||||
ret = DUPLICATE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ret = OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// cleanup
|
if (model_.hasTorrent(TorrentHash{ metainfo.infoHash() }))
|
||||||
if (err == 0)
|
|
||||||
{
|
{
|
||||||
tr_metainfoFree(&inf);
|
return DUPLICATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
tr_ctorFree(ctor);
|
return OK;
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WatchDir::onTimeout()
|
void WatchDir::onTimeout()
|
||||||
|
|
Loading…
Reference in New Issue