mirror of
https://github.com/Sude-/lgogdownloader.git
synced 2024-11-20 03:39:17 +01:00
use std::optional to fix soundness hole
This commit is contained in:
parent
a314f2d635
commit
9319075245
@ -149,11 +149,7 @@ if(USE_QT_GUI)
|
||||
)
|
||||
endif(USE_QT_GUI)
|
||||
|
||||
if(Qt6_FOUND)
|
||||
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 17)
|
||||
else()
|
||||
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11)
|
||||
endif(Qt6_FOUND)
|
||||
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 17)
|
||||
|
||||
if(MSVC)
|
||||
# Force to always compile with W4
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include <json/json.h>
|
||||
#include <mutex>
|
||||
#include <ctime>
|
||||
#include <optional>
|
||||
|
||||
#include "filelist.h"
|
||||
|
||||
@ -305,10 +306,10 @@ class Config
|
||||
std::string sPassword;
|
||||
|
||||
// Lists
|
||||
Filelist blacklist;
|
||||
Filelist ignorelist;
|
||||
Filelist gamehasdlc;
|
||||
Filelist whitelist;
|
||||
std::optional<Filelist> blacklist;
|
||||
std::optional<Filelist> ignorelist;
|
||||
std::optional<Filelist> gamehasdlc;
|
||||
std::optional<Filelist> whitelist;
|
||||
|
||||
// Cloud save options
|
||||
std::vector<std::string> cloudWhiteList;
|
||||
|
@ -155,9 +155,9 @@ class Downloader
|
||||
static std::string getChangelogFromJSON(const Json::Value& json);
|
||||
void saveJsonFile(const std::string& json, const std::string& filepath);
|
||||
void saveChangelog(const std::string& changelog, const std::string& filepath);
|
||||
static void processDownloadQueue(Config conf, const unsigned int& tid);
|
||||
static void processCloudSaveDownloadQueue(Config conf, const unsigned int& tid);
|
||||
static void processCloudSaveUploadQueue(Config conf, const unsigned int& tid);
|
||||
static void processDownloadQueue(const Config& conf, const unsigned int& tid);
|
||||
static void processCloudSaveDownloadQueue(const Config& conf, const unsigned int& tid);
|
||||
static void processCloudSaveUploadQueue(const Config& conf, const unsigned int& tid);
|
||||
static int progressCallbackForThread(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow);
|
||||
template <typename T> void printProgress(const ThreadSafeQueue<T>& download_queue);
|
||||
static void getGameDetailsThread(Config config, const unsigned int& tid);
|
||||
@ -169,10 +169,10 @@ class Downloader
|
||||
static size_t readData(void *ptr, size_t size, size_t nmemb, FILE *stream);
|
||||
|
||||
std::vector<std::string> galaxyGetOrphanedFiles(const std::vector<galaxyDepotItem>& items, const std::string& install_path);
|
||||
static void processGalaxyDownloadQueue(const std::string& install_path, Config conf, const unsigned int& tid);
|
||||
static void processGalaxyDownloadQueue(const std::string& install_path, const Config& conf, const unsigned int& tid);
|
||||
void galaxyInstallGame_MojoSetupHack(const std::string& product_id);
|
||||
void galaxyInstallGame_MojoSetupHack_CombineSplitFiles(const splitFilesMap& mSplitFiles, const bool& bAppendtoFirst = false);
|
||||
static void processGalaxyDownloadQueue_MojoSetupHack(Config conf, const unsigned int& tid);
|
||||
static void processGalaxyDownloadQueue_MojoSetupHack(const Config& conf, const unsigned int& tid);
|
||||
int mojoSetupGetFileVector(const gameFile& gf, std::vector<zipFileEntry>& vFiles);
|
||||
std::string getGalaxyInstallDirectory(galaxyAPI *galaxyHandle, const Json::Value& manifest);
|
||||
bool galaxySelectProductIdHelper(const std::string& product_id, std::string& selected_product);
|
||||
|
@ -25,14 +25,13 @@ class FilelistItem {
|
||||
class Filelist
|
||||
{
|
||||
public:
|
||||
Filelist(){};
|
||||
Filelist(const std::vector<std::string>& lines);
|
||||
|
||||
void initialize(const std::vector<std::string>& lines);
|
||||
bool Matches(const std::string& path);
|
||||
bool Matches(const std::string& path, const std::string& gamename, std::string subdirectory = "");
|
||||
bool Matches(const std::string& path) const;
|
||||
bool Matches(const std::string& path, const std::string& gamename, std::string subdirectory = "") const;
|
||||
|
||||
std::vector<FilelistItem>::size_type size() const { return files.size(); }
|
||||
bool empty() { return files.empty(); }
|
||||
bool empty() const { return files.empty(); }
|
||||
private:
|
||||
std::vector<FilelistItem> files;
|
||||
};
|
||||
|
41
main.cpp
41
main.cpp
@ -11,6 +11,7 @@
|
||||
#include "galaxyapi.h"
|
||||
#include "globals.h"
|
||||
|
||||
#include <optional>
|
||||
#include <fstream>
|
||||
#include <boost/filesystem.hpp>
|
||||
#include <boost/program_options.hpp>
|
||||
@ -72,9 +73,9 @@ int main(int argc, char *argv[])
|
||||
std::string priority_help_text = "Set priority by separating values with \",\"\nCombine values by separating with \"+\"";
|
||||
// Create help text for --platform option
|
||||
std::string platform_text = "Select which installers are downloaded\n";
|
||||
for (unsigned int i = 0; i < GlobalConstants::PLATFORMS.size(); ++i)
|
||||
for (const auto& platform : GlobalConstants::PLATFORMS)
|
||||
{
|
||||
platform_text += GlobalConstants::PLATFORMS[i].str + " = " + GlobalConstants::PLATFORMS[i].regexp + "\n";
|
||||
platform_text += platform.str + " = " + platform.regexp + "\n";
|
||||
}
|
||||
platform_text += "All = all";
|
||||
platform_text += "\n\n" + priority_help_text;
|
||||
@ -82,16 +83,16 @@ int main(int argc, char *argv[])
|
||||
|
||||
// Create help text for --galaxy-platform option
|
||||
std::string galaxy_platform_text = "Select platform\n";
|
||||
for (unsigned int i = 0; i < GlobalConstants::PLATFORMS.size(); ++i)
|
||||
for (const auto& platform : GlobalConstants::PLATFORMS)
|
||||
{
|
||||
galaxy_platform_text += GlobalConstants::PLATFORMS[i].str + " = " + GlobalConstants::PLATFORMS[i].regexp + "\n";
|
||||
galaxy_platform_text += platform.str + " = " + platform.regexp + "\n";
|
||||
}
|
||||
|
||||
// Create help text for --language option
|
||||
std::string language_text = "Select which language installers are downloaded\n";
|
||||
for (unsigned int i = 0; i < GlobalConstants::LANGUAGES.size(); ++i)
|
||||
for (const auto& language : GlobalConstants::LANGUAGES)
|
||||
{
|
||||
language_text += GlobalConstants::LANGUAGES[i].str + " = " + GlobalConstants::LANGUAGES[i].regexp + "\n";
|
||||
language_text += language.str + " = " + language.regexp + "\n";
|
||||
}
|
||||
language_text += "All = all";
|
||||
language_text += "\n\n" + priority_help_text;
|
||||
@ -99,16 +100,16 @@ int main(int argc, char *argv[])
|
||||
|
||||
// Create help text for --galaxy-language option
|
||||
std::string galaxy_language_text = "Select language\n";
|
||||
for (unsigned int i = 0; i < GlobalConstants::LANGUAGES.size(); ++i)
|
||||
for (const auto& language : GlobalConstants::LANGUAGES)
|
||||
{
|
||||
galaxy_language_text += GlobalConstants::LANGUAGES[i].str + " = " + GlobalConstants::LANGUAGES[i].regexp + "\n";
|
||||
galaxy_language_text += language.str + " = " + language.regexp + "\n";
|
||||
}
|
||||
|
||||
// Create help text for --galaxy-arch option
|
||||
std::string galaxy_arch_text = "Select architecture\n";
|
||||
for (unsigned int i = 0; i < GlobalConstants::GALAXY_ARCHS.size(); ++i)
|
||||
for (const auto& arch : GlobalConstants::GALAXY_ARCHS)
|
||||
{
|
||||
galaxy_arch_text += GlobalConstants::GALAXY_ARCHS[i].str + " = " + GlobalConstants::GALAXY_ARCHS[i].regexp + "\n";
|
||||
galaxy_arch_text += arch.str + " = " + arch.regexp + "\n";
|
||||
}
|
||||
|
||||
// Create help text for --subdir-galaxy-install option
|
||||
@ -127,9 +128,9 @@ int main(int argc, char *argv[])
|
||||
|
||||
// Create help text for --galaxy-cdn-priority option
|
||||
std::string galaxy_cdn_priority_text = "Set priority for used CDNs\n";
|
||||
for (unsigned int i = 0; i < GlobalConstants::GALAXY_CDNS.size(); ++i)
|
||||
for (const auto& cdn : GlobalConstants::GALAXY_CDNS)
|
||||
{
|
||||
galaxy_cdn_priority_text += GlobalConstants::GALAXY_CDNS[i].str + " = " + GlobalConstants::GALAXY_CDNS[i].regexp + "\n";
|
||||
galaxy_cdn_priority_text += cdn.str + " = " + cdn.regexp + "\n";
|
||||
}
|
||||
galaxy_cdn_priority_text += "\n" + priority_help_text;
|
||||
|
||||
@ -142,18 +143,18 @@ int main(int argc, char *argv[])
|
||||
|
||||
// Help text for include and exclude options
|
||||
std::string include_options_text;
|
||||
for (unsigned int i = 0; i < GlobalConstants::INCLUDE_OPTIONS.size(); ++i)
|
||||
for (const auto& include_option : GlobalConstants::INCLUDE_OPTIONS)
|
||||
{
|
||||
include_options_text += GlobalConstants::INCLUDE_OPTIONS[i].str + " = " + GlobalConstants::INCLUDE_OPTIONS[i].regexp + "\n";
|
||||
include_options_text += include_option.str + " = " + include_option.regexp + "\n";
|
||||
}
|
||||
include_options_text += "All = all\n";
|
||||
include_options_text += "Separate with \",\" to use multiple values";
|
||||
|
||||
// Create help text for --list-format option
|
||||
std::string list_format_text = "List games/tags\n";
|
||||
for (unsigned int i = 0; i < GlobalConstants::LIST_FORMAT.size(); ++i)
|
||||
for (const auto& list_format: GlobalConstants::LIST_FORMAT)
|
||||
{
|
||||
list_format_text += GlobalConstants::LIST_FORMAT[i].str + " = " + GlobalConstants::LIST_FORMAT[i].regexp + "\n";
|
||||
list_format_text += list_format.str + " = " + list_format.regexp + "\n";
|
||||
}
|
||||
|
||||
std::string galaxy_product_id_install;
|
||||
@ -413,7 +414,7 @@ int main(int argc, char *argv[])
|
||||
std::getline(ifs, line);
|
||||
lines.push_back(std::move(line));
|
||||
}
|
||||
Globals::globalConfig.blacklist.initialize(lines);
|
||||
Globals::globalConfig.blacklist = Filelist(lines);
|
||||
}
|
||||
}
|
||||
|
||||
@ -429,7 +430,7 @@ int main(int argc, char *argv[])
|
||||
std::getline(ifs, line);
|
||||
lines.push_back(std::move(line));
|
||||
}
|
||||
Globals::globalConfig.whitelist.initialize(lines);
|
||||
Globals::globalConfig.whitelist = Filelist(lines);
|
||||
}
|
||||
}
|
||||
|
||||
@ -450,7 +451,7 @@ int main(int argc, char *argv[])
|
||||
std::getline(ifs, line);
|
||||
lines.push_back(std::move(line));
|
||||
}
|
||||
Globals::globalConfig.ignorelist.initialize(lines);
|
||||
Globals::globalConfig.ignorelist = Filelist(lines);
|
||||
}
|
||||
}
|
||||
|
||||
@ -481,7 +482,7 @@ int main(int argc, char *argv[])
|
||||
std::getline(ifs, line);
|
||||
lines.push_back(std::move(line));
|
||||
}
|
||||
Globals::globalConfig.gamehasdlc.initialize(lines);
|
||||
Globals::globalConfig.gamehasdlc = Filelist(lines);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -109,6 +109,28 @@ bool whitelisted(const std::string &path) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// checks if a given path matches either the whitelist or the blacklist.
|
||||
bool shouldSkipFile(const std::string &path) {
|
||||
const auto &whitelist = Globals::globalConfig.whitelist;
|
||||
const auto &blacklist = Globals::globalConfig.blacklist;
|
||||
|
||||
if(whitelist.has_value()) {
|
||||
if (!whitelist->Matches(path)) {
|
||||
if (Globals::globalConfig.iMsgLevel >= MSGLEVEL_VERBOSE)
|
||||
std::cout << "skipped non-whitelisted file: " << path << std::endl;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if (blacklist.has_value()) {
|
||||
if (blacklist->Matches(path)) {
|
||||
if (Globals::globalConfig.iMsgLevel >= MSGLEVEL_VERBOSE)
|
||||
std::cout << "skipped blacklisted file: " << path << std::endl;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Downloader::Downloader()
|
||||
{
|
||||
if (Globals::globalConfig.bLogin)
|
||||
@ -204,11 +226,11 @@ int Downloader::init()
|
||||
{
|
||||
if (!Globals::globalConfig.sGameHasDLCList.empty())
|
||||
{
|
||||
if (Globals::globalConfig.gamehasdlc.empty())
|
||||
if (Globals::globalConfig.gamehasdlc.has_value() && Globals::globalConfig.gamehasdlc->empty())
|
||||
{
|
||||
std::string game_has_dlc_list = this->getResponse(Globals::globalConfig.sGameHasDLCList);
|
||||
if (!game_has_dlc_list.empty())
|
||||
Globals::globalConfig.gamehasdlc.initialize(Util::tokenize(game_has_dlc_list, "\n"));
|
||||
Globals::globalConfig.gamehasdlc = Filelist(Util::tokenize(game_has_dlc_list, "\n"));
|
||||
}
|
||||
}
|
||||
|
||||
@ -631,17 +653,8 @@ void Downloader::repair()
|
||||
continue;
|
||||
|
||||
std::string filepath = vGameFiles[i].getFilepath();
|
||||
if (Globals::globalConfig.whitelist.Matches(filepath))
|
||||
{
|
||||
if (Globals::globalConfig.iMsgLevel >= MSGLEVEL_VERBOSE)
|
||||
std::cerr << "including whitelisted file " << filepath << std::endl;
|
||||
}
|
||||
else if (Globals::globalConfig.blacklist.Matches(filepath))
|
||||
{
|
||||
if (Globals::globalConfig.iMsgLevel >= MSGLEVEL_VERBOSE)
|
||||
std::cerr << "skipped blacklisted file " << filepath << std::endl;
|
||||
if (shouldSkipFile(filepath))
|
||||
continue;
|
||||
}
|
||||
|
||||
// Refresh Galaxy login if token is expired
|
||||
if (gogGalaxy->isTokenExpired())
|
||||
@ -1687,9 +1700,9 @@ std::string Downloader::getChangelogFromJSON(const Json::Value& json)
|
||||
}
|
||||
|
||||
// Linear search. Good thing computers are fast and lists are small.
|
||||
static int isPresent(const std::vector<gameFile>& list, const boost::filesystem::path& path, Filelist& blacklist)
|
||||
static int isPresent(std::vector<gameFile>& list, const boost::filesystem::path& path, std::optional<Filelist>& blacklist)
|
||||
{
|
||||
if(blacklist.Matches(path.native())) {
|
||||
if(blacklist.has_value() && blacklist->Matches(path.native())) {
|
||||
return false;
|
||||
}
|
||||
for (unsigned int k = 0; k < list.size(); ++k)
|
||||
@ -1771,7 +1784,7 @@ void Downloader::checkOrphans()
|
||||
if (boost::filesystem::is_regular_file(dir_iter->status()))
|
||||
{
|
||||
std::string filepath = dir_iter->path().string();
|
||||
if (config.ignorelist.Matches(filepath.substr(pathlen))) {
|
||||
if (config.ignorelist.has_value() && config.ignorelist->Matches(filepath.substr(pathlen))) {
|
||||
if (config.iMsgLevel >= MSGLEVEL_VERBOSE)
|
||||
std::cerr << "skipped ignorelisted file " << filepath << std::endl;
|
||||
} else {
|
||||
@ -1867,13 +1880,8 @@ void Downloader::checkStatus()
|
||||
continue;
|
||||
|
||||
const boost::filesystem::path filepath = gamefile.getFilepath();
|
||||
if (Globals::globalConfig.whitelist.Matches(filepath.native())) {
|
||||
|
||||
// no-op
|
||||
}
|
||||
else if (Globals::globalConfig.blacklist.Matches(filepath.native())) {
|
||||
if (shouldSkipFile(filepath.native()))
|
||||
continue;
|
||||
}
|
||||
|
||||
std::string filePathString = filepath.filename().string();
|
||||
std::string gamename = gamefile.gamename;
|
||||
@ -2559,7 +2567,7 @@ void Downloader::showWishlist()
|
||||
return;
|
||||
}
|
||||
|
||||
void Downloader::processCloudSaveUploadQueue(Config conf, const unsigned int& tid) {
|
||||
void Downloader::processCloudSaveUploadQueue(const Config& conf, const unsigned int& tid) {
|
||||
std::string msg_prefix = "[Thread #" + std::to_string(tid) + "]";
|
||||
|
||||
std::unique_ptr<galaxyAPI> galaxy { new galaxyAPI(Globals::globalConfig.curlConf) };
|
||||
@ -2704,7 +2712,7 @@ void Downloader::processCloudSaveUploadQueue(Config conf, const unsigned int& ti
|
||||
msgQueue.push(Message("Finished all tasks", MSGTYPE_INFO, msg_prefix, MSGLEVEL_DEFAULT));
|
||||
}
|
||||
|
||||
void Downloader::processCloudSaveDownloadQueue(Config conf, const unsigned int& tid) {
|
||||
void Downloader::processCloudSaveDownloadQueue(const Config& conf, const unsigned int& tid) {
|
||||
std::string msg_prefix = "[Thread #" + std::to_string(tid) + "]";
|
||||
|
||||
std::unique_ptr<galaxyAPI> galaxy { new galaxyAPI(Globals::globalConfig.curlConf) };
|
||||
@ -2938,7 +2946,7 @@ void Downloader::processCloudSaveDownloadQueue(Config conf, const unsigned int&
|
||||
msgQueue.push(Message("Finished all tasks", MSGTYPE_INFO, msg_prefix, MSGLEVEL_DEFAULT));
|
||||
}
|
||||
|
||||
void Downloader::processDownloadQueue(Config conf, const unsigned int& tid)
|
||||
void Downloader::processDownloadQueue(const Config& conf, const unsigned int& tid)
|
||||
{
|
||||
std::string msg_prefix = "[Thread #" + std::to_string(tid) + "]";
|
||||
|
||||
@ -3000,13 +3008,18 @@ void Downloader::processDownloadQueue(Config conf, const unsigned int& tid)
|
||||
filepath = boost::filesystem::absolute(filepath, boost::filesystem::current_path());
|
||||
boost::filesystem::path directory = filepath.parent_path();
|
||||
|
||||
if (conf.whitelist.Matches(filepath.string()))
|
||||
if (conf.whitelist.has_value())
|
||||
{
|
||||
msgQueue.push(Message("Whitelisted file: " + filepath.string(), MSGTYPE_INFO, msg_prefix, MSGLEVEL_VERBOSE));
|
||||
if (conf.whitelist->Matches(filepath.string())) {
|
||||
msgQueue.push(Message("Whitelisted file: " + filepath.string(), MSGTYPE_INFO, msg_prefix, MSGLEVEL_VERBOSE));
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else if (conf.blacklist.Matches(filepath.string()))
|
||||
else if (conf.blacklist.has_value())
|
||||
{
|
||||
msgQueue.push(Message("Blacklisted file: " + filepath.string(), MSGTYPE_INFO, msg_prefix, MSGLEVEL_VERBOSE));
|
||||
if (conf.blacklist->Matches(filepath.string()))
|
||||
msgQueue.push(Message("Blacklisted file: " + filepath.string(), MSGTYPE_INFO, msg_prefix, MSGLEVEL_VERBOSE));
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -4000,22 +4013,11 @@ void Downloader::galaxyInstallGameById(const std::string& product_id, int build_
|
||||
for (auto it = items.begin(); it != items.end();)
|
||||
{
|
||||
std::string item_install_path = install_path + "/" + it->path;
|
||||
if (Globals::globalConfig.whitelist.Matches(item_install_path))
|
||||
{
|
||||
if (Globals::globalConfig.iMsgLevel >= MSGLEVEL_VERBOSE) {
|
||||
std::cout << "Including whitelisted file: " << item_install_path << std::endl;
|
||||
}
|
||||
}
|
||||
else if (Globals::globalConfig.blacklist.Matches(item_install_path))
|
||||
{
|
||||
if (Globals::globalConfig.iMsgLevel >= MSGLEVEL_VERBOSE) {
|
||||
std::cout << "Skipping blacklisted file: " << item_install_path << std::endl;
|
||||
}
|
||||
if (shouldSkipFile(item_install_path)) {
|
||||
it = items.erase(it);
|
||||
continue;
|
||||
} else {
|
||||
it++;
|
||||
}
|
||||
|
||||
++it;
|
||||
}
|
||||
|
||||
// Check for differences between previously installed build and new build
|
||||
@ -4058,10 +4060,10 @@ void Downloader::galaxyInstallGameById(const std::string& product_id, int build_
|
||||
std::vector<std::string> deleted_filepaths;
|
||||
if (!items_old.empty())
|
||||
{
|
||||
for (auto old_item: items_old)
|
||||
for (const auto& old_item: items_old)
|
||||
{
|
||||
bool isDeleted = true;
|
||||
for (auto item: items)
|
||||
for (const auto& item: items)
|
||||
{
|
||||
if (old_item.path == item.path)
|
||||
{
|
||||
@ -4077,7 +4079,7 @@ void Downloader::galaxyInstallGameById(const std::string& product_id, int build_
|
||||
// Delete old files
|
||||
if (!deleted_filepaths.empty())
|
||||
{
|
||||
for (auto path : deleted_filepaths)
|
||||
for (const auto& path : deleted_filepaths)
|
||||
{
|
||||
std::string filepath = install_path + "/" + path;
|
||||
std::cout << "Deleting " << filepath << std::endl;
|
||||
@ -4166,7 +4168,7 @@ void Downloader::galaxyInstallGameById(const std::string& product_id, int build_
|
||||
}
|
||||
}
|
||||
|
||||
void Downloader::processGalaxyDownloadQueue(const std::string& install_path, Config conf, const unsigned int& tid)
|
||||
void Downloader::processGalaxyDownloadQueue(const std::string& install_path, const Config& conf, const unsigned int& tid)
|
||||
{
|
||||
std::string msg_prefix = "[Thread #" + std::to_string(tid) + "]";
|
||||
|
||||
@ -4714,8 +4716,12 @@ void Downloader::galaxyShowBuildFilesById(const std::string& product_id, int bui
|
||||
json_items[i]["size"] = static_cast<unsigned int>(items[i].totalSizeUncompressed);
|
||||
json_items[i]["md5"] = items[i].md5;
|
||||
json_items[i]["isDependency"] = items[i].isDependency;
|
||||
json_items[i]["whitelisted"] = Globals::globalConfig.whitelist.Matches(items[i].path);
|
||||
json_items[i]["blacklisted"] = Globals::globalConfig.blacklist.Matches(items[i].path);
|
||||
if (Globals::globalConfig.whitelist.has_value()) {
|
||||
json_items[i]["whitelisted"] = Globals::globalConfig.whitelist->Matches(items[i].path);
|
||||
}
|
||||
if (Globals::globalConfig.blacklist.has_value()) {
|
||||
json_items[i]["blacklisted"] = Globals::globalConfig.blacklist->Matches(items[i].path);
|
||||
}
|
||||
}
|
||||
Json::StyledStreamWriter().write(std::cout, json_items);
|
||||
|
||||
@ -4744,6 +4750,7 @@ std::string parseLocationHelper(const std::string &location, const std::map<std:
|
||||
|
||||
return parsedLocation;
|
||||
}
|
||||
|
||||
std::string parseLocation(const std::string &location, const std::map<std::string, std::string> &var) {
|
||||
auto parsedLocation = parseLocationHelper(location, var);
|
||||
Util::replaceAllString(parsedLocation, "\\", "/");
|
||||
@ -5274,7 +5281,7 @@ std::vector<std::string> Downloader::galaxyGetOrphanedFiles(const std::vector<ga
|
||||
if (boost::filesystem::is_regular_file(dir_iter->status()))
|
||||
{
|
||||
std::string filepath = dir_iter->path().string();
|
||||
if (Globals::globalConfig.ignorelist.Matches(filepath.substr(pathlen)))
|
||||
if (Globals::globalConfig.ignorelist.has_value() && Globals::globalConfig.ignorelist->Matches(filepath.substr(pathlen)))
|
||||
{
|
||||
if (Globals::globalConfig.iMsgLevel >= MSGLEVEL_VERBOSE)
|
||||
std::cerr << "skipped ignorelisted file " << filepath << std::endl;
|
||||
@ -5526,42 +5533,22 @@ void Downloader::galaxyInstallGame_MojoSetupHack(const std::string& product_id)
|
||||
|
||||
// Add files to download queue
|
||||
uintmax_t totalSize = 0;
|
||||
for (std::uintmax_t i = 0; i < vZipFiles.size(); ++i)
|
||||
for (const auto& zipfile : vZipFiles)
|
||||
{
|
||||
if (Globals::globalConfig.whitelist.Matches(vZipFiles[i].filepath))
|
||||
{
|
||||
if (Globals::globalConfig.iMsgLevel >= MSGLEVEL_VERBOSE)
|
||||
std::cout << "Including whitelisted file: " << vZipFiles[i].filepath << std::endl;
|
||||
}
|
||||
else if (Globals::globalConfig.blacklist.Matches(vZipFiles[i].filepath))
|
||||
{
|
||||
if (Globals::globalConfig.iMsgLevel >= MSGLEVEL_VERBOSE)
|
||||
std::cout << "Skipping blacklisted file: " << vZipFiles[i].filepath << std::endl;
|
||||
if (shouldSkipFile(zipfile.filepath))
|
||||
continue;
|
||||
}
|
||||
dlQueueGalaxy_MojoSetupHack.push(vZipFiles[i]);
|
||||
iTotalRemainingBytes.fetch_add(vZipFiles[i].comp_size);
|
||||
totalSize += vZipFiles[i].uncomp_size;
|
||||
dlQueueGalaxy_MojoSetupHack.push(zipfile);
|
||||
iTotalRemainingBytes.fetch_add(zipfile.comp_size);
|
||||
totalSize += zipfile.uncomp_size;
|
||||
}
|
||||
|
||||
// Add symlinks to download queue
|
||||
for (std::uintmax_t i = 0; i < vZipFilesSymlink.size(); ++i)
|
||||
{
|
||||
if (Globals::globalConfig.whitelist.Matches(vZipFiles[i].filepath))
|
||||
{
|
||||
if (Globals::globalConfig.iMsgLevel >= MSGLEVEL_VERBOSE)
|
||||
std::cout << "Including whitelisted file: " << vZipFiles[i].filepath << std::endl;
|
||||
}
|
||||
else if (Globals::globalConfig.blacklist.Matches(vZipFilesSymlink[i].filepath))
|
||||
{
|
||||
if (Globals::globalConfig.iMsgLevel >= MSGLEVEL_VERBOSE)
|
||||
std::cout << "Skipping blacklisted file: " << vZipFilesSymlink[i].filepath << std::endl;
|
||||
|
||||
for (const auto& symlink_zipfile : vZipFilesSymlink) {
|
||||
if (shouldSkipFile(symlink_zipfile.filepath))
|
||||
continue;
|
||||
}
|
||||
dlQueueGalaxy_MojoSetupHack.push(vZipFilesSymlink[i]);
|
||||
iTotalRemainingBytes.fetch_add(vZipFilesSymlink[i].comp_size);
|
||||
totalSize += vZipFilesSymlink[i].uncomp_size;
|
||||
dlQueueGalaxy_MojoSetupHack.push(symlink_zipfile);
|
||||
iTotalRemainingBytes.fetch_add(symlink_zipfile.comp_size);
|
||||
totalSize += symlink_zipfile.uncomp_size;
|
||||
}
|
||||
|
||||
std::cout << game.title << std::endl;
|
||||
@ -5756,7 +5743,7 @@ void Downloader::galaxyInstallGame_MojoSetupHack_CombineSplitFiles(const splitFi
|
||||
return;
|
||||
}
|
||||
|
||||
void Downloader::processGalaxyDownloadQueue_MojoSetupHack(Config conf, const unsigned int& tid)
|
||||
void Downloader::processGalaxyDownloadQueue_MojoSetupHack(const Config& conf, const unsigned int& tid)
|
||||
{
|
||||
std::string msg_prefix = "[Thread #" + std::to_string(tid) + "]";
|
||||
|
||||
@ -6580,18 +6567,9 @@ void Downloader::printGameDetailsAsText(gameDetails& game)
|
||||
|
||||
void Downloader::printGameFileDetailsAsText(gameFile& gf)
|
||||
{
|
||||
std::string filepath = gf.getFilepath();
|
||||
if (Globals::globalConfig.whitelist.Matches(filepath))
|
||||
{
|
||||
if (Globals::globalConfig.iMsgLevel >= MSGLEVEL_VERBOSE)
|
||||
std::cerr << "included whitelisted file " << filepath << std::endl;
|
||||
}
|
||||
else if (Globals::globalConfig.blacklist.Matches(filepath))
|
||||
{
|
||||
if (Globals::globalConfig.iMsgLevel >= MSGLEVEL_VERBOSE)
|
||||
std::cerr << "skipped blacklisted file " << filepath << std::endl;
|
||||
const std::string filepath = gf.getFilepath();
|
||||
if(shouldSkipFile(filepath))
|
||||
return;
|
||||
}
|
||||
|
||||
std::cout << "\tid: " << gf.id << std::endl
|
||||
<< "\tname: " << gf.name << std::endl
|
||||
|
@ -16,7 +16,7 @@ enum {
|
||||
BLFLAG_PERL = 1 << 1
|
||||
};
|
||||
|
||||
void Filelist::initialize(const std::vector<std::string>& lines) {
|
||||
Filelist::Filelist(const std::vector<std::string>& lines) {
|
||||
int linenr = 1;
|
||||
for (auto it = lines.begin(); it != lines.end(); ++it, ++linenr) {
|
||||
FilelistItem item;
|
||||
@ -57,12 +57,13 @@ void Filelist::initialize(const std::vector<std::string>& lines) {
|
||||
item.regex.assign(item.source, rx_flags);
|
||||
files.push_back(std::move(item));
|
||||
} else {
|
||||
std::cout << "unknown expression type in blacklist line " << linenr << std::endl;
|
||||
std::cerr << "unknown expression type in filelist line " << linenr << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool Filelist::Matches(const std::string& path) {
|
||||
bool Filelist::Matches(const std::string& path) const
|
||||
{
|
||||
for (const auto& item : files) {
|
||||
if (item.flags & BLFLAG_RX && boost::regex_search(path, item.regex))
|
||||
return true;
|
||||
@ -70,7 +71,7 @@ bool Filelist::Matches(const std::string& path) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Filelist::Matches(const std::string& path, const std::string& gamename, std::string subdirectory)
|
||||
bool Filelist::Matches(const std::string& path, const std::string& gamename, std::string subdirectory) const
|
||||
{
|
||||
const std::string filepath = Util::makeRelativeFilepath(path, gamename, subdirectory);
|
||||
return Matches(filepath);
|
||||
|
@ -209,9 +209,8 @@ std::vector<gameItem> Website::getGames()
|
||||
}
|
||||
}
|
||||
|
||||
if (!bDownloadDLCInfo && !Globals::globalConfig.gamehasdlc.empty())
|
||||
{
|
||||
if (Globals::globalConfig.gamehasdlc.Matches(game.name))
|
||||
if (!bDownloadDLCInfo && !Globals::globalConfig.gamehasdlc.has_value() && !Globals::globalConfig.gamehasdlc->empty()) {
|
||||
if (Globals::globalConfig.gamehasdlc->Matches(game.name))
|
||||
bDownloadDLCInfo = true;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user