Mercurial > hg > orthanc-webviewer
annotate Plugin/Plugin.cpp @ 159:5dc54316d68b
shared copyright with osimis
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 04 Jan 2017 16:41:43 +0100 |
parents | 70d1fe6d6309 |
children | b0910ae2ace5 |
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 |
159
5dc54316d68b
shared copyright with osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
147
diff
changeset
|
5 * Copyright (C) 2017 Osimis, 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 | |
22 #include <boost/thread.hpp> | |
23 #include <boost/lexical_cast.hpp> | |
24 #include <EmbeddedResources.h> | |
4
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
25 #include <boost/filesystem.hpp> |
0 | 26 |
26 | 27 #include "../Orthanc/Core/OrthancException.h" |
133
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
28 #include "../Orthanc/Core/DicomFormat/DicomMap.h" |
0 | 29 #include "ViewerToolbox.h" |
30 #include "ViewerPrefetchPolicy.h" | |
31 #include "DecodedImageAdapter.h" | |
32 #include "SeriesInformationAdapter.h" | |
102 | 33 #include "../Orthanc/Plugins/Samples/GdcmDecoder/GdcmDecoderCache.h" |
99
46ec13a1177c
use of ordered-slices
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
34 #include "../Orthanc/Core/Toolbox.h" |
74
ab5218c18b7a
compatibility with forthcoming sdk 0.9.5
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
58
diff
changeset
|
35 |
0 | 36 |
75
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
37 static OrthancPluginContext* context_ = NULL; |
133
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
38 static bool restrictTransferSyntaxes_ = false; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
39 static std::set<std::string> enabledTransferSyntaxes_; |
75
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
40 |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
41 |
0 | 42 class CacheContext |
43 { | |
44 private: | |
75
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
45 class DynamicString : public Orthanc::IDynamicObject |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
46 { |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
47 private: |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
48 std::string value_; |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
49 |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
50 public: |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
51 DynamicString(const char* value) : value_(value) |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
52 { |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
53 } |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
54 |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
55 const std::string& GetValue() const |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
56 { |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
57 return value_; |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
58 } |
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 |
58 | 61 Orthanc::FilesystemStorage storage_; |
62 Orthanc::SQLite::Connection db_; | |
63 | |
0 | 64 std::auto_ptr<OrthancPlugins::CacheManager> cache_; |
65 std::auto_ptr<OrthancPlugins::CacheScheduler> scheduler_; | |
66 | |
75
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
67 Orthanc::SharedMessageQueue newInstances_; |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
68 bool stop_; |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
69 boost::thread newInstancesThread_; |
102 | 70 OrthancPlugins::GdcmDecoderCache decoder_; |
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 static void NewInstancesThread(CacheContext* cache) |
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 while (!cache->stop_) |
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 std::auto_ptr<Orthanc::IDynamicObject> obj(cache->newInstances_.Dequeue(100)); |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
77 if (obj.get() != NULL) |
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 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
|
80 |
100
f5b1a9267da0
remove unused classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
99
diff
changeset
|
81 // 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
|
82 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
|
83 Json::Value instance; |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
84 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
|
85 { |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
86 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
|
87 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
|
88 } |
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 } |
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 |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
93 |
0 | 94 public: |
75
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
95 CacheContext(const std::string& path) : storage_(path), stop_(false) |
0 | 96 { |
97 boost::filesystem::path p(path); | |
58 | 98 db_.Open((p / "cache.db").string()); |
0 | 99 |
147
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
143
diff
changeset
|
100 cache_.reset(new OrthancPlugins::CacheManager(context_, db_, storage_)); |
0 | 101 //cache_->SetSanityCheckEnabled(true); // For debug |
102 | |
103 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
|
104 |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
105 newInstancesThread_ = boost::thread(NewInstancesThread, this); |
0 | 106 } |
107 | |
58 | 108 ~CacheContext() |
109 { | |
75
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
110 stop_ = true; |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
111 if (newInstancesThread_.joinable()) |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
112 { |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
113 newInstancesThread_.join(); |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
114 } |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
115 |
58 | 116 scheduler_.reset(NULL); |
117 cache_.reset(NULL); | |
118 } | |
119 | |
0 | 120 OrthancPlugins::CacheScheduler& GetScheduler() |
121 { | |
122 return *scheduler_; | |
123 } | |
75
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
124 |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
125 void SignalNewInstance(const char* instanceId) |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
126 { |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
127 newInstances_.Enqueue(new DynamicString(instanceId)); |
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
128 } |
102 | 129 |
130 OrthancPlugins::GdcmDecoderCache& GetDecoder() | |
131 { | |
132 return decoder_; | |
133 } | |
0 | 134 }; |
135 | |
136 | |
75
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
137 |
0 | 138 static CacheContext* cache_ = NULL; |
139 | |
140 | |
141 | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
142 static OrthancPluginErrorCode OnChangeCallback(OrthancPluginChangeType changeType, |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
143 OrthancPluginResourceType resourceType, |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
144 const char* resourceId) |
0 | 145 { |
146 try | |
147 { | |
148 if (changeType == OrthancPluginChangeType_NewInstance && | |
149 resourceType == OrthancPluginResourceType_Instance) | |
150 { | |
75
e15a59a4b4d4
Fix possible deadlock with other plugins in OnChangeCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
74
diff
changeset
|
151 cache_->SignalNewInstance(resourceId); |
0 | 152 } |
153 | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
154 return OrthancPluginErrorCode_Success; |
0 | 155 } |
156 catch (std::runtime_error& e) | |
157 { | |
158 OrthancPluginLogError(context_, e.what()); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
159 return OrthancPluginErrorCode_Success; // Ignore error |
0 | 160 } |
161 } | |
162 | |
163 | |
164 | |
165 template <enum OrthancPlugins::CacheBundle bundle> | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
166 static OrthancPluginErrorCode ServeCache(OrthancPluginRestOutput* output, |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
167 const char* url, |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
168 const OrthancPluginHttpRequest* request) |
0 | 169 { |
170 try | |
171 { | |
172 if (request->method != OrthancPluginHttpMethod_Get) | |
173 { | |
174 OrthancPluginSendMethodNotAllowed(context_, output, "GET"); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
175 return OrthancPluginErrorCode_Success; |
0 | 176 } |
177 | |
178 const std::string id = request->groups[0]; | |
179 std::string content; | |
180 | |
181 if (cache_->GetScheduler().Access(content, bundle, id)) | |
182 { | |
183 OrthancPluginAnswerBuffer(context_, output, content.c_str(), content.size(), "application/json"); | |
184 } | |
185 else | |
186 { | |
187 OrthancPluginSendHttpStatusCode(context_, output, 404); | |
188 } | |
189 | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
190 return OrthancPluginErrorCode_Success; |
0 | 191 } |
192 catch (Orthanc::OrthancException& e) | |
193 { | |
194 OrthancPluginLogError(context_, e.What()); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
195 return OrthancPluginErrorCode_Plugin; |
0 | 196 } |
197 catch (std::runtime_error& e) | |
198 { | |
199 OrthancPluginLogError(context_, e.what()); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
200 return OrthancPluginErrorCode_Plugin; |
0 | 201 } |
202 catch (boost::bad_lexical_cast&) | |
203 { | |
204 OrthancPluginLogError(context_, "Bad lexical cast"); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
205 return OrthancPluginErrorCode_Plugin; |
0 | 206 } |
207 } | |
208 | |
209 | |
210 | |
211 | |
212 #if ORTHANC_STANDALONE == 0 | |
99
46ec13a1177c
use of ordered-slices
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
213 static OrthancPluginErrorCode ServeWebViewer(OrthancPluginRestOutput* output, |
46ec13a1177c
use of ordered-slices
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
214 const char* url, |
46ec13a1177c
use of ordered-slices
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
215 const OrthancPluginHttpRequest* request) |
0 | 216 { |
217 if (request->method != OrthancPluginHttpMethod_Get) | |
218 { | |
219 OrthancPluginSendMethodNotAllowed(context_, output, "GET"); | |
99
46ec13a1177c
use of ordered-slices
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
220 return OrthancPluginErrorCode_Success; |
0 | 221 } |
222 | |
223 const std::string path = std::string(WEB_VIEWER_PATH) + std::string(request->groups[0]); | |
224 const char* mime = OrthancPlugins::GetMimeType(path); | |
225 | |
226 std::string s; | |
99
46ec13a1177c
use of ordered-slices
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
227 try |
0 | 228 { |
99
46ec13a1177c
use of ordered-slices
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
229 Orthanc::Toolbox::ReadFile(s, path); |
0 | 230 const char* resource = s.size() ? s.c_str() : NULL; |
231 OrthancPluginAnswerBuffer(context_, output, resource, s.size(), mime); | |
232 } | |
99
46ec13a1177c
use of ordered-slices
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
233 catch (Orthanc::OrthancException&) |
0 | 234 { |
235 std::string s = "Inexistent file in served folder: " + path; | |
236 OrthancPluginLogError(context_, s.c_str()); | |
237 OrthancPluginSendHttpStatusCode(context_, output, 404); | |
238 } | |
239 | |
99
46ec13a1177c
use of ordered-slices
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
240 return OrthancPluginErrorCode_Success; |
0 | 241 } |
242 #endif | |
243 | |
244 | |
245 | |
31 | 246 template <enum Orthanc::EmbeddedResources::DirectoryResourceId folder> |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
247 static OrthancPluginErrorCode ServeEmbeddedFolder(OrthancPluginRestOutput* output, |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
248 const char* url, |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
249 const OrthancPluginHttpRequest* request) |
0 | 250 { |
251 if (request->method != OrthancPluginHttpMethod_Get) | |
252 { | |
253 OrthancPluginSendMethodNotAllowed(context_, output, "GET"); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
254 return OrthancPluginErrorCode_Success; |
0 | 255 } |
256 | |
257 std::string path = "/" + std::string(request->groups[0]); | |
258 const char* mime = OrthancPlugins::GetMimeType(path); | |
259 | |
260 try | |
261 { | |
262 std::string s; | |
31 | 263 Orthanc::EmbeddedResources::GetDirectoryResource(s, folder, path.c_str()); |
0 | 264 |
265 const char* resource = s.size() ? s.c_str() : NULL; | |
266 OrthancPluginAnswerBuffer(context_, output, resource, s.size(), mime); | |
267 | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
268 return OrthancPluginErrorCode_Success; |
0 | 269 } |
270 catch (std::runtime_error&) | |
271 { | |
272 std::string s = "Unknown static resource in plugin: " + std::string(request->groups[0]); | |
273 OrthancPluginLogError(context_, s.c_str()); | |
274 OrthancPluginSendHttpStatusCode(context_, output, 404); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
275 return OrthancPluginErrorCode_Success; |
0 | 276 } |
277 } | |
278 | |
279 | |
280 | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
281 static OrthancPluginErrorCode IsStableSeries(OrthancPluginRestOutput* output, |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
282 const char* url, |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
283 const OrthancPluginHttpRequest* request) |
19 | 284 { |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
285 try |
19 | 286 { |
287 if (request->method != OrthancPluginHttpMethod_Get) | |
288 { | |
289 OrthancPluginSendMethodNotAllowed(context_, output, "GET"); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
290 return OrthancPluginErrorCode_Success; |
19 | 291 } |
292 | |
293 const std::string id = request->groups[0]; | |
294 Json::Value series; | |
295 | |
296 if (OrthancPlugins::GetJsonFromOrthanc(series, context_, "/series/" + id) && | |
297 series.type() == Json::objectValue) | |
298 { | |
299 bool value = (series["IsStable"].asBool() || | |
300 series["Status"].asString() == "Complete"); | |
301 std::string answer = value ? "true" : "false"; | |
302 OrthancPluginAnswerBuffer(context_, output, answer.c_str(), answer.size(), "application/json"); | |
303 } | |
304 else | |
305 { | |
306 OrthancPluginSendHttpStatusCode(context_, output, 404); | |
307 } | |
308 | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
309 return OrthancPluginErrorCode_Success; |
19 | 310 } |
311 catch (Orthanc::OrthancException& e) | |
312 { | |
313 OrthancPluginLogError(context_, e.What()); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
314 return OrthancPluginErrorCode_Plugin; |
19 | 315 } |
316 catch (std::runtime_error& e) | |
317 { | |
318 OrthancPluginLogError(context_, e.what()); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
319 return OrthancPluginErrorCode_Plugin; |
19 | 320 } |
321 catch (boost::bad_lexical_cast&) | |
322 { | |
323 OrthancPluginLogError(context_, "Bad lexical cast"); | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
324 return OrthancPluginErrorCode_Plugin; |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
325 } |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
326 } |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
327 |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
328 |
133
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
329 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
330 static bool ExtractTransferSyntax(std::string& transferSyntax, |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
331 const void* dicom, |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
332 const uint32_t size) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
333 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
334 Orthanc::DicomMap header; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
335 if (!Orthanc::DicomMap::ParseDicomMetaInformation(header, reinterpret_cast<const char*>(dicom), size)) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
336 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
337 return false; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
338 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
339 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
340 const Orthanc::DicomValue* tag = header.TestAndGetValue(0x0002, 0x0010); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
341 if (tag == NULL || |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
342 tag->IsNull() || |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
343 tag->IsBinary()) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
344 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
345 return false; |
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 else |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
348 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
349 // Stripping spaces should not be required, as this is a UI value |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
350 // representation whose stripping is supported by the Orthanc |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
351 // core, but let's be careful... |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
352 transferSyntax = Orthanc::Toolbox::StripSpaces(tag->GetContent()); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
353 return true; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
354 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
355 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
356 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
357 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
358 static bool IsTransferSyntaxEnabled(const void* dicom, |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
359 const uint32_t size) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
360 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
361 std::string formattedSize; |
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 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
364 char tmp[16]; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
365 sprintf(tmp, "%0.1fMB", static_cast<float>(size) / (1024.0f * 1024.0f)); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
366 formattedSize.assign(tmp); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
367 } |
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 if (!restrictTransferSyntaxes_) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
370 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
371 std::string s = "Decoding one DICOM instance of " + formattedSize + " using GDCM"; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
372 OrthancPluginLogInfo(context_, s.c_str()); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
373 return true; |
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 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
376 std::string transferSyntax; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
377 if (!ExtractTransferSyntax(transferSyntax, dicom, size)) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
378 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
379 std::string s = ("Cannot extract the transfer syntax of this instance of " + |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
380 formattedSize + ", will use GDCM to decode it"); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
381 OrthancPluginLogInfo(context_, s.c_str()); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
382 return true; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
383 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
384 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
385 if (enabledTransferSyntaxes_.find(transferSyntax) != enabledTransferSyntaxes_.end()) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
386 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
387 // Decoding for this transfer syntax is enabled |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
388 std::string s = ("Using GDCM to decode this instance of " + |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
389 formattedSize + " with transfer syntax " + transferSyntax); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
390 OrthancPluginLogInfo(context_, s.c_str()); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
391 return true; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
392 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
393 else |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
394 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
395 std::string s = ("Won't use GDCM to decode this instance of " + |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
396 formattedSize + ", as its transfer syntax " + transferSyntax + " is disabled"); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
397 OrthancPluginLogInfo(context_, s.c_str()); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
398 return false; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
399 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
400 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
401 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
402 |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
403 static OrthancPluginErrorCode DecodeImageCallback(OrthancPluginImage** target, |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
404 const void* dicom, |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
405 const uint32_t size, |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
406 uint32_t frameIndex) |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
407 { |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
408 try |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
409 { |
133
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
410 if (!IsTransferSyntaxEnabled(dicom, size)) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
411 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
412 *target = NULL; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
413 return OrthancPluginErrorCode_Success; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
414 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
415 |
96 | 416 std::auto_ptr<OrthancPlugins::OrthancImageWrapper> image; |
417 | |
418 #if 0 | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
419 // Do not use the cache |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
420 OrthancPlugins::GdcmImageDecoder decoder(dicom, size); |
96 | 421 image.reset(new OrthancPlugins::OrthancImageWrapper(context_, decoder, frameIndex)); |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
422 #else |
96 | 423 using namespace OrthancPlugins; |
102 | 424 image.reset(cache_->GetDecoder().Decode(context_, dicom, size, frameIndex)); |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
425 #endif |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
426 |
96 | 427 *target = image->Release(); |
428 | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
429 return OrthancPluginErrorCode_Success; |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
430 } |
114 | 431 catch (Orthanc::OrthancException& e) |
432 { | |
433 *target = NULL; | |
434 | |
435 std::string s = "Cannot decode image using GDCM: " + std::string(e.What()); | |
436 OrthancPluginLogError(context_, s.c_str()); | |
437 return OrthancPluginErrorCode_Plugin; | |
438 } | |
95
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
439 catch (std::runtime_error& e) |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
440 { |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
441 *target = NULL; |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
442 |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
443 std::string s = "Cannot decode image using GDCM: " + std::string(e.what()); |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
444 OrthancPluginLogError(context_, s.c_str()); |
dbe7c97b6b4a
replace built-in decoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
445 return OrthancPluginErrorCode_Plugin; |
19 | 446 } |
447 } | |
448 | |
0 | 449 |
133
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
450 void ParseConfiguration(bool& enableGdcm, |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
451 int& decodingThreads, |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
452 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
|
453 int& cacheSize) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
454 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
455 /* 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
|
456 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
|
457 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
|
458 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
459 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
|
460 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
461 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
462 // 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
|
463 // "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
|
464 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
|
465 cachePath /= "WebViewerCache"; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
466 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
467 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
|
468 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
|
469 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
470 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
471 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
|
472 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
|
473 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
474 // 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
|
475 key = "Cache"; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
476 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
477 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
478 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
|
479 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
|
480 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
|
481 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
482 static const char* CONFIG_ENABLE_GDCM = "EnableGdcm"; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
483 if (configuration[CONFIG_WEB_VIEWER].isMember(CONFIG_ENABLE_GDCM)) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
484 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
485 if (configuration[CONFIG_WEB_VIEWER][CONFIG_ENABLE_GDCM].type() != Json::booleanValue) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
486 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
487 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
|
488 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
489 else |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
490 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
491 enableGdcm = configuration[CONFIG_WEB_VIEWER][CONFIG_ENABLE_GDCM].asBool(); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
492 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
493 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
494 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
495 static const char* CONFIG_RESTRICT_TRANSFER_SYNTAXES = "RestrictTransferSyntaxes"; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
496 if (enableGdcm) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
497 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
498 if (configuration[CONFIG_WEB_VIEWER].isMember(CONFIG_RESTRICT_TRANSFER_SYNTAXES)) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
499 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
500 const Json::Value& config = configuration[CONFIG_WEB_VIEWER][CONFIG_RESTRICT_TRANSFER_SYNTAXES]; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
501 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
502 if (config.type() != Json::arrayValue) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
503 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
504 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
|
505 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
506 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
507 restrictTransferSyntaxes_ = true; |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
508 for (Json::Value::ArrayIndex i = 0; i < config.size(); i++) |
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 if (config[i].type() != Json::stringValue) |
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 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
|
513 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
514 else |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
515 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
516 std::string s = "Web viewer will use GDCM to decode transfer syntax " + config[i].asString(); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
517 enabledTransferSyntaxes_.insert(config[i].asString()); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
518 OrthancPluginLogWarning(context_, s.c_str()); |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
519 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
520 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
521 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
522 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
523 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
524 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
525 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
|
526 cacheSize <= 0) |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
527 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
528 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
|
529 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
530 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
531 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
532 |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
533 |
143
16f8471e3872
Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
133
diff
changeset
|
534 static bool DisplayPerformanceWarning() |
16f8471e3872
Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
133
diff
changeset
|
535 { |
16f8471e3872
Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
133
diff
changeset
|
536 (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
|
537 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
|
538 "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
|
539 return true; |
16f8471e3872
Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
133
diff
changeset
|
540 } |
16f8471e3872
Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
133
diff
changeset
|
541 |
133
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
542 |
0 | 543 extern "C" |
544 { | |
545 ORTHANC_PLUGINS_API int32_t OrthancPluginInitialize(OrthancPluginContext* context) | |
546 { | |
547 using namespace OrthancPlugins; | |
548 | |
549 context_ = context; | |
143
16f8471e3872
Performance warning if runtime debug assertions are turned on
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
133
diff
changeset
|
550 assert(DisplayPerformanceWarning()); |
0 | 551 OrthancPluginLogWarning(context_, "Initializing the Web viewer"); |
552 | |
553 | |
554 /* Check the version of the Orthanc core */ | |
555 if (OrthancPluginCheckVersion(context_) == 0) | |
556 { | |
557 char info[1024]; | |
558 sprintf(info, "Your version of Orthanc (%s) must be above %d.%d.%d to run this plugin", | |
559 context_->orthancVersion, | |
560 ORTHANC_PLUGINS_MINIMAL_MAJOR_NUMBER, | |
561 ORTHANC_PLUGINS_MINIMAL_MINOR_NUMBER, | |
562 ORTHANC_PLUGINS_MINIMAL_REVISION_NUMBER); | |
563 OrthancPluginLogError(context_, info); | |
564 return -1; | |
565 } | |
566 | |
567 OrthancPluginSetDescription(context_, "Provides a Web viewer of DICOM series within Orthanc."); | |
568 | |
569 | |
570 /* By default, use half of the available processing cores for the decoding of DICOM images */ | |
571 int decodingThreads = boost::thread::hardware_concurrency() / 2; | |
572 if (decodingThreads == 0) | |
573 { | |
574 decodingThreads = 1; | |
575 } | |
576 | |
127
5754d39b011d
Option "EnableGdcm" to replace the built-in decoder of Orthanc with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
577 /* By default, use GDCM */ |
5754d39b011d
Option "EnableGdcm" to replace the built-in decoder of Orthanc with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
578 bool enableGdcm = true; |
5754d39b011d
Option "EnableGdcm" to replace the built-in decoder of Orthanc with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
579 |
133
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
580 /* By default, a cache of 100 MB is used */ |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
581 int cacheSize = 100; |
0 | 582 |
583 try | |
584 { | |
133
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
585 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
|
586 ParseConfiguration(enableGdcm, decodingThreads, cachePath, cacheSize); |
0 | 587 |
588 std::string message = ("Web viewer using " + boost::lexical_cast<std::string>(decodingThreads) + | |
589 " threads for the decoding of the DICOM images"); | |
590 OrthancPluginLogWarning(context_, message.c_str()); | |
591 | |
4
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
592 message = "Storing the cache of the Web viewer in folder: " + cachePath.string(); |
0 | 593 OrthancPluginLogWarning(context_, message.c_str()); |
594 | |
595 | |
596 /* Create the cache */ | |
4
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
597 cache_ = new CacheContext(cachePath.string()); |
115
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
598 CacheScheduler& scheduler = cache_->GetScheduler(); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
599 |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
600 |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
601 /* Look for a change in the versions */ |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
602 std::string orthancVersion("unknown"), webViewerVersion("unknown"); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
603 bool clear = false; |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
604 if (!scheduler.LookupProperty(orthancVersion, CacheProperty_OrthancVersion) || |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
605 orthancVersion != std::string(context_->orthancVersion)) |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
606 { |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
607 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
|
608 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
|
609 OrthancPluginLogWarning(context_, s.c_str()); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
610 clear = true; |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
611 } |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
612 |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
613 if (!scheduler.LookupProperty(webViewerVersion, CacheProperty_WebViewerVersion) || |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
614 webViewerVersion != std::string(ORTHANC_WEBVIEWER_VERSION)) |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
615 { |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
616 std::string s = ("The version of the Web viewer plugin has changed from \"" + webViewerVersion + "\" to \"" + |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
617 std::string(ORTHANC_WEBVIEWER_VERSION) + "\": 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
|
618 OrthancPluginLogWarning(context_, s.c_str()); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
619 clear = true; |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
620 } |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
621 |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
622 |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
623 /* Clear the cache if needed */ |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
624 if (clear) |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
625 { |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
626 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
|
627 scheduler.Clear(); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
628 scheduler.SetProperty(CacheProperty_OrthancVersion, context_->orthancVersion); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
629 scheduler.SetProperty(CacheProperty_WebViewerVersion, ORTHANC_WEBVIEWER_VERSION); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
630 } |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
631 else |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
632 { |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
633 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
|
634 } |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
635 |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
636 |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
637 /* Configure the cache */ |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
638 scheduler.RegisterPolicy(new ViewerPrefetchPolicy(context_)); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
639 scheduler.Register(CacheBundle_SeriesInformation, |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
640 new SeriesInformationAdapter(context_, scheduler), 1); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
641 scheduler.Register(CacheBundle_DecodedImage, |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
642 new DecodedImageAdapter(context_), decodingThreads); |
4
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
643 |
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
644 |
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
645 /* Set the quotas */ |
115
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
646 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
|
647 |
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
648 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
|
649 OrthancPluginLogWarning(context_, message.c_str()); |
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
650 |
115
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
114
diff
changeset
|
651 scheduler.SetQuota(CacheBundle_DecodedImage, 0, static_cast<uint64_t>(cacheSize) * 1024 * 1024); |
0 | 652 } |
653 catch (std::runtime_error& e) | |
654 { | |
655 OrthancPluginLogError(context_, e.what()); | |
656 return -1; | |
657 } | |
658 catch (Orthanc::OrthancException& e) | |
659 { | |
133
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
660 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
|
661 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
662 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
|
663 } |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
664 else |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
665 { |
3251ec958a29
Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
127
diff
changeset
|
666 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
|
667 } |
0 | 668 return -1; |
669 } | |
670 | |
671 | |
127
5754d39b011d
Option "EnableGdcm" to replace the built-in decoder of Orthanc with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
672 /* Configure the DICOM decoder */ |
5754d39b011d
Option "EnableGdcm" to replace the built-in decoder of Orthanc with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
673 if (enableGdcm) |
5754d39b011d
Option "EnableGdcm" to replace the built-in decoder of Orthanc with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
674 { |
5754d39b011d
Option "EnableGdcm" to replace the built-in decoder of Orthanc with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
675 // Replace the default decoder of DICOM images that is built in Orthanc |
5754d39b011d
Option "EnableGdcm" to replace the built-in decoder of Orthanc with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
676 OrthancPluginLogWarning(context_, "Using GDCM instead of the DICOM decoder that is built in Orthanc"); |
5754d39b011d
Option "EnableGdcm" to replace the built-in decoder of Orthanc with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
677 OrthancPluginRegisterDecodeImageCallback(context_, DecodeImageCallback); |
5754d39b011d
Option "EnableGdcm" to replace the built-in decoder of Orthanc with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
678 } |
5754d39b011d
Option "EnableGdcm" to replace the built-in decoder of Orthanc with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
679 else |
5754d39b011d
Option "EnableGdcm" to replace the built-in decoder of Orthanc with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
680 { |
5754d39b011d
Option "EnableGdcm" to replace the built-in decoder of Orthanc with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
681 OrthancPluginLogWarning(context_, "Using the DICOM decoder that is built in Orthanc (not using GDCM)"); |
5754d39b011d
Option "EnableGdcm" to replace the built-in decoder of Orthanc with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
682 } |
5754d39b011d
Option "EnableGdcm" to replace the built-in decoder of Orthanc with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
683 |
5754d39b011d
Option "EnableGdcm" to replace the built-in decoder of Orthanc with GDCM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
684 |
0 | 685 /* Install the callbacks */ |
686 OrthancPluginRegisterRestCallback(context_, "/web-viewer/series/(.*)", ServeCache<CacheBundle_SeriesInformation>); | |
19 | 687 OrthancPluginRegisterRestCallback(context_, "/web-viewer/is-stable-series/(.*)", IsStableSeries); |
0 | 688 OrthancPluginRegisterRestCallback(context_, "/web-viewer/instances/(.*)", ServeCache<CacheBundle_DecodedImage>); |
31 | 689 OrthancPluginRegisterRestCallback(context, "/web-viewer/libs/(.*)", ServeEmbeddedFolder<Orthanc::EmbeddedResources::JAVASCRIPT_LIBS>); |
0 | 690 |
691 #if ORTHANC_STANDALONE == 1 | |
31 | 692 OrthancPluginRegisterRestCallback(context, "/web-viewer/app/(.*)", ServeEmbeddedFolder<Orthanc::EmbeddedResources::WEB_VIEWER>); |
0 | 693 #else |
694 OrthancPluginRegisterRestCallback(context, "/web-viewer/app/(.*)", ServeWebViewer); | |
695 #endif | |
696 | |
697 OrthancPluginRegisterOnChangeCallback(context, OnChangeCallback); | |
698 | |
699 | |
700 /* Extend the default Orthanc Explorer with custom JavaScript */ | |
701 std::string explorer; | |
31 | 702 Orthanc::EmbeddedResources::GetFileResource(explorer, Orthanc::EmbeddedResources::ORTHANC_EXPLORER); |
0 | 703 OrthancPluginExtendOrthancExplorer(context_, explorer.c_str()); |
704 | |
705 return 0; | |
706 } | |
707 | |
708 | |
709 ORTHANC_PLUGINS_API void OrthancPluginFinalize() | |
710 { | |
711 OrthancPluginLogWarning(context_, "Finalizing the Web viewer"); | |
712 | |
713 if (cache_ != NULL) | |
714 { | |
715 delete cache_; | |
716 cache_ = NULL; | |
717 } | |
718 } | |
719 | |
720 | |
721 ORTHANC_PLUGINS_API const char* OrthancPluginGetName() | |
722 { | |
723 return "web-viewer"; | |
724 } | |
725 | |
726 | |
727 ORTHANC_PLUGINS_API const char* OrthancPluginGetVersion() | |
728 { | |
12 | 729 return ORTHANC_WEBVIEWER_VERSION; |
0 | 730 } |
731 } |