summaryrefslogtreecommitdiffstats
path: root/src/common/resources
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/resources')
-rw-r--r--src/common/resources/resourcemanager.cpp52
-rw-r--r--src/common/resources/resourcemanager.h15
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);