Mercurial > hg > orthanc
annotate OrthancServer/Internals/CommandDispatcher.cpp @ 789:55dae8c5a6ab
refactoring
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 05 May 2014 18:43:34 +0200 |
parents | 0a2f8c707c78 |
children | a811bdf8b8eb |
rev | line source |
---|---|
0 | 1 /** |
62 | 2 * Orthanc - A Lightweight, RESTful DICOM Store |
689 | 3 * Copyright (C) 2012-2014 Medical Physics Department, CHU of Liege, |
0 | 4 * Belgium |
5 * | |
6 * This program is free software: you can redistribute it and/or | |
7 * modify it under the terms of the GNU General Public License as | |
8 * published by the Free Software Foundation, either version 3 of the | |
9 * License, or (at your option) any later version. | |
136 | 10 * |
11 * In addition, as a special exception, the copyright holders of this | |
12 * program give permission to link the code of its release with the | |
13 * OpenSSL project's "OpenSSL" library (or with modified versions of it | |
14 * that use the same license as the "OpenSSL" library), and distribute | |
15 * the linked executables. You must obey the GNU General Public License | |
16 * in all respects for all of the code used other than "OpenSSL". If you | |
17 * modify file(s) with this exception, you may extend this exception to | |
18 * your version of the file(s), but you are not obligated to do so. If | |
19 * you do not wish to do so, delete this exception statement from your | |
20 * version. If you delete this exception statement from all source files | |
21 * in the program, then also delete it here. | |
0 | 22 * |
23 * This program is distributed in the hope that it will be useful, but | |
24 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
26 * General Public License for more details. | |
27 * | |
28 * You should have received a copy of the GNU General Public License | |
29 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
30 **/ | |
31 | |
32 | |
766
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
33 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
34 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
35 /*========================================================================= |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
36 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
37 This file is based on portions of the following project: |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
38 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
39 Program: DCMTK 3.6.0 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
40 Module: http://dicom.offis.de/dcmtk.php.en |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
41 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
42 Copyright (C) 1994-2011, OFFIS e.V. |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
43 All rights reserved. |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
44 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
45 This software and supporting documentation were developed by |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
46 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
47 OFFIS e.V. |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
48 R&D Division Health |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
49 Escherweg 2 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
50 26121 Oldenburg, Germany |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
51 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
52 Redistribution and use in source and binary forms, with or without |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
53 modification, are permitted provided that the following conditions |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
54 are met: |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
55 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
56 - Redistributions of source code must retain the above copyright |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
57 notice, this list of conditions and the following disclaimer. |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
58 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
59 - Redistributions in binary form must reproduce the above copyright |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
60 notice, this list of conditions and the following disclaimer in the |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
61 documentation and/or other materials provided with the distribution. |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
62 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
63 - Neither the name of OFFIS nor the names of its contributors may be |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
64 used to endorse or promote products derived from this software |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
65 without specific prior written permission. |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
66 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
67 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
68 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
69 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
70 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
71 HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
72 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
73 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
74 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
75 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
76 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
77 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
78 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
79 =========================================================================*/ |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
80 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
81 |
0 | 82 #include "CommandDispatcher.h" |
83 | |
84 #include "FindScp.h" | |
85 #include "StoreScp.h" | |
86 #include "MoveScp.h" | |
87 #include "../../Core/Toolbox.h" | |
88 | |
89 #include <dcmtk/dcmnet/dcasccfg.h> /* for class DcmAssociationConfiguration */ | |
101 | 90 #include <boost/lexical_cast.hpp> |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
101
diff
changeset
|
91 #include <glog/logging.h> |
0 | 92 |
503 | 93 #define ORTHANC_PROMISCUOUS 1 |
94 | |
0 | 95 static OFBool opt_rejectWithoutImplementationUID = OFFalse; |
96 | |
97 | |
503 | 98 |
99 #if ORTHANC_PROMISCUOUS == 1 | |
100 static | |
101 DUL_PRESENTATIONCONTEXT * | |
102 findPresentationContextID(LST_HEAD * head, | |
103 T_ASC_PresentationContextID presentationContextID) | |
104 { | |
105 DUL_PRESENTATIONCONTEXT *pc; | |
106 LST_HEAD **l; | |
107 OFBool found = OFFalse; | |
108 | |
109 if (head == NULL) | |
110 return NULL; | |
111 | |
112 l = &head; | |
113 if (*l == NULL) | |
114 return NULL; | |
115 | |
116 pc = OFstatic_cast(DUL_PRESENTATIONCONTEXT *, LST_Head(l)); | |
117 (void)LST_Position(l, OFstatic_cast(LST_NODE *, pc)); | |
118 | |
119 while (pc && !found) { | |
120 if (pc->presentationContextID == presentationContextID) { | |
121 found = OFTrue; | |
122 } else { | |
123 pc = OFstatic_cast(DUL_PRESENTATIONCONTEXT *, LST_Next(l)); | |
124 } | |
125 } | |
126 return pc; | |
127 } | |
128 | |
129 | |
130 /** accept all presenstation contexts for unknown SOP classes, | |
131 * i.e. UIDs appearing in the list of abstract syntaxes | |
132 * where no corresponding name is defined in the UID dictionary. | |
133 * @param params pointer to association parameters structure | |
134 * @param transferSyntax transfer syntax to accept | |
135 * @param acceptedRole SCU/SCP role to accept | |
136 */ | |
137 static OFCondition acceptUnknownContextsWithTransferSyntax( | |
138 T_ASC_Parameters * params, | |
139 const char* transferSyntax, | |
140 T_ASC_SC_ROLE acceptedRole) | |
141 { | |
142 OFCondition cond = EC_Normal; | |
143 int n, i, k; | |
144 DUL_PRESENTATIONCONTEXT *dpc; | |
145 T_ASC_PresentationContext pc; | |
146 OFBool accepted = OFFalse; | |
147 OFBool abstractOK = OFFalse; | |
148 | |
149 n = ASC_countPresentationContexts(params); | |
150 for (i = 0; i < n; i++) | |
151 { | |
152 cond = ASC_getPresentationContext(params, i, &pc); | |
153 if (cond.bad()) return cond; | |
154 abstractOK = OFFalse; | |
155 accepted = OFFalse; | |
156 | |
157 if (dcmFindNameOfUID(pc.abstractSyntax) == NULL) | |
158 { | |
159 abstractOK = OFTrue; | |
160 | |
161 /* check the transfer syntax */ | |
162 for (k = 0; (k < OFstatic_cast(int, pc.transferSyntaxCount)) && !accepted; k++) | |
163 { | |
164 if (strcmp(pc.proposedTransferSyntaxes[k], transferSyntax) == 0) | |
165 { | |
166 accepted = OFTrue; | |
167 } | |
168 } | |
169 } | |
170 | |
171 if (accepted) | |
172 { | |
173 cond = ASC_acceptPresentationContext( | |
174 params, pc.presentationContextID, | |
175 transferSyntax, acceptedRole); | |
176 if (cond.bad()) return cond; | |
177 } else { | |
178 T_ASC_P_ResultReason reason; | |
179 | |
180 /* do not refuse if already accepted */ | |
181 dpc = findPresentationContextID(params->DULparams.acceptedPresentationContext, | |
182 pc.presentationContextID); | |
183 if ((dpc == NULL) || ((dpc != NULL) && (dpc->result != ASC_P_ACCEPTANCE))) | |
184 { | |
185 | |
186 if (abstractOK) { | |
187 reason = ASC_P_TRANSFERSYNTAXESNOTSUPPORTED; | |
188 } else { | |
189 reason = ASC_P_ABSTRACTSYNTAXNOTSUPPORTED; | |
190 } | |
191 /* | |
192 * If previously this presentation context was refused | |
193 * because of bad transfer syntax let it stay that way. | |
194 */ | |
195 if ((dpc != NULL) && (dpc->result == ASC_P_TRANSFERSYNTAXESNOTSUPPORTED)) | |
196 reason = ASC_P_TRANSFERSYNTAXESNOTSUPPORTED; | |
197 | |
198 cond = ASC_refusePresentationContext(params, pc.presentationContextID, reason); | |
199 if (cond.bad()) return cond; | |
200 } | |
201 } | |
202 } | |
203 return EC_Normal; | |
204 } | |
205 | |
206 | |
207 /** accept all presenstation contexts for unknown SOP classes, | |
208 * i.e. UIDs appearing in the list of abstract syntaxes | |
209 * where no corresponding name is defined in the UID dictionary. | |
210 * This method is passed a list of "preferred" transfer syntaxes. | |
211 * @param params pointer to association parameters structure | |
212 * @param transferSyntax transfer syntax to accept | |
213 * @param acceptedRole SCU/SCP role to accept | |
214 */ | |
215 static OFCondition acceptUnknownContextsWithPreferredTransferSyntaxes( | |
216 T_ASC_Parameters * params, | |
217 const char* transferSyntaxes[], int transferSyntaxCount, | |
218 T_ASC_SC_ROLE acceptedRole = ASC_SC_ROLE_DEFAULT) | |
219 { | |
220 OFCondition cond = EC_Normal; | |
221 /* | |
222 ** Accept in the order "least wanted" to "most wanted" transfer | |
223 ** syntax. Accepting a transfer syntax will override previously | |
224 ** accepted transfer syntaxes. | |
225 */ | |
226 for (int i = transferSyntaxCount - 1; i >= 0; i--) | |
227 { | |
228 cond = acceptUnknownContextsWithTransferSyntax(params, transferSyntaxes[i], acceptedRole); | |
229 if (cond.bad()) return cond; | |
230 } | |
231 return cond; | |
232 } | |
233 #endif | |
234 | |
235 | |
62 | 236 namespace Orthanc |
0 | 237 { |
238 namespace Internals | |
239 { | |
240 OFCondition AssociationCleanup(T_ASC_Association *assoc) | |
241 { | |
242 OFString temp_str; | |
243 OFCondition cond = ASC_dropSCPAssociation(assoc); | |
244 if (cond.bad()) | |
245 { | |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
101
diff
changeset
|
246 LOG(FATAL) << cond.text(); |
0 | 247 return cond; |
248 } | |
249 | |
250 cond = ASC_destroyAssociation(&assoc); | |
251 if (cond.bad()) | |
252 { | |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
101
diff
changeset
|
253 LOG(FATAL) << cond.text(); |
0 | 254 return cond; |
255 } | |
256 | |
257 return cond; | |
258 } | |
259 | |
260 | |
261 | |
262 CommandDispatcher* AcceptAssociation(const DicomServer& server, T_ASC_Network *net) | |
263 { | |
264 DcmAssociationConfiguration asccfg; | |
265 char buf[BUFSIZ]; | |
266 T_ASC_Association *assoc; | |
267 OFCondition cond; | |
268 OFString sprofile; | |
269 OFString temp_str; | |
270 | |
271 std::vector<const char*> knownAbstractSyntaxes; | |
272 | |
273 // For C-STORE | |
274 if (server.HasStoreRequestHandlerFactory()) | |
275 { | |
276 knownAbstractSyntaxes.push_back(UID_VerificationSOPClass); | |
277 } | |
278 | |
279 // For C-FIND | |
280 if (server.HasFindRequestHandlerFactory()) | |
281 { | |
282 knownAbstractSyntaxes.push_back(UID_FINDPatientRootQueryRetrieveInformationModel); | |
283 knownAbstractSyntaxes.push_back(UID_FINDStudyRootQueryRetrieveInformationModel); | |
284 } | |
285 | |
286 // For C-MOVE | |
287 if (server.HasMoveRequestHandlerFactory()) | |
288 { | |
289 knownAbstractSyntaxes.push_back(UID_MOVEStudyRootQueryRetrieveInformationModel); | |
665 | 290 knownAbstractSyntaxes.push_back(UID_MOVEPatientRootQueryRetrieveInformationModel); |
0 | 291 } |
292 | |
293 cond = ASC_receiveAssociation(net, &assoc, | |
294 /*opt_maxPDU*/ ASC_DEFAULTMAXPDU, | |
295 NULL, NULL, | |
296 /*opt_secureConnection*/ OFFalse, | |
297 DUL_NOBLOCK, 1); | |
298 | |
299 if (cond == DUL_NOASSOCIATIONREQUEST) | |
300 { | |
301 // Timeout | |
302 AssociationCleanup(assoc); | |
303 return NULL; | |
304 } | |
305 | |
306 // if some kind of error occured, take care of it | |
307 if (cond.bad()) | |
308 { | |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
101
diff
changeset
|
309 LOG(ERROR) << "Receiving Association failed: " << cond.text(); |
0 | 310 // no matter what kind of error occurred, we need to do a cleanup |
311 AssociationCleanup(assoc); | |
312 return NULL; | |
313 } | |
314 | |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
101
diff
changeset
|
315 LOG(INFO) << "Association Received"; |
0 | 316 |
661
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
317 std::vector<const char*> transferSyntaxes; |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
318 |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
319 // This is the list of the transfer syntaxes that were supported up to Orthanc 0.7.1 |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
320 transferSyntaxes.push_back(UID_LittleEndianExplicitTransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
321 transferSyntaxes.push_back(UID_BigEndianExplicitTransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
322 transferSyntaxes.push_back(UID_LittleEndianImplicitTransferSyntax); |
665 | 323 |
324 // New transfer syntaxes supported since Orthanc 0.7.2 | |
661
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
325 transferSyntaxes.push_back(UID_DeflatedExplicitVRLittleEndianTransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
326 transferSyntaxes.push_back(UID_JPEGProcess1TransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
327 transferSyntaxes.push_back(UID_JPEGProcess2_4TransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
328 transferSyntaxes.push_back(UID_JPEGProcess3_5TransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
329 transferSyntaxes.push_back(UID_JPEGProcess6_8TransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
330 transferSyntaxes.push_back(UID_JPEGProcess7_9TransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
331 transferSyntaxes.push_back(UID_JPEGProcess10_12TransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
332 transferSyntaxes.push_back(UID_JPEGProcess11_13TransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
333 transferSyntaxes.push_back(UID_JPEGProcess14TransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
334 transferSyntaxes.push_back(UID_JPEGProcess15TransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
335 transferSyntaxes.push_back(UID_JPEGProcess16_18TransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
336 transferSyntaxes.push_back(UID_JPEGProcess17_19TransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
337 transferSyntaxes.push_back(UID_JPEGProcess20_22TransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
338 transferSyntaxes.push_back(UID_JPEGProcess21_23TransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
339 transferSyntaxes.push_back(UID_JPEGProcess24_26TransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
340 transferSyntaxes.push_back(UID_JPEGProcess25_27TransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
341 transferSyntaxes.push_back(UID_JPEGProcess28TransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
342 transferSyntaxes.push_back(UID_JPEGProcess29TransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
343 transferSyntaxes.push_back(UID_JPEGProcess14SV1TransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
344 transferSyntaxes.push_back(UID_JPEGLSLosslessTransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
345 transferSyntaxes.push_back(UID_JPEGLSLossyTransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
346 transferSyntaxes.push_back(UID_JPEG2000LosslessOnlyTransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
347 transferSyntaxes.push_back(UID_JPEG2000TransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
348 transferSyntaxes.push_back(UID_JPEG2000Part2MulticomponentImageCompressionLosslessOnlyTransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
349 transferSyntaxes.push_back(UID_JPEG2000Part2MulticomponentImageCompressionTransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
350 transferSyntaxes.push_back(UID_JPIPReferencedTransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
351 transferSyntaxes.push_back(UID_JPIPReferencedDeflateTransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
352 transferSyntaxes.push_back(UID_MPEG2MainProfileAtMainLevelTransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
353 transferSyntaxes.push_back(UID_MPEG2MainProfileAtHighLevelTransferSyntax); |
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
354 transferSyntaxes.push_back(UID_RLELosslessTransferSyntax); |
0 | 355 |
356 /* accept the Verification SOP Class if presented */ | |
661
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
357 cond = ASC_acceptContextsWithPreferredTransferSyntaxes( assoc->params, &knownAbstractSyntaxes[0], knownAbstractSyntaxes.size(), &transferSyntaxes[0], transferSyntaxes.size()); |
0 | 358 if (cond.bad()) |
359 { | |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
101
diff
changeset
|
360 LOG(INFO) << cond.text(); |
0 | 361 AssociationCleanup(assoc); |
362 return NULL; | |
363 } | |
364 | |
365 /* the array of Storage SOP Class UIDs comes from dcuid.h */ | |
661
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
366 cond = ASC_acceptContextsWithPreferredTransferSyntaxes( assoc->params, dcmAllStorageSOPClassUIDs, numberOfAllDcmStorageSOPClassUIDs, &transferSyntaxes[0], transferSyntaxes.size()); |
0 | 367 if (cond.bad()) |
368 { | |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
101
diff
changeset
|
369 LOG(INFO) << cond.text(); |
0 | 370 AssociationCleanup(assoc); |
371 return NULL; | |
372 } | |
373 | |
503 | 374 #if ORTHANC_PROMISCUOUS == 1 |
375 /* accept everything not known not to be a storage SOP class */ | |
376 cond = acceptUnknownContextsWithPreferredTransferSyntaxes( | |
661
d233b5090105
accept more transfer syntaxes for C-Store SCP, write meta-header when receiving files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
620
diff
changeset
|
377 assoc->params, &transferSyntaxes[0], transferSyntaxes.size()); |
503 | 378 if (cond.bad()) |
379 { | |
380 LOG(INFO) << cond.text(); | |
381 AssociationCleanup(assoc); | |
382 return NULL; | |
383 } | |
384 #endif | |
385 | |
0 | 386 /* set our app title */ |
387 ASC_setAPTitles(assoc->params, NULL, NULL, server.GetApplicationEntityTitle().c_str()); | |
388 | |
389 /* acknowledge or reject this association */ | |
390 cond = ASC_getApplicationContextName(assoc->params, buf); | |
391 if ((cond.bad()) || strcmp(buf, UID_StandardApplicationContext) != 0) | |
392 { | |
393 /* reject: the application context name is not supported */ | |
394 T_ASC_RejectParameters rej = | |
395 { | |
396 ASC_RESULT_REJECTEDPERMANENT, | |
397 ASC_SOURCE_SERVICEUSER, | |
398 ASC_REASON_SU_APPCONTEXTNAMENOTSUPPORTED | |
399 }; | |
400 | |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
101
diff
changeset
|
401 LOG(INFO) << "Association Rejected: Bad Application Context Name: " << buf; |
0 | 402 cond = ASC_rejectAssociation(assoc, &rej); |
403 if (cond.bad()) | |
404 { | |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
101
diff
changeset
|
405 LOG(INFO) << cond.text(); |
0 | 406 } |
407 AssociationCleanup(assoc); | |
408 return NULL; | |
409 } | |
620
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
410 |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
411 std::string callingIP; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
412 std::string callingTitle; |
0 | 413 |
414 /* check the AETs */ | |
415 { | |
416 DIC_AE callingTitle_C; | |
417 DIC_AE calledTitle_C; | |
418 DIC_AE callingIP_C; | |
419 DIC_AE calledIP_C; | |
420 if (ASC_getAPTitles(assoc->params, callingTitle_C, calledTitle_C, NULL).bad() || | |
421 ASC_getPresentationAddresses(assoc->params, callingIP_C, calledIP_C).bad()) | |
422 { | |
423 T_ASC_RejectParameters rej = | |
424 { | |
425 ASC_RESULT_REJECTEDPERMANENT, | |
426 ASC_SOURCE_SERVICEUSER, | |
427 ASC_REASON_SU_NOREASON | |
428 }; | |
429 ASC_rejectAssociation(assoc, &rej); | |
430 AssociationCleanup(assoc); | |
431 return NULL; | |
432 } | |
433 | |
620
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
434 callingIP = std::string(/*OFSTRING_GUARD*/(callingIP_C)); |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
435 callingTitle = std::string(/*OFSTRING_GUARD*/(callingTitle_C)); |
101 | 436 std::string calledTitle(/*OFSTRING_GUARD*/(calledTitle_C)); |
0 | 437 |
690
2e67366aab83
case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
438 if (!server.IsMyAETitle(calledTitle)) |
0 | 439 { |
440 T_ASC_RejectParameters rej = | |
441 { | |
442 ASC_RESULT_REJECTEDPERMANENT, | |
443 ASC_SOURCE_SERVICEUSER, | |
444 ASC_REASON_SU_CALLEDAETITLENOTRECOGNIZED | |
445 }; | |
446 ASC_rejectAssociation(assoc, &rej); | |
447 AssociationCleanup(assoc); | |
448 return NULL; | |
449 } | |
450 | |
451 if (server.HasApplicationEntityFilter() && | |
620
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
452 !server.GetApplicationEntityFilter().IsAllowedConnection(callingIP, callingTitle)) |
0 | 453 { |
454 T_ASC_RejectParameters rej = | |
455 { | |
456 ASC_RESULT_REJECTEDPERMANENT, | |
457 ASC_SOURCE_SERVICEUSER, | |
458 ASC_REASON_SU_CALLINGAETITLENOTRECOGNIZED | |
459 }; | |
460 ASC_rejectAssociation(assoc, &rej); | |
461 AssociationCleanup(assoc); | |
462 return NULL; | |
463 } | |
464 } | |
465 | |
466 if (opt_rejectWithoutImplementationUID && strlen(assoc->params->theirImplementationClassUID) == 0) | |
467 { | |
468 /* reject: the no implementation Class UID provided */ | |
469 T_ASC_RejectParameters rej = | |
470 { | |
471 ASC_RESULT_REJECTEDPERMANENT, | |
472 ASC_SOURCE_SERVICEUSER, | |
473 ASC_REASON_SU_NOREASON | |
474 }; | |
475 | |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
101
diff
changeset
|
476 LOG(INFO) << "Association Rejected: No Implementation Class UID provided"; |
0 | 477 cond = ASC_rejectAssociation(assoc, &rej); |
478 if (cond.bad()) | |
479 { | |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
101
diff
changeset
|
480 LOG(INFO) << cond.text(); |
0 | 481 } |
482 AssociationCleanup(assoc); | |
483 return NULL; | |
484 } | |
485 | |
486 { | |
487 cond = ASC_acknowledgeAssociation(assoc); | |
488 if (cond.bad()) | |
489 { | |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
101
diff
changeset
|
490 LOG(ERROR) << cond.text(); |
0 | 491 AssociationCleanup(assoc); |
492 return NULL; | |
493 } | |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
101
diff
changeset
|
494 LOG(INFO) << "Association Acknowledged (Max Send PDV: " << assoc->sendPDVLength << ")"; |
0 | 495 if (ASC_countAcceptedPresentationContexts(assoc->params) == 0) |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
101
diff
changeset
|
496 LOG(INFO) << " (but no valid presentation contexts)"; |
0 | 497 } |
498 | |
620
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
499 IApplicationEntityFilter* filter = server.HasApplicationEntityFilter() ? &server.GetApplicationEntityFilter() : NULL; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
500 return new CommandDispatcher(server, assoc, callingIP, callingTitle, filter); |
0 | 501 } |
502 | |
503 bool CommandDispatcher::Step() | |
504 /* | |
505 * This function receives DIMSE commmands over the network connection | |
506 * and handles these commands correspondingly. Note that in case of | |
507 * storscp only C-ECHO-RQ and C-STORE-RQ commands can be processed. | |
508 */ | |
509 { | |
510 bool finished = false; | |
511 | |
512 // receive a DIMSE command over the network, with a timeout of 1 second | |
513 DcmDataset *statusDetail = NULL; | |
514 T_ASC_PresentationContextID presID = 0; | |
515 T_DIMSE_Message msg; | |
516 | |
517 OFCondition cond = DIMSE_receiveCommand(assoc_, DIMSE_NONBLOCKING, 1, &presID, &msg, &statusDetail); | |
518 elapsedTimeSinceLastCommand_++; | |
519 | |
520 // if the command which was received has extra status | |
521 // detail information, dump this information | |
522 if (statusDetail != NULL) | |
523 { | |
101 | 524 //LOG4CPP_WARN(Internals::GetLogger(), "Status Detail:" << OFendl << DcmObject::PrintHelper(*statusDetail)); |
0 | 525 delete statusDetail; |
526 } | |
527 | |
528 if (cond == DIMSE_OUTOFRESOURCES) | |
529 { | |
530 finished = true; | |
531 } | |
532 else if (cond == DIMSE_NODATAAVAILABLE) | |
533 { | |
534 // Timeout due to DIMSE_NONBLOCKING | |
535 if (clientTimeout_ != 0 && | |
536 elapsedTimeSinceLastCommand_ >= clientTimeout_) | |
537 { | |
538 // This timeout is actually a client timeout | |
539 finished = true; | |
540 } | |
541 } | |
542 else if (cond == EC_Normal) | |
543 { | |
544 // Reset the client timeout counter | |
545 elapsedTimeSinceLastCommand_ = 0; | |
546 | |
620
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
547 // Convert the type of request to Orthanc's internal type |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
548 bool supported = false; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
549 DicomRequestType request; |
0 | 550 switch (msg.CommandField) |
551 { | |
620
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
552 case DIMSE_C_ECHO_RQ: |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
553 request = DicomRequestType_Echo; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
554 supported = true; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
555 break; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
556 |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
557 case DIMSE_C_STORE_RQ: |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
558 request = DicomRequestType_Store; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
559 supported = true; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
560 break; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
561 |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
562 case DIMSE_C_MOVE_RQ: |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
563 request = DicomRequestType_Move; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
564 supported = true; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
565 break; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
566 |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
567 case DIMSE_C_FIND_RQ: |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
568 request = DicomRequestType_Find; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
569 supported = true; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
570 break; |
0 | 571 |
620
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
572 default: |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
573 // we cannot handle this kind of message |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
574 cond = DIMSE_BADCOMMANDTYPE; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
575 LOG(ERROR) << "cannot handle command: 0x" << std::hex << msg.CommandField; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
576 break; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
577 } |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
578 |
0 | 579 |
620
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
580 // Check whether this request is allowed by the security filter |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
581 if (supported && |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
582 filter_ != NULL && |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
583 !filter_->IsAllowedRequest(callingIP_, callingAETitle_, request)) |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
584 { |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
585 LOG(ERROR) << EnumerationToString(request) |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
586 << " requests are disallowed for the AET \"" |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
587 << callingAETitle_ << "\""; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
588 cond = DIMSE_BADCOMMANDTYPE; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
589 supported = false; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
590 } |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
591 |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
592 // in case we received a supported message, process this command |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
593 if (supported) |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
594 { |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
595 // If anything goes wrong, there will be a "BADCOMMANDTYPE" answer |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
596 cond = DIMSE_BADCOMMANDTYPE; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
597 |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
598 switch (request) |
0 | 599 { |
620
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
600 case DicomRequestType_Echo: |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
601 cond = EchoScp(assoc_, &msg, presID); |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
602 break; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
603 |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
604 case DicomRequestType_Store: |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
605 if (server_.HasStoreRequestHandlerFactory()) // Should always be true |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
606 { |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
607 std::auto_ptr<IStoreRequestHandler> handler |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
608 (server_.GetStoreRequestHandlerFactory().ConstructStoreRequestHandler()); |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
609 cond = Internals::storeScp(assoc_, &msg, presID, *handler); |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
610 } |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
611 break; |
0 | 612 |
620
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
613 case DicomRequestType_Move: |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
614 if (server_.HasMoveRequestHandlerFactory()) // Should always be true |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
615 { |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
616 std::auto_ptr<IMoveRequestHandler> handler |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
617 (server_.GetMoveRequestHandlerFactory().ConstructMoveRequestHandler()); |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
618 cond = Internals::moveScp(assoc_, &msg, presID, *handler); |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
619 } |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
620 break; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
621 |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
622 case DicomRequestType_Find: |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
623 if (server_.HasFindRequestHandlerFactory()) // Should always be true |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
624 { |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
625 std::auto_ptr<IFindRequestHandler> handler |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
626 (server_.GetFindRequestHandlerFactory().ConstructFindRequestHandler()); |
665 | 627 cond = Internals::findScp(assoc_, &msg, presID, *handler, callingAETitle_); |
620
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
628 } |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
629 break; |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
630 |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
631 default: |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
632 // Should never happen |
4aa6f0d79947
security filter for dicom requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
503
diff
changeset
|
633 break; |
0 | 634 } |
635 } | |
636 } | |
637 else | |
638 { | |
639 // Bad status, which indicates the closing of the connection by | |
640 // the peer or a network error | |
641 finished = true; | |
665 | 642 |
667
aa2ab67d913d
log error to log info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
665
diff
changeset
|
643 LOG(INFO) << cond.text(); |
0 | 644 } |
645 | |
646 if (finished) | |
647 { | |
648 if (cond == DUL_PEERREQUESTEDRELEASE) | |
649 { | |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
101
diff
changeset
|
650 LOG(INFO) << "Association Release"; |
0 | 651 ASC_acknowledgeRelease(assoc_); |
652 } | |
653 else if (cond == DUL_PEERABORTEDASSOCIATION) | |
654 { | |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
101
diff
changeset
|
655 LOG(INFO) << "Association Aborted"; |
0 | 656 } |
657 else | |
658 { | |
659 OFString temp_str; | |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
101
diff
changeset
|
660 LOG(ERROR) << "DIMSE failure (aborting association): " << cond.text(); |
0 | 661 /* some kind of error so abort the association */ |
662 ASC_abortAssociation(assoc_); | |
663 } | |
664 } | |
665 | |
666 return !finished; | |
667 } | |
668 | |
669 | |
670 OFCondition EchoScp( T_ASC_Association * assoc, T_DIMSE_Message * msg, T_ASC_PresentationContextID presID) | |
671 { | |
672 OFString temp_str; | |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
101
diff
changeset
|
673 LOG(INFO) << "Received Echo Request"; |
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
101
diff
changeset
|
674 //LOG(DEBUG) << DIMSE_dumpMessage(temp_str, msg->msg.CEchoRQ, DIMSE_INCOMING, NULL, presID)); |
0 | 675 |
676 /* the echo succeeded !! */ | |
677 OFCondition cond = DIMSE_sendEchoResponse(assoc, presID, &msg->msg.CEchoRQ, STATUS_Success, NULL); | |
678 if (cond.bad()) | |
679 { | |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
101
diff
changeset
|
680 LOG(ERROR) << "Echo SCP Failed: " << cond.text(); |
0 | 681 } |
682 return cond; | |
683 } | |
684 } | |
685 } |