diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/Registry.cpp | 25 | ||||
| -rw-r--r-- | src/core/Registry.hpp | 15 | 
2 files changed, 35 insertions, 5 deletions
diff --git a/src/core/Registry.cpp b/src/core/Registry.cpp index 1961b35..6ff9594 100644 --- a/src/core/Registry.cpp +++ b/src/core/Registry.cpp @@ -29,12 +29,14 @@ using namespace parser;  void Registry::registerParser(parser::Parser *parser)  {  	parsers.push_back(parser); -	for (const auto &mime : parser.mimetypes()) { +	for (const auto &mime : parser->mimetypes()) { +		//TODO: This does not allow for multiple parsers with the same mimetype. +		// Is that how its supposed to be?  		parserMimetypes.insert(std::make_pair(mime, parser));  	}  } -Parser* Registry::getParserForMimetype(const std::string &mimetype) +Parser *Registry::getParserForMimetype(const std::string &mimetype) const  {  	const auto it = parserMimetypes.find(mimetype);  	if (it != parserMimetypes.end()) { @@ -43,5 +45,24 @@ Parser* Registry::getParserForMimetype(const std::string &mimetype)  	return nullptr;  } +void Registry::registerResourceLocator(ResourceLocator *locator) +{ +	locators.push_back(locator); +} + +ResourceLocator::Location Registry::locateResource( +    const std::string &path, const std::string &relativeTo, +    ResourceLocator::Type type) const +{ +	ResourceLocator::Location *last; +	for (auto &locator : locators) { +		ResourceLocator::Location loc = locator->locate(path, relativeTo, type); +		if (loc.found) { +			return loc; +		} +		last = &loc; +	} +	return *last; +}  } diff --git a/src/core/Registry.hpp b/src/core/Registry.hpp index 235e427..01d57e8 100644 --- a/src/core/Registry.hpp +++ b/src/core/Registry.hpp @@ -22,6 +22,8 @@  #include <map>  #include <vector> +#include "ResourceLocator.hpp" +  namespace ousia {  // TODO: Add support for ScriptEngine type @@ -35,15 +37,22 @@ class Parser;  class Registry {  private:  	Logger &logger; -	std::vector<parser::Parser*> parsers; -	std::map<std::string, parser::Parser*> parserMimetypes; +	std::vector<parser::Parser *> parsers; +	std::map<std::string, parser::Parser *> parserMimetypes; +	std::vector<ResourceLocator *> locators;  public:  	Registry(Logger &logger) : logger(logger) {}  	void registerParser(parser::Parser *parser); -	parser::Parser *getParserForMimetype(std::string mimetype); +	parser::Parser *getParserForMimetype(const std::string& mimetype) const; + +	void registerResourceLocator(ResourceLocator *locator); + +	ResourceLocator::Location locateResource(const std::string &path, +	                                         const std::string &relativeTo, +	                                         ResourceLocator::Type type) const;  };  }  | 
