Mercurial > hg > orthanc-authorization
annotate Plugin/OrthancResource.cpp @ 188:c4b908970ae4
updated copyright, as Orthanc Team now replaces Osimis
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 30 May 2024 21:59:01 +0200 |
parents | 9be1ee2b8fe1 |
children |
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 |
188
c4b908970ae4
updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
150
diff
changeset
|
5 * Copyright (C) 2021-2024 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
1 | 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 #include "OrthancResource.h" | |
22 | |
34 | 23 #include "../Resources/Orthanc/Plugins/OrthancPluginCppWrapper.h" |
1 | 24 |
109 | 25 static const char* LABELS_KEY = "Labels"; |
26 | |
1 | 27 namespace OrthancPlugins |
28 { | |
29 void OrthancResource::GetDicomUidInternal(std::string& result, | |
30 Orthanc::ResourceType level, | |
31 const Json::Value& content) | |
32 { | |
33 std::string uidTag; | |
34 | |
35 switch (level) | |
36 { | |
37 case Orthanc::ResourceType_Patient: | |
38 uidTag = "PatientID"; | |
39 break; | |
40 | |
41 case Orthanc::ResourceType_Study: | |
42 uidTag = "StudyInstanceUID"; | |
43 break; | |
44 | |
45 case Orthanc::ResourceType_Series: | |
46 uidTag = "SeriesInstanceUID"; | |
47 break; | |
48 | |
49 case Orthanc::ResourceType_Instance: | |
50 uidTag = "SOPInstanceUID"; | |
51 break; | |
52 | |
53 default: | |
54 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
55 } | |
56 | |
57 static const char* MAIN_DICOM_TAGS = "MainDicomTags"; | |
58 | |
59 if (content.type() != Json::objectValue || | |
60 !content.isMember(MAIN_DICOM_TAGS)) | |
61 { | |
62 throw Orthanc::OrthancException(Orthanc::ErrorCode_Plugin); | |
63 } | |
64 | |
65 const Json::Value& mainDicomTags = content[MAIN_DICOM_TAGS]; | |
66 if (mainDicomTags.type() != Json::objectValue || | |
67 (mainDicomTags.isMember(uidTag) && | |
68 mainDicomTags[uidTag].type() != Json::stringValue)) | |
69 { | |
70 throw Orthanc::OrthancException(Orthanc::ErrorCode_Plugin); | |
71 } | |
72 | |
73 if (!mainDicomTags.isMember(uidTag)) | |
74 { | |
75 result.clear(); | |
76 } | |
77 else | |
78 { | |
79 result = mainDicomTags[uidTag].asString(); | |
80 } | |
81 } | |
82 | |
83 | |
84 Orthanc::ResourceType OrthancResource::GetLevel() const | |
85 { | |
86 if (IsValid()) | |
87 { | |
88 return level_; | |
89 } | |
90 else | |
91 { | |
92 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
93 } | |
94 } | |
95 | |
96 | |
97 const std::string& OrthancResource::GetIdentifier() const | |
98 { | |
99 if (IsValid()) | |
100 { | |
101 return id_; | |
102 } | |
103 else | |
104 { | |
105 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
106 } | |
107 } | |
108 | |
109 | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
110 bool OrthancResource::GetContent(Json::Value& content) const |
1 | 111 { |
112 if (!IsValid()) | |
113 { | |
114 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
115 } | |
116 | |
117 std::string uri; | |
118 switch (level_) | |
119 { | |
120 case Orthanc::ResourceType_Patient: | |
121 uri = "patients"; | |
122 break; | |
123 | |
124 case Orthanc::ResourceType_Study: | |
125 uri = "studies"; | |
126 break; | |
127 | |
128 case Orthanc::ResourceType_Series: | |
129 uri = "series"; | |
130 break; | |
131 | |
132 case Orthanc::ResourceType_Instance: | |
133 uri = "instances"; | |
134 break; | |
135 | |
136 default: | |
137 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
138 } | |
139 | |
140 uri = "/" + uri + "/" + id_; | |
141 | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
142 return RestApiGet(content, uri, false /* ignore plugins */); |
1 | 143 } |
144 | |
145 | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
146 bool OrthancResource::GetDicomUid(std::string& dicomUid /* out */) const |
1 | 147 { |
148 Json::Value content; | |
149 | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
150 if (!GetContent(content)) |
1 | 151 { |
152 return false; | |
153 } | |
154 else | |
155 { | |
156 GetDicomUidInternal(dicomUid, level_, content); | |
157 return true; | |
158 } | |
159 } | |
160 | |
161 | |
162 bool OrthancResource::GetHierarchy(std::string& dicomUid /* out */, | |
163 OrthancResource& parent /* out */, | |
109 | 164 std::list<OrthancResource>& children /* out */, |
165 std::set<std::string>& labels) const | |
1 | 166 { |
167 Json::Value content; | |
168 | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
169 if (!GetContent(content)) |
1 | 170 { |
171 return false; | |
172 } | |
173 | |
174 std::string parentKey, childrenKey; | |
175 | |
176 switch (level_) | |
177 { | |
178 case Orthanc::ResourceType_Patient: | |
179 childrenKey = "Studies"; | |
180 break; | |
181 | |
182 case Orthanc::ResourceType_Study: | |
183 parentKey = "ParentPatient"; | |
184 childrenKey = "Series"; | |
185 break; | |
186 | |
187 case Orthanc::ResourceType_Series: | |
188 parentKey = "ParentStudy"; | |
189 childrenKey = "Instances"; | |
190 break; | |
191 | |
192 case Orthanc::ResourceType_Instance: | |
193 parentKey = "ParentSeries"; | |
194 break; | |
195 | |
196 default: | |
197 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
198 } | |
199 | |
200 GetDicomUidInternal(dicomUid, level_, content); | |
201 | |
202 if (content.type() != Json::objectValue) | |
203 { | |
204 throw Orthanc::OrthancException(Orthanc::ErrorCode_Plugin); | |
205 } | |
206 | |
207 if (!parentKey.empty()) | |
208 { | |
209 if (!content.isMember(parentKey) || | |
210 content[parentKey].type() != Json::stringValue) | |
211 { | |
212 throw Orthanc::OrthancException(Orthanc::ErrorCode_Plugin); | |
213 } | |
214 | |
215 parent = OrthancResource(Orthanc::GetParentResourceType(level_), | |
216 content[parentKey].asString()); | |
217 } | |
218 | |
219 children.clear(); | |
220 | |
221 if (!childrenKey.empty()) | |
222 { | |
223 if (!content.isMember(childrenKey) || | |
224 content[childrenKey].type() != Json::arrayValue) | |
225 { | |
226 throw Orthanc::OrthancException(Orthanc::ErrorCode_Plugin); | |
227 } | |
228 | |
229 Orthanc::ResourceType childrenType = Orthanc::GetChildResourceType(level_); | |
230 | |
231 for (Json::Value::ArrayIndex i = 0; i < content[childrenKey].size(); i++) | |
232 { | |
233 const Json::Value& child = content[childrenKey][i]; | |
234 | |
235 if (child.type() != Json::stringValue) | |
236 { | |
237 throw Orthanc::OrthancException(Orthanc::ErrorCode_Plugin); | |
238 } | |
239 | |
240 children.push_back(OrthancResource(childrenType, child.asString())); | |
241 } | |
242 } | |
109 | 243 |
244 labels.clear(); | |
245 if (content.isMember(LABELS_KEY) || | |
246 content[LABELS_KEY].type() != Json::arrayValue) | |
247 { | |
248 for (Json::Value::ArrayIndex i = 0; i < content[LABELS_KEY].size(); i++) | |
249 { | |
250 const Json::Value& label = content[LABELS_KEY][i]; | |
251 | |
252 if (label.type() != Json::stringValue) | |
253 { | |
254 throw Orthanc::OrthancException(Orthanc::ErrorCode_Plugin); | |
255 } | |
256 | |
257 labels.insert(label.asString()); | |
258 } | |
259 } | |
260 | |
1 | 261 return true; |
262 } | |
263 | |
264 | |
265 bool OrthancResource::LookupOrthancId(std::string& result, | |
266 Orthanc::ResourceType level, | |
267 const std::string& dicomUid) | |
268 { | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
269 OrthancString s; |
1 | 270 |
271 switch (level) | |
272 { | |
273 case Orthanc::ResourceType_Patient: | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
274 s.Assign(OrthancPluginLookupPatient(GetGlobalContext(), dicomUid.c_str())); |
1 | 275 break; |
276 | |
277 case Orthanc::ResourceType_Study: | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
278 s.Assign(OrthancPluginLookupStudy(GetGlobalContext(), dicomUid.c_str())); |
1 | 279 break; |
280 | |
281 case Orthanc::ResourceType_Series: | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
282 s.Assign(OrthancPluginLookupSeries(GetGlobalContext(), dicomUid.c_str())); |
1 | 283 break; |
284 | |
285 case Orthanc::ResourceType_Instance: | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
286 s.Assign(OrthancPluginLookupInstance(GetGlobalContext(), dicomUid.c_str())); |
1 | 287 break; |
288 | |
289 default: | |
290 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
291 } | |
292 | |
293 if (s.GetContent() == NULL) | |
294 { | |
295 // Inexisting resource | |
296 return false; | |
297 } | |
298 else | |
299 { | |
300 result.assign(s.GetContent()); | |
301 return true; | |
302 } | |
303 } | |
304 } |