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