diff options
| author | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2014-12-11 22:30:50 +0100 | 
|---|---|---|
| committer | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2014-12-11 22:30:50 +0100 | 
| commit | be370445362aff67b70f80567b8cf6099c72ddd8 (patch) | |
| tree | 28339e19fc9566c7bc83e38a25f2fdf2f039f514 /src/plugins/boost | |
| parent | d43b75cb459136e1d0c9df5447151069094f341d (diff) | |
| parent | 3d1e59ff0b3116255b70f6247137009903cd530b (diff) | |
Merge branch 'master' of somweyr.de:ousia
Diffstat (limited to 'src/plugins/boost')
| -rw-r--r-- | src/plugins/boost/FileLocator.cpp | 77 | ||||
| -rw-r--r-- | src/plugins/boost/FileLocator.hpp | 22 | 
2 files changed, 95 insertions, 4 deletions
diff --git a/src/plugins/boost/FileLocator.cpp b/src/plugins/boost/FileLocator.cpp new file mode 100644 index 0000000..ed9d0c9 --- /dev/null +++ b/src/plugins/boost/FileLocator.cpp @@ -0,0 +1,77 @@ +/* +    Ousía +    Copyright (C) 2014, 2015  Benjamin Paaßen, Andreas Stöckel + +    This program is free software: you can redistribute it and/or modify +    it under the terms of the GNU General Public License as published by +    the Free Software Foundation, either version 3 of the License, or +    (at your option) any later version. + +    This program is distributed in the hope that it will be useful, +    but WITHOUT ANY WARRANTY; without even the implied warranty of +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +    GNU General Public License for more details. + +    You should have received a copy of the GNU General Public License +    along with this program.  If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "FileLocator.hpp" + +#include <fstream> + +namespace ousia { + +void FileLocator::addSearchPath(const boost::filesystem::path &path, +                                std::set<ResourceLocator::Type> 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); +		} else { +			std::vector<boost::filesystem::path> v{path}; +			searchPaths.insert({type, v}); +		} +	} +} + +ResourceLocator::Location FileLocator::locate(const std::string &path, +                                              const std::string &relativeTo, +                                              const Type type) const +{ +	boost::filesystem::path base(relativeTo); +	// use the / operator to append the path. +	base /= path; +	// 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); +	} +	// otherwise look in the search paths. +	auto it = searchPaths.find(type); +	if (it != searchPaths.end()) { +		for (boost::filesystem::path p : it->second) { +			p /= path; +			if (boost::filesystem::exists(p)) { +				std::string location = +				    boost::filesystem::canonical(p).generic_string(); +				return ResourceLocator::Location(true, *this, type, location); +			} +		} +	} +	// 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; +} + +std::unique_ptr<std::istream> FileLocator::stream( +    const std::string &location) const +{ +	std::unique_ptr<std::istream> ifs{new std::ifstream(location)}; +	return std::move(ifs); +} +} diff --git a/src/plugins/boost/FileLocator.hpp b/src/plugins/boost/FileLocator.hpp index 50a77db..9cb705c 100644 --- a/src/plugins/boost/FileLocator.hpp +++ b/src/plugins/boost/FileLocator.hpp @@ -19,10 +19,14 @@  #ifndef _OUSIA_FILE_LOCATOR_HPP_  #define _OUSIA_FILE_LOCATOR_HPP_ +#include <core/ResourceLocator.hpp> +  #include <map>  #include <set> +#include <vector> + +#include <boost/filesystem.hpp> -#include <core/ResourceLocator.hpp>  namespace ousia { @@ -36,10 +40,10 @@ namespace ousia {   */  class FileLocator : public ResourceLocator {  private: -	map<ResourceLocator::Type, std::vector<std::string>> searchPaths; +	std::map<ResourceLocator::Type, std::vector<boost::filesystem::path>> searchPaths;  public: -	FileLocator() searchpaths() {} +	FileLocator() : searchPaths() {}  	/**  	 * Adds a search paths for the given types. @@ -49,9 +53,19 @@ public:  	 *              resources of the specified types at the given path in the  	 *              future.  	 */ -	void addSearchPath(const std::string &path, +	void addSearchPath(const boost::filesystem::path &path,  	                   std::set<ResourceLocator::Type> types); +	/** +	 * Returns the backing map containing all search paths for a given type. +	 * This is read-only. +	 */ +	const std::map<ResourceLocator::Type, std::vector<boost::filesystem::path>> & +	getSearchPaths() const +	{ +		return searchPaths; +	} +  	Location locate(const std::string &path, const std::string &relativeTo,  	                const Type type) const override;  | 
