mirror of
https://github.com/Detanup01/gbe_fork.git
synced 2024-11-27 05:04:01 +08:00
* use std::filesystem::u8path to support utf-8
* don't sanitize paths in settings_parser since it removes the colon ':', preventing the usage of absolute paths on Windows like 'C:\aa\bb'
This commit is contained in:
parent
303cdd2878
commit
e2980d100e
@ -7,15 +7,16 @@
|
|||||||
|
|
||||||
static inline bool remove_file(const std::string &file)
|
static inline bool remove_file(const std::string &file)
|
||||||
{
|
{
|
||||||
if (!std::filesystem::exists(file)) {
|
const std::filesystem::u8path p_file(std::filesystem::u8path(file));
|
||||||
|
if (!std::filesystem::exists(p_file)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (std::filesystem::is_directory(file)) {
|
if (std::filesystem::is_directory(p_file)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::filesystem::remove(file);
|
return std::filesystem::remove(p_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool remove_file(const std::wstring &file)
|
static inline bool remove_file(const std::wstring &file)
|
||||||
|
@ -57,10 +57,11 @@ static void copy_file(const std::string &src_filepath, const std::string &dst_fi
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
PRINT_DEBUG("copying file '%s' to '%s'", src_filepath.c_str(), dst_filepath.c_str());
|
PRINT_DEBUG("copying file '%s' to '%s'", src_filepath.c_str(), dst_filepath.c_str());
|
||||||
const auto src_p = std::filesystem::path(src_filepath);
|
const std::filesystem::path src_p(std::filesystem::u8path(src_filepath));
|
||||||
if (!std::filesystem::exists(src_p) || std::filesystem::is_directory(src_p)) return;
|
|
||||||
|
|
||||||
const auto dst_p = std::filesystem::path(dst_filepath);
|
if (!common_helpers::file_exist(src_p)) return;
|
||||||
|
|
||||||
|
const std::filesystem::path dst_p(std::filesystem::u8path(dst_filepath));
|
||||||
std::filesystem::create_directories(dst_p.parent_path()); // make the folder tree if needed
|
std::filesystem::create_directories(dst_p.parent_path()); // make the folder tree if needed
|
||||||
std::filesystem::copy_file(src_p, dst_p, std::filesystem::copy_options::overwrite_existing);
|
std::filesystem::copy_file(src_p, dst_p, std::filesystem::copy_options::overwrite_existing);
|
||||||
} catch(...) {}
|
} catch(...) {}
|
||||||
|
@ -617,8 +617,8 @@ std::vector<std::string> Local_Storage::get_folders_path(std::string path)
|
|||||||
std::vector<std::string> output{};
|
std::vector<std::string> output{};
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
const auto path_p = std::filesystem::path(path);
|
const std::filesystem::path path_p(std::filesystem::u8path(path));
|
||||||
if (!std::filesystem::is_directory(path_p)) return output;
|
if (!common_helpers::dir_exist(path_p)) return output;
|
||||||
|
|
||||||
for (const auto &dir_entry :
|
for (const auto &dir_entry :
|
||||||
std::filesystem::directory_iterator(path_p, std::filesystem::directory_options::follow_directory_symlink)) {
|
std::filesystem::directory_iterator(path_p, std::filesystem::directory_options::follow_directory_symlink)) {
|
||||||
|
@ -198,7 +198,7 @@ static void load_overlay_appearance(class Settings *settings_client, class Setti
|
|||||||
PRINT_DEBUG(" Overlay appearance line '%s'='%s'", name.c_str(), value.c_str());
|
PRINT_DEBUG(" Overlay appearance line '%s'='%s'", name.c_str(), value.c_str());
|
||||||
try {
|
try {
|
||||||
if (name.compare("Font_Override") == 0) {
|
if (name.compare("Font_Override") == 0) {
|
||||||
value = common_helpers::string_strip(Settings::sanitize(value));
|
value = common_helpers::string_strip(value);
|
||||||
// first try the local settings folder
|
// first try the local settings folder
|
||||||
std::string nfont_override(common_helpers::to_absolute(value, Local_Storage::get_game_settings_path() + "fonts"));
|
std::string nfont_override(common_helpers::to_absolute(value, Local_Storage::get_game_settings_path() + "fonts"));
|
||||||
if (!common_helpers::file_exist(nfont_override)) {
|
if (!common_helpers::file_exist(nfont_override)) {
|
||||||
@ -513,7 +513,7 @@ static bool parse_local_save(std::string &save_path)
|
|||||||
auto ptr = ini.GetValue("user::saves", "local_save_path");
|
auto ptr = ini.GetValue("user::saves", "local_save_path");
|
||||||
if (!ptr || !ptr[0]) return false;
|
if (!ptr || !ptr[0]) return false;
|
||||||
|
|
||||||
save_path = common_helpers::to_absolute(common_helpers::string_strip(Settings::sanitize(ptr)), Local_Storage::get_program_path());
|
save_path = common_helpers::to_absolute(common_helpers::string_strip(ptr), Local_Storage::get_program_path());
|
||||||
if (save_path.size() && save_path.back() != *PATH_SEPARATOR) {
|
if (save_path.size() && save_path.back() != *PATH_SEPARATOR) {
|
||||||
save_path.push_back(*PATH_SEPARATOR);
|
save_path.push_back(*PATH_SEPARATOR);
|
||||||
}
|
}
|
||||||
@ -1104,7 +1104,7 @@ static void parse_build_id(class Settings *settings_client, class Settings *sett
|
|||||||
// main::general::crash_printer_location
|
// main::general::crash_printer_location
|
||||||
static void parse_crash_printer_location()
|
static void parse_crash_printer_location()
|
||||||
{
|
{
|
||||||
std::string line(common_helpers::string_strip(Settings::sanitize(ini.GetValue("main::general", "crash_printer_location", ""))));
|
std::string line(common_helpers::string_strip(ini.GetValue("main::general", "crash_printer_location", "")));
|
||||||
if (line.size()) {
|
if (line.size()) {
|
||||||
auto crash_path = utf8_decode(common_helpers::to_absolute(line, get_full_program_path()));
|
auto crash_path = utf8_decode(common_helpers::to_absolute(line, get_full_program_path()));
|
||||||
if (crash_path.size()) {
|
if (crash_path.size()) {
|
||||||
|
@ -21,7 +21,7 @@ static bool create_dir_impl(std::filesystem::path &dirpath)
|
|||||||
|
|
||||||
bool common_helpers::create_dir(const std::string_view &filepath)
|
bool common_helpers::create_dir(const std::string_view &filepath)
|
||||||
{
|
{
|
||||||
std::filesystem::path parent(std::filesystem::path(filepath).parent_path());
|
std::filesystem::path parent(std::filesystem::u8path(filepath).parent_path());
|
||||||
return create_dir_impl(parent);
|
return create_dir_impl(parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,17 +231,17 @@ static std::filesystem::path to_absolute_impl(const std::filesystem::path &path,
|
|||||||
|
|
||||||
std::string common_helpers::to_absolute(const std::string_view &path, const std::string_view &base)
|
std::string common_helpers::to_absolute(const std::string_view &path, const std::string_view &base)
|
||||||
{
|
{
|
||||||
if (path.empty()) return std::string(path);
|
if (path.empty()) return {};
|
||||||
auto path_abs = to_absolute_impl(
|
auto path_abs = to_absolute_impl(
|
||||||
std::filesystem::path(path),
|
std::filesystem::u8path(path),
|
||||||
base.empty() ? std::filesystem::current_path() : std::filesystem::path(base)
|
base.empty() ? std::filesystem::current_path() : std::filesystem::u8path(base)
|
||||||
);
|
);
|
||||||
return path_abs.u8string();
|
return path_abs.u8string();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::wstring common_helpers::to_absolute(const std::wstring_view &path, const std::wstring_view &base)
|
std::wstring common_helpers::to_absolute(const std::wstring_view &path, const std::wstring_view &base)
|
||||||
{
|
{
|
||||||
if (path.empty()) return std::wstring(path);
|
if (path.empty()) return {};
|
||||||
auto path_abs = to_absolute_impl(
|
auto path_abs = to_absolute_impl(
|
||||||
std::filesystem::path(path),
|
std::filesystem::path(path),
|
||||||
base.empty() ? std::filesystem::current_path() : std::filesystem::path(base)
|
base.empty() ? std::filesystem::current_path() : std::filesystem::path(base)
|
||||||
@ -263,15 +263,13 @@ bool common_helpers::file_exist(const std::filesystem::path &filepath)
|
|||||||
bool common_helpers::file_exist(const std::string &filepath)
|
bool common_helpers::file_exist(const std::string &filepath)
|
||||||
{
|
{
|
||||||
if (filepath.empty()) return false;
|
if (filepath.empty()) return false;
|
||||||
std::filesystem::path path(filepath);
|
return file_exist(std::filesystem::u8path(filepath));
|
||||||
return file_exist(path);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool common_helpers::file_exist(const std::wstring &filepath)
|
bool common_helpers::file_exist(const std::wstring &filepath)
|
||||||
{
|
{
|
||||||
if (filepath.empty()) return false;
|
if (filepath.empty()) return false;
|
||||||
std::filesystem::path path(filepath);
|
return file_exist(std::filesystem::path(filepath));
|
||||||
return file_exist(path);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool common_helpers::file_size(const std::filesystem::path &filepath, size_t &size)
|
bool common_helpers::file_size(const std::filesystem::path &filepath, size_t &size)
|
||||||
@ -285,14 +283,12 @@ bool common_helpers::file_size(const std::filesystem::path &filepath, size_t &si
|
|||||||
|
|
||||||
bool common_helpers::file_size(const std::string &filepath, size_t &size)
|
bool common_helpers::file_size(const std::string &filepath, size_t &size)
|
||||||
{
|
{
|
||||||
const auto file_p = std::filesystem::path(filepath);
|
return file_size(std::filesystem::u8path(filepath), size);
|
||||||
return file_size(file_p, size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool common_helpers::file_size(const std::wstring &filepath, size_t &size)
|
bool common_helpers::file_size(const std::wstring &filepath, size_t &size)
|
||||||
{
|
{
|
||||||
const auto file_p = std::filesystem::path(filepath);
|
return file_size(std::filesystem::path(filepath), size);
|
||||||
return file_size(file_p, size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool common_helpers::dir_exist(const std::filesystem::path &dirpath)
|
bool common_helpers::dir_exist(const std::filesystem::path &dirpath)
|
||||||
@ -307,13 +303,11 @@ bool common_helpers::dir_exist(const std::filesystem::path &dirpath)
|
|||||||
bool common_helpers::dir_exist(const std::string &dirpath)
|
bool common_helpers::dir_exist(const std::string &dirpath)
|
||||||
{
|
{
|
||||||
if (dirpath.empty()) return false;
|
if (dirpath.empty()) return false;
|
||||||
std::filesystem::path path(dirpath);
|
return dir_exist(std::filesystem::u8path(dirpath));
|
||||||
return dir_exist(path);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool common_helpers::dir_exist(const std::wstring &dirpath)
|
bool common_helpers::dir_exist(const std::wstring &dirpath)
|
||||||
{
|
{
|
||||||
if (dirpath.empty()) return false;
|
if (dirpath.empty()) return false;
|
||||||
std::filesystem::path path(dirpath);
|
return dir_exist(std::filesystem::path(dirpath));
|
||||||
return dir_exist(path);
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user