From e1b99479a2db254d40ccd7ea0a5ee524f1582b65 Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Wed, 7 Feb 2018 23:51:01 +0100 Subject: [PATCH 1/2] Make custom paths absolute Then gCustomUserDataPath and relatant variables are set, they overwrite the gBasePath array, which uses absolute paths. This commit makes the custom paths absolute as well, to prevent issues with assumptions in the code (file dialog for example). --- src/openrct2/cmdline/RootCommands.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/openrct2/cmdline/RootCommands.cpp b/src/openrct2/cmdline/RootCommands.cpp index 714a524e6f..31e423c27f 100644 --- a/src/openrct2/cmdline/RootCommands.cpp +++ b/src/openrct2/cmdline/RootCommands.cpp @@ -27,6 +27,7 @@ #include "../core/Memory.hpp" #include "../core/Path.hpp" #include "../core/String.hpp" +#include "../core/Util.hpp" #include "../network/network.h" #include "../object/ObjectRepository.h" #include "../OpenRCT2.h" @@ -197,25 +198,29 @@ exitcode_t CommandLine::HandleCommandDefault() if (_userDataPath != nullptr) { - String::Set(gCustomUserDataPath, sizeof(gCustomUserDataPath), _userDataPath); + utf8 absolutePath[MAX_PATH]{}; + Path::GetAbsolute(absolutePath, Util::CountOf(absolutePath), _userDataPath); + String::Set(gCustomUserDataPath, Util::CountOf(gCustomUserDataPath), absolutePath); Memory::Free(_userDataPath); } if (_openrctDataPath != nullptr) { - String::Set(gCustomOpenrctDataPath, sizeof(gCustomOpenrctDataPath), _openrctDataPath); + utf8 absolutePath[MAX_PATH]{}; + Path::GetAbsolute(absolutePath, Util::CountOf(absolutePath), _openrctDataPath); + String::Set(gCustomOpenrctDataPath, Util::CountOf(gCustomOpenrctDataPath), absolutePath); Memory::Free(_openrctDataPath); } if (_rct2DataPath != nullptr) { - String::Set(gCustomRCT2DataPath, sizeof(gCustomRCT2DataPath), _rct2DataPath); + String::Set(gCustomRCT2DataPath, Util::CountOf(gCustomRCT2DataPath), _rct2DataPath); Memory::Free(_rct2DataPath); } if (_password != nullptr) { - String::Set(gCustomPassword, sizeof(gCustomPassword), _password); + String::Set(gCustomPassword, Util::CountOf(gCustomPassword), _password); Memory::Free(_password); } From ced75956d145672f92e9315fb6199d75eba2ade7 Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Thu, 8 Feb 2018 00:10:55 +0100 Subject: [PATCH 2/2] Populate loadsave window with absolute path When pressing "up", the code would look for the parent in the given path, which doesn't work well with relative paths. This commit fixes this behaviour. --- src/openrct2-ui/windows/LoadSave.cpp | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/openrct2-ui/windows/LoadSave.cpp b/src/openrct2-ui/windows/LoadSave.cpp index cb89a9f3ef..e12fa159fd 100644 --- a/src/openrct2-ui/windows/LoadSave.cpp +++ b/src/openrct2-ui/windows/LoadSave.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -24,9 +25,9 @@ #include #include #include +#include #include #include -#include #include #include #include @@ -746,10 +747,12 @@ static void window_loadsave_sort_list() static void window_loadsave_populate_list(rct_window *w, sint32 includeNewItem, const char *directory, const char *extension) { - safe_strcpy(_directory, directory, sizeof(_directory)); + utf8 absoluteDirectory[MAX_PATH]; + Path::GetAbsolute(absoluteDirectory, Util::CountOf(absoluteDirectory), directory); + safe_strcpy(_directory, absoluteDirectory, Util::CountOf(_directory)); if (_extension != extension) { - safe_strcpy(_extension, extension, sizeof(_extension)); + safe_strcpy(_extension, extension, Util::CountOf(_extension)); } _shortenedDirectory[0] = '\0'; @@ -781,7 +784,7 @@ static void window_loadsave_populate_list(rct_window *w, sint32 includeNewItem, else { // Remove the separator at the end of the path, if present - safe_strcpy(_parentDirectory, directory, sizeof(_parentDirectory)); + safe_strcpy(_parentDirectory, absoluteDirectory, Util::CountOf(_parentDirectory)); if (_parentDirectory[strlen(_parentDirectory) - 1] == *PATH_SEPARATOR || _parentDirectory[strlen(_parentDirectory) - 1] == '/') _parentDirectory[strlen(_parentDirectory) - 1] = '\0'; @@ -816,13 +819,13 @@ static void window_loadsave_populate_list(rct_window *w, sint32 includeNewItem, w->disabled_widgets &= ~(1 << WIDX_NEW_FOLDER); // List all directories - auto subDirectories = Path::GetDirectories(directory); + auto subDirectories = Path::GetDirectories(absoluteDirectory); for (const auto &sdName : subDirectories) { auto subDir = sdName + PATH_SEPARATOR; LoadSaveListItem newListItem; - newListItem.path = Path::Combine(directory, subDir); + newListItem.path = Path::Combine(absoluteDirectory, subDir); newListItem.name = subDir; newListItem.type = TYPE_DIRECTORY; newListItem.loaded = false; @@ -833,15 +836,15 @@ static void window_loadsave_populate_list(rct_window *w, sint32 includeNewItem, // List all files with the wanted extensions char filter[MAX_PATH]; char extCopy[64]; - safe_strcpy(extCopy, extension, sizeof(extCopy)); + safe_strcpy(extCopy, extension, Util::CountOf(extCopy)); char * extToken; bool showExtension = false; extToken = strtok(extCopy, ";"); while (extToken != nullptr) { - safe_strcpy(filter, directory, sizeof(filter)); - safe_strcat_path(filter, "*", sizeof(filter)); - path_append_extension(filter, extToken, sizeof(filter)); + safe_strcpy(filter, directory, Util::CountOf(filter)); + safe_strcat_path(filter, "*", Util::CountOf(filter)); + path_append_extension(filter, extToken, Util::CountOf(filter)); auto scanner = std::unique_ptr(Path::ScanDirectory(filter, false)); while (scanner->Next())