From 11ff9aec2c3206a5b9df5bf8815051458628c45a Mon Sep 17 00:00:00 2001 From: =?utf8?q?C=C3=B4me=20Chilliet?= Date: Fri, 2 Dec 2016 23:30:30 +0700 Subject: [PATCH] Trying to add implementations for MacOS and Windows --- Source/MacCompatibility.cpp | 123 ------------------------------------ Source/Utils/Folders.cpp | 66 +++++++++++++++++-- Source/Utils/Folders.h | 1 + 3 files changed, 63 insertions(+), 127 deletions(-) diff --git a/Source/MacCompatibility.cpp b/Source/MacCompatibility.cpp index 1777791..6e47632 100644 --- a/Source/MacCompatibility.cpp +++ b/Source/MacCompatibility.cpp @@ -116,126 +116,3 @@ Duration AbsoluteDeltaToDuration( AbsoluteTime& a, AbsoluteTime& b) return time; } - - -#if PLATFORM_UNIX -#include -#include -#include -#include -#include - -// some but not all of this is code from PhysicsFS: http://icculus.org/physfs/ -// the zlib license on physfs allows this cut-and-pasting. -static int locateOneElement(char *buf) -{ - char *ptr; - DIR *dirp; - - if (access(buf, F_OK) == 0) - return(1); /* quick rejection: exists in current case. */ - - ptr = strrchr(buf, '/'); /* find entry at end of path. */ - if (ptr == NULL) { - dirp = opendir("."); - ptr = buf; - } /* if */ - else { - *ptr = '\0'; - dirp = opendir(buf); - *ptr = '/'; - ptr++; /* point past dirsep to entry itself. */ - } /* else */ - - struct dirent *dent; - while ((dent = readdir(dirp)) != NULL) { - if (strcasecmp(dent->d_name, ptr) == 0) { - strcpy(ptr, dent->d_name); /* found a match. Overwrite with this case. */ - closedir(dirp); - return(1); - } /* if */ - } /* for */ - - /* no match at all... */ - closedir(dirp); - return(0); -} /* locateOneElement */ - - -static inline const char *getUserDirByUID(void) -{ - struct passwd *pw = getpwuid(getuid()); - if (pw != NULL) - return(pw->pw_dir); - return(NULL); -} /* getUserDirByUID */ - - -static inline const char *getPrefPath(void) -{ - static char *prefpath = NULL; - if (prefpath == NULL) { - const char *homedir = getenv("HOME"); - if (homedir == NULL) - homedir = getUserDirByUID(); - if (homedir == NULL) - homedir = "."; // oh well. - -#if (defined(__APPLE__) && defined(__MACH__)) - const char *PREFPATHNAME = "Library/Application Support/Lugaru"; -#else - const char *PREFPATHNAME = ".lugaru"; -#endif - size_t len = strlen(homedir) + strlen(PREFPATHNAME) + 2; - prefpath = new char[len]; - snprintf(prefpath, len, "%s/%s", homedir, PREFPATHNAME); - } - return(prefpath); -} - -static int locateCorrectCase(char *buf, bool makedirs) -{ - int rc; - char *ptr = buf; - - while (ptr = strchr(ptr + 1, '/')) { - *ptr = '\0'; /* block this path section off */ - rc = locateOneElement(buf); - if (!rc) { - if (makedirs) /* normal if we're writing; build dirs! */ - mkdir(buf, S_IRWXU); - else { - *ptr = '/'; /* restore path separator */ - return(-2); /* missing element in path. */ - } /* else */ - } /* if */ - *ptr = '/'; /* restore path separator */ - } /* while */ - - /* check final element... */ - return(locateOneElement(buf) ? 0 : -1); -} - - -static int locateCorrectFile(char *buf, const char *mode) -{ - if (*buf == '\0') - return(0); /* Uh...I guess that's failure. */ - - assert((mode[0] == 'w') || (mode[0] == 'r')); - - bool iswriting = (mode[0] == 'w'); - const char *prefpath = getPrefPath(); - size_t len = strlen(buf) + strlen(prefpath) + 2; - char *prefpathfile = (char *) alloca(len); - snprintf(prefpathfile, len, "%s/%s", prefpath, buf); - - int rc = locateCorrectCase(prefpathfile, iswriting); /* favor prefpath. */ - if ( (rc == 0) || ((rc == -1) && (iswriting)) ) // found or create? - strcpy(buf, prefpathfile); - else if ((rc < 0) && (!iswriting)) /* not writing? Try game dir... */ - rc = locateCorrectCase(buf, iswriting); - - return(rc); -} /* locateCorrectFile */ -#endif diff --git a/Source/Utils/Folders.cpp b/Source/Utils/Folders.cpp index 0a36e5c..e845b3f 100644 --- a/Source/Utils/Folders.cpp +++ b/Source/Utils/Folders.cpp @@ -20,7 +20,16 @@ along with Lugaru. If not, see . #include "Folders.h" #include +#include +#if PLATFORM_UNIX #include +#include +#include +#endif +#if _WIN32 +#include +#include +#endif const std::string Folders::dataDir = DATADIR; @@ -38,26 +47,50 @@ std::string Folders::getResourcePath(std::string filepath) std::string Folders::getUserDataPath() { - std::string userDataPath = getGenericDirectory("XDG_DATA_HOME", ".local/share"); +#ifdef _WIN32 + return dataDir; +#else + std::string userDataPath; +#if (defined(__APPLE__) && defined(__MACH__)) + const char* homePath = getHomeDirectory(); + if (homePath == NULL) { + userDataPath = "."; + } else { + userDataPath = std::string(homePath) + "/Library/Application Support/Lugaru"; + } +#else + userDataPath = getGenericDirectory("XDG_DATA_HOME", ".local/share"); +#endif makeDirectory(userDataPath); return userDataPath; +#endif } std::string Folders::getConfigFilePath() { - std::string configFolder = getGenericDirectory("XDG_CONFIG_HOME", ".config"); +#ifdef _WIN32 + return dataDir + "/config.txt"; +#else + std::string configFolder; +#if (defined(__APPLE__) && defined(__MACH__)) + configFolder = getUserDataPath(); +#else + configFolder = getGenericDirectory("XDG_CONFIG_HOME", ".config"); +#endif makeDirectory(configFolder); return configFolder + "/config.txt"; +#endif } +#if PLATFORM_LINUX /* Generic code for XDG ENVVAR test and fallback */ std::string Folders::getGenericDirectory(const char* ENVVAR, const std::string fallback) { - char* path = getenv(ENVVAR); + const char* path = getenv(ENVVAR); std::string ret; if((path != NULL) && (strlen(path) != 0)) { ret = std::string(path) + "/lugaru"; } else { - path = getenv("HOME"); + path = getHomeDirectory(); if((path != NULL) && (strlen(path) != 0)) { ret = std::string(path) + '/' + fallback + "/lugaru"; } else { @@ -66,8 +99,32 @@ std::string Folders::getGenericDirectory(const char* ENVVAR, const std::string f } return ret; } +#endif + +#if PLATFORM_UNIX +const char* Folders::getHomeDirectory() +{ + const char *homedir = getenv("HOME"); + if (homedir != NULL) + return homedir; + struct passwd *pw = getpwuid(getuid()); + if (pw != NULL) + return pw->pw_dir; + return NULL; +} +#endif bool Folders::makeDirectory(std::string path) { +#ifdef _WIN32 + int status = CreateDirectory(path.c_str(), NULL); + if(status != 0) { + return true; + } else if(GetLastError() == ERROR_ALREADY_EXISTS) { + return true; + } else { + return false; + } +#else errno = 0; int status = mkdir(path.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); if (status == 0) { @@ -77,4 +134,5 @@ bool Folders::makeDirectory(std::string path) { } else { return false; } +#endif } diff --git a/Source/Utils/Folders.h b/Source/Utils/Folders.h index 0343b6c..9ed7ae4 100644 --- a/Source/Utils/Folders.h +++ b/Source/Utils/Folders.h @@ -45,6 +45,7 @@ public: static std::string getConfigFilePath(); private: + static const char* getHomeDirectory(); static std::string getGenericDirectory(const char* ENVVAR, const std::string fallback); static bool makeDirectory(std::string path); }; -- 2.39.2