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; +} + | 
