Mercurial > hg > orthanc-volview
annotate Sources/Plugin.cpp @ 19:9d35ffe3e321 default tip
added CITATION.cff
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Sat, 06 Apr 2024 17:34:19 +0200 |
parents | 972439d2d38f |
children |
rev | line source |
---|---|
0 | 1 /** |
15 | 2 * SPDX-FileCopyrightText: 2023-2024 Sebastien Jodogne, UCLouvain, Belgium |
0 | 3 * SPDX-License-Identifier: GPL-3.0-or-later |
4 */ | |
5 | |
6 /** | |
7 * Kitware's VolView plugin for Orthanc | |
15 | 8 * Copyright (C) 2023-2024 Sebastien Jodogne, UCLouvain, Belgium |
0 | 9 * |
10 * This program is free software: you can redistribute it and/or | |
11 * modify it under the terms of the GNU General Public License as | |
12 * published by the Free Software Foundation, either version 3 of the | |
13 * License, or (at your option) any later version. | |
14 * | |
15 * This program is distributed in the hope that it will be useful, but | |
16 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
18 * General Public License for more details. | |
19 * | |
20 * You should have received a copy of the GNU General Public License | |
21 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
22 **/ | |
23 | |
24 | |
25 #include "../Resources/Orthanc/Plugins/OrthancPluginCppWrapper.h" | |
26 | |
27 #include <Logging.h> | |
28 #include <SystemToolbox.h> | |
29 | |
30 #include <EmbeddedResources.h> | |
31 | |
32 #include <boost/thread/shared_mutex.hpp> | |
33 | |
16
e662d794da41
fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
15
diff
changeset
|
34 #define ORTHANC_PLUGIN_NAME "volview" |
e662d794da41
fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
15
diff
changeset
|
35 |
e662d794da41
fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
15
diff
changeset
|
36 |
0 | 37 // Forward declaration |
38 void ReadStaticAsset(std::string& target, | |
39 const std::string& path); | |
40 | |
41 | |
42 /** | |
10 | 43 * As the VolView static assets are gzipped by the |
44 * "EmbedStaticAssets.py" script, we use a cache to maintain the | |
45 * uncompressed assets in order to avoid multiple gzip decodings. | |
0 | 46 **/ |
47 class ResourcesCache : public boost::noncopyable | |
48 { | |
49 private: | |
50 typedef std::map<std::string, std::string*> Content; | |
51 | |
52 boost::shared_mutex mutex_; | |
53 Content content_; | |
54 | |
55 public: | |
56 ~ResourcesCache() | |
57 { | |
58 for (Content::iterator it = content_.begin(); it != content_.end(); ++it) | |
59 { | |
60 assert(it->second != NULL); | |
61 delete it->second; | |
62 } | |
63 } | |
64 | |
65 void Answer(OrthancPluginRestOutput* output, | |
66 const std::string& path) | |
67 { | |
68 const std::string mime = Orthanc::EnumerationToString(Orthanc::SystemToolbox::AutodetectMimeType(path)); | |
69 | |
70 { | |
71 // Check whether the cache already contains the resource | |
72 boost::shared_lock<boost::shared_mutex> lock(mutex_); | |
73 | |
74 Content::const_iterator found = content_.find(path); | |
75 | |
76 if (found != content_.end()) | |
77 { | |
78 assert(found->second != NULL); | |
79 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, found->second->c_str(), found->second->size(), mime.c_str()); | |
80 return; | |
81 } | |
82 } | |
83 | |
84 // This resource has not been cached yet | |
85 | |
86 std::unique_ptr<std::string> item(new std::string); | |
87 ReadStaticAsset(*item, path); | |
88 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, item->c_str(), item->size(), mime.c_str()); | |
89 | |
90 { | |
91 // Store the resource into the cache | |
92 boost::unique_lock<boost::shared_mutex> lock(mutex_); | |
93 | |
94 if (content_.find(path) == content_.end()) | |
95 { | |
96 content_[path] = item.release(); | |
97 } | |
98 } | |
99 } | |
100 }; | |
101 | |
102 | |
103 static ResourcesCache cache_; | |
104 | |
105 void ServeFile(OrthancPluginRestOutput* output, | |
106 const char* url, | |
107 const OrthancPluginHttpRequest* request) | |
108 { | |
109 cache_.Answer(output, request->groups[0]); | |
110 } | |
111 | |
112 extern "C" | |
113 { | |
114 ORTHANC_PLUGINS_API int32_t OrthancPluginInitialize(OrthancPluginContext* context) | |
115 { | |
116 OrthancPlugins::SetGlobalContext(context); | |
117 | |
118 /* Check the version of the Orthanc core */ | |
119 if (OrthancPluginCheckVersion(OrthancPlugins::GetGlobalContext()) == 0) | |
120 { | |
121 char info[1024]; | |
122 sprintf(info, "Your version of Orthanc (%s) must be above %d.%d.%d to run this plugin", | |
123 OrthancPlugins::GetGlobalContext()->orthancVersion, | |
124 ORTHANC_PLUGINS_MINIMAL_MAJOR_NUMBER, | |
125 ORTHANC_PLUGINS_MINIMAL_MINOR_NUMBER, | |
126 ORTHANC_PLUGINS_MINIMAL_REVISION_NUMBER); | |
127 OrthancPluginLogError(OrthancPlugins::GetGlobalContext(), info); | |
128 return -1; | |
129 } | |
130 | |
131 #if ORTHANC_FRAMEWORK_VERSION_IS_ABOVE(1, 7, 2) | |
132 Orthanc::Logging::InitializePluginContext(context); | |
133 #else | |
134 Orthanc::Logging::Initialize(context); | |
135 #endif | |
136 | |
16
e662d794da41
fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
15
diff
changeset
|
137 OrthancPlugins::SetDescription(ORTHANC_PLUGIN_NAME, "Kitware's VolView for Orthanc."); |
0 | 138 |
139 OrthancPlugins::RegisterRestCallback<ServeFile>("/volview/(.*)", true); | |
140 | |
141 // Extend the default Orthanc Explorer with custom JavaScript for VolView | |
142 std::string explorer; | |
143 Orthanc::EmbeddedResources::GetFileResource(explorer, Orthanc::EmbeddedResources::ORTHANC_EXPLORER); | |
17 | 144 OrthancPlugins::ExtendOrthancExplorer(ORTHANC_PLUGIN_NAME, explorer); |
0 | 145 |
146 return 0; | |
147 } | |
148 | |
149 | |
150 ORTHANC_PLUGINS_API void OrthancPluginFinalize() | |
151 { | |
152 } | |
153 | |
154 | |
155 ORTHANC_PLUGINS_API const char* OrthancPluginGetName() | |
156 { | |
16
e662d794da41
fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
15
diff
changeset
|
157 return ORTHANC_PLUGIN_NAME; |
0 | 158 } |
159 | |
160 | |
161 ORTHANC_PLUGINS_API const char* OrthancPluginGetVersion() | |
162 { | |
163 return ORTHANC_VOLVIEW_VERSION; | |
164 } | |
165 } |