Mercurial > hg > orthanc-webviewer
annotate Plugin/Plugin.cpp @ 231:7097d0eaac76 transcoding
Move the GDCM decoder out of the Orthanc Web viewer plugin as a separate plugin
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 11 May 2020 15:34:12 +0200 |
parents | cce89307af28 |
children | 85b6a8bf8c7b |
rev | line source |
---|---|
0 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
122 | 3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
0 | 4 * Department, University Hospital of Liege, Belgium |
226
aee499712ac4
upgrade to year 2020
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
218
diff
changeset
|
5 * Copyright (C) 2017-2020 Osimis S.A., Belgium |
0 | 6 * |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU Affero General Public License | |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Affero General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Affero General Public License | |
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 **/ | |
20 | |
21 | |
191
993dd140bd30
Resort to Orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
22 #include "ViewerToolbox.h" |
993dd140bd30
Resort to Orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
23 #include "ViewerPrefetchPolicy.h" |
993dd140bd30
Resort to Orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
24 #include "DecodedImageAdapter.h" |
993dd140bd30
Resort to Orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
25 #include "SeriesInformationAdapter.h" |
993dd140bd30
Resort to Orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
26 |
993dd140bd30
Resort to Orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
27 #include <Core/DicomFormat/DicomMap.h> |
993dd140bd30
Resort to Orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
28 #include <Core/OrthancException.h> |
993dd140bd30
Resort to Orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
29 #include <Core/SystemToolbox.h> |
993dd140bd30
Resort to Orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
30 #include <Core/Toolbox.h> |
230
cce89307af28
replacing GdcmDecoder/OrthancImageWrapper.h by OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
228
diff
changeset
|
31 #include <Plugins/Samples/Common/OrthancPluginCppWrapper.h> |
191
993dd140bd30
Resort to Orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
174
diff
changeset
|
32 |
0 | 33 #include <boost/thread.hpp> |
34 #include <boost/lexical_cast.hpp> | |
35 #include <EmbeddedResources.h> | |
4
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
36 #include <boost/filesystem.hpp> |
0 | 37 |
38 | |
228
0f9d183f685d
fix compilation with Holy Build Box (for LSB)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
227
diff
changeset
|
39 /** |
0f9d183f685d
fix compilation with Holy Build Box (for LSB)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
227
diff
changeset
|
40 * We force the redefinition of the "ORTHANC_PLUGINS_API" macro, that |
0f9d183f685d
fix compilation with Holy Build Box (for LSB)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
227
diff
changeset
|
41 * was left empty with gcc until Orthanc SDK 1.5.7 (no "default" |
0f9d183f685d
fix compilation with Holy Build Box (for LSB)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
227
diff
changeset
|
42 * visibility). This causes the version script, if run from "Holy |
0f9d183f685d
fix compilation with Holy Build Box (for LSB)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
227
diff
changeset
|
43 * Build Box", to make private the 4 global functions of the plugin. |
0f9d183f685d
fix compilation with Holy Build Box (for LSB)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
227
diff
changeset
|
44 **/ |
0f9d183f685d
fix compilation with Holy Build Box (for LSB)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
227
diff
changeset
|
45 |
0f9d183f685d
fix compilation with Holy Build Box (for LSB)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
227
diff
changeset
|
46 #undef ORTHANC_PLUGINS_API |
0f9d183f685d
fix compilation with Holy Build Box (for LSB)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
227
diff
changeset
|
47 |
0f9d183f685d
fix compilation with Holy Build Box (for LSB)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
227
diff
changeset
|
48 #ifdef WIN32 |
0f9d183f685d
fix compilation with Holy Build Box (for LSB)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
227
diff
changeset
|
49 # define ORTHANC_PLUGINS_API __declspec(dllexport) |
0f9d183f685d
fix compilation with Holy Build Box (for LSB)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
227
diff
changeset
|
50 #elif __GNUC__ >= 4 |
0f9d183f685d
fix compilation with Holy Build Box (for LSB)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
227
diff
changeset
|
51 # define ORTHANC_PLUGINS_API __attribute__ ((visibility ("default"))) |
0f9d183f685d
fix compilation with Holy Build Box (for LSB)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
227
diff
changeset
|
52 #else |
0f9d183f685d
fix compilation with Holy Build Box (for LSB)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
227
diff
changeset
|
53 # define ORTHANC_PLUGINS_API |
0f9d183f685d
fix compilation with Holy Build Box (for LSB)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
227
diff
changeset
|
54 #endif |
0f9d183f685d
fix compilation with Holy Build Box (for LSB)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
227
diff
changeset
|
55 |
0f9d183f685d
fix compilation with Holy Build Box (for LSB)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
227
diff
changeset
|
56 |
0f9d183f685d
fix compilation with Holy Build Box (for LSB)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
227
diff
changeset
|
57 |
75
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
58 static OrthancPluginContext* context_ = NULL; |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
59 |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
60 |
0 | 61 class CacheContext |
62 { | |
63 private: | |
75
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
64 class DynamicString : public Orthanc::IDynamicObject |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
65 { |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
66 private: |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
67 std::string value_; |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
68 |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
69 public: |
197 | 70 explicit DynamicString(const char* value) : value_(value) |
75
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
71 { |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
72 } |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
73 |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
74 const std::string& GetValue() const |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
75 { |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
76 return value_; |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
77 } |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
78 }; |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
79 |
58 | 80 Orthanc::FilesystemStorage storage_; |
81 Orthanc::SQLite::Connection db_; | |
82 | |
227
e4def26f0fd3
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
226
diff
changeset
|
83 std::unique_ptr<OrthancPlugins::CacheManager> cache_; |
e4def26f0fd3
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
226
diff
changeset
|
84 std::unique_ptr<OrthancPlugins::CacheScheduler> scheduler_; |
0 | 85 |
75
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
86 Orthanc::SharedMessageQueue newInstances_; |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
87 bool stop_; |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
88 boost::thread newInstancesThread_; |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
89 |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
90 static void NewInstancesThread(CacheContext* cache) |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
91 { |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
92 while (!cache->stop_) |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
93 { |
227
e4def26f0fd3
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
226
diff
changeset
|
94 std::unique_ptr<Orthanc::IDynamicObject> obj(cache->newInstances_.Dequeue(100)); |
75
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
95 if (obj.get() != NULL) |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
96 { |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
97 const std::string& instanceId = dynamic_cast<DynamicString&>(*obj).GetValue(); |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
98 |
100
f5b1a9267da0
remove unused classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
99
diff
changeset
|
99 // On the reception of a new instance, indalidate the parent series of the instance |
75
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
100 std::string uri = "/instances/" + std::string(instanceId); |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
101 Json::Value instance; |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
102 if (OrthancPlugins::GetJsonFromOrthanc(instance, context_, uri)) |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
103 { |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
104 std::string seriesId = instance["ParentSeries"].asString(); |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
105 cache->GetScheduler().Invalidate(OrthancPlugins::CacheBundle_SeriesInformation, seriesId); |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
106 } |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
107 } |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
108 } |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
109 } |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
110 |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
111 |
0 | 112 public: |
197 | 113 explicit CacheContext(const std::string& path) : storage_(path), stop_(false) |
0 | 114 { |
115 boost::filesystem::path p(path); | |
58 | 116 db_.Open((p / "cache.db").string()); |
0 | 117 |
147
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
143
diff
changeset
|
118 cache_.reset(new OrthancPlugins::CacheManager(context_, db_, storage_)); |
0 | 119 //cache_->SetSanityCheckEnabled(true); // For debug |
120 | |
121 scheduler_.reset(new OrthancPlugins::CacheScheduler(*cache_, 100)); | |
75
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
122 |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
123 newInstancesThread_ = boost::thread(NewInstancesThread, this); |
0 | 124 } |
125 | |
58 | 126 ~CacheContext() |
127 { | |
75
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
128 stop_ = true; |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
129 if (newInstancesThread_.joinable()) |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
130 { |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
131 newInstancesThread_.join(); |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
132 } |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
133 |
58 | 134 scheduler_.reset(NULL); |
135 cache_.reset(NULL); | |
136 } | |
137 | |
0 | 138 OrthancPlugins::CacheScheduler& GetScheduler() |
139 { | |
140 return *scheduler_; | |
141 } | |
75
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
142 |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
143 void SignalNewInstance(const char* instanceId) |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
144 { |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
145 newInstances_.Enqueue(new DynamicString(instanceId)); |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
146 } |
0 | 147 }; |
148 | |
149 | |
75
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
150 |
0 | 151 static CacheContext* cache_ = NULL; |
152 | |
153 | |
154 | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
155 static OrthancPluginErrorCode OnChangeCallback(OrthancPluginChangeType changeType, |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
156 OrthancPluginResourceType resourceType, |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
157 const char* resourceId) |
0 | 158 { |
159 try | |
160 { | |
161 if (changeType == OrthancPluginChangeType_NewInstance && | |
162 resourceType == OrthancPluginResourceType_Instance) | |
163 { | |
75
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
164 cache_->SignalNewInstance(resourceId); |
0 | 165 } |
166 | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
167 return OrthancPluginErrorCode_Success; |
0 | 168 } |
169 catch (std::runtime_error& e) | |
170 { | |
171 OrthancPluginLogError(context_, e.what()); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
172 return OrthancPluginErrorCode_Success; // Ignore error |
0 | 173 } |
174 } | |
175 | |
176 | |
177 | |
178 template <enum OrthancPlugins::CacheBundle bundle> | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
179 static OrthancPluginErrorCode ServeCache(OrthancPluginRestOutput* output, |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
180 const char* url, |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
181 const OrthancPluginHttpRequest* request) |
0 | 182 { |
183 try | |
184 { | |
185 if (request->method != OrthancPluginHttpMethod_Get) | |
186 { | |
187 OrthancPluginSendMethodNotAllowed(context_, output, "GET"); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
188 return OrthancPluginErrorCode_Success; |
0 | 189 } |
190 | |
191 const std::string id = request->groups[0]; | |
192 std::string content; | |
193 | |
194 if (cache_->GetScheduler().Access(content, bundle, id)) | |
195 { | |
196 OrthancPluginAnswerBuffer(context_, output, content.c_str(), content.size(), "application/json"); | |
197 } | |
198 else | |
199 { | |
200 OrthancPluginSendHttpStatusCode(context_, output, 404); | |
201 } | |
202 | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
203 return OrthancPluginErrorCode_Success; |
0 | 204 } |
205 catch (Orthanc::OrthancException& e) | |
206 { | |
207 OrthancPluginLogError(context_, e.What()); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
208 return OrthancPluginErrorCode_Plugin; |
0 | 209 } |
210 catch (std::runtime_error& e) | |
211 { | |
212 OrthancPluginLogError(context_, e.what()); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
213 return OrthancPluginErrorCode_Plugin; |
0 | 214 } |
215 catch (boost::bad_lexical_cast&) | |
216 { | |
217 OrthancPluginLogError(context_, "Bad lexical cast"); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
218 return OrthancPluginErrorCode_Plugin; |
0 | 219 } |
220 } | |
221 | |
222 | |
223 | |
224 | |
225 #if ORTHANC_STANDALONE == 0 | |
99
46ec13a1177c
use of ordered-slices
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
226 static OrthancPluginErrorCode ServeWebViewer(OrthancPluginRestOutput* output, |
46ec13a1177c
use of ordered-slices
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
227 const char* url, |
46ec13a1177c
use of ordered-slices
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
228 const OrthancPluginHttpRequest* request) |
0 | 229 { |
230 if (request->method != OrthancPluginHttpMethod_Get) | |
231 { | |
232 OrthancPluginSendMethodNotAllowed(context_, output, "GET"); | |
99
46ec13a1177c
use of ordered-slices
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
233 return OrthancPluginErrorCode_Success; |
0 | 234 } |
235 | |
236 const std::string path = std::string(WEB_VIEWER_PATH) + std::string(request->groups[0]); | |
237 const char* mime = OrthancPlugins::GetMimeType(path); | |
238 | |
239 std::string s; | |
99
46ec13a1177c
use of ordered-slices
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
240 try |
0 | 241 { |
160 | 242 Orthanc::SystemToolbox::ReadFile(s, path); |
0 | 243 const char* resource = s.size() ? s.c_str() : NULL; |
244 OrthancPluginAnswerBuffer(context_, output, resource, s.size(), mime); | |
245 } | |
99
46ec13a1177c
use of ordered-slices
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
246 catch (Orthanc::OrthancException&) |
0 | 247 { |
248 std::string s = "Inexistent file in served folder: " + path; | |
249 OrthancPluginLogError(context_, s.c_str()); | |
250 OrthancPluginSendHttpStatusCode(context_, output, 404); | |
251 } | |
252 | |
99
46ec13a1177c
use of ordered-slices
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
253 return OrthancPluginErrorCode_Success; |
0 | 254 } |
255 #endif | |
256 | |
257 | |
258 | |
31 | 259 template <enum Orthanc::EmbeddedResources::DirectoryResourceId folder> |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
260 static OrthancPluginErrorCode ServeEmbeddedFolder(OrthancPluginRestOutput* output, |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
261 const char* url, |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
262 const OrthancPluginHttpRequest* request) |
0 | 263 { |
264 if (request->method != OrthancPluginHttpMethod_Get) | |
265 { | |
266 OrthancPluginSendMethodNotAllowed(context_, output, "GET"); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
267 return OrthancPluginErrorCode_Success; |
0 | 268 } |
269 | |
270 std::string path = "/" + std::string(request->groups[0]); | |
271 const char* mime = OrthancPlugins::GetMimeType(path); | |
272 | |
273 try | |
274 { | |
275 std::string s; | |
31 | 276 Orthanc::EmbeddedResources::GetDirectoryResource(s, folder, path.c_str()); |
0 | 277 |
278 const char* resource = s.size() ? s.c_str() : NULL; | |
279 OrthancPluginAnswerBuffer(context_, output, resource, s.size(), mime); | |
280 | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
281 return OrthancPluginErrorCode_Success; |
0 | 282 } |
283 catch (std::runtime_error&) | |
284 { | |
285 std::string s = "Unknown static resource in plugin: " + std::string(request->groups[0]); | |
286 OrthancPluginLogError(context_, s.c_str()); | |
287 OrthancPluginSendHttpStatusCode(context_, output, 404); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
288 return OrthancPluginErrorCode_Success; |
0 | 289 } |
290 } | |
291 | |
292 | |
293 | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
294 static OrthancPluginErrorCode IsStableSeries(OrthancPluginRestOutput* output, |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
295 const char* url, |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
296 const OrthancPluginHttpRequest* request) |
19 | 297 { |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
298 try |
19 | 299 { |
300 if (request->method != OrthancPluginHttpMethod_Get) | |
301 { | |
302 OrthancPluginSendMethodNotAllowed(context_, output, "GET"); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
303 return OrthancPluginErrorCode_Success; |
19 | 304 } |
305 | |
306 const std::string id = request->groups[0]; | |
307 Json::Value series; | |
308 | |
309 if (OrthancPlugins::GetJsonFromOrthanc(series, context_, "/series/" + id) && | |
310 series.type() == Json::objectValue) | |
311 { | |
312 bool value = (series["IsStable"].asBool() || | |
313 series["Status"].asString() == "Complete"); | |
314 std::string answer = value ? "true" : "false"; | |
315 OrthancPluginAnswerBuffer(context_, output, answer.c_str(), answer.size(), "application/json"); | |
316 } | |
317 else | |
318 { | |
319 OrthancPluginSendHttpStatusCode(context_, output, 404); | |
320 } | |
321 | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
322 return OrthancPluginErrorCode_Success; |
19 | 323 } |
324 catch (Orthanc::OrthancException& e) | |
325 { | |
326 OrthancPluginLogError(context_, e.What()); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
327 return OrthancPluginErrorCode_Plugin; |
19 | 328 } |
329 catch (std::runtime_error& e) | |
330 { | |
331 OrthancPluginLogError(context_, e.what()); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
332 return OrthancPluginErrorCode_Plugin; |
19 | 333 } |
334 catch (boost::bad_lexical_cast&) | |
335 { | |
336 OrthancPluginLogError(context_, "Bad lexical cast"); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
337 return OrthancPluginErrorCode_Plugin; |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
338 } |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
339 } |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
340 |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
341 |
133
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
342 |
231
7097d0eaac76
Move the GDCM decoder out of the Orthanc Web viewer plugin as a separate plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
230
diff
changeset
|
343 void ParseConfiguration(int& decodingThreads, |
133
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
344 boost::filesystem::path& cachePath, |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
345 int& cacheSize) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
346 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
347 /* Read the configuration of the Web viewer */ |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
348 Json::Value configuration; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
349 if (!OrthancPlugins::ReadConfiguration(configuration, context_)) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
350 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
351 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
352 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
353 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
354 // By default, the cache of the Web viewer is located inside the |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
355 // "StorageDirectory" of Orthanc |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
356 cachePath = OrthancPlugins::GetStringValue(configuration, "StorageDirectory", "."); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
357 cachePath /= "WebViewerCache"; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
358 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
359 static const char* CONFIG_WEB_VIEWER = "WebViewer"; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
360 if (configuration.isMember(CONFIG_WEB_VIEWER)) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
361 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
362 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
363 std::string key = "CachePath"; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
364 if (!configuration[CONFIG_WEB_VIEWER].isMember(key)) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
365 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
366 // For backward compatibility with the initial release of the Web viewer |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
367 key = "Cache"; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
368 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
369 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
370 cachePath = OrthancPlugins::GetStringValue(configuration[CONFIG_WEB_VIEWER], key, cachePath.string()); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
371 cacheSize = OrthancPlugins::GetIntegerValue(configuration[CONFIG_WEB_VIEWER], "CacheSize", cacheSize); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
372 decodingThreads = OrthancPlugins::GetIntegerValue(configuration[CONFIG_WEB_VIEWER], "Threads", decodingThreads); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
373 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
374 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
375 if (decodingThreads <= 0 || |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
376 cacheSize <= 0) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
377 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
378 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
379 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
380 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
381 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
382 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
383 |
143
16f8471e3872
Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
133
diff
changeset
|
384 static bool DisplayPerformanceWarning() |
16f8471e3872
Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
133
diff
changeset
|
385 { |
16f8471e3872
Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
133
diff
changeset
|
386 (void) DisplayPerformanceWarning; // Disable warning about unused function |
16f8471e3872
Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
133
diff
changeset
|
387 OrthancPluginLogWarning(context_, "Performance warning in Web viewer: " |
16f8471e3872
Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
133
diff
changeset
|
388 "Non-release build, runtime debug assertions are turned on"); |
16f8471e3872
Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
133
diff
changeset
|
389 return true; |
16f8471e3872
Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
133
diff
changeset
|
390 } |
16f8471e3872
Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
133
diff
changeset
|
391 |
133
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
392 |
0 | 393 extern "C" |
394 { | |
395 ORTHANC_PLUGINS_API int32_t OrthancPluginInitialize(OrthancPluginContext* context) | |
396 { | |
397 using namespace OrthancPlugins; | |
398 | |
230
cce89307af28
replacing GdcmDecoder/OrthancImageWrapper.h by OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
228
diff
changeset
|
399 OrthancPlugins::SetGlobalContext(context); |
0 | 400 context_ = context; |
143
16f8471e3872
Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
133
diff
changeset
|
401 assert(DisplayPerformanceWarning()); |
0 | 402 OrthancPluginLogWarning(context_, "Initializing the Web viewer"); |
403 | |
404 | |
405 /* Check the version of the Orthanc core */ | |
406 if (OrthancPluginCheckVersion(context_) == 0) | |
407 { | |
408 char info[1024]; | |
409 sprintf(info, "Your version of Orthanc (%s) must be above %d.%d.%d to run this plugin", | |
410 context_->orthancVersion, | |
411 ORTHANC_PLUGINS_MINIMAL_MAJOR_NUMBER, | |
412 ORTHANC_PLUGINS_MINIMAL_MINOR_NUMBER, | |
413 ORTHANC_PLUGINS_MINIMAL_REVISION_NUMBER); | |
414 OrthancPluginLogError(context_, info); | |
415 return -1; | |
416 } | |
417 | |
418 OrthancPluginSetDescription(context_, "Provides a Web viewer of DICOM series within Orthanc."); | |
419 | |
420 | |
421 /* By default, use half of the available processing cores for the decoding of DICOM images */ | |
422 int decodingThreads = boost::thread::hardware_concurrency() / 2; | |
423 if (decodingThreads == 0) | |
424 { | |
425 decodingThreads = 1; | |
426 } | |
427 | |
428 try | |
429 { | |
197 | 430 /* By default, a cache of 100 MB is used */ |
431 int cacheSize = 100; | |
432 | |
133
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
433 boost::filesystem::path cachePath; |
231
7097d0eaac76
Move the GDCM decoder out of the Orthanc Web viewer plugin as a separate plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
230
diff
changeset
|
434 ParseConfiguration(decodingThreads, cachePath, cacheSize); |
0 | 435 |
436 std::string message = ("Web viewer using " + boost::lexical_cast<std::string>(decodingThreads) + | |
437 " threads for the decoding of the DICOM images"); | |
438 OrthancPluginLogWarning(context_, message.c_str()); | |
439 | |
4
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
440 message = "Storing the cache of the Web viewer in folder: " + cachePath.string(); |
0 | 441 OrthancPluginLogWarning(context_, message.c_str()); |
442 | |
443 | |
444 /* Create the cache */ | |
4
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
445 cache_ = new CacheContext(cachePath.string()); |
115
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
446 CacheScheduler& scheduler = cache_->GetScheduler(); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
447 |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
448 |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
449 /* Look for a change in the versions */ |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
450 std::string orthancVersion("unknown"), webViewerVersion("unknown"); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
451 bool clear = false; |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
452 if (!scheduler.LookupProperty(orthancVersion, CacheProperty_OrthancVersion) || |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
453 orthancVersion != std::string(context_->orthancVersion)) |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
454 { |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
455 std::string s = ("The version of Orthanc has changed from \"" + orthancVersion + "\" to \"" + |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
456 std::string(context_->orthancVersion) + "\": The cache of the Web viewer will be cleared"); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
457 OrthancPluginLogWarning(context_, s.c_str()); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
458 clear = true; |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
459 } |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
460 |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
461 if (!scheduler.LookupProperty(webViewerVersion, CacheProperty_WebViewerVersion) || |
206
d1ed9efdea6c
rename ORTHANC_WEBVIEWER_VERSION as ORTHANC_PLUGIN_VERSION
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
462 webViewerVersion != std::string(ORTHANC_PLUGIN_VERSION)) |
115
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
463 { |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
464 std::string s = ("The version of the Web viewer plugin has changed from \"" + webViewerVersion + "\" to \"" + |
206
d1ed9efdea6c
rename ORTHANC_WEBVIEWER_VERSION as ORTHANC_PLUGIN_VERSION
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
465 std::string(ORTHANC_PLUGIN_VERSION) + "\": The cache of the Web viewer will be cleared"); |
115
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
466 OrthancPluginLogWarning(context_, s.c_str()); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
467 clear = true; |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
468 } |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
469 |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
470 |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
471 /* Clear the cache if needed */ |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
472 if (clear) |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
473 { |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
474 OrthancPluginLogWarning(context_, "Clearing the cache of the Web viewer"); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
475 scheduler.Clear(); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
476 scheduler.SetProperty(CacheProperty_OrthancVersion, context_->orthancVersion); |
206
d1ed9efdea6c
rename ORTHANC_WEBVIEWER_VERSION as ORTHANC_PLUGIN_VERSION
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
477 scheduler.SetProperty(CacheProperty_WebViewerVersion, ORTHANC_PLUGIN_VERSION); |
115
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
478 } |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
479 else |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
480 { |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
481 OrthancPluginLogInfo(context_, "No change in the versions, no need to clear the cache of the Web viewer"); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
482 } |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
483 |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
484 |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
485 /* Configure the cache */ |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
486 scheduler.RegisterPolicy(new ViewerPrefetchPolicy(context_)); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
487 scheduler.Register(CacheBundle_SeriesInformation, |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
488 new SeriesInformationAdapter(context_, scheduler), 1); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
489 scheduler.Register(CacheBundle_DecodedImage, |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
490 new DecodedImageAdapter(context_), decodingThreads); |
4
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
491 |
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
492 |
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
493 /* Set the quotas */ |
115
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
494 scheduler.SetQuota(CacheBundle_SeriesInformation, 1000, 0); // Keep info about 1000 series |
4
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
495 |
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
496 message = "Web viewer using a cache of " + boost::lexical_cast<std::string>(cacheSize) + " MB"; |
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
497 OrthancPluginLogWarning(context_, message.c_str()); |
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
498 |
115
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
499 scheduler.SetQuota(CacheBundle_DecodedImage, 0, static_cast<uint64_t>(cacheSize) * 1024 * 1024); |
0 | 500 } |
501 catch (std::runtime_error& e) | |
502 { | |
503 OrthancPluginLogError(context_, e.what()); | |
504 return -1; | |
505 } | |
506 catch (Orthanc::OrthancException& e) | |
507 { | |
133
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
508 if (e.GetErrorCode() == Orthanc::ErrorCode_BadFileFormat) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
509 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
510 OrthancPluginLogError(context_, "Unable to read the configuration of the Web viewer plugin"); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
511 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
512 else |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
513 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
514 OrthancPluginLogError(context_, e.What()); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
515 } |
0 | 516 return -1; |
517 } | |
518 | |
519 | |
520 /* Install the callbacks */ | |
218
6318db66448e
Performance: Replaced "OrthancPluginRegisterRestCallback" by "OrthancPluginRegisterRestCallbackNoLock"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
521 OrthancPluginRegisterRestCallbackNoLock(context_, "/web-viewer/series/(.*)", ServeCache<CacheBundle_SeriesInformation>); |
6318db66448e
Performance: Replaced "OrthancPluginRegisterRestCallback" by "OrthancPluginRegisterRestCallbackNoLock"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
522 OrthancPluginRegisterRestCallbackNoLock(context_, "/web-viewer/is-stable-series/(.*)", IsStableSeries); |
6318db66448e
Performance: Replaced "OrthancPluginRegisterRestCallback" by "OrthancPluginRegisterRestCallbackNoLock"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
523 OrthancPluginRegisterRestCallbackNoLock(context_, "/web-viewer/instances/(.*)", ServeCache<CacheBundle_DecodedImage>); |
6318db66448e
Performance: Replaced "OrthancPluginRegisterRestCallback" by "OrthancPluginRegisterRestCallbackNoLock"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
524 OrthancPluginRegisterRestCallbackNoLock(context, "/web-viewer/libs/(.*)", ServeEmbeddedFolder<Orthanc::EmbeddedResources::JAVASCRIPT_LIBS>); |
0 | 525 |
526 #if ORTHANC_STANDALONE == 1 | |
218
6318db66448e
Performance: Replaced "OrthancPluginRegisterRestCallback" by "OrthancPluginRegisterRestCallbackNoLock"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
527 OrthancPluginRegisterRestCallbackNoLock(context, "/web-viewer/app/(.*)", ServeEmbeddedFolder<Orthanc::EmbeddedResources::WEB_VIEWER>); |
0 | 528 #else |
218
6318db66448e
Performance: Replaced "OrthancPluginRegisterRestCallback" by "OrthancPluginRegisterRestCallbackNoLock"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
529 OrthancPluginRegisterRestCallbackNoLock(context, "/web-viewer/app/(.*)", ServeWebViewer); |
0 | 530 #endif |
531 | |
532 OrthancPluginRegisterOnChangeCallback(context, OnChangeCallback); | |
533 | |
534 | |
535 /* Extend the default Orthanc Explorer with custom JavaScript */ | |
536 std::string explorer; | |
31 | 537 Orthanc::EmbeddedResources::GetFileResource(explorer, Orthanc::EmbeddedResources::ORTHANC_EXPLORER); |
0 | 538 OrthancPluginExtendOrthancExplorer(context_, explorer.c_str()); |
539 | |
540 return 0; | |
541 } | |
542 | |
543 | |
544 ORTHANC_PLUGINS_API void OrthancPluginFinalize() | |
545 { | |
546 OrthancPluginLogWarning(context_, "Finalizing the Web viewer"); | |
547 | |
548 if (cache_ != NULL) | |
549 { | |
550 delete cache_; | |
551 cache_ = NULL; | |
552 } | |
553 } | |
554 | |
555 | |
556 ORTHANC_PLUGINS_API const char* OrthancPluginGetName() | |
557 { | |
558 return "web-viewer"; | |
559 } | |
560 | |
561 | |
562 ORTHANC_PLUGINS_API const char* OrthancPluginGetVersion() | |
563 { | |
206
d1ed9efdea6c
rename ORTHANC_WEBVIEWER_VERSION as ORTHANC_PLUGIN_VERSION
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
564 return ORTHANC_PLUGIN_VERSION; |
0 | 565 } |
566 } |