mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2025-12-20 15:37:26 -06:00
Drop implicit conversions between InfoHash and QString
This commit is contained in:
committed by
sledgehammer999
parent
9c664d04ae
commit
f16c585a77
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Bittorrent Client using Qt and libtorrent.
|
||||
* Copyright (C) 2015 Vladimir Golovnev <glassez@yandex.ru>
|
||||
* Copyright (C) 2015, 2021 Vladimir Golovnev <glassez@yandex.ru>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@@ -36,28 +36,13 @@ using namespace BitTorrent;
|
||||
const int InfoHashTypeId = qRegisterMetaType<InfoHash>();
|
||||
|
||||
InfoHash::InfoHash(const lt::sha1_hash &nativeHash)
|
||||
: m_valid(true)
|
||||
, m_nativeHash(nativeHash)
|
||||
: m_valid {true}
|
||||
, m_nativeHash {nativeHash}
|
||||
{
|
||||
const QByteArray raw = QByteArray::fromRawData(nativeHash.data(), length());
|
||||
m_hashString = QString::fromLatin1(raw.toHex());
|
||||
}
|
||||
|
||||
InfoHash::InfoHash(const QString &hashString)
|
||||
: m_valid(false)
|
||||
{
|
||||
if (hashString.size() != (length() * 2))
|
||||
return;
|
||||
|
||||
const QByteArray raw = QByteArray::fromHex(hashString.toLatin1());
|
||||
if (raw.size() != length()) // QByteArray::fromHex() will skip over invalid characters
|
||||
return;
|
||||
|
||||
m_valid = true;
|
||||
m_hashString = hashString;
|
||||
m_nativeHash.assign(raw.constData());
|
||||
}
|
||||
|
||||
bool InfoHash::isValid() const
|
||||
{
|
||||
return m_valid;
|
||||
@@ -68,7 +53,24 @@ InfoHash::operator lt::sha1_hash() const
|
||||
return m_nativeHash;
|
||||
}
|
||||
|
||||
InfoHash::operator QString() const
|
||||
InfoHash InfoHash::fromString(const QString &hashString)
|
||||
{
|
||||
if (hashString.size() != (length() * 2))
|
||||
return {};
|
||||
|
||||
const QByteArray raw = QByteArray::fromHex(hashString.toLatin1());
|
||||
if (raw.size() != length()) // QByteArray::fromHex() will skip over invalid characters
|
||||
return {};
|
||||
|
||||
InfoHash result;
|
||||
result.m_valid = true;
|
||||
result.m_hashString = hashString;
|
||||
result.m_nativeHash.assign(raw.constData());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
QString InfoHash::toString() const
|
||||
{
|
||||
return m_hashString;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Bittorrent Client using Qt and libtorrent.
|
||||
* Copyright (C) 2015 Vladimir Golovnev <glassez@yandex.ru>
|
||||
* Copyright (C) 2015, 2021 Vladimir Golovnev <glassez@yandex.ru>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@@ -40,7 +40,6 @@ namespace BitTorrent
|
||||
public:
|
||||
InfoHash() = default;
|
||||
InfoHash(const lt::sha1_hash &nativeHash);
|
||||
InfoHash(const QString &hashString);
|
||||
InfoHash(const InfoHash &other) = default;
|
||||
|
||||
static constexpr int length()
|
||||
@@ -51,7 +50,9 @@ namespace BitTorrent
|
||||
bool isValid() const;
|
||||
|
||||
operator lt::sha1_hash() const;
|
||||
operator QString() const;
|
||||
|
||||
static InfoHash fromString(const QString &hashString);
|
||||
QString toString() const;
|
||||
|
||||
private:
|
||||
bool m_valid = false;
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
|
||||
namespace
|
||||
{
|
||||
bool isBitTorrentInfoHash(const QString &string)
|
||||
bool isSHA1Hash(const QString &string)
|
||||
{
|
||||
// There are 2 representations for BitTorrent info hash:
|
||||
// 1. 40 chars hex-encoded string
|
||||
@@ -65,7 +65,7 @@ MagnetUri::MagnetUri(const QString &source)
|
||||
{
|
||||
if (source.isEmpty()) return;
|
||||
|
||||
if (isBitTorrentInfoHash(source))
|
||||
if (isSHA1Hash(source))
|
||||
m_url = QLatin1String("magnet:?xt=urn:btih:") + source;
|
||||
|
||||
lt::error_code ec;
|
||||
|
||||
@@ -1798,7 +1798,7 @@ bool Session::deleteTorrent(const InfoHash &hash, const DeleteOption deleteOptio
|
||||
TorrentImpl *const torrent = m_torrents.take(hash);
|
||||
if (!torrent) return false;
|
||||
|
||||
qDebug("Deleting torrent with hash: %s", qUtf8Printable(torrent->hash()));
|
||||
qDebug("Deleting torrent with hash: %s", qUtf8Printable(torrent->hash().toString()));
|
||||
emit torrentAboutToBeRemoved(torrent);
|
||||
|
||||
// Remove it from session
|
||||
@@ -1852,8 +1852,8 @@ bool Session::deleteTorrent(const InfoHash &hash, const DeleteOption deleteOptio
|
||||
}
|
||||
|
||||
// Remove it from torrent resume directory
|
||||
const QString resumedataFile = QString::fromLatin1("%1.fastresume").arg(torrent->hash());
|
||||
const QString metadataFile = QString::fromLatin1("%1.torrent").arg(torrent->hash());
|
||||
const QString resumedataFile = QString::fromLatin1("%1.fastresume").arg(torrent->hash().toString());
|
||||
const QString metadataFile = QString::fromLatin1("%1.torrent").arg(torrent->hash().toString());
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
|
||||
QMetaObject::invokeMethod(m_resumeDataSavingManager, [this, resumedataFile, metadataFile]()
|
||||
{
|
||||
@@ -2250,7 +2250,7 @@ bool Session::downloadMetadata(const MagnetUri &magnetUri)
|
||||
if (m_downloadedMetadata.contains(hash)) return false;
|
||||
|
||||
qDebug("Adding torrent to preload metadata...");
|
||||
qDebug(" -> Hash: %s", qUtf8Printable(hash));
|
||||
qDebug(" -> Hash: %s", qUtf8Printable(hash.toString()));
|
||||
qDebug(" -> Name: %s", qUtf8Printable(name));
|
||||
|
||||
lt::add_torrent_params p = magnetUri.addTorrentParams();
|
||||
@@ -2266,7 +2266,7 @@ bool Session::downloadMetadata(const MagnetUri &magnetUri)
|
||||
p.max_connections = maxConnectionsPerTorrent();
|
||||
p.max_uploads = maxUploadsPerTorrent();
|
||||
|
||||
const QString savePath = Utils::Fs::tempPath() + static_cast<QString>(hash);
|
||||
const QString savePath = Utils::Fs::tempPath() + hash.toString();
|
||||
p.save_path = Utils::Fs::toNativePath(savePath).toStdString();
|
||||
|
||||
// Forced start
|
||||
@@ -2299,7 +2299,7 @@ void Session::exportTorrentFile(const Torrent *torrent, TorrentExportFolder fold
|
||||
((folder == TorrentExportFolder::Finished) && !finishedTorrentExportDirectory().isEmpty()));
|
||||
|
||||
const QString validName = Utils::Fs::toValidFileSystemName(torrent->name());
|
||||
const QString torrentFilename = QString::fromLatin1("%1.torrent").arg(torrent->hash());
|
||||
const QString torrentFilename = QString::fromLatin1("%1.torrent").arg(torrent->hash().toString());
|
||||
QString torrentExportFilename = QString::fromLatin1("%1.torrent").arg(validName);
|
||||
const QString torrentPath = QDir(m_resumeFolderPath).absoluteFilePath(torrentFilename);
|
||||
const QDir exportPath(folder == TorrentExportFolder::Regular ? torrentExportDirectory() : finishedTorrentExportDirectory());
|
||||
@@ -2372,7 +2372,7 @@ void Session::saveTorrentsQueue() const
|
||||
// We require actual (non-cached) queue position here!
|
||||
const int queuePos = static_cast<LTUnderlyingType<lt::queue_position_t>>(torrent->nativeHandle().queue_position());
|
||||
if (queuePos >= 0)
|
||||
queue[queuePos] = torrent->hash();
|
||||
queue[queuePos] = torrent->hash().toString();
|
||||
}
|
||||
|
||||
QByteArray data;
|
||||
@@ -3852,7 +3852,7 @@ void Session::handleTorrentMetadataReceived(TorrentImpl *const torrent)
|
||||
{
|
||||
// Save metadata
|
||||
const QDir resumeDataDir {m_resumeFolderPath};
|
||||
const QString torrentFileName {QString {"%1.torrent"}.arg(torrent->hash())};
|
||||
const QString torrentFileName {QString {"%1.torrent"}.arg(torrent->hash().toString())};
|
||||
try
|
||||
{
|
||||
torrent->info().saveToFile(resumeDataDir.absoluteFilePath(torrentFileName));
|
||||
@@ -3932,7 +3932,7 @@ void Session::handleTorrentResumeDataReady(TorrentImpl *const torrent, const std
|
||||
// Separated thread is used for the blocking IO which results in slow processing of many torrents.
|
||||
// Copying lt::entry objects around isn't cheap.
|
||||
|
||||
const QString filename = QString::fromLatin1("%1.fastresume").arg(torrent->hash());
|
||||
const QString filename = QString::fromLatin1("%1.fastresume").arg(torrent->hash().toString());
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
|
||||
QMetaObject::invokeMethod(m_resumeDataSavingManager
|
||||
, [this, filename, data]() { m_resumeDataSavingManager->save(filename, data); });
|
||||
@@ -4010,7 +4010,7 @@ void Session::moveTorrentStorage(const MoveStorageJob &job) const
|
||||
{
|
||||
const InfoHash infoHash = job.torrentHandle.info_hash();
|
||||
const TorrentImpl *torrent = m_torrents.value(infoHash);
|
||||
const QString torrentName = (torrent ? torrent->name() : QString {infoHash});
|
||||
const QString torrentName = (torrent ? torrent->name() : infoHash.toString());
|
||||
LogMsg(tr("Moving \"%1\" to \"%2\"...").arg(torrentName, job.path));
|
||||
|
||||
job.torrentHandle.move_storage(job.path.toUtf8().constData()
|
||||
@@ -4583,7 +4583,7 @@ void Session::createTorrent(const lt::torrent_handle &nativeHandle)
|
||||
{
|
||||
// Backup torrent file
|
||||
const QDir resumeDataDir {m_resumeFolderPath};
|
||||
const QString torrentFileName {QString {"%1.torrent"}.arg(torrent->hash())};
|
||||
const QString torrentFileName {QString::fromLatin1("%1.torrent").arg(torrent->hash().toString())};
|
||||
try
|
||||
{
|
||||
torrent->info().saveToFile(resumeDataDir.absoluteFilePath(torrentFileName));
|
||||
@@ -4921,7 +4921,7 @@ void Session::handleStorageMovedAlert(const lt::storage_moved_alert *p)
|
||||
|
||||
const InfoHash infoHash = currentJob.torrentHandle.info_hash();
|
||||
TorrentImpl *torrent = m_torrents.value(infoHash);
|
||||
const QString torrentName = (torrent ? torrent->name() : QString {infoHash});
|
||||
const QString torrentName = (torrent ? torrent->name() : infoHash.toString());
|
||||
LogMsg(tr("\"%1\" is successfully moved to \"%2\".").arg(torrentName, newPath));
|
||||
|
||||
handleMoveTorrentStorageJobFinished();
|
||||
@@ -4936,7 +4936,7 @@ void Session::handleStorageMovedFailedAlert(const lt::storage_moved_failed_alert
|
||||
|
||||
const InfoHash infoHash = currentJob.torrentHandle.info_hash();
|
||||
TorrentImpl *torrent = m_torrents.value(infoHash);
|
||||
const QString torrentName = (torrent ? torrent->name() : QString {infoHash});
|
||||
const QString torrentName = (torrent ? torrent->name() : infoHash.toString());
|
||||
const QString currentLocation = QString::fromStdString(p->handle.status(lt::torrent_handle::query_save_path).save_path);
|
||||
const QString errorMessage = QString::fromStdString(p->message());
|
||||
LogMsg(tr("Failed to move \"%1\" from \"%2\" to \"%3\". Reason: %4.")
|
||||
|
||||
@@ -185,7 +185,7 @@ QString TorrentImpl::name() const
|
||||
if (!name.isEmpty())
|
||||
return name;
|
||||
|
||||
return m_hash;
|
||||
return m_hash.toString();
|
||||
}
|
||||
|
||||
QDateTime TorrentImpl::creationDate() const
|
||||
|
||||
@@ -295,7 +295,7 @@ void Tracker::processAnnounceRequest()
|
||||
if (infoHashIter == queryParams.end())
|
||||
throw TrackerError("Missing \"info_hash\" parameter");
|
||||
|
||||
const InfoHash infoHash(infoHashIter->toHex());
|
||||
const auto infoHash = InfoHash::fromString(infoHashIter->toHex());
|
||||
if (!infoHash.isValid())
|
||||
throw TrackerError("Invalid \"info_hash\" parameter");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user