From a27781aa6a93d699089bd9859279a027fd9364cc Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Sun, 22 Dec 2019 17:42:23 -0400 Subject: [PATCH] macOS/iOS: Use more modern APIs for determining the save directory. --HG-- branch : minor --- src/common/ios.mm | 12 ++++++++---- src/common/macosx.h | 2 ++ src/common/macosx.mm | 20 ++++++++++++++++++++ src/modules/filesystem/Filesystem.h | 2 +- src/modules/filesystem/physfs/Filesystem.cpp | 15 +++++++++------ src/modules/filesystem/physfs/Filesystem.h | 2 +- 6 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/common/ios.mm b/src/common/ios.mm index 01373ad08..6b21f8b74 100644 --- a/src/common/ios.mm +++ b/src/common/ios.mm @@ -287,22 +287,26 @@ std::string getLoveInResources(bool &fused) return path; } -std::string getAppdataDirectory() +static std::string getUserDirectory(NSSearchPathDirectory dir) { - NSSearchPathDirectory searchdir = NSApplicationSupportDirectory; std::string path; @autoreleasepool { - NSArray *dirs = NSSearchPathForDirectoriesInDomains(searchdir, NSUserDomainMask, YES); + NSArray *dirs = [[NSFileManager defaultManager] URLsForDirectory:dir inDomains:NSUserDomainMask]; if (dirs.count > 0) - path = [dirs[0] UTF8String]; + path = [dirs[0].path UTF8String]; } return path; } +std::string getAppdataDirectory() +{ + return getUserDirectory(NSApplicationSupportDirectory); +} + std::string getHomeDirectory() { std::string path; diff --git a/src/common/macosx.h b/src/common/macosx.h index 348cbb329..5f94a7515 100644 --- a/src/common/macosx.h +++ b/src/common/macosx.h @@ -32,6 +32,8 @@ namespace love namespace macosx { +std::string getAppdataDirectory(); + /** * Returns the filepath of the first detected love file in the Resources folder * in the main bundle (love.app.) diff --git a/src/common/macosx.mm b/src/common/macosx.mm index d537f74f4..d0b41493f 100644 --- a/src/common/macosx.mm +++ b/src/common/macosx.mm @@ -36,6 +36,26 @@ namespace love namespace macosx { +static std::string getUserDirectory(NSSearchPathDirectory dir) +{ + std::string path; + + @autoreleasepool + { + NSArray *dirs = [[NSFileManager defaultManager] URLsForDirectory:dir inDomains:NSUserDomainMask]; + + if (dirs.count > 0) + path = [dirs[0].path UTF8String]; + } + + return path; +} + +std::string getAppdataDirectory() +{ + return getUserDirectory(NSApplicationSupportDirectory); +} + std::string getLoveInResources() { std::string path; diff --git a/src/modules/filesystem/Filesystem.h b/src/modules/filesystem/Filesystem.h index d15b66d0b..6e3a12051 100644 --- a/src/modules/filesystem/Filesystem.h +++ b/src/modules/filesystem/Filesystem.h @@ -231,7 +231,7 @@ public: * This "native" method returns a table of all * files in a given directory. **/ - virtual void getDirectoryItems(const char *dir, std::vector &items) = 0; + virtual bool getDirectoryItems(const char *dir, std::vector &items) = 0; /** * Enable or disable symbolic link support in love.filesystem. diff --git a/src/modules/filesystem/physfs/Filesystem.cpp b/src/modules/filesystem/physfs/Filesystem.cpp index 31cfa4684..e2cd671f5 100644 --- a/src/modules/filesystem/physfs/Filesystem.cpp +++ b/src/modules/filesystem/physfs/Filesystem.cpp @@ -46,6 +46,10 @@ # include "common/ios.h" #endif +#ifdef LOVE_MACOSX +# include "common/macosx.h" +#endif + #include #ifdef LOVE_ANDROID @@ -497,9 +501,7 @@ std::string Filesystem::getAppdataDirectory() appdata = to_utf8(w_appdata); replace_char(appdata, '\\', '/'); #elif defined(LOVE_MACOSX) - std::string udir = getUserDirectory(); - udir.append("/Library/Application Support"); - appdata = normalize(udir); + appdata = normalize(love::macosx::getAppdataDirectory()); #elif defined(LOVE_IOS) appdata = normalize(love::ios::getAppdataDirectory()); #elif defined(LOVE_LINUX) @@ -644,20 +646,21 @@ void Filesystem::append(const char *filename, const void *data, int64 size) cons throw love::Exception("Data could not be written."); } -void Filesystem::getDirectoryItems(const char *dir, std::vector &items) +bool Filesystem::getDirectoryItems(const char *dir, std::vector &items) { if (!PHYSFS_isInit()) - return; + return false; char **rc = PHYSFS_enumerateFiles(dir); if (rc == nullptr) - return; + return false; for (char **i = rc; *i != 0; i++) items.push_back(*i); PHYSFS_freeList(rc); + return true; } void Filesystem::setSymlinksEnabled(bool enable) diff --git a/src/modules/filesystem/physfs/Filesystem.h b/src/modules/filesystem/physfs/Filesystem.h index 5f6f0f1a3..98060eede 100644 --- a/src/modules/filesystem/physfs/Filesystem.h +++ b/src/modules/filesystem/physfs/Filesystem.h @@ -86,7 +86,7 @@ public: void write(const char *filename, const void *data, int64 size) const override; void append(const char *filename, const void *data, int64 size) const override; - void getDirectoryItems(const char *dir, std::vector &items) override; + bool getDirectoryItems(const char *dir, std::vector &items) override; void setSymlinksEnabled(bool enable) override; bool areSymlinksEnabled() const override;