summaryrefslogtreecommitdiff
path: root/src/core/resource/ResourceLocator.cpp
diff options
context:
space:
mode:
authorAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-01-20 00:53:49 +0100
committerAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-01-20 00:53:49 +0100
commit47311cc8b211a7fef033d744d9eba9f308726ea8 (patch)
tree348726aef17297729233b93b6d7eef86f25c7a78 /src/core/resource/ResourceLocator.cpp
parentd836d70ea2352dcf277c6fce91ba1ded3f074b44 (diff)
Refactored stuff surrounding the ResourceLocator class, implemented StaticResourceLocator which can be used for registering static resources (mainly for testing or if certain resources need to be available from the executable)
Diffstat (limited to 'src/core/resource/ResourceLocator.cpp')
-rw-r--r--src/core/resource/ResourceLocator.cpp103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/core/resource/ResourceLocator.cpp b/src/core/resource/ResourceLocator.cpp
index e69de29..1b8490d 100644
--- a/src/core/resource/ResourceLocator.cpp
+++ 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;
+}
+