Mercurial > hg > orthanc-volview
diff Sources/Plugin.cpp @ 0:3f1cf4a8e31f
initial commit
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 22 Mar 2023 10:16:47 +0100 |
parents | |
children | fdb3093ab802 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Sources/Plugin.cpp Wed Mar 22 10:16:47 2023 +0100 @@ -0,0 +1,162 @@ +/** + * SPDX-FileCopyrightText: 2023 Sebastien Jodogne, UCLouvain, Belgium + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Kitware's VolView plugin for Orthanc + * Copyright (C) 2023 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 "../Resources/Orthanc/Plugins/OrthancPluginCppWrapper.h" + +#include <Logging.h> +#include <SystemToolbox.h> + +#include <EmbeddedResources.h> + +#include <boost/thread/shared_mutex.hpp> + +// Forward declaration +void ReadStaticAsset(std::string& target, + const std::string& path); + + +/** + * As the VolView static assets are gzipped by the "EmbedResources.py" + * script, we use a cache to maintain the uncompressed assets in order + * to avoid multiple gzip decodings. + **/ +class ResourcesCache : public boost::noncopyable +{ +private: + typedef std::map<std::string, std::string*> Content; + + boost::shared_mutex mutex_; + Content content_; + +public: + ~ResourcesCache() + { + for (Content::iterator it = content_.begin(); it != content_.end(); ++it) + { + assert(it->second != NULL); + delete it->second; + } + } + + void Answer(OrthancPluginRestOutput* output, + const std::string& path) + { + const std::string mime = Orthanc::EnumerationToString(Orthanc::SystemToolbox::AutodetectMimeType(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); + OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, found->second->c_str(), found->second->size(), mime.c_str()); + return; + } + } + + // This resource has not been cached yet + + std::unique_ptr<std::string> item(new std::string); + ReadStaticAsset(*item, path); + OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, item->c_str(), item->size(), mime.c_str()); + + { + // Store the resource into the cache + boost::unique_lock<boost::shared_mutex> lock(mutex_); + + if (content_.find(path) == content_.end()) + { + content_[path] = item.release(); + } + } + } +}; + + +static ResourcesCache cache_; + +void ServeFile(OrthancPluginRestOutput* output, + const char* url, + const OrthancPluginHttpRequest* request) +{ + cache_.Answer(output, request->groups[0]); +} + +extern "C" +{ + ORTHANC_PLUGINS_API int32_t OrthancPluginInitialize(OrthancPluginContext* context) + { + OrthancPlugins::SetGlobalContext(context); + + /* Check the version of the Orthanc core */ + if (OrthancPluginCheckVersion(OrthancPlugins::GetGlobalContext()) == 0) + { + char info[1024]; + sprintf(info, "Your version of Orthanc (%s) must be above %d.%d.%d to run this plugin", + OrthancPlugins::GetGlobalContext()->orthancVersion, + ORTHANC_PLUGINS_MINIMAL_MAJOR_NUMBER, + ORTHANC_PLUGINS_MINIMAL_MINOR_NUMBER, + ORTHANC_PLUGINS_MINIMAL_REVISION_NUMBER); + OrthancPluginLogError(OrthancPlugins::GetGlobalContext(), info); + return -1; + } + +#if ORTHANC_FRAMEWORK_VERSION_IS_ABOVE(1, 7, 2) + Orthanc::Logging::InitializePluginContext(context); +#else + Orthanc::Logging::Initialize(context); +#endif + + OrthancPluginSetDescription(context, "Kitware's VolView for Orthanc."); + + OrthancPlugins::RegisterRestCallback<ServeFile>("/volview/(.*)", true); + + // Extend the default Orthanc Explorer with custom JavaScript for VolView + std::string explorer; + Orthanc::EmbeddedResources::GetFileResource(explorer, Orthanc::EmbeddedResources::ORTHANC_EXPLORER); + OrthancPluginExtendOrthancExplorer(OrthancPlugins::GetGlobalContext(), explorer.c_str()); + + return 0; + } + + + ORTHANC_PLUGINS_API void OrthancPluginFinalize() + { + } + + + ORTHANC_PLUGINS_API const char* OrthancPluginGetName() + { + return "volview"; + } + + + ORTHANC_PLUGINS_API const char* OrthancPluginGetVersion() + { + return ORTHANC_VOLVIEW_VERSION; + } +}