Mercurial > hg > orthanc-stl
diff Sources/ResourcesCache.cpp @ 72:e94f177c3653
reorganization
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 04 Oct 2024 17:25:46 +0200 |
parents | |
children | 1963619e3e87 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Sources/ResourcesCache.cpp Fri Oct 04 17:25:46 2024 +0200 @@ -0,0 +1,138 @@ +/** + * SPDX-FileCopyrightText: 2023-2024 Sebastien Jodogne, UCLouvain, Belgium + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * STL plugin for Orthanc + * Copyright (C) 2023-2024 Sebastien Jodogne, UCLouvain, Belgium + * + * 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 "ResourcesCache.h" + +#include "../Resources/Orthanc/Plugins/OrthancPluginCppWrapper.h" + +#include <Compatibility.h> +#include <SystemToolbox.h> + + +// Forward declaration +void ReadStaticAsset(std::string& target, + const std::string& path); + + +class ResourcesCache::RestOutputHandler : public IHandler +{ +private: + OrthancPluginRestOutput* output_; + std::string mime_; + +public: + RestOutputHandler(OrthancPluginRestOutput* output, + const std::string& mime) : + output_(output), + mime_(mime) + { + } + + virtual void Apply(const std::string& resource) ORTHANC_OVERRIDE + { + OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output_, + resource.c_str(), resource.size(), mime_.c_str()); + } +}; + + +class ResourcesCache::StoreResourceIntoString : public IHandler +{ +private: + std::string& target_; + +public: + StoreResourceIntoString(std::string& target) : + target_(target) + { + } + + virtual void Apply(const std::string& resource) ORTHANC_OVERRIDE + { + target_ = resource; + } +}; + + +ResourcesCache::~ResourcesCache() +{ + for (Content::iterator it = content_.begin(); it != content_.end(); ++it) + { + assert(it->second != NULL); + delete it->second; + } +} + + +void ResourcesCache::Apply(IHandler& handler, + const std::string& path) +{ + { + // Check whether the cache already contains the resource + boost::shared_lock<boost::shared_mutex> lock(mutex_); + + Content::const_iterator found = content_.find(path); + + if (found != content_.end()) + { + assert(found->second != NULL); + handler.Apply(*found->second); + return; + } + } + + // This resource has not been cached yet + + std::unique_ptr<std::string> item(new std::string); + ReadStaticAsset(*item, path); + handler.Apply(*item); + + { + // Store the resource into the cache + boost::unique_lock<boost::shared_mutex> lock(mutex_); + + if (content_.find(path) == content_.end()) + { + content_[path] = item.release(); + } + } +} + + +void ResourcesCache::Answer(OrthancPluginRestOutput* output, + const std::string& path) +{ + const std::string mime = Orthanc::EnumerationToString(Orthanc::SystemToolbox::AutodetectMimeType(path)); + + RestOutputHandler handler(output, mime); + Apply(handler, path); +} + + +void ResourcesCache::ReadResource(std::string& target, + const std::string& path) +{ + StoreResourceIntoString handler(target); + Apply(handler, path); +}