From 6decad0b8e7e369bd8215f31a45dd3eae982d2a9 Mon Sep 17 00:00:00 2001 From: Andreas Stöckel Date: Wed, 21 Jan 2015 01:17:49 +0100 Subject: Some further refactoring -- renamed Scope to ParserScope, got rid of parser namespace, added new functionality to RegistryClass, wrote documentation, added function for extracting file extensions to Utils --- src/core/Registry.cpp | 69 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 55 insertions(+), 14 deletions(-) (limited to 'src/core/Registry.cpp') diff --git a/src/core/Registry.cpp b/src/core/Registry.cpp index 86665a2..c42a97a 100644 --- a/src/core/Registry.cpp +++ b/src/core/Registry.cpp @@ -16,6 +16,8 @@ along with this program. If not, see . */ +#include +#include #include #include #include @@ -24,32 +26,71 @@ namespace ousia { -using namespace parser; - /* Class Registry */ -void Registry::registerParser(parser::Parser &parser) +void Registry::registerParser(const std::set &mimetypes, + const RttiSet &types, Parser *parser) +{ + for (const std::string &mimetype : mimetypes) { + // Make sure no other parser was given for this mimetype + auto it = parsers.find(mimetype); + if (it != parsers.end()) { + throw OusiaException{std::string{"Parser for mimetype "} + + mimetype + + std::string{" already registered."}}; + } + + // Store a reference at the parser and a copy of the given RttiSet + parsers[mimetype] = std::pair{parser, types}; + } +} + +static const std::pair NullParser{nullptr, RttiSet{}}; + +const std::pair &Registry::getParserForMimetype( + const std::string &mimetype) const { - parsers.push_back(&parser); - 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)); + const auto it = parsers.find(mimetype); + if (it != parsers.end()) { + return it->second; + } + return NullParser; +} + +void Registry::registerExtension(const std::string &extension, + const std::string &mimetype) +{ + // Always use extensions in lower case + std::string ext = Utils::toLower(extension); + + // Make sure the extension is unique + auto it = extensions.find(ext); + if (it != extensions.end()) { + throw OusiaException{std::string{"Extension "} + extension + + std::string{" already registered."}}; } + + // Register the mimetype + extensions[ext] = mimetype; } -Parser *Registry::getParserForMimetype(const std::string &mimetype) const +std::string Registry::getMimetypeForExtension( + const std::string &extension) const { - const auto it = parserMimetypes.find(mimetype); - if (it != parserMimetypes.end()) { + // Always use extensions in lower case + std::string ext = Utils::toLower(extension); + + // Try to find the extension + auto it = extensions.find(ext); + if (it != extensions.end()) { return it->second; } - return nullptr; + return std::string{}; } -void Registry::registerResourceLocator(ResourceLocator &locator) +void Registry::registerResourceLocator(ResourceLocator *locator) { - locators.push_back(&locator); + locators.push_back(locator); } bool Registry::locateResource(Resource &resource, const std::string &path, -- cgit v1.2.3 From d41716e4cc2be229fee82d99dc84e253d7949d47 Mon Sep 17 00:00:00 2001 From: Andreas Stöckel Date: Thu, 22 Jan 2015 02:43:00 +0100 Subject: Added function which registers mimetypes for some default extensions (to be extended) --- src/core/Registry.cpp | 9 +++++++++ src/core/Registry.hpp | 5 +++++ 2 files changed, 14 insertions(+) (limited to 'src/core/Registry.cpp') diff --git a/src/core/Registry.cpp b/src/core/Registry.cpp index c42a97a..88babb7 100644 --- a/src/core/Registry.cpp +++ b/src/core/Registry.cpp @@ -74,6 +74,15 @@ void Registry::registerExtension(const std::string &extension, extensions[ext] = mimetype; } +void Registry::registerDefaultExtensions() +{ + registerExtension("oxd", "text/vnd.ousia.oxd"); + registerExtension("oxm", "text/vnd.ousia.oxm"); + registerExtension("opd", "text/vnd.ousia.opd"); + registerExtension("oss", "text/vnd.ousia.oss"); + registerExtension("js", "application/javascript"); +} + std::string Registry::getMimetypeForExtension( const std::string &extension) const { diff --git a/src/core/Registry.hpp b/src/core/Registry.hpp index 965f336..f932480 100644 --- a/src/core/Registry.hpp +++ b/src/core/Registry.hpp @@ -105,6 +105,11 @@ public: void registerExtension(const std::string &extension, const std::string &mimetype); + /** + * Registers mimetypes for some default extensions. + */ + void registerDefaultExtensions(); + /** * Returns the mimetype for the given extension. * -- cgit v1.2.3 From ba52f3f4823faf9c73e9445770a44887f3c2b389 Mon Sep 17 00:00:00 2001 From: Andreas Stöckel Date: Fri, 23 Jan 2015 00:31:07 +0100 Subject: Added mimetype by filename lookup to registry --- src/core/Registry.cpp | 12 ++++++++++++ src/core/Registry.hpp | 9 +++++++++ 2 files changed, 21 insertions(+) (limited to 'src/core/Registry.cpp') diff --git a/src/core/Registry.cpp b/src/core/Registry.cpp index 88babb7..044668c 100644 --- a/src/core/Registry.cpp +++ b/src/core/Registry.cpp @@ -97,6 +97,18 @@ std::string Registry::getMimetypeForExtension( return std::string{}; } +std::string Registry::getMimetypeForFilename(const std::string &filename) const +{ + // Fetch the file extension + std::string ext = Utils::extractFileExtension(path); + if (ext.empty()) { + return std::string{}; + } + + // Fetch the mimetype for the extension + return ctx.registry.getMimetypeForExtension(ext); +} + void Registry::registerResourceLocator(ResourceLocator *locator) { locators.push_back(locator); diff --git a/src/core/Registry.hpp b/src/core/Registry.hpp index f932480..4b4cb65 100644 --- a/src/core/Registry.hpp +++ b/src/core/Registry.hpp @@ -120,6 +120,15 @@ public: */ std::string getMimetypeForExtension(const std::string &extension) const; + /** + * Tries to deduce the mimetype from the given filename. + * + * @param filename is the filename from which the mimetype should be + * deduced. + * @return the mimetype or an empty string if no filename could be deduced. + */ + std::string getMimetypeForFilename(const std::string &filename) const; + /** * Registers a ResourceLocator instance that should be used for locating * resources. Two registered ResourceLocator should not be capable of -- cgit v1.2.3 From b0ab6e4cb077af892046e1fa1504d08e5b66deaf Mon Sep 17 00:00:00 2001 From: Andreas Stöckel Date: Fri, 23 Jan 2015 15:25:58 +0100 Subject: Fixed typos --- src/core/Registry.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/core/Registry.cpp') diff --git a/src/core/Registry.cpp b/src/core/Registry.cpp index 044668c..4aad7db 100644 --- a/src/core/Registry.cpp +++ b/src/core/Registry.cpp @@ -100,13 +100,13 @@ std::string Registry::getMimetypeForExtension( std::string Registry::getMimetypeForFilename(const std::string &filename) const { // Fetch the file extension - std::string ext = Utils::extractFileExtension(path); + std::string ext = Utils::extractFileExtension(filename); if (ext.empty()) { return std::string{}; } // Fetch the mimetype for the extension - return ctx.registry.getMimetypeForExtension(ext); + return getMimetypeForExtension(ext); } void Registry::registerResourceLocator(ResourceLocator *locator) -- cgit v1.2.3