From c1f8e7294c1ee8ed28ea71ca7eee10e659368ac4 Mon Sep 17 00:00:00 2001 From: Tomas Jakobsson Date: Tue, 9 Jan 2018 23:55:09 +0100 Subject: [PATCH] Update and rename some Utils::FileSystem functions Replace boost::filesystem::is_directory with Utils::FileSystem::isDirectory Replace boost::filesystem::is_regular_file with Utils::FileSystem::isRegularFile Replace boost::filesystem::is_symlink with Utils::FileSystem::isSymlink Replace boost::filesystem::exists with Utils::FileSystem::exists Replace boost::filesystem::create_directory with Utils::FileSystem::createDirectory Replace boost::filesystem::remove with Utils::FileSystem::removeFile --- es-app/src/CollectionSystemManager.cpp | 21 +- es-app/src/FileData.cpp | 10 +- es-app/src/Gamelist.cpp | 11 +- es-app/src/SystemData.cpp | 25 +- es-app/src/SystemScreenSaver.cpp | 21 +- es-app/src/main.cpp | 10 +- es-app/src/scrapers/Scraper.cpp | 10 +- .../src/views/gamelist/BasicGameListView.cpp | 4 +- .../src/views/gamelist/VideoGameListView.cpp | 4 +- es-core/src/HttpReq.cpp | 5 +- es-core/src/InputManager.cpp | 8 +- es-core/src/Settings.cpp | 6 +- es-core/src/ThemeData.cpp | 9 +- es-core/src/Util.cpp | 7 +- es-core/src/components/VideoComponent.cpp | 6 +- es-core/src/guis/GuiDetectDevice.cpp | 4 +- es-core/src/resources/ResourceManager.cpp | 6 +- es-core/src/utils/FileSystemUtil.cpp | 218 +++++++++++------- es-core/src/utils/FileSystemUtil.h | 46 ++-- 19 files changed, 244 insertions(+), 187 deletions(-) diff --git a/es-app/src/CollectionSystemManager.cpp b/es-app/src/CollectionSystemManager.cpp index 6aea7e108..4b439546b 100644 --- a/es-app/src/CollectionSystemManager.cpp +++ b/es-app/src/CollectionSystemManager.cpp @@ -1,6 +1,7 @@ #include "CollectionSystemManager.h" #include "guis/GuiInfoPopup.h" +#include "utils/FileSystemUtil.h" #include "utils/StringUtil.h" #include "views/gamelist/IGameListView.h" #include "views/ViewController.h" @@ -50,8 +51,8 @@ CollectionSystemManager::CollectionSystemManager(Window* window) : mWindow(windo mCollectionEnvData->mPlatformIds = allPlatformIds; std::string path = getCollectionsFolder(); - if(!boost::filesystem::exists(path)) - boost::filesystem::create_directory(path); + if(!Utils::FileSystem::exists(path)) + Utils::FileSystem::createDirectory(path); mIsEditingCustom = false; mEditingCollection = "Favorites"; @@ -332,7 +333,7 @@ bool CollectionSystemManager::isThemeCustomCollectionCompatible(std::vectorsecond.path.string() + "/theme.xml"; - if (boost::filesystem::exists(defaultThemeFilePath)) + if (Utils::FileSystem::exists(defaultThemeFilePath)) { return true; } @@ -722,7 +723,7 @@ void CollectionSystemManager::populateCustomCollection(CollectionSystemData* sys CollectionSystemDecl sysDecl = sysData->decl; std::string path = getCustomCollectionConfigPath(newSys->getName()); - if(!boost::filesystem::exists(path)) + if(!Utils::FileSystem::exists(path)) { LOG(LogInfo) << "Couldn't find custom collection config file at " << path; return; @@ -829,7 +830,7 @@ std::vector CollectionSystemManager::getSystemsFromConfig() std::vector systems; std::string path = SystemData::getConfigPath(false); - if(!boost::filesystem::exists(path)) + if(!Utils::FileSystem::exists(path)) { return systems; } @@ -882,18 +883,18 @@ std::vector CollectionSystemManager::getSystemsFromTheme() boost::filesystem::path themePath = set->second.path; - if (boost::filesystem::exists(themePath)) + if (Utils::FileSystem::exists(themePath.generic_string())) { boost::filesystem::directory_iterator end_itr; // default construction yields past-the-end for (boost::filesystem::directory_iterator itr(themePath); itr != end_itr; ++itr) { - if (boost::filesystem::is_directory(itr->status())) + if (Utils::FileSystem::isDirectory(itr->path().generic_string())) { //... here you have a directory std::string folder = itr->path().string(); folder = folder.substr(themePath.string().size()+1); - if(boost::filesystem::exists(set->second.getThemePath(folder))) + if(Utils::FileSystem::exists(set->second.getThemePath(folder).generic_string())) { systems.push_back(folder); } @@ -942,12 +943,12 @@ std::vector CollectionSystemManager::getCollectionsFromConfigFolder std::vector systems; boost::filesystem::path configPath = getCollectionsFolder(); - if (boost::filesystem::exists(configPath)) + if (Utils::FileSystem::exists(configPath.generic_string())) { boost::filesystem::directory_iterator end_itr; // default construction yields past-the-end for (boost::filesystem::directory_iterator itr(configPath); itr != end_itr; ++itr) { - if (boost::filesystem::is_regular_file(itr->status())) + if (Utils::FileSystem::isRegularFile(itr->path().generic_string())) { // it's a file std::string file = itr->path().string(); diff --git a/es-app/src/FileData.cpp b/es-app/src/FileData.cpp index 9006901ff..4e2177df2 100644 --- a/es-app/src/FileData.cpp +++ b/es-app/src/FileData.cpp @@ -1,5 +1,6 @@ #include "FileData.h" +#include "utils/FileSystemUtil.h" #include "utils/StringUtil.h" #include "utils/TimeUtil.h" #include "AudioManager.h" @@ -12,7 +13,6 @@ #include "Util.h" #include "VolumeControl.h" #include "Window.h" -#include FileData::FileData(FileType type, const boost::filesystem::path& path, SystemEnvironmentData* envData, SystemData* system) : mType(type), mPath(path), mSystem(system), mEnvData(envData), mSourceFileData(NULL), mParent(NULL), metadata(type == GAME ? GAME_METADATA : FOLDER_METADATA) // metadata is REALLY set in the constructor! @@ -66,7 +66,7 @@ const std::string FileData::getThumbnailPath() const if(thumbnail.empty()) { std::string path = mEnvData->mStartPath + "/images/" + getDisplayName() + "-image" + extList[i]; - if(boost::filesystem::exists(path)) + if(Utils::FileSystem::exists(path)) thumbnail = path; } } @@ -109,7 +109,7 @@ const std::string FileData::getVideoPath() const if(video.empty()) { std::string path = mEnvData->mStartPath + "/images/" + getDisplayName() + "-video.mp4"; - if(boost::filesystem::exists(path)) + if(Utils::FileSystem::exists(path)) video = path; } @@ -129,7 +129,7 @@ const std::string FileData::getMarqueePath() const if(marquee.empty()) { std::string path = mEnvData->mStartPath + "/images/" + getDisplayName() + "-marquee" + extList[i]; - if(boost::filesystem::exists(path)) + if(Utils::FileSystem::exists(path)) marquee = path; } } @@ -151,7 +151,7 @@ const std::string FileData::getImagePath() const if(image.empty()) { std::string path = mEnvData->mStartPath + "/images/" + getDisplayName() + "-image" + extList[i]; - if(boost::filesystem::exists(path)) + if(Utils::FileSystem::exists(path)) image = path; } } diff --git a/es-app/src/Gamelist.cpp b/es-app/src/Gamelist.cpp index 6c4293218..2a3e92661 100644 --- a/es-app/src/Gamelist.cpp +++ b/es-app/src/Gamelist.cpp @@ -1,5 +1,6 @@ #include "Gamelist.h" +#include "utils/FileSystemUtil.h" #include "FileData.h" #include "FileFilterIndex.h" #include "Log.h" @@ -87,7 +88,7 @@ void parseGamelist(SystemData* system) bool trustGamelist = Settings::getInstance()->getBool("ParseGamelistOnly"); std::string xmlpath = system->getGamelistPath(false); - if(!boost::filesystem::exists(xmlpath)) + if(!Utils::FileSystem::exists(xmlpath)) return; LOG(LogInfo) << "Parsing XML file \"" << xmlpath << "\"..."; @@ -120,7 +121,7 @@ void parseGamelist(SystemData* system) { boost::filesystem::path path = resolvePath(fileNode.child("path").text().get(), relativeTo, false); - if(!trustGamelist && !boost::filesystem::exists(path)) + if(!trustGamelist && !Utils::FileSystem::exists(path.generic_string())) { LOG(LogWarning) << "File \"" << path << "\" does not exist! Ignoring."; continue; @@ -183,7 +184,7 @@ void updateGamelist(SystemData* system) pugi::xml_node root; std::string xmlReadPath = system->getGamelistPath(false); - if(boost::filesystem::exists(xmlReadPath)) + if(Utils::FileSystem::exists(xmlReadPath)) { //parse an existing file first pugi::xml_parse_result result = doc.load_file(xmlReadPath.c_str()); @@ -241,7 +242,7 @@ void updateGamelist(SystemData* system) boost::filesystem::path nodePath = resolvePath(pathNode.text().get(), system->getStartPath(), true); boost::filesystem::path gamePath((*fit)->getPath()); - if(nodePath == gamePath || (boost::filesystem::exists(nodePath) && boost::filesystem::exists(gamePath) && boost::filesystem::equivalent(nodePath, gamePath))) + if(nodePath == gamePath || (Utils::FileSystem::exists(nodePath.generic_string()) && Utils::FileSystem::exists(gamePath.generic_string()) && boost::filesystem::equivalent(nodePath, gamePath))) { // found it root.remove_child(fileNode); @@ -259,7 +260,7 @@ void updateGamelist(SystemData* system) if (numUpdated > 0) { //make sure the folders leading up to this path exist (or the write will fail) boost::filesystem::path xmlWritePath(system->getGamelistPath(true)); - boost::filesystem::create_directories(xmlWritePath.parent_path()); + Utils::FileSystem::createDirectory(xmlWritePath.parent_path().generic_string()); LOG(LogInfo) << "Added/Updated " << numUpdated << " entities in '" << xmlReadPath << "'"; diff --git a/es-app/src/SystemData.cpp b/es-app/src/SystemData.cpp index ad9c1f84e..7115d08bc 100644 --- a/es-app/src/SystemData.cpp +++ b/es-app/src/SystemData.cpp @@ -1,5 +1,6 @@ #include "SystemData.h" +#include "utils/FileSystemUtil.h" #include "CollectionSystemManager.h" #include "FileFilterIndex.h" #include "FileSorts.h" @@ -82,7 +83,7 @@ bool isHidden(const boost::filesystem::path &filePath) void SystemData::populateFolder(FileData* folder) { const boost::filesystem::path& folderPath = folder->getPath(); - if(!boost::filesystem::is_directory(folderPath)) + if(!Utils::FileSystem::isDirectory(folderPath.generic_string())) { LOG(LogWarning) << "Error - folder with path \"" << folderPath << "\" is not a directory!"; return; @@ -91,7 +92,7 @@ void SystemData::populateFolder(FileData* folder) const std::string folderStr = folderPath.generic_string(); //make sure that this isn't a symlink to a thing we already have - if(boost::filesystem::is_symlink(folderPath)) + if(Utils::FileSystem::isSymlink(folderPath.generic_string())) { //if this symlink resolves to somewhere that's at the beginning of our path, it's gonna recurse if(folderStr.find(boost::filesystem::canonical(folderPath).generic_string()) == 0) @@ -132,7 +133,7 @@ void SystemData::populateFolder(FileData* folder) } //add directories that also do not match an extension as folders - if(!isGame && boost::filesystem::is_directory(filePath)) + if(!isGame && Utils::FileSystem::isDirectory(filePath.generic_string())) { FileData* newFolder = new FileData(FOLDER, filePath.generic_string(), mEnvData, this); populateFolder(newFolder); @@ -186,7 +187,7 @@ bool SystemData::loadConfig() LOG(LogInfo) << "Loading system config file " << path << "..."; - if(!boost::filesystem::exists(path)) + if(!Utils::FileSystem::exists(path)) { LOG(LogError) << "es_systems.cfg file does not exist!"; writeExampleConfig(getConfigPath(true)); @@ -349,7 +350,7 @@ void SystemData::deleteSystems() std::string SystemData::getConfigPath(bool forWrite) { boost::filesystem::path path = getHomePath() + "/.emulationstation/es_systems.cfg"; - if(forWrite || boost::filesystem::exists(path)) + if(forWrite || Utils::FileSystem::exists(path.generic_string())) return path.generic_string(); return "/etc/emulationstation/es_systems.cfg"; @@ -388,13 +389,13 @@ std::string SystemData::getGamelistPath(bool forWrite) const boost::filesystem::path filePath; filePath = mRootFolder->getPath() / "gamelist.xml"; - if(boost::filesystem::exists(filePath)) + if(Utils::FileSystem::exists(filePath.generic_string())) return filePath.generic_string(); filePath = getHomePath() + "/.emulationstation/gamelists/" + mName + "/gamelist.xml"; if(forWrite) // make sure the directory exists if we're going to write to it, or crashes will happen - boost::filesystem::create_directories(filePath.parent_path()); - if(forWrite || boost::filesystem::exists(filePath)) + Utils::FileSystem::createDirectory(filePath.parent_path().generic_string()); + if(forWrite || Utils::FileSystem::exists(filePath.generic_string())) return filePath.generic_string(); return "/etc/emulationstation/gamelists/" + mName + "/gamelist.xml"; @@ -409,13 +410,13 @@ std::string SystemData::getThemePath() const // first, check game folder boost::filesystem::path localThemePath = mRootFolder->getPath() / "theme.xml"; - if(boost::filesystem::exists(localThemePath)) + if(Utils::FileSystem::exists(localThemePath.generic_string())) return localThemePath.generic_string(); // not in game folder, try system theme in theme sets localThemePath = ThemeData::getThemeFromCurrentSet(mThemeFolder); - if (boost::filesystem::exists(localThemePath)) + if (Utils::FileSystem::exists(localThemePath.generic_string())) return localThemePath.generic_string(); // not system theme, try default system theme in theme set @@ -426,7 +427,7 @@ std::string SystemData::getThemePath() const bool SystemData::hasGamelist() const { - return (boost::filesystem::exists(getGamelistPath(false))); + return (Utils::FileSystem::exists(getGamelistPath(false))); } unsigned int SystemData::getGameCount() const @@ -488,7 +489,7 @@ void SystemData::loadTheme() std::string path = getThemePath(); - if(!boost::filesystem::exists(path)) // no theme available for this platform + if(!Utils::FileSystem::exists(path)) // no theme available for this platform return; try diff --git a/es-app/src/SystemScreenSaver.cpp b/es-app/src/SystemScreenSaver.cpp index e2efdf93f..c82b7a445 100644 --- a/es-app/src/SystemScreenSaver.cpp +++ b/es-app/src/SystemScreenSaver.cpp @@ -4,6 +4,7 @@ #include "components/VideoPlayerComponent.h" #endif #include "components/VideoVlcComponent.h" +#include "utils/FileSystemUtil.h" #include "views/gamelist/IGameListView.h" #include "views/ViewController.h" #include "FileData.h" @@ -38,8 +39,8 @@ SystemScreenSaver::SystemScreenSaver(Window* window) : { mWindow->setScreenSaver(this); std::string path = getTitleFolder(); - if(!boost::filesystem::exists(path)) - boost::filesystem::create_directory(path); + if(!Utils::FileSystem::exists(path)) + Utils::FileSystem::createDirectory(path); srand((unsigned int)time(NULL)); mVideoChangeTime = 30000; } @@ -81,13 +82,13 @@ void SystemScreenSaver::startScreenSaver() pickRandomVideo(path); int retry = 200; - while(retry > 0 && ((path.empty() || !boost::filesystem::exists(path)) || mCurrentGame == NULL)) + while(retry > 0 && ((path.empty() || !Utils::FileSystem::exists(path)) || mCurrentGame == NULL)) { retry--; pickRandomVideo(path); } - if (!path.empty() && boost::filesystem::exists(path)) + if (!path.empty() && Utils::FileSystem::exists(path)) { #ifdef _RPI_ // Create the correct type of video component @@ -164,7 +165,7 @@ void SystemScreenSaver::startScreenSaver() std::string bg_audio_file = Settings::getInstance()->getString("SlideshowScreenSaverBackgroundAudioFile"); if ((!mBackgroundAudio) && (bg_audio_file != "")) { - if (boost::filesystem::exists(bg_audio_file)) + if (Utils::FileSystem::exists(bg_audio_file)) { // paused PS so that the background audio keeps playing PowerSaver::pause(); @@ -269,7 +270,7 @@ unsigned long SystemScreenSaver::countGameListNodes(const char *nodeName) pugi::xml_node root; std::string xmlReadPath = (*it)->getGamelistPath(false); - if(boost::filesystem::exists(xmlReadPath)) + if(Utils::FileSystem::exists(xmlReadPath)) { pugi::xml_parse_result result = doc.load_file(xmlReadPath.c_str()); if (!result) @@ -321,7 +322,7 @@ void SystemScreenSaver::pickGameListNode(unsigned long index, const char *nodeNa std::string xmlReadPath = (*it)->getGamelistPath(false); - if(boost::filesystem::exists(xmlReadPath)) + if(Utils::FileSystem::exists(xmlReadPath)) { pugi::xml_parse_result result = doc.load_file(xmlReadPath.c_str()); if (!result) @@ -416,7 +417,7 @@ void SystemScreenSaver::pickRandomGameListImage(std::string& path) void SystemScreenSaver::pickRandomCustomImage(std::string& path) { std::string imageDir = Settings::getInstance()->getString("SlideshowScreenSaverImageDir"); - if ((imageDir != "") && (boost::filesystem::exists(imageDir))) + if ((imageDir != "") && (Utils::FileSystem::exists(imageDir))) { std::string imageFilter = Settings::getInstance()->getString("SlideshowScreenSaverImageFilter"); @@ -430,7 +431,7 @@ void SystemScreenSaver::pickRandomCustomImage(std::string& path) // TODO: Figure out how to remove this duplication in the else block for (iter; iter != end_iter; ++iter) { - if (boost::filesystem::is_regular_file(iter->status())) + if (Utils::FileSystem::isRegularFile(iter->path().generic_string())) { // If the image filter is empty, or the file extension is in the filter string, // add it to the matching files list @@ -449,7 +450,7 @@ void SystemScreenSaver::pickRandomCustomImage(std::string& path) for (iter; iter != end_iter; ++iter) { - if (boost::filesystem::is_regular_file(iter->status())) + if (Utils::FileSystem::isRegularFile(iter->path().generic_string())) { // If the image filter is empty, or the file extension is in the filter string, // add it to the matching files list diff --git a/es-app/src/main.cpp b/es-app/src/main.cpp index 23f8e982b..4e4bf070f 100644 --- a/es-app/src/main.cpp +++ b/es-app/src/main.cpp @@ -3,6 +3,7 @@ #include "guis/GuiDetectDevice.h" #include "guis/GuiMsgBox.h" +#include "utils/FileSystemUtil.h" #include "views/ViewController.h" #include "CollectionSystemManager.h" #include "EmulationStation.h" @@ -14,7 +15,6 @@ #include "Settings.h" #include "SystemData.h" #include "SystemScreenSaver.h" -#include #include #include #include @@ -169,11 +169,11 @@ bool verifyHomeFolderExists() //make sure the config directory exists std::string home = getHomePath(); std::string configDir = home + "/.emulationstation"; - if(!boost::filesystem::exists(configDir)) + if(!Utils::FileSystem::exists(configDir)) { std::cout << "Creating config directory \"" << configDir << "\"\n"; - boost::filesystem::create_directory(configDir); - if(!boost::filesystem::exists(configDir)) + Utils::FileSystem::createDirectory(configDir); + if(!Utils::FileSystem::exists(configDir)) { std::cerr << "Config directory could not be created!\n"; return false; @@ -335,7 +335,7 @@ int main(int argc, char* argv[]) //choose which GUI to open depending on if an input configuration already exists if(errorMsg == NULL) { - if(boost::filesystem::exists(InputManager::getConfigPath()) && InputManager::getInstance()->getNumConfiguredDevices() > 0) + if(Utils::FileSystem::exists(InputManager::getConfigPath()) && InputManager::getInstance()->getNumConfiguredDevices() > 0) { ViewController::get()->goToStart(); }else{ diff --git a/es-app/src/scrapers/Scraper.cpp b/es-app/src/scrapers/Scraper.cpp index af970891d..f6d7de776 100644 --- a/es-app/src/scrapers/Scraper.cpp +++ b/es-app/src/scrapers/Scraper.cpp @@ -1,12 +1,12 @@ #include "scrapers/Scraper.h" +#include "utils/FileSystemUtil.h" #include "FileData.h" #include "GamesDBScraper.h" #include "Log.h" #include "platform.h" #include "Settings.h" #include "SystemData.h" -#include #include #include @@ -278,13 +278,13 @@ std::string getSaveAsPath(const ScraperSearchParams& params, const std::string& std::string path = getHomePath() + "/.emulationstation/downloaded_images/"; - if(!boost::filesystem::exists(path)) - boost::filesystem::create_directory(path); + if(!Utils::FileSystem::exists(path)) + Utils::FileSystem::createDirectory(path); path += subdirectory + "/"; - if(!boost::filesystem::exists(path)) - boost::filesystem::create_directory(path); + if(!Utils::FileSystem::exists(path)) + Utils::FileSystem::createDirectory(path); size_t dot = url.find_last_of('.'); std::string ext; diff --git a/es-app/src/views/gamelist/BasicGameListView.cpp b/es-app/src/views/gamelist/BasicGameListView.cpp index d4803edd0..4f61d3fa8 100644 --- a/es-app/src/views/gamelist/BasicGameListView.cpp +++ b/es-app/src/views/gamelist/BasicGameListView.cpp @@ -1,11 +1,11 @@ #include "views/gamelist/BasicGameListView.h" +#include "utils/FileSystemUtil.h" #include "views/UIModeController.h" #include "views/ViewController.h" #include "CollectionSystemManager.h" #include "Settings.h" #include "SystemData.h" -#include BasicGameListView::BasicGameListView(Window* window, FileData* root) : ISimpleGameListView(window, root), mList(window) @@ -105,7 +105,7 @@ void BasicGameListView::launch(FileData* game) void BasicGameListView::remove(FileData *game, bool deleteFile) { if (deleteFile) - boost::filesystem::remove(game->getPath()); // actually delete the file on the filesystem + Utils::FileSystem::removeFile(game->getPath().generic_string()); // actually delete the file on the filesystem FileData* parent = game->getParent(); if (getCursor() == game) // Select next element in list, or prev if none { diff --git a/es-app/src/views/gamelist/VideoGameListView.cpp b/es-app/src/views/gamelist/VideoGameListView.cpp index a75df55f9..6de7caf8f 100644 --- a/es-app/src/views/gamelist/VideoGameListView.cpp +++ b/es-app/src/views/gamelist/VideoGameListView.cpp @@ -5,11 +5,11 @@ #include "components/VideoPlayerComponent.h" #endif #include "components/VideoVlcComponent.h" +#include "utils/FileSystemUtil.h" #include "views/ViewController.h" #ifdef _RPI_ #include "Settings.h" #endif -#include VideoGameListView::VideoGameListView(Window* window, FileData* root) : BasicGameListView(window, root), @@ -224,7 +224,7 @@ void VideoGameListView::updateInfoPanel() { FileData* file = (mList.size() == 0 || mList.isScrolling()) ? NULL : mList.getSelected(); - boost::filesystem::remove(getTitlePath().c_str()); + Utils::FileSystem::removeFile(getTitlePath()); bool fadingOut; if(file == NULL) diff --git a/es-core/src/HttpReq.cpp b/es-core/src/HttpReq.cpp index f30d663c5..7005b2409 100644 --- a/es-core/src/HttpReq.cpp +++ b/es-core/src/HttpReq.cpp @@ -1,7 +1,8 @@ #include "HttpReq.h" +#include "utils/FileSystemUtil.h" #include "Log.h" -#include +#include CURLM* HttpReq::s_multi_handle = curl_multi_init(); @@ -32,7 +33,7 @@ std::string HttpReq::urlEncode(const std::string &s) bool HttpReq::isUrl(const std::string& str) { //the worst guess - return (!str.empty() && !boost::filesystem::exists(str) && + return (!str.empty() && !Utils::FileSystem::exists(str) && (str.find("http://") != std::string::npos || str.find("https://") != std::string::npos || str.find("www.") != std::string::npos)); } diff --git a/es-core/src/InputManager.cpp b/es-core/src/InputManager.cpp index 9e7901312..c91adbafc 100644 --- a/es-core/src/InputManager.cpp +++ b/es-core/src/InputManager.cpp @@ -1,10 +1,10 @@ #include "InputManager.h" +#include "utils/FileSystemUtil.h" #include "CECInput.h" #include "Log.h" #include "platform.h" #include "Window.h" -#include #include #include #include @@ -278,7 +278,7 @@ bool InputManager::parseEvent(const SDL_Event& ev, Window* window) bool InputManager::loadInputConfig(InputConfig* config) { std::string path = getConfigPath(); - if(!boost::filesystem::exists(path)) + if(!Utils::FileSystem::exists(path)) return false; pugi::xml_document doc; @@ -333,7 +333,7 @@ void InputManager::writeDeviceConfig(InputConfig* config) pugi::xml_document doc; - if(boost::filesystem::exists(path)) + if(Utils::FileSystem::exists(path)) { // merge files pugi::xml_parse_result result = doc.load_file(path.c_str()); @@ -394,7 +394,7 @@ void InputManager::doOnFinish() std::string path = getConfigPath(); pugi::xml_document doc; - if(boost::filesystem::exists(path)) + if(Utils::FileSystem::exists(path)) { pugi::xml_parse_result result = doc.load_file(path.c_str()); if(!result) diff --git a/es-core/src/Settings.cpp b/es-core/src/Settings.cpp index a18f002f3..fcf16661b 100644 --- a/es-core/src/Settings.cpp +++ b/es-core/src/Settings.cpp @@ -1,9 +1,11 @@ #include "Settings.h" +#include "utils/FileSystemUtil.h" #include "Log.h" #include "platform.h" -#include #include +#include +#include Settings* Settings::sInstance = NULL; @@ -185,7 +187,7 @@ void Settings::loadFile() { const std::string path = getHomePath() + "/.emulationstation/es_settings.cfg"; - if(!boost::filesystem::exists(path)) + if(!Utils::FileSystem::exists(path)) return; pugi::xml_document doc; diff --git a/es-core/src/ThemeData.cpp b/es-core/src/ThemeData.cpp index c6609d52a..9f55ec944 100644 --- a/es-core/src/ThemeData.cpp +++ b/es-core/src/ThemeData.cpp @@ -2,6 +2,7 @@ #include "components/ImageComponent.h" #include "components/TextComponent.h" +#include "utils/FileSystemUtil.h" #include "Log.h" #include "platform.h" #include "Settings.h" @@ -205,7 +206,7 @@ void ThemeData::loadFile(std::map sysDataMap, const st ThemeException error; error.setFiles(mPaths); - if(!boost::filesystem::exists(path)) + if(!Utils::FileSystem::exists(path)) throw error << "File does not exist!"; mVersion = 0; @@ -484,7 +485,7 @@ const std::shared_ptr& ThemeData::getDefault() theme = std::shared_ptr(new ThemeData()); const std::string path = getHomePath() + "/.emulationstation/es_theme_default.xml"; - if(boost::filesystem::exists(path)) + if(Utils::FileSystem::exists(path)) { try { @@ -544,12 +545,12 @@ std::map ThemeData::getThemeSets() for(size_t i = 0; i < pathCount; i++) { - if(!boost::filesystem::is_directory(paths[i])) + if(!Utils::FileSystem::isDirectory(paths[i].generic_string())) continue; for(boost::filesystem::directory_iterator it(paths[i]); it != end; ++it) { - if(boost::filesystem::is_directory(*it)) + if(Utils::FileSystem::isDirectory((*it).path().generic_string())) { ThemeSet set = {*it}; sets[set.getName()] = set; diff --git a/es-core/src/Util.cpp b/es-core/src/Util.cpp index 79234c70f..04cc6f170 100644 --- a/es-core/src/Util.cpp +++ b/es-core/src/Util.cpp @@ -1,5 +1,6 @@ #include "Util.h" +#include "utils/FileSystemUtil.h" #include "platform.h" #include @@ -27,7 +28,7 @@ std::string strToUpper(const std::string& str) // embedded resources, e.g. ":/font.ttf", need to be properly handled too std::string getCanonicalPath(const std::string& path) { - if(path.empty() || !boost::filesystem::exists(path)) + if(path.empty() || !Utils::FileSystem::exists(path)) return path; return boost::filesystem::canonical(path).generic_string(); @@ -83,14 +84,14 @@ boost::filesystem::path removeCommonPathUsingStrings(const boost::filesystem::pa boost::filesystem::path removeCommonPath(const boost::filesystem::path& path, const boost::filesystem::path& relativeTo, bool& contains) { // if either of these doesn't exist, boost::filesystem::canonical() is going to throw an error - if(!boost::filesystem::exists(path) || !boost::filesystem::exists(relativeTo)) + if(!Utils::FileSystem::exists(path.generic_string()) || !Utils::FileSystem::exists(relativeTo.generic_string())) { contains = false; return path; } // if it's a symlink we don't want to apply boost::filesystem::canonical on it, otherwise we'll lose the current parent_path - boost::filesystem::path p = (boost::filesystem::is_symlink(path) ? boost::filesystem::canonical(path.parent_path()) / path.filename() : boost::filesystem::canonical(path)); + boost::filesystem::path p = (Utils::FileSystem::isSymlink(path.generic_string()) ? boost::filesystem::canonical(path.parent_path()) / path.filename() : boost::filesystem::canonical(path)); boost::filesystem::path r = boost::filesystem::canonical(relativeTo); if(p.root_path() != r.root_path()) diff --git a/es-core/src/components/VideoComponent.cpp b/es-core/src/components/VideoComponent.cpp index 9b4f585f6..cbbc535a6 100644 --- a/es-core/src/components/VideoComponent.cpp +++ b/es-core/src/components/VideoComponent.cpp @@ -1,12 +1,12 @@ #include "components/VideoComponent.h" #include "resources/ResourceManager.h" +#include "utils/FileSystemUtil.h" #include "PowerSaver.h" #include "Renderer.h" #include "ThemeData.h" #include "Util.h" #include "Window.h" -#include #include #define FADE_TIME_MS 200 @@ -75,8 +75,8 @@ VideoComponent::VideoComponent(Window* window) : } std::string path = getTitleFolder(); - if(!boost::filesystem::exists(path)) - boost::filesystem::create_directory(path); + if(!Utils::FileSystem::exists(path)) + Utils::FileSystem::createDirectory(path); } VideoComponent::~VideoComponent() diff --git a/es-core/src/guis/GuiDetectDevice.cpp b/es-core/src/guis/GuiDetectDevice.cpp index 6d3f5b096..a8555f8bd 100644 --- a/es-core/src/guis/GuiDetectDevice.cpp +++ b/es-core/src/guis/GuiDetectDevice.cpp @@ -2,12 +2,12 @@ #include "components/TextComponent.h" #include "guis/GuiInputConfig.h" +#include "utils/FileSystemUtil.h" #include "InputManager.h" #include "PowerSaver.h" #include "Renderer.h" #include "Util.h" #include "Window.h" -#include #define HOLD_TIME 1000 @@ -102,7 +102,7 @@ void GuiDetectDevice::update(int deltaTime) if(mHoldingConfig) { // If ES starts and if a known device is connected after startup skip controller configuration - if(mFirstRun && boost::filesystem::exists(InputManager::getConfigPath()) && InputManager::getInstance()->getNumConfiguredDevices() > 0) + if(mFirstRun && Utils::FileSystem::exists(InputManager::getConfigPath()) && InputManager::getInstance()->getNumConfiguredDevices() > 0) { if(mDoneCallback) mDoneCallback(); diff --git a/es-core/src/resources/ResourceManager.cpp b/es-core/src/resources/ResourceManager.cpp index 5134a0731..348d7880b 100644 --- a/es-core/src/resources/ResourceManager.cpp +++ b/es-core/src/resources/ResourceManager.cpp @@ -1,7 +1,7 @@ #include "ResourceManager.h" #include "../data/Resources.h" -#include +#include "utils/FileSystemUtil.h" #include auto array_deleter = [](unsigned char* p) { delete[] p; }; @@ -37,7 +37,7 @@ const ResourceData ResourceManager::getFileData(const std::string& path) const } //it's not embedded; load the file - if(!boost::filesystem::exists(path)) + if(!Utils::FileSystem::exists(path)) { //if the file doesn't exist, return an "empty" ResourceData ResourceData data = {NULL, 0}; @@ -71,7 +71,7 @@ bool ResourceManager::fileExists(const std::string& path) const if(res2hMap.find(path) != res2hMap.cend()) return true; - return boost::filesystem::exists(path); + return Utils::FileSystem::exists(path); } void ResourceManager::unloadAll() diff --git a/es-core/src/utils/FileSystemUtil.cpp b/es-core/src/utils/FileSystemUtil.cpp index 1d282cb62..04c9a821b 100644 --- a/es-core/src/utils/FileSystemUtil.cpp +++ b/es-core/src/utils/FileSystemUtil.cpp @@ -23,7 +23,7 @@ namespace Utils { stringList getDirContent(const std::string& _path) { - std::string path = genericPath(_path); + std::string path = getGenericPath(_path); stringList contentList; // only parse the directory, if it's a directory @@ -90,7 +90,7 @@ namespace Utils // this should give us something like "/home/YOUR_USERNAME" on Linux and "C:/Users/YOUR_USERNAME/" on Windows std::string envHome(getenv("HOME")); if(envHome.length()) - path = genericPath(envHome); + path = getGenericPath(envHome); #if defined(_WIN32) // but does not seem to work for Windows XP or Vista, so try something else @@ -99,7 +99,7 @@ namespace Utils std::string envDir(getenv("HOMEDRIVE")); std::string envPath(getenv("HOMEPATH")); if(envDir.length() && envPath.length()) - path = genericPath(envDir + "/" + envPath); + path = getGenericPath(envDir + "/" + envPath); } #endif // _WIN32 @@ -115,11 +115,11 @@ namespace Utils char temp[512]; // return current working directory path - return (getcwd(temp, 512) ? genericPath(temp) : ""); + return (getcwd(temp, 512) ? getGenericPath(temp) : ""); } // getCWDPath - std::string genericPath(const std::string& _path) + std::string getGenericPath(const std::string& _path) { std::string path = _path; size_t offset = std::string::npos; @@ -139,11 +139,11 @@ namespace Utils // return generic path return path; - } // genericPath + } // getGenericPath - std::string escapedPath(const std::string& _path) + std::string getEscapedPath(const std::string& _path) { - std::string path = genericPath(_path); + std::string path = getGenericPath(_path); #if defined(_WIN32) // windows escapes stuff by just putting everything in quotes @@ -166,11 +166,11 @@ namespace Utils return path; #endif // _WIN32 - } // escapedPath + } // getEscapedPath - std::string canonicalPath(const std::string& _path) + std::string getCanonicalPath(const std::string& _path) { - std::string path = absolutePath(_path); + std::string path = exists(_path) ? getAbsolutePath(_path) : getGenericPath(_path); // cleanup path bool scan = true; @@ -244,78 +244,21 @@ namespace Utils // return canonical path return path; - } // canonicalPath + } // getCanonicalPath - std::string absolutePath(const std::string& _path, const std::string& _base) + std::string getAbsolutePath(const std::string& _path, const std::string& _base) { - std::string path = genericPath(_path); - std::string base = isAbsolute(_base) ? genericPath(_base) : absolutePath(_base); + std::string path = getGenericPath(_path); + std::string base = isAbsolute(_base) ? getGenericPath(_base) : getAbsolutePath(_base); // return absolute path - return isAbsolute(path) ? path : genericPath(base + "/" + path); + return isAbsolute(path) ? path : getGenericPath(base + "/" + path); - } // absolutePath - - std::string resolvePath(const std::string& _path, const std::string& _relativeTo, const bool _allowHome) - { - std::string path = genericPath(_path); - std::string relativeTo = isDirectory(_relativeTo) ? _relativeTo : getParent(_relativeTo); - - // nothing to resolve - if(!path.length()) - return path; - - // replace '.' with relativeTo - if(path[0] == '.') - return genericPath(relativeTo + "/" + &(path[1])); - - // replace '~' with homePath - if(_allowHome && (path[0] == '~')) - return genericPath(getHomePath() + "/" + &(path[1])); - - // nothing to resolve - return path; - - } // resolvePath - - std::string resolveSymlink(const std::string& _path) - { - std::string path = genericPath(_path); - std::string resolved; - -#if defined(_WIN32) - HANDLE hFile = CreateFile(path.c_str(), FILE_READ_ATTRIBUTES, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); - - if(hFile != INVALID_HANDLE_VALUE) - { - resolved.resize(GetFinalPathNameByHandle(hFile, nullptr, 0, FILE_NAME_NORMALIZED) + 1); - if(GetFinalPathNameByHandle(hFile, (LPSTR)resolved.data(), (DWORD)resolved.size(), FILE_NAME_NORMALIZED) > 0) - { - resolved.resize(resolved.size() - 1); - resolved = genericPath(resolved); - } - CloseHandle(hFile); - } -#else // _WIN32 - struct stat info; - - // check if lstat succeeded - if(lstat(path.c_str(), &info) == 0) - { - resolved.resize(info.st_size); - if(readlink(path.c_str(), (char*)resolved.data(), resolved.size()) > 0) - resolved = genericPath(resolved); - } -#endif // _WIN32 - - // return resolved path - return resolved; - - } // resolveSymlink + } // getAbsolutePath std::string getParent(const std::string& _path) { - std::string path = genericPath(_path); + std::string path = getGenericPath(_path); size_t offset = std::string::npos; // find last '/' and erase it @@ -329,7 +272,7 @@ namespace Utils std::string getFileName(const std::string& _path) { - std::string path = genericPath(_path); + std::string path = getGenericPath(_path); size_t offset = std::string::npos; // find last '/' and return the filename @@ -377,9 +320,112 @@ namespace Utils } // getExtension + std::string resolveRelativePath(const std::string& _path, const std::string& _relativeTo, const bool _allowHome) + { + std::string path = getGenericPath(_path); + std::string relativeTo = isDirectory(_relativeTo) ? getGenericPath(_relativeTo) : getParent(_relativeTo); + + // nothing to resolve + if (!path.length()) + return path; + + // replace '.' with relativeTo + if (path[0] == '.') + return (relativeTo + "/" + &(path[1])); + + // replace '~' with homePath + if (_allowHome && (path[0] == '~')) + return (getHomePath() + "/" + &(path[1])); + + // nothing to resolve + return path; + + } // resolveRelativePath + + std::string createRelativePath(const std::string& _path, const std::string& _relativeTo, const bool _allowHome) + { + bool contains = false; + std::string path = removeCommonPath(_path, _relativeTo, contains); + + if (contains) + { + // success + return ("." + path); + } + + if (_allowHome) + { + contains = false; + std::string path = removeCommonPath(_path, getHomePath(), contains); + + if (contains) + { + // success + return ("~" + path); + } + } + + // nothing to resolve + return path; + + } // createRelativePath + + std::string removeCommonPath(const std::string& _path, const std::string& _common, bool& _contains) + { + std::string path = getGenericPath(_path); + std::string common = isDirectory(_common) ? getGenericPath(_common) : getParent(_common); + + // check if path contains common + if (path.find_first_of(common) == 0) + { + _contains = true; + return path.substr(common.length() + 1); + } + + // it didn't + _contains = false; + return path; + + } // removeCommonPath + + std::string resolveSymlink(const std::string& _path) + { + std::string path = getGenericPath(_path); + std::string resolved; + +#if defined(_WIN32) + HANDLE hFile = CreateFile(path.c_str(), FILE_READ_ATTRIBUTES, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + + if (hFile != INVALID_HANDLE_VALUE) + { + resolved.resize(GetFinalPathNameByHandle(hFile, nullptr, 0, FILE_NAME_NORMALIZED) + 1); + if (GetFinalPathNameByHandle(hFile, (LPSTR)resolved.data(), (DWORD)resolved.size(), FILE_NAME_NORMALIZED) > 0) + { + resolved.resize(resolved.size() - 1); + resolved = getGenericPath(resolved); + } + CloseHandle(hFile); + } +#else // _WIN32 + struct stat info; + + // check if lstat succeeded + if (lstat(path.c_str(), &info) == 0) + { + resolved.resize(info.st_size); + if (readlink(path.c_str(), (char*)resolved.data(), resolved.size()) > 0) + resolved = getGenericPath(resolved); + } +#endif // _WIN32 + + // return resolved path + return resolved; + + } // resolveSymlink + bool removeFile(const std::string& _path) { - std::string path = genericPath(_path); + std::string path = getGenericPath(_path); // don't remove if it doesn't exists if(!exists(path)) @@ -392,7 +438,7 @@ namespace Utils bool createDirectory(const std::string& _path) { - std::string path = genericPath(_path); + std::string path = getGenericPath(_path); // don't create if it already exists if(exists(path)) @@ -416,7 +462,7 @@ namespace Utils bool exists(const std::string& _path) { - std::string path = genericPath(_path); + std::string path = getGenericPath(_path); struct stat info; // check if stat succeeded @@ -426,7 +472,7 @@ namespace Utils bool isAbsolute(const std::string& _path) { - std::string path = genericPath(_path); + std::string path = getGenericPath(_path); #if defined(_WIN32) return ((path.size() > 1) && (path[1] == ':')); @@ -438,7 +484,7 @@ namespace Utils bool isRegularFile(const std::string& _path) { - std::string path = genericPath(_path); + std::string path = getGenericPath(_path); struct stat info; // check if stat succeeded @@ -452,7 +498,7 @@ namespace Utils bool isDirectory(const std::string& _path) { - std::string path = genericPath(_path); + std::string path = getGenericPath(_path); struct stat info; // check if stat succeeded @@ -466,7 +512,7 @@ namespace Utils bool isSymlink(const std::string& _path) { - std::string path = genericPath(_path); + std::string path = getGenericPath(_path); #if defined(_WIN32) // check for symlink attribute @@ -491,7 +537,7 @@ namespace Utils bool isHidden(const std::string& _path) { - std::string path = genericPath(_path); + std::string path = getGenericPath(_path); #if defined(_WIN32) // check for hidden attribute @@ -511,8 +557,8 @@ namespace Utils bool isEquivalent(const std::string& _path1, const std::string& _path2) { - std::string path1 = genericPath(_path1); - std::string path2 = genericPath(_path2); + std::string path1 = getGenericPath(_path1); + std::string path2 = getGenericPath(_path2); struct stat info1; struct stat info2; diff --git a/es-core/src/utils/FileSystemUtil.h b/es-core/src/utils/FileSystemUtil.h index 2d90d6951..5d4e705c6 100644 --- a/es-core/src/utils/FileSystemUtil.h +++ b/es-core/src/utils/FileSystemUtil.h @@ -11,28 +11,30 @@ namespace Utils { typedef std::list stringList; - stringList getDirContent (const std::string& _path); - std::string getHomePath (); - std::string getCWDPath (); - std::string genericPath (const std::string& _path); - std::string escapedPath (const std::string& _path); - std::string canonicalPath (const std::string& _path); - std::string absolutePath (const std::string& _path, const std::string& _base = getCWDPath()); - std::string resolvePath (const std::string& _path, const std::string& _relativeTo, const bool _allowHome); - std::string resolveSymlink (const std::string& _path); - std::string getParent (const std::string& _path); - std::string getFileName (const std::string& _path); - std::string getStem (const std::string& _path); - std::string getExtension (const std::string& _path); - bool removeFile (const std::string& _path); - bool createDirectory(const std::string& _path); - bool exists (const std::string& _path); - bool isAbsolute (const std::string& _path); - bool isRegularFile (const std::string& _path); - bool isDirectory (const std::string& _path); - bool isSymlink (const std::string& _path); - bool isHidden (const std::string& _path); - bool isEquivalent (const std::string& _path1, const std::string& _path2); + stringList getDirContent (const std::string& _path); + std::string getHomePath (); + std::string getCWDPath (); + std::string getGenericPath (const std::string& _path); + std::string getEscapedPath (const std::string& _path); + std::string getCanonicalPath (const std::string& _path); + std::string getAbsolutePath (const std::string& _path, const std::string& _base = getCWDPath()); + std::string getParent (const std::string& _path); + std::string getFileName (const std::string& _path); + std::string getStem (const std::string& _path); + std::string getExtension (const std::string& _path); + std::string resolveRelativePath(const std::string& _path, const std::string& _relativeTo, const bool _allowHome); + std::string createRelativePath (const std::string& _path, const std::string& _relativeTo, const bool _allowHome); + std::string removeCommonPath (const std::string& _path, const std::string& _common, bool& _contains); + std::string resolveSymlink (const std::string& _path); + bool removeFile (const std::string& _path); + bool createDirectory (const std::string& _path); + bool exists (const std::string& _path); + bool isAbsolute (const std::string& _path); + bool isRegularFile (const std::string& _path); + bool isDirectory (const std::string& _path); + bool isSymlink (const std::string& _path); + bool isHidden (const std::string& _path); + bool isEquivalent (const std::string& _path1, const std::string& _path2); } // FileSystem::