From d4df46459e558f10cab9dc51ef0ee5bf5e769ad1 Mon Sep 17 00:00:00 2001 From: Benjamin Paassen Date: Wed, 10 Dec 2014 11:23:50 +0100 Subject: integrated ResourceLocator into the Registry. --- src/core/Registry.cpp | 25 +++++++++++++++++++++++-- src/core/Registry.hpp | 15 ++++++++++++--- 2 files changed, 35 insertions(+), 5 deletions(-) (limited to 'src') 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 #include +#include "ResourceLocator.hpp" + namespace ousia { // TODO: Add support for ScriptEngine type @@ -35,15 +37,22 @@ class Parser; class Registry { private: Logger &logger; - std::vector parsers; - std::map parserMimetypes; + std::vector parsers; + std::map parserMimetypes; + std::vector 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; }; } -- cgit v1.2.3