transmission/qt/AddData.cc

127 lines
2.6 KiB
C++
Raw Normal View History

// This file Copyright © 2012-2023 Mnemosyne LLC.
// It may be used under GPLv2 (SPDX: GPL-2.0-only), GPLv3 (SPDX: GPL-3.0-only),
// or any future license endorsed by Mnemosyne LLC.
// License text can be found in the licenses/ folder.
#include <QDir>
#include <QFile>
#include <libtransmission/transmission.h>
2022-08-04 13:44:18 +00:00
#include <libtransmission/error.h>
#include <libtransmission/torrent-metainfo.h>
#include <libtransmission/utils.h>
2022-08-04 13:44:18 +00:00
#include <libtransmission/web-utils.h>
#include "AddData.h"
#include "Utils.h"
namespace
{
QString getNameFromMetainfo(QByteArray const& benc)
{
if (auto metainfo = tr_torrent_metainfo{}; metainfo.parse_benc({ benc.constData(), static_cast<size_t>(benc.size()) }))
{
return QString::fromStdString(metainfo.name());
}
return {};
}
QString getNameFromMagnet(QString const& magnet)
{
auto tmp = tr_magnet_metainfo{};
if (!tmp.parseMagnet(magnet.toStdString()))
{
return magnet;
}
if (!std::empty(tmp.name()))
{
return QString::fromStdString(tmp.name());
}
auto const& hashstr = tmp.info_hash_string();
return QString::fromUtf8(std::data(hashstr), std::size(hashstr));
}
} // namespace
int AddData::set(QString const& key)
{
if (auto const key_std = key.toStdString(); tr_urlIsValid(key_std))
{
this->url = key;
type = URL;
}
else if (QFile(key).exists())
{
this->filename = QDir::fromNativeSeparators(key);
type = FILENAME;
auto file = QFile{ key };
file.open(QIODevice::ReadOnly);
this->metainfo = file.readAll();
file.close();
}
else if (tr_magnet_metainfo{}.parseMagnet(key_std))
{
this->magnet = key;
this->type = MAGNET;
}
else if (auto const raw = QByteArray::fromBase64(key.toUtf8()); !raw.isEmpty())
{
this->metainfo.append(raw);
this->type = METAINFO;
}
else
{
this->type = NONE;
}
return type;
}
QByteArray AddData::toBase64() const
{
return metainfo.toBase64();
}
QString AddData::readableName() const
{
switch (type)
{
case FILENAME:
return filename;
case MAGNET:
return getNameFromMagnet(magnet);
case URL:
return url.toString();
case METAINFO:
return getNameFromMetainfo(metainfo);
default: // NONE
return {};
}
}
QString AddData::readableShortName() const
{
switch (type)
{
case FILENAME:
return QFileInfo(filename).baseName();
case URL:
return url.path().split(QLatin1Char('/')).last();
default:
return readableName();
}
}