diff options
Diffstat (limited to 'src/common/resources')
-rw-r--r-- | src/common/resources/resourcemanager.cpp | 52 | ||||
-rw-r--r-- | src/common/resources/resourcemanager.h | 15 |
2 files changed, 66 insertions, 1 deletions
diff --git a/src/common/resources/resourcemanager.cpp b/src/common/resources/resourcemanager.cpp index 6459df0..8e7f09f 100644 --- a/src/common/resources/resourcemanager.cpp +++ b/src/common/resources/resourcemanager.cpp @@ -22,6 +22,10 @@ #include <physfs.h> +#include <boost/filesystem.hpp> + +namespace fs = boost::filesystem; + namespace { const Uint32 PHYSFS_RWOPS_TYPE = 0xc010b04f; @@ -135,13 +139,39 @@ bool CResourceManager::Exists(const std::string &filename) return PHYSFS_exists(filename.c_str()); } +bool CResourceManager::DirectoryExists(const std::string& directory) +{ + return PHYSFS_exists(directory.c_str()) && PHYSFS_isDirectory(directory.c_str()); +} + +bool CResourceManager::CreateDirectory(const std::string& directory) +{ + return PHYSFS_mkdir(directory.c_str()); +} + +bool CResourceManager::RemoveDirectory(const std::string& directory) +{ + bool success = true; + std::string writeDir = PHYSFS_getWriteDir(); + try + { + fs::remove_all(writeDir + "/" + directory); + } + catch (std::exception & e) + { + success = false; + } + return success; +} + std::vector<std::string> CResourceManager::ListFiles(const std::string &directory) { std::vector<std::string> result; char **files = PHYSFS_enumerateFiles(directory.c_str()); - for (char **i = files; *i != nullptr; i++) { + for (char **i = files; *i != nullptr; i++) + { result.push_back(*i); } @@ -150,6 +180,26 @@ std::vector<std::string> CResourceManager::ListFiles(const std::string &director return result; } +std::vector<std::string> CResourceManager::ListDirectories(const std::string &directory) +{ + std::vector<std::string> result; + + char **files = PHYSFS_enumerateFiles(directory.c_str()); + + for (char **i = files; *i != nullptr; i++) + { + std::string path = directory + "/" + (*i); + if (PHYSFS_isDirectory(path.c_str())) + { + result.push_back(*i); + } + } + + PHYSFS_freeList(files); + + return result; +} + int CResourceManager::SDLClose(SDL_RWops *context) { diff --git a/src/common/resources/resourcemanager.h b/src/common/resources/resourcemanager.h index b222048..7f99210 100644 --- a/src/common/resources/resourcemanager.h +++ b/src/common/resources/resourcemanager.h @@ -30,11 +30,26 @@ public: static bool AddLocation(const std::string &location, bool prepend = true); static bool RemoveLocation(const std::string &location); + static bool SetSaveLocation(const std::string &location); + static SDL_RWops* GetSDLFileHandler(const std::string &filename); static CSNDFile* GetSNDFileHandler(const std::string &filename); + + //! Check if file exists static bool Exists(const std::string &filename); + //! Check if file exists and is a directory + static bool DirectoryExists(const std::string& directory); + + //! Create directory in write directory + static bool CreateDirectory(const std::string& directory); + //! Remove directory in write directory, recursively + static bool RemoveDirectory(const std::string& directory); + + //! List files contained in directory static std::vector<std::string> ListFiles(const std::string &directory); + //! List directories contained in directory + static std::vector<std::string> ListDirectories(const std::string &directory); private: static int SDLSeek(SDL_RWops *context, int offset, int whence); |