diff options
author | Benjamin Paassen <bpaassen@techfak.uni-bielefeld.de> | 2015-01-20 01:24:17 +0100 |
---|---|---|
committer | Benjamin Paassen <bpaassen@techfak.uni-bielefeld.de> | 2015-01-20 01:24:17 +0100 |
commit | 57a1ea659ae125934c541951113c0c3a38b10971 (patch) | |
tree | 8bf6f93a1c4b56cd48777b2f2f80c77466ef61ee /src/core/resource/ResourceLocator.cpp | |
parent | 20d3e71f26ca884271ed5d372a8459394554c147 (diff) | |
parent | 533e1a93c8f636b78f5687dd9c343a81563081a1 (diff) |
Merge branch 'master' of somweyr.de:ousia
Diffstat (limited to 'src/core/resource/ResourceLocator.cpp')
-rw-r--r-- | src/core/resource/ResourceLocator.cpp | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/src/core/resource/ResourceLocator.cpp b/src/core/resource/ResourceLocator.cpp new file mode 100644 index 0000000..1b8490d --- /dev/null +++ b/src/core/resource/ResourceLocator.cpp @@ -0,0 +1,103 @@ +/* + 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 <sstream> + +#include "Resource.hpp" +#include "ResourceLocator.hpp" + +namespace ousia { + +/* Class ResourceLocator */ + +bool ResourceLocator::locate(Resource &resource, const std::string &path, + const ResourceType type, + const Resource &relativeTo) const +{ + if (&relativeTo.getLocator() == this) { + return doLocate(resource, path, type, relativeTo.getLocation()); + } + return doLocate(resource, path, type, ""); +} + +bool ResourceLocator::locate(Resource &resource, const std::string &path, + const ResourceType type, + const std::string &relativeTo) const +{ + return doLocate(resource, path, type, relativeTo); +} + +std::unique_ptr<std::istream> ResourceLocator::stream( + const std::string &location) const +{ + return doStream(location); +} + +/* Class StaticResourceLocator */ + +bool StaticResourceLocator::doLocate( + Resource &resource, const std::string &path, const ResourceType type, + const std::string &relativeTo) const +{ + auto it = resources.find(path); + if (it != resources.end()) { + resource = Resource(true, *this, type, path); + return true; + } + return false; +} + +std::unique_ptr<std::istream> StaticResourceLocator::doStream( + const std::string &location) const +{ + auto it = resources.find(location); + if (it != resources.end()) { + return std::unique_ptr<std::istream>{new std::stringstream{it->second}}; + } + return std::unique_ptr<std::istream>{new std::stringstream{""}}; +} + +void StaticResourceLocator::store(const std::string &path, + const std::string &data) +{ + auto it = resources.find(path); + if (it != resources.end()) { + it->second = data; + } else { + resources.emplace(path, data); + } +} + +/* Class NullResourceLocatorImpl */ + +bool NullResourceLocatorImpl::doLocate(Resource &resource, + const std::string &path, + const ResourceType type, + const std::string &relativeTo) const +{ + return false; +} +std::unique_ptr<std::istream> NullResourceLocatorImpl::doStream( + const std::string &location) const +{ + return std::unique_ptr<std::istream>{new std::stringstream{""}}; +} + +const NullResourceLocatorImpl NullResourceLocator; +} + |