Mercurial > minori
view src/core/filesystem.cc @ 118:39521c47c7a3
*: another huge megacommit, SORRY
The torrents page works a lot better now
Added the edit option to the anime list right click menu
Vectorized currently playing files
Available player and extensions are now loaded at runtime
from files in (dotpath)/players.json and (dotpath)/extensions.json
These paths are not permanent and will likely be moved to
(dotpath)/recognition
...
...
...
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Tue, 07 Nov 2023 23:40:54 -0500 |
parents | c8c72278f6fd |
children | 54c9d36207db |
line wrap: on
line source
#ifdef WIN32 # include <shlobj.h> #elif defined(MACOSX) # include "sys/osx/filesystem.h" #elif defined(__linux__) # include <pwd.h> # include <sys/types.h> #endif #ifdef WIN32 # define DELIM "\\" #else # define DELIM "/" # include <errno.h> # include <unistd.h> # include <sys/stat.h> #endif #include "core/filesystem.h" #include "core/config.h" #include "core/strings.h" #include <limits.h> 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)); } void Path::SetPath(const std::string& path) { _path = path; } std::string Path::GetPath() const { return _path; } Path GetDotPath(void) { std::string ret = ""; #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); } #elif defined(MACOSX) ret += osx::GetApplicationSupportDirectory(); ret += DELIM CONFIG_DIR; #else // just assume POSIX if (getenv("HOME") != NULL) ret += getenv("HOME"); # ifdef __linux__ else ret += getpwuid(getuid())->pw_dir; # endif // __linux__ if (!ret.empty()) ret += DELIM ".config" DELIM CONFIG_DIR; #endif // !WIN32 && !MACOSX return ret; } Path GetConfigPath(void) { std::string ret = ""; ret += GetDotPath().GetPath(); if (!ret.empty()) ret += DELIM CONFIG_NAME; return ret; } Path GetPlayersPath(void) { std::string ret = ""; ret += GetDotPath().GetPath(); if (!ret.empty()) ret += DELIM "players.json"; return ret; } Path GetExtensionsPath(void) { std::string ret = ""; ret += GetDotPath().GetPath(); if (!ret.empty()) ret += DELIM "extensions.json"; return ret; } Path GetAnimeDBPath(void) { std::string ret = ""; ret += GetDotPath().GetPath(); if (!ret.empty()) ret += DELIM "anime" DELIM "db.json"; return ret; } } // namespace Filesystem