Mercurial > hg > orthanc-authorization
annotate Plugin/OrthancResource.cpp @ 125:dce43cba6824
merge 0.6.0
author | Alain Mazy <am@osimis.io> |
---|---|
date | Mon, 18 Sep 2023 21:16:12 +0200 |
parents | 7381a7674b36 |
children | 9be1ee2b8fe1 |
rev | line source |
---|---|
1 | 1 /** |
2 * Advanced authorization plugin for Orthanc | |
68 | 3 * Copyright (C) 2017-2023 Osimis S.A., Belgium |
1 | 4 * |
5 * This program is free software: you can redistribute it and/or | |
6 * modify it under the terms of the GNU Affero General Public License | |
7 * as published by the Free Software Foundation, either version 3 of | |
8 * the License, or (at your option) any later version. | |
9 * | |
10 * This program is distributed in the hope that it will be useful, but | |
11 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 * Affero General Public License for more details. | |
14 * | |
15 * You should have received a copy of the GNU Affero General Public License | |
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
17 **/ | |
18 | |
19 #include "OrthancResource.h" | |
20 | |
34 | 21 #include "../Resources/Orthanc/Plugins/OrthancPluginCppWrapper.h" |
1 | 22 |
109 | 23 static const char* LABELS_KEY = "Labels"; |
24 | |
1 | 25 namespace OrthancPlugins |
26 { | |
27 void OrthancResource::GetDicomUidInternal(std::string& result, | |
28 Orthanc::ResourceType level, | |
29 const Json::Value& content) | |
30 { | |
31 std::string uidTag; | |
32 | |
33 switch (level) | |
34 { | |
35 case Orthanc::ResourceType_Patient: | |
36 uidTag = "PatientID"; | |
37 break; | |
38 | |
39 case Orthanc::ResourceType_Study: | |
40 uidTag = "StudyInstanceUID"; | |
41 break; | |
42 | |
43 case Orthanc::ResourceType_Series: | |
44 uidTag = "SeriesInstanceUID"; | |
45 break; | |
46 | |
47 case Orthanc::ResourceType_Instance: | |
48 uidTag = "SOPInstanceUID"; | |
49 break; | |
50 | |
51 default: | |
52 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
53 } | |
54 | |
55 static const char* MAIN_DICOM_TAGS = "MainDicomTags"; | |
56 | |
57 if (content.type() != Json::objectValue || | |
58 !content.isMember(MAIN_DICOM_TAGS)) | |
59 { | |
60 throw Orthanc::OrthancException(Orthanc::ErrorCode_Plugin); | |
61 } | |
62 | |
63 const Json::Value& mainDicomTags = content[MAIN_DICOM_TAGS]; | |
64 if (mainDicomTags.type() != Json::objectValue || | |
65 (mainDicomTags.isMember(uidTag) && | |
66 mainDicomTags[uidTag].type() != Json::stringValue)) | |
67 { | |
68 throw Orthanc::OrthancException(Orthanc::ErrorCode_Plugin); | |
69 } | |
70 | |
71 if (!mainDicomTags.isMember(uidTag)) | |
72 { | |
73 result.clear(); | |
74 } | |
75 else | |
76 { | |
77 result = mainDicomTags[uidTag].asString(); | |
78 } | |
79 } | |
80 | |
81 | |
82 Orthanc::ResourceType OrthancResource::GetLevel() const | |
83 { | |
84 if (IsValid()) | |
85 { | |
86 return level_; | |
87 } | |
88 else | |
89 { | |
90 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
91 } | |
92 } | |
93 | |
94 | |
95 const std::string& OrthancResource::GetIdentifier() const | |
96 { | |
97 if (IsValid()) | |
98 { | |
99 return id_; | |
100 } | |
101 else | |
102 { | |
103 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
104 } | |
105 } | |
106 | |
107 | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
108 bool OrthancResource::GetContent(Json::Value& content) const |
1 | 109 { |
110 if (!IsValid()) | |
111 { | |
112 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
113 } | |
114 | |
115 std::string uri; | |
116 switch (level_) | |
117 { | |
118 case Orthanc::ResourceType_Patient: | |
119 uri = "patients"; | |
120 break; | |
121 | |
122 case Orthanc::ResourceType_Study: | |
123 uri = "studies"; | |
124 break; | |
125 | |
126 case Orthanc::ResourceType_Series: | |
127 uri = "series"; | |
128 break; | |
129 | |
130 case Orthanc::ResourceType_Instance: | |
131 uri = "instances"; | |
132 break; | |
133 | |
134 default: | |
135 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
136 } | |
137 | |
138 uri = "/" + uri + "/" + id_; | |
139 | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
140 return RestApiGet(content, uri, false /* ignore plugins */); |
1 | 141 } |
142 | |
143 | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
144 bool OrthancResource::GetDicomUid(std::string& dicomUid /* out */) const |
1 | 145 { |
146 Json::Value content; | |
147 | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
148 if (!GetContent(content)) |
1 | 149 { |
150 return false; | |
151 } | |
152 else | |
153 { | |
154 GetDicomUidInternal(dicomUid, level_, content); | |
155 return true; | |
156 } | |
157 } | |
158 | |
159 | |
160 bool OrthancResource::GetHierarchy(std::string& dicomUid /* out */, | |
161 OrthancResource& parent /* out */, | |
109 | 162 std::list<OrthancResource>& children /* out */, |
163 std::set<std::string>& labels) const | |
1 | 164 { |
165 Json::Value content; | |
166 | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
167 if (!GetContent(content)) |
1 | 168 { |
169 return false; | |
170 } | |
171 | |
172 std::string parentKey, childrenKey; | |
173 | |
174 switch (level_) | |
175 { | |
176 case Orthanc::ResourceType_Patient: | |
177 childrenKey = "Studies"; | |
178 break; | |
179 | |
180 case Orthanc::ResourceType_Study: | |
181 parentKey = "ParentPatient"; | |
182 childrenKey = "Series"; | |
183 break; | |
184 | |
185 case Orthanc::ResourceType_Series: | |
186 parentKey = "ParentStudy"; | |
187 childrenKey = "Instances"; | |
188 break; | |
189 | |
190 case Orthanc::ResourceType_Instance: | |
191 parentKey = "ParentSeries"; | |
192 break; | |
193 | |
194 default: | |
195 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
196 } | |
197 | |
198 GetDicomUidInternal(dicomUid, level_, content); | |
199 | |
200 if (content.type() != Json::objectValue) | |
201 { | |
202 throw Orthanc::OrthancException(Orthanc::ErrorCode_Plugin); | |
203 } | |
204 | |
205 if (!parentKey.empty()) | |
206 { | |
207 if (!content.isMember(parentKey) || | |
208 content[parentKey].type() != Json::stringValue) | |
209 { | |
210 throw Orthanc::OrthancException(Orthanc::ErrorCode_Plugin); | |
211 } | |
212 | |
213 parent = OrthancResource(Orthanc::GetParentResourceType(level_), | |
214 content[parentKey].asString()); | |
215 } | |
216 | |
217 children.clear(); | |
218 | |
219 if (!childrenKey.empty()) | |
220 { | |
221 if (!content.isMember(childrenKey) || | |
222 content[childrenKey].type() != Json::arrayValue) | |
223 { | |
224 throw Orthanc::OrthancException(Orthanc::ErrorCode_Plugin); | |
225 } | |
226 | |
227 Orthanc::ResourceType childrenType = Orthanc::GetChildResourceType(level_); | |
228 | |
229 for (Json::Value::ArrayIndex i = 0; i < content[childrenKey].size(); i++) | |
230 { | |
231 const Json::Value& child = content[childrenKey][i]; | |
232 | |
233 if (child.type() != Json::stringValue) | |
234 { | |
235 throw Orthanc::OrthancException(Orthanc::ErrorCode_Plugin); | |
236 } | |
237 | |
238 children.push_back(OrthancResource(childrenType, child.asString())); | |
239 } | |
240 } | |
109 | 241 |
242 labels.clear(); | |
243 if (content.isMember(LABELS_KEY) || | |
244 content[LABELS_KEY].type() != Json::arrayValue) | |
245 { | |
246 for (Json::Value::ArrayIndex i = 0; i < content[LABELS_KEY].size(); i++) | |
247 { | |
248 const Json::Value& label = content[LABELS_KEY][i]; | |
249 | |
250 if (label.type() != Json::stringValue) | |
251 { | |
252 throw Orthanc::OrthancException(Orthanc::ErrorCode_Plugin); | |
253 } | |
254 | |
255 labels.insert(label.asString()); | |
256 } | |
257 } | |
258 | |
1 | 259 return true; |
260 } | |
261 | |
262 | |
263 bool OrthancResource::LookupOrthancId(std::string& result, | |
264 Orthanc::ResourceType level, | |
265 const std::string& dicomUid) | |
266 { | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
267 OrthancString s; |
1 | 268 |
269 switch (level) | |
270 { | |
271 case Orthanc::ResourceType_Patient: | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
272 s.Assign(OrthancPluginLookupPatient(GetGlobalContext(), dicomUid.c_str())); |
1 | 273 break; |
274 | |
275 case Orthanc::ResourceType_Study: | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
276 s.Assign(OrthancPluginLookupStudy(GetGlobalContext(), dicomUid.c_str())); |
1 | 277 break; |
278 | |
279 case Orthanc::ResourceType_Series: | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
280 s.Assign(OrthancPluginLookupSeries(GetGlobalContext(), dicomUid.c_str())); |
1 | 281 break; |
282 | |
283 case Orthanc::ResourceType_Instance: | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
284 s.Assign(OrthancPluginLookupInstance(GetGlobalContext(), dicomUid.c_str())); |
1 | 285 break; |
286 | |
287 default: | |
288 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
289 } | |
290 | |
291 if (s.GetContent() == NULL) | |
292 { | |
293 // Inexisting resource | |
294 return false; | |
295 } | |
296 else | |
297 { | |
298 result.assign(s.GetContent()); | |
299 return true; | |
300 } | |
301 } | |
302 } |