diff src/core/filesystem.cc @ 135:0a458cb26ff4

filesystem: move to using std::filesystem after C++17 switch old compilers will croak compiling this, but it's not like we *really* need to support them (they probably croak compiling Qt as well)
author Paper <mrpapersonic@gmail.com>
date Thu, 09 Nov 2023 18:01:56 -0500
parents 54c9d36207db
children 7d3ad9529c4c
line wrap: on
line diff
--- a/src/core/filesystem.cc	Thu Nov 09 13:53:04 2023 -0500
+++ b/src/core/filesystem.cc	Thu Nov 09 18:01:56 2023 -0500
@@ -19,139 +19,59 @@
 #include "core/filesystem.h"
 #include "core/config.h"
 #include "core/strings.h"
+#include <filesystem>
 #include <limits.h>
 
-/* TODO: remove this and use std::filesystem */
-
 namespace Filesystem {
 
-Path::Path() {
-	_path = "";
-}
-Path::Path(const std::string& path) {
-	_path = path;
-}
-Path::Path(const Path& path) {
-	_path = path.GetPath();
-}
-
-bool Path::CreateDirectories() const {
-	std::string temp = "";
-	size_t start;
-	size_t end = 0;
-	temp.append(_path.substr(0, _path.find_first_not_of(DELIM, end)));
-
-	while ((start = _path.find_first_not_of(DELIM, end)) != std::string::npos) {
-		end = _path.find(DELIM, start);
-		temp.append(_path.substr(start, end - start));
-#ifdef WIN32
-		if (!CreateDirectoryW(Strings::ToWstring(temp).c_str(), NULL) && GetLastError() == ERROR_PATH_NOT_FOUND)
-			/* ERROR_PATH_NOT_FOUND should NOT happen here */
-			return false;
-#else
-		struct stat st;
-		if (stat(temp.c_str(), &st) == -1)
-			mkdir(temp.c_str(), 0755);
-#endif
-		temp.append(DELIM);
-	}
-	return true;
-}
-
-bool Path::Exists() const {
-#ifdef WIN32
-	std::wstring buf = Strings::ToWstring(_path);
-	return GetFileAttributesW(buf.c_str()) != INVALID_FILE_ATTRIBUTES;
-#else
-	struct stat st;
-	return stat(_path.c_str(), &st) == 0;
-#endif
-}
-
-std::string Path::Basename() const {
-	unsigned long long pos = _path.find_last_of(DELIM);
-	return pos != std::string::npos ? _path.substr(pos + 1, _path.length()) : "";
-}
-
-std::string Path::Stem() const {
-	std::string basename = Basename();
-	unsigned long long pos = basename.find_last_of(".");
-	return pos != std::string::npos ? basename.substr(0, pos) : "";
-}
-
-std::string Path::Extension() const {
-	std::string basename = Basename();
-	unsigned long long pos = basename.find_last_of(".");
-	return pos != std::string::npos ? basename.substr(pos + 1, basename.length()) : "";
-}
-
-Path Path::GetParent() const {
-	return _path.substr(0, _path.find_last_of(DELIM));
+/* this runs fs::create_directories() on the
+   PARENT directory. */
+void CreateDirectories(const std::filesystem::path& path) {
+	std::filesystem::create_directories(path.parent_path());
 }
 
-void Path::SetPath(const std::string& path) {
-	_path = path;
-}
-
-std::string Path::GetPath() const {
-	return _path;
-}
-
-Path GetDotPath(void) {
-	std::string ret = "";
+std::filesystem::path GetDotPath() {
 #ifdef WIN32
-	std::wstring buf(MAX_PATH, '\0');
-	if (SHGetFolderPathAndSubDirW(NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, CONFIG_WDIR, &buf.front()) ==
-	    S_OK) {
-		buf.resize(buf.find('\0'));
-		ret += Strings::ToUtf8String(buf);
-	}
+	std::filesystem::path path;
+	wchar_t* buf;
+	if (SHGetKnownFolderPath(FOLDERID_RoamingAppData, KF_FLAG_CREATE, NULL, &buf) == S_OK)
+		path = buf;
+	else
+		return std::filesystem::path();
+	CoTaskMemFree(buf);
+	return path / CONFIG_DIR;
 #elif defined(MACOSX)
-	ret += osx::GetApplicationSupportDirectory();
-	ret += DELIM CONFIG_DIR;
+	return std::filesystem::path(osx::GetApplicationSupportDirectory()) / CONFIG_DIR;
 #else // just assume POSIX
-	if (getenv("HOME") != NULL)
-		ret += getenv("HOME");
+	const char* home = getenv("HOME");
+	if (home != NULL)
+		path = home;
 #	ifdef __linux__
 	else
-		ret += getpwuid(getuid())->pw_dir;
+		path = getpwuid(getuid())->pw_dir;
 #	endif // __linux__
-	if (!ret.empty())
-		ret += DELIM ".config" DELIM CONFIG_DIR;
+	if (!path.empty())
+		return path / ".config";
+	else
+		return std::filesystem::path();
 #endif     // !WIN32 && !MACOSX
-	return ret;
-}
-
-Path GetConfigPath(void) {
-	std::string ret = "";
-	ret += GetDotPath().GetPath();
-	if (!ret.empty())
-		ret += DELIM CONFIG_NAME;
-	return ret;
+	return path / CONFIG_DIR;
 }
 
-Path GetPlayersPath(void) {
-	std::string ret = "";
-	ret += GetDotPath().GetPath();
-	if (!ret.empty())
-		ret += DELIM "players.json";
-	return ret;
+std::filesystem::path GetConfigPath() {
+	return GetDotPath() / CONFIG_NAME;
 }
 
-Path GetExtensionsPath(void) {
-	std::string ret = "";
-	ret += GetDotPath().GetPath();
-	if (!ret.empty())
-		ret += DELIM "extensions.json";
-	return ret;
+std::filesystem::path GetPlayersPath() {
+	return GetDotPath() / "recognition" / "players.json";
 }
 
-Path GetAnimeDBPath(void) {
-	std::string ret = "";
-	ret += GetDotPath().GetPath();
-	if (!ret.empty())
-		ret += DELIM "anime" DELIM "db.json";
-	return ret;
+std::filesystem::path GetExtensionsPath() {
+	return GetDotPath() / "recognition" / "extensions.json";
+}
+
+std::filesystem::path GetAnimeDBPath() {
+	return GetDotPath() / "anime" / "db.json";
 }
 
 } // namespace Filesystem