153 lines
3.1 KiB
C++
153 lines
3.1 KiB
C++
// This file Copyright © 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 <QFileInfo>
|
|
|
|
#include <libtransmission/transmission.h>
|
|
|
|
#include <libtransmission/error.h>
|
|
#include <libtransmission/torrent-metainfo.h>
|
|
#include <libtransmission/utils.h>
|
|
#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();
|
|
}
|
|
}
|
|
|
|
void AddData::disposeSourceFile() const
|
|
{
|
|
auto file = QFile{ filename };
|
|
if (!disposal_ || !file.exists())
|
|
{
|
|
return;
|
|
}
|
|
|
|
switch (*disposal_)
|
|
{
|
|
case FilenameDisposal::Delete:
|
|
file.setPermissions(QFile::ReadOwner | QFile::WriteOwner);
|
|
file.remove();
|
|
break;
|
|
|
|
case FilenameDisposal::Rename:
|
|
file.rename(QStringLiteral("%1.added").arg(filename));
|
|
break;
|
|
|
|
default:
|
|
// no action
|
|
break;
|
|
}
|
|
}
|