diff --git a/src/OpenRCT2.cpp b/src/OpenRCT2.cpp index 645be04d1b..20261b30c3 100644 --- a/src/OpenRCT2.cpp +++ b/src/OpenRCT2.cpp @@ -173,14 +173,18 @@ extern "C" OpenRCT2::SetupEnvironment(); IObjectRepository * objRepo = CreateObjectRepository(OpenRCT2::_env); - // TODO Ideally we want to delay this until we show the title so that we can // still open the game window and draw a progress screen for the creation // of the object cache. objRepo->LoadOrConstruct(); CreateScenarioRepository(OpenRCT2::_env); - GetTrackRepository()->Scan(); + + ITrackDesignRepository * tdRepo = CreateTrackDesignRepository(OpenRCT2::_env); + // TODO Like objects, this can take a while if there are a lot of track designs + // its also really something really we might want to do in the background + // as its not required until the player wants to place a new ride. + tdRepo->Scan(); if (!gOpenRCT2Headless) { audio_init(); diff --git a/src/ride/TrackDesignRepository.cpp b/src/ride/TrackDesignRepository.cpp index 09ce52e2b3..0ff2c72388 100644 --- a/src/ride/TrackDesignRepository.cpp +++ b/src/ride/TrackDesignRepository.cpp @@ -22,6 +22,7 @@ #include "../core/FileStream.hpp" #include "../core/Path.hpp" #include "../core/String.hpp" +#include "../PlatformEnvironment.h" #include "TrackDesignRepository.h" extern "C" @@ -64,13 +65,21 @@ enum TRACK_REPO_ITEM_FLAGS class TrackDesignRepository : public ITrackDesignRepository { private: + IPlatformEnvironment * _env; + std::vector _items; QueryDirectoryResult _directoryQueryResult; public: + TrackDesignRepository(IPlatformEnvironment * env) + { + Guard::ArgumentNotNull(env); + + _env = env; + } + virtual ~TrackDesignRepository() { - } size_t GetCount() const override @@ -117,11 +126,8 @@ public: void Scan() override { - utf8 rct2Directory[MAX_PATH]; - utf8 userDirectory[MAX_PATH]; - - GetRCT2Directory(rct2Directory, sizeof(rct2Directory)); - GetUserDirectory(userDirectory, sizeof(userDirectory)); + std::string rct2Directory = _env->GetDirectoryPath(DIRBASE::RCT2, DIRID::TRACK); + std::string userDirectory = _env->GetDirectoryPath(DIRBASE::OPENRCT2, DIRID::TRACK); _items.clear(); _directoryQueryResult = { 0 }; @@ -191,9 +197,10 @@ public: { const utf8 * result = nullptr; const utf8 * fileName = Path::GetFileName(path); + std::string installDir = _env->GetDirectoryPath(DIRBASE::USER, DIRID::TRACK); utf8 newPath[MAX_PATH]; - GetUserDirectory(newPath, sizeof(newPath)); + String::Set(newPath, sizeof(newPath), installDir.c_str()); Path::Append(newPath, sizeof(newPath), fileName); if (platform_file_copy(path, newPath, false)) @@ -211,18 +218,18 @@ public: } private: - void Query(const utf8 * directory) + void Query(const std::string &directory) { utf8 pattern[MAX_PATH]; - String::Set(pattern, sizeof(pattern), directory); + String::Set(pattern, sizeof(pattern), directory.c_str()); Path::Append(pattern, sizeof(pattern), "*.td4;*.td6"); Path::QueryDirectory(&_directoryQueryResult, pattern); } - void Scan(const utf8 * directory, uint32 flags = 0) + void Scan(const std::string &directory, uint32 flags = 0) { utf8 pattern[MAX_PATH]; - String::Set(pattern, sizeof(pattern), directory); + String::Set(pattern, sizeof(pattern), directory.c_str()); Path::Append(pattern, sizeof(pattern), "*.td4;*.td6"); IFileScanner * scanner = Path::ScanDirectory(pattern, true); @@ -268,9 +275,7 @@ private: bool Load() { - utf8 path[MAX_PATH]; - GetRepositoryPath(path, sizeof(path)); - + std::string path = _env->GetFilePath(PATHID::CACHE_TRACKS); bool result = false; try { @@ -308,9 +313,7 @@ private: void Save() const { - utf8 path[MAX_PATH]; - GetRepositoryPath(path, sizeof(path)); - + std::string path = _env->GetFilePath(PATHID::CACHE_TRACKS); try { auto fs = FileStream(path, FILE_MODE_WRITE); @@ -372,19 +375,6 @@ private: return buffer; } - utf8 * GetUserDirectory(utf8 * buffer, size_t bufferSize) const - { - platform_get_user_directory(buffer, "track", bufferSize); - return buffer; - } - - utf8 * GetRepositoryPath(utf8 * buffer, size_t bufferSize) const - { - platform_get_user_directory(buffer, nullptr, bufferSize); - Path::Append(buffer, bufferSize, "tracks.idx"); - return buffer; - } - public: static utf8 * GetNameFromTrackPath(const utf8 * path) { @@ -395,52 +385,54 @@ public: } }; -static std::unique_ptr _trackRepository; +static std::unique_ptr _trackDesignRepository; -ITrackDesignRepository * GetTrackRepository() +ITrackDesignRepository * CreateTrackDesignRepository(IPlatformEnvironment * env) { - if (_trackRepository == nullptr) - { - _trackRepository = std::unique_ptr(new TrackDesignRepository()); - } - return _trackRepository.get(); + _trackDesignRepository = std::unique_ptr(new TrackDesignRepository(env)); + return _trackDesignRepository.get(); +} + +ITrackDesignRepository * GetTrackDesignRepository() +{ + return _trackDesignRepository.get(); } extern "C" { void track_repository_scan() { - ITrackDesignRepository * repo = GetTrackRepository(); + ITrackDesignRepository * repo = GetTrackDesignRepository(); repo->Scan(); } size_t track_repository_get_count_for_ride(uint8 rideType, const utf8 * entry) { - ITrackDesignRepository * repo = GetTrackRepository(); + ITrackDesignRepository * repo = GetTrackDesignRepository(); return repo->GetCountForObjectEntry(rideType, entry); } size_t track_repository_get_items_for_ride(track_design_file_ref * * outRefs, uint8 rideType, const utf8 * entry) { - ITrackDesignRepository * repo = GetTrackRepository(); + ITrackDesignRepository * repo = GetTrackDesignRepository(); return repo->GetItemsForObjectEntry(outRefs, rideType, entry); } bool track_repository_delete(const utf8 * path) { - ITrackDesignRepository * repo = GetTrackRepository(); + ITrackDesignRepository * repo = GetTrackDesignRepository(); return repo->Delete(path); } const utf8 * track_repository_rename(const utf8 * path, const utf8 * newName) { - ITrackDesignRepository * repo = GetTrackRepository(); + ITrackDesignRepository * repo = GetTrackDesignRepository(); return repo->Rename(path, newName); } const utf8 * track_repository_install(const utf8 * srcPath) { - ITrackDesignRepository * repo = GetTrackRepository(); + ITrackDesignRepository * repo = GetTrackDesignRepository(); return repo->Install(srcPath); } diff --git a/src/ride/TrackDesignRepository.h b/src/ride/TrackDesignRepository.h index 922889da08..bcf6ecaa7e 100644 --- a/src/ride/TrackDesignRepository.h +++ b/src/ride/TrackDesignRepository.h @@ -26,6 +26,8 @@ typedef struct track_design_file_ref #ifdef __cplusplus +interface IPlatformEnvironment; + interface ITrackDesignRepository { virtual ~ITrackDesignRepository() = default; @@ -42,7 +44,8 @@ interface ITrackDesignRepository virtual const utf8 * Install(const utf8 * path) abstract; }; -ITrackDesignRepository * GetTrackRepository(); +ITrackDesignRepository * CreateTrackDesignRepository(IPlatformEnvironment * env); +ITrackDesignRepository * GetTrackDesignRepository(); #endif