diff options
author | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2015-01-20 17:46:00 +0100 |
---|---|---|
committer | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2015-01-20 17:46:00 +0100 |
commit | b61de477f91e9f6ec68a7e7b9ab5d4bddc632843 (patch) | |
tree | b15dba2ac0cf667d798d052bbb5e854f5c767a89 /src/plugins/filesystem | |
parent | 070094c6411f4c6b17ad4420538a7d7121988c73 (diff) |
Moved some files around
Diffstat (limited to 'src/plugins/filesystem')
-rw-r--r-- | src/plugins/filesystem/FileLocator.cpp | 91 | ||||
-rw-r--r-- | src/plugins/filesystem/FileLocator.hpp | 92 |
2 files changed, 183 insertions, 0 deletions
diff --git a/src/plugins/filesystem/FileLocator.cpp b/src/plugins/filesystem/FileLocator.cpp new file mode 100644 index 0000000..9ab398e --- /dev/null +++ b/src/plugins/filesystem/FileLocator.cpp @@ -0,0 +1,91 @@ +/* + 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 <boost/filesystem.hpp> + +#include <fstream> + +namespace ousia { + +void FileLocator::addSearchPath(const std::string &path, + std::set<ResourceType> 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) { + auto it = searchPaths.find(type); + if (it != searchPaths.end()) { + it->second.push_back(canonicalPath); + } else { + searchPaths.insert({type, {canonicalPath}}); + } + } +} + +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. + if (!boost::filesystem::is_directory(base)) { + // If not we use the parent directory. + base = base.parent_path(); + } + + // 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(); + resource = Resource(true, *this, type, location); + return true; + } + } + + // 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(); + resource = Resource(true, *this, type, location); + return true; + } + } + } + return false; +} + +std::unique_ptr<std::istream> FileLocator::doStream( + const std::string &location) const +{ + std::unique_ptr<std::istream> ifs{new std::ifstream(location)}; + return std::move(ifs); +} +} diff --git a/src/plugins/filesystem/FileLocator.hpp b/src/plugins/filesystem/FileLocator.hpp new file mode 100644 index 0000000..ffe5c8f --- /dev/null +++ b/src/plugins/filesystem/FileLocator.hpp @@ -0,0 +1,92 @@ +/* + 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/>. +*/ + +#ifndef _OUSIA_FILE_LOCATOR_HPP_ +#define _OUSIA_FILE_LOCATOR_HPP_ + +#include <core/resource/Resource.hpp> +#include <core/resource/ResourceLocator.hpp> + +#include <map> +#include <set> +#include <vector> + +namespace ousia { + +/** + * A ResourceLocator is a class able to locate resources in some way, usually + * on the hard drive. + * + * We specify this as an abstract superclass to have an interface layer between + * the program core and possible future extensions in terms of resource + * locations (e.g. online resources, .zip files, etc.). + */ +class FileLocator : public ResourceLocator { +public: + /** + * Type alias representing a Res + */ + using SearchPaths = std::map<ResourceType, std::vector<std::string>>; + +private: + /** + * Internal variable containing all stored search paths. + */ + SearchPaths searchPaths; + +protected: + bool doLocate(Resource &resource, const std::string &path, + const ResourceType type, + const std::string &relativeTo) const override; + + std::unique_ptr<std::istream> doStream( + const std::string &location) const override; + +public: + FileLocator() : searchPaths() {} + + /** + * Adds a search paths for the given types. + * + * @param path is a fully qualified/canonical path to a directory. + * @param types is a set of Resource Types. The FileLocator will look for + * resources of the specified types at the given path in the + * future. + */ + void addSearchPath(const std::string &path, std::set<ResourceType> types); + + /** + * Adds a search path. Implicitly adds the search path for the "unknown" + * + * @param path is a fully qualified/canonical path to a directory. + * @param types is a set of Resource Types. The FileLocator will look for + * resources of the specified types at the given path in the + * future. + */ + void addSearchPath(const std::string &path); + + /** + * Returns the backing map containing all search paths for a given type. + * This is read-only. + */ + const SearchPaths &getSearchPaths() const { return searchPaths; } +}; +} + +#endif /* _OUSIA_FILE_LOCATOR_HPP_ */ + |