diff --git a/src/base/utils/string.cpp b/src/base/utils/string.cpp index 9c0ba7ea9..8f5d0c263 100644 --- a/src/base/utils/string.cpp +++ b/src/base/utils/string.cpp @@ -200,6 +200,26 @@ std::optional Utils::String::parseBool(const QString &string) return std::nullopt; } +std::optional Utils::String::parseInt(const QString &string) +{ + bool ok = false; + const int result = string.toInt(&ok); + if (ok) + return result; + + return std::nullopt; +} + +std::optional Utils::String::parseDouble(const QString &string) +{ + bool ok = false; + const double result = string.toDouble(&ok); + if (ok) + return result; + + return std::nullopt; +} + QString Utils::String::join(const QVector &strings, const QString &separator) { if (strings.empty()) diff --git a/src/base/utils/string.h b/src/base/utils/string.h index 836fc770c..30bf38a8e 100644 --- a/src/base/utils/string.h +++ b/src/base/utils/string.h @@ -67,6 +67,8 @@ namespace Utils::String } std::optional parseBool(const QString &string); + std::optional parseInt(const QString &string); + std::optional parseDouble(const QString &string); QString join(const QVector &strings, const QString &separator); diff --git a/src/webui/api/torrentscontroller.cpp b/src/webui/api/torrentscontroller.cpp index b06dd7654..24568beba 100644 --- a/src/webui/api/torrentscontroller.cpp +++ b/src/webui/api/torrentscontroller.cpp @@ -117,6 +117,8 @@ const char KEY_FILE_AVAILABILITY[] = "availability"; namespace { using Utils::String::parseBool; + using Utils::String::parseInt; + using Utils::String::parseDouble; void applyToTorrents(const QStringList &hashes, const std::function &func) { @@ -601,6 +603,8 @@ void TorrentsController::pieceStatesAction() void TorrentsController::addAction() { const QString urls = params()["urls"]; + const QString cookie = params()["cookie"]; + const bool skipChecking = parseBool(params()["skip_checking"]).value_or(false); const bool seqDownload = parseBool(params()["sequentialDownload"]).value_or(false); const bool firstLastPiece = parseBool(params()["firstLastPiecePrio"]).value_or(false); @@ -608,10 +612,11 @@ void TorrentsController::addAction() const QString savepath = params()["savepath"].trimmed(); const QString category = params()["category"]; const QSet tags = List::toSet(params()["tags"].split(',', QString::SkipEmptyParts)); - const QString cookie = params()["cookie"]; const QString torrentName = params()["rename"].trimmed(); - const int upLimit = params()["upLimit"].toInt(); - const int dlLimit = params()["dlLimit"].toInt(); + const int upLimit = parseInt(params()["upLimit"]).value_or(-1); + const int dlLimit = parseInt(params()["dlLimit"]).value_or(-1); + const double ratioLimit = parseDouble(params()["ratioLimit"]).value_or(BitTorrent::Torrent::USE_GLOBAL_RATIO); + const int seedingTimeLimit = parseInt(params()["seedingTimeLimit"]).value_or(BitTorrent::Torrent::USE_GLOBAL_SEEDING_TIME); const std::optional autoTMM = parseBool(params()["autoTMM"]); const QString contentLayoutParam = params()["contentLayout"]; @@ -636,20 +641,22 @@ void TorrentsController::addAction() } } - BitTorrent::AddTorrentParams params; + BitTorrent::AddTorrentParams addTorrentParams; // TODO: Check if destination actually exists - params.skipChecking = skipChecking; - params.sequential = seqDownload; - params.firstLastPiecePriority = firstLastPiece; - params.addPaused = addPaused; - params.contentLayout = contentLayout; - params.savePath = savepath; - params.category = category; - params.tags = tags; - params.name = torrentName; - params.uploadLimit = (upLimit > 0) ? upLimit : -1; - params.downloadLimit = (dlLimit > 0) ? dlLimit : -1; - params.useAutoTMM = autoTMM; + addTorrentParams.skipChecking = skipChecking; + addTorrentParams.sequential = seqDownload; + addTorrentParams.firstLastPiecePriority = firstLastPiece; + addTorrentParams.addPaused = addPaused; + addTorrentParams.contentLayout = contentLayout; + addTorrentParams.savePath = savepath; + addTorrentParams.category = category; + addTorrentParams.tags = tags; + addTorrentParams.name = torrentName; + addTorrentParams.uploadLimit = upLimit; + addTorrentParams.downloadLimit = dlLimit; + addTorrentParams.seedingTimeLimit = seedingTimeLimit; + addTorrentParams.ratioLimit = ratioLimit; + addTorrentParams.useAutoTMM = autoTMM; bool partialSuccess = false; for (QString url : asConst(urls.split('\n'))) @@ -658,7 +665,7 @@ void TorrentsController::addAction() if (!url.isEmpty()) { Net::DownloadManager::instance()->setCookiesFromUrl(cookies, QUrl::fromEncoded(url.toUtf8())); - partialSuccess |= BitTorrent::Session::instance()->addTorrent(url, params); + partialSuccess |= BitTorrent::Session::instance()->addTorrent(url, addTorrentParams); } } @@ -671,7 +678,7 @@ void TorrentsController::addAction() , tr("Error: '%1' is not a valid torrent file.").arg(it.key())); } - partialSuccess |= BitTorrent::Session::instance()->addTorrent(torrentInfo, params); + partialSuccess |= BitTorrent::Session::instance()->addTorrent(torrentInfo, addTorrentParams); } if (partialSuccess) diff --git a/src/webui/webapplication.h b/src/webui/webapplication.h index 978b48024..9db7a639c 100644 --- a/src/webui/webapplication.h +++ b/src/webui/webapplication.h @@ -43,7 +43,7 @@ #include "base/utils/net.h" #include "base/utils/version.h" -constexpr Utils::Version API_VERSION {2, 8, 0}; +constexpr Utils::Version API_VERSION {2, 8, 1}; class APIController; class WebApplication;