From 47311cc8b211a7fef033d744d9eba9f308726ea8 Mon Sep 17 00:00:00 2001 From: Andreas Stöckel Date: Tue, 20 Jan 2015 00:53:49 +0100 Subject: Refactored stuff surrounding the ResourceLocator class, implemented StaticResourceLocator which can be used for registering static resources (mainly for testing or if certain resources need to be available from the executable) --- src/plugins/boost/FileLocator.cpp | 49 ++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 21 deletions(-) (limited to 'src/plugins/boost/FileLocator.cpp') diff --git a/src/plugins/boost/FileLocator.cpp b/src/plugins/boost/FileLocator.cpp index 3db214f..9ab398e 100644 --- a/src/plugins/boost/FileLocator.cpp +++ b/src/plugins/boost/FileLocator.cpp @@ -18,46 +18,55 @@ #include "FileLocator.hpp" +#include + #include namespace ousia { -void FileLocator::addSearchPath(const boost::filesystem::path &path, - std::set types) +void FileLocator::addSearchPath(const std::string &path, + std::set types) { + // Canonicalize the given path + std::string canonicalPath = + boost::filesystem::canonical(path).generic_string(); + + // Insert the path for all given types. for (auto &type : types) { - // retrieve the path vector for the given type. auto it = searchPaths.find(type); if (it != searchPaths.end()) { - it->second.push_back(path); + it->second.push_back(canonicalPath); } else { - std::vector v{path}; - searchPaths.insert({type, v}); + searchPaths.insert({type, {canonicalPath}}); } } } -ResourceLocator::Location FileLocator::locate(const std::string &path, - const std::string &relativeTo, - const Type type) const +bool FileLocator::doLocate(Resource &resource, const std::string &path, + const ResourceType type, + const std::string &relativeTo) const { boost::filesystem::path base(relativeTo); if (boost::filesystem::exists(base)) { - // look if 'relativeTo' is a directory already. + // Look if 'relativeTo' is a directory already. if (!boost::filesystem::is_directory(base)) { - // if not we use the parent directory. + // If not we use the parent directory. base = base.parent_path(); } - // use the / operator to append the path. + + // Use the / operator to append the path. base /= path; - // if we already found a fitting resource there, use that. + + // If we already found a fitting resource there, use that. if (boost::filesystem::exists(base)) { std::string location = boost::filesystem::canonical(base).generic_string(); - return ResourceLocator::Location(true, *this, type, location); + resource = Resource(true, *this, type, location); + return true; } } - // otherwise look in the search paths. + + // Otherwise look in the search paths. auto it = searchPaths.find(type); if (it != searchPaths.end()) { for (boost::filesystem::path p : it->second) { @@ -65,17 +74,15 @@ ResourceLocator::Location FileLocator::locate(const std::string &path, if (boost::filesystem::exists(p)) { std::string location = boost::filesystem::canonical(p).generic_string(); - return ResourceLocator::Location(true, *this, type, location); + resource = Resource(true, *this, type, location); + return true; } } } - // if we find the resource in none of the search paths we return a location. - // with the found flag set to false. - ResourceLocator::Location l(false, *this, type, ""); - return l; + return false; } -std::unique_ptr FileLocator::stream( +std::unique_ptr FileLocator::doStream( const std::string &location) const { std::unique_ptr ifs{new std::ifstream(location)}; -- cgit v1.2.3