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