Mercurial > hg > orthanc
annotate Core/DicomNetworking/DicomUserConnection.cpp @ 3786:3801435e34a1 SylvainRouquette/fix-issue169-95b752c
integration Orthanc-1.6.0->SylvainRouquette
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 19 Mar 2020 11:48:30 +0100 |
parents | 763533d6dd67 c6658187e4b1 |
children |
rev | line source |
---|---|
0 | 1 /** |
62 | 2 * Orthanc - A Lightweight, RESTful DICOM Store |
1900 | 3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
1288
6e7e5ed91c2d
upgrade to year 2015
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1285
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
3640
94f4a18a79cc
upgrade to year 2020
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
5 * Copyright (C) 2017-2020 Osimis S.A., Belgium |
0 | 6 * |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU General Public License as | |
9 * published by the Free Software Foundation, either version 3 of the | |
10 * License, or (at your option) any later version. | |
136 | 11 * |
12 * In addition, as a special exception, the copyright holders of this | |
13 * program give permission to link the code of its release with the | |
14 * OpenSSL project's "OpenSSL" library (or with modified versions of it | |
15 * that use the same license as the "OpenSSL" library), and distribute | |
16 * the linked executables. You must obey the GNU General Public License | |
17 * in all respects for all of the code used other than "OpenSSL". If you | |
18 * modify file(s) with this exception, you may extend this exception to | |
19 * your version of the file(s), but you are not obligated to do so. If | |
20 * you do not wish to do so, delete this exception statement from your | |
21 * version. If you delete this exception statement from all source files | |
22 * in the program, then also delete it here. | |
0 | 23 * |
24 * This program is distributed in the hope that it will be useful, but | |
25 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
27 * General Public License for more details. | |
28 * | |
29 * You should have received a copy of the GNU General Public License | |
30 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
31 **/ | |
32 | |
33 | |
766
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
diff
changeset
|
34 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
diff
changeset
|
35 /*========================================================================= |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
diff
changeset
|
36 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
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:
763
diff
changeset
|
38 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
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:
763
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:
763
diff
changeset
|
41 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
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:
763
diff
changeset
|
43 All rights reserved. |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
diff
changeset
|
44 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
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:
763
diff
changeset
|
46 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
diff
changeset
|
47 OFFIS e.V. |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
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:
763
diff
changeset
|
49 Escherweg 2 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
diff
changeset
|
50 26121 Oldenburg, Germany |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
diff
changeset
|
51 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
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:
763
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:
763
diff
changeset
|
54 are met: |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
diff
changeset
|
55 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
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:
763
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:
763
diff
changeset
|
58 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
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:
763
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:
763
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:
763
diff
changeset
|
62 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
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:
763
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:
763
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:
763
diff
changeset
|
66 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
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:
763
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:
763
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:
763
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:
763
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:
763
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:
763
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:
763
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:
763
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:
763
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:
763
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:
763
diff
changeset
|
78 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
diff
changeset
|
79 =========================================================================*/ |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
diff
changeset
|
80 |
0a2f8c707c78
Fix missing licensing terms about reuse of some DCMTK code
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
763
diff
changeset
|
81 |
2382
7284093111b0
big reorganization to cleanly separate framework vs. server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2381
diff
changeset
|
82 #include "../PrecompiledHeaders.h" |
0 | 83 #include "DicomUserConnection.h" |
84 | |
3117 | 85 #if !defined(DCMTK_VERSION_NUMBER) |
86 # error The macro DCMTK_VERSION_NUMBER must be defined | |
87 #endif | |
88 | |
3767 | 89 #include "../Compatibility.h" |
2382
7284093111b0
big reorganization to cleanly separate framework vs. server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2381
diff
changeset
|
90 #include "../DicomFormat/DicomArray.h" |
7284093111b0
big reorganization to cleanly separate framework vs. server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2381
diff
changeset
|
91 #include "../Logging.h" |
7284093111b0
big reorganization to cleanly separate framework vs. server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2381
diff
changeset
|
92 #include "../OrthancException.h" |
7284093111b0
big reorganization to cleanly separate framework vs. server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2381
diff
changeset
|
93 #include "../DicomParsing/FromDcmtkBridge.h" |
7284093111b0
big reorganization to cleanly separate framework vs. server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2381
diff
changeset
|
94 #include "../DicomParsing/ToDcmtkBridge.h" |
0 | 95 |
3369 | 96 #include <dcmtk/dcmdata/dcdeftag.h> |
97 #include <dcmtk/dcmdata/dcfilefo.h> | |
0 | 98 #include <dcmtk/dcmdata/dcistrmb.h> |
99 #include <dcmtk/dcmdata/dcistrmf.h> | |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
100 #include <dcmtk/dcmdata/dcmetinf.h> |
0 | 101 #include <dcmtk/dcmnet/diutil.h> |
102 | |
103 #include <set> | |
104 | |
105 | |
106 #ifdef _WIN32 | |
107 /** | |
108 * "The maximum length, in bytes, of the string returned in the buffer | |
109 * pointed to by the name parameter is dependent on the namespace provider, | |
110 * but this string must be 256 bytes or less. | |
111 * http://msdn.microsoft.com/en-us/library/windows/desktop/ms738527(v=vs.85).aspx | |
112 **/ | |
2340 | 113 # define HOST_NAME_MAX 256 |
114 # include <winsock.h> | |
0 | 115 #endif |
116 | |
117 | |
918 | 118 #if !defined(HOST_NAME_MAX) && defined(_POSIX_HOST_NAME_MAX) |
890 | 119 /** |
120 * TO IMPROVE: "_POSIX_HOST_NAME_MAX is only the minimum value that | |
121 * HOST_NAME_MAX can ever have [...] Therefore you cannot allocate an | |
122 * array of size _POSIX_HOST_NAME_MAX, invoke gethostname() and expect | |
123 * that the result will fit." | |
124 * http://lists.gnu.org/archive/html/bug-gnulib/2009-08/msg00128.html | |
125 **/ | |
126 #define HOST_NAME_MAX _POSIX_HOST_NAME_MAX | |
127 #endif | |
128 | |
129 | |
3785
763533d6dd67
add PreferredTransferSyntax to RemoteModalityParameters
sylvain.rouquette@incepto-medical.com
parents:
3402
diff
changeset
|
130 static const std::string DEFAULT_PREFERRED_TRANSFER_SYNTAX = UID_LittleEndianImplicitTransferSyntax; |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
131 |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
132 /** |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
133 * "If we have more than 64 storage SOP classes, tools such as |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
134 * storescu will fail because they attempt to negotiate two |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
135 * presentation contexts for each SOP class, and there is a total |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
136 * limit of 128 contexts for one association." |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
137 **/ |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
138 static const unsigned int MAXIMUM_STORAGE_SOP_CLASSES = 64; |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
139 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
140 |
62 | 141 namespace Orthanc |
0 | 142 { |
2069
fabf7820d1f1
New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2007
diff
changeset
|
143 // By default, the timeout for DICOM SCU (client) connections is set to 10 seconds |
fabf7820d1f1
New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2007
diff
changeset
|
144 static uint32_t defaultTimeout_ = 10; |
fabf7820d1f1
New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2007
diff
changeset
|
145 |
0 | 146 struct DicomUserConnection::PImpl |
147 { | |
148 // Connection state | |
1186
b17b6bd59747
timeouts for HTTP and DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1017
diff
changeset
|
149 uint32_t dimseTimeout_; |
b17b6bd59747
timeouts for HTTP and DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1017
diff
changeset
|
150 uint32_t acseTimeout_; |
0 | 151 T_ASC_Network* net_; |
152 T_ASC_Parameters* params_; | |
153 T_ASC_Association* assoc_; | |
154 | |
155 bool IsOpen() const | |
156 { | |
157 return assoc_ != NULL; | |
158 } | |
159 | |
160 void CheckIsOpen() const; | |
161 | |
3734
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
162 void Store(std::string& sopClassUidOut /* out */, |
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
163 std::string& sopInstanceUidOut /* out */, |
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
164 DcmInputStream& is, |
1907
5011a597b6ce
Support of Move Originator Message ID (0000,1031) in C-Store responses driven by C-Move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1900
diff
changeset
|
165 DicomUserConnection& connection, |
2222
21713ce8717b
Fix handling of Move Originator AET and ID in C-MOVE SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2202
diff
changeset
|
166 const std::string& moveOriginatorAET, |
1997
f9f2aa1cc594
"MoveOriginatorID" can be specified for /modalities/.../store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1929
diff
changeset
|
167 uint16_t moveOriginatorID); |
0 | 168 }; |
169 | |
170 | |
3208
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
171 static void Check(const OFCondition& cond, |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
172 const std::string& aet, |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
173 const std::string& command) |
0 | 174 { |
175 if (cond.bad()) | |
176 { | |
3208
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
177 // Reformat the error message from DCMTK by turning multiline |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
178 // errors into a single line |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
179 |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
180 std::string s(cond.text()); |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
181 std::string info; |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
182 info.reserve(s.size()); |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
183 |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
184 bool isMultiline = false; |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
185 for (size_t i = 0; i < s.size(); i++) |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
186 { |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
187 if (s[i] == '\r') |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
188 { |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
189 // Ignore |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
190 } |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
191 else if (s[i] == '\n') |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
192 { |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
193 if (isMultiline) |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
194 { |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
195 info += "; "; |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
196 } |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
197 else |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
198 { |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
199 info += " ("; |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
200 isMultiline = true; |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
201 } |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
202 } |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
203 else |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
204 { |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
205 info.push_back(s[i]); |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
206 } |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
207 } |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
208 |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
209 if (isMultiline) |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
210 { |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
211 info += ")"; |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
212 } |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
213 |
2954
d924f9bb61cc
taking advantage of details in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2888
diff
changeset
|
214 throw OrthancException(ErrorCode_NetworkProtocol, |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
215 "DicomUserConnection - " + command + |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
216 " to AET \"" + aet + "\": " + info); |
0 | 217 } |
218 } | |
219 | |
220 void DicomUserConnection::PImpl::CheckIsOpen() const | |
221 { | |
222 if (!IsOpen()) | |
223 { | |
2954
d924f9bb61cc
taking advantage of details in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2888
diff
changeset
|
224 throw OrthancException(ErrorCode_NetworkProtocol, |
d924f9bb61cc
taking advantage of details in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2888
diff
changeset
|
225 "DicomUserConnection: First open the connection"); |
0 | 226 } |
227 } | |
228 | |
229 | |
230 void DicomUserConnection::CheckIsOpen() const | |
231 { | |
232 pimpl_->CheckIsOpen(); | |
233 } | |
234 | |
235 | |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
236 static void RegisterStorageSOPClass(T_ASC_Parameters* params, |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
237 unsigned int& presentationContextId, |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
238 const std::string& sopClass, |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
239 const char* asPreferred[], |
3208
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
240 std::vector<const char*>& asFallback, |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
241 const std::string& aet) |
0 | 242 { |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
243 Check(ASC_addPresentationContext(params, presentationContextId, |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
244 sopClass.c_str(), asPreferred, 1), |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
245 aet, "initializing"); |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
246 presentationContextId += 2; |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
247 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
248 if (asFallback.size() > 0) |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
249 { |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
250 Check(ASC_addPresentationContext(params, presentationContextId, |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
251 sopClass.c_str(), &asFallback[0], asFallback.size()), |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
252 aet, "initializing"); |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
253 presentationContextId += 2; |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
254 } |
0 | 255 } |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
256 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
257 |
3605
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
258 void DicomUserConnection::SetupPresentationContexts(Mode mode, |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
259 const std::string& preferredTransferSyntax) |
0 | 260 { |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
261 // Flatten an array with the preferred transfer syntax |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
262 const char* asPreferred[1] = { preferredTransferSyntax.c_str() }; |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
263 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
264 // Setup the fallback transfer syntaxes |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
265 std::set<std::string> fallbackSyntaxes; |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
266 fallbackSyntaxes.insert(UID_LittleEndianExplicitTransferSyntax); |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
267 fallbackSyntaxes.insert(UID_BigEndianExplicitTransferSyntax); |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
268 fallbackSyntaxes.insert(UID_LittleEndianImplicitTransferSyntax); |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
269 fallbackSyntaxes.erase(preferredTransferSyntax); |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
270 |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
271 // Flatten an array with the fallback transfer syntaxes |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
272 std::vector<const char*> asFallback; |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
273 asFallback.reserve(fallbackSyntaxes.size()); |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
274 for (std::set<std::string>::const_iterator |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
275 it = fallbackSyntaxes.begin(); it != fallbackSyntaxes.end(); ++it) |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
276 { |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
277 asFallback.push_back(it->c_str()); |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
278 } |
0 | 279 |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
280 CheckStorageSOPClassesInvariant(); |
3605
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
281 |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
282 switch (mode) |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
283 { |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
284 case Mode_Generic: |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
285 { |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
286 unsigned int presentationContextId = 1; |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
287 |
3605
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
288 for (std::list<std::string>::const_iterator it = reservedStorageSOPClasses_.begin(); |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
289 it != reservedStorageSOPClasses_.end(); ++it) |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
290 { |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
291 RegisterStorageSOPClass(pimpl_->params_, presentationContextId, |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
292 *it, asPreferred, asFallback, remoteAet_); |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
293 } |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
294 |
3605
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
295 for (std::set<std::string>::const_iterator it = storageSOPClasses_.begin(); |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
296 it != storageSOPClasses_.end(); ++it) |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
297 { |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
298 RegisterStorageSOPClass(pimpl_->params_, presentationContextId, |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
299 *it, asPreferred, asFallback, remoteAet_); |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
300 } |
0 | 301 |
3605
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
302 for (std::set<std::string>::const_iterator it = defaultStorageSOPClasses_.begin(); |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
303 it != defaultStorageSOPClasses_.end(); ++it) |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
304 { |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
305 RegisterStorageSOPClass(pimpl_->params_, presentationContextId, |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
306 *it, asPreferred, asFallback, remoteAet_); |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
307 } |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
308 |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
309 break; |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
310 } |
0 | 311 |
3608
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
312 case Mode_RequestStorageCommitment: |
3605
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
313 case Mode_ReportStorageCommitment: |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
314 { |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
315 const char* as = UID_StorageCommitmentPushModelSOPClass; |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
316 |
3605
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
317 std::vector<const char*> ts; |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
318 ts.push_back(UID_LittleEndianExplicitTransferSyntax); |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
319 ts.push_back(UID_LittleEndianImplicitTransferSyntax); |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
320 |
3608
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
321 T_ASC_SC_ROLE role; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
322 switch (mode) |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
323 { |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
324 case Mode_RequestStorageCommitment: |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
325 role = ASC_SC_ROLE_DEFAULT; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
326 break; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
327 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
328 case Mode_ReportStorageCommitment: |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
329 role = ASC_SC_ROLE_SCP; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
330 break; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
331 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
332 default: |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
333 throw OrthancException(ErrorCode_InternalError); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
334 } |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
335 |
3605
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
336 Check(ASC_addPresentationContext(pimpl_->params_, 1 /*presentationContextId*/, |
3608
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
337 as, &ts[0], ts.size(), role), |
3605
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
338 remoteAet_, "initializing"); |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
339 |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
340 break; |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
341 } |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
342 |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
343 default: |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
344 throw OrthancException(ErrorCode_InternalError); |
0 | 345 } |
346 } | |
3605
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
347 |
0 | 348 |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
349 static bool IsGenericTransferSyntax(const std::string& syntax) |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
350 { |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
351 return (syntax == UID_LittleEndianExplicitTransferSyntax || |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
352 syntax == UID_BigEndianExplicitTransferSyntax || |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
353 syntax == UID_LittleEndianImplicitTransferSyntax); |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
354 } |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
355 |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
356 |
3734
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
357 void DicomUserConnection::PImpl::Store(std::string& sopClassUidOut, |
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
358 std::string& sopInstanceUidOut, |
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
359 DcmInputStream& is, |
1907
5011a597b6ce
Support of Move Originator Message ID (0000,1031) in C-Store responses driven by C-Move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1900
diff
changeset
|
360 DicomUserConnection& connection, |
2222
21713ce8717b
Fix handling of Move Originator AET and ID in C-MOVE SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2202
diff
changeset
|
361 const std::string& moveOriginatorAET, |
1997
f9f2aa1cc594
"MoveOriginatorID" can be specified for /modalities/.../store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1929
diff
changeset
|
362 uint16_t moveOriginatorID) |
0 | 363 { |
364 DcmFileFormat dcmff; | |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
365 Check(dcmff.read(is, EXS_Unknown, EGL_noChange, DCM_MaxReadLength), |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
366 connection.remoteAet_, "C-STORE"); |
0 | 367 |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
368 // Determine the storage SOP class UID for this instance |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
369 OFString sopClassUid; |
3369 | 370 if (dcmff.getDataset()->findAndGetOFString(DCM_SOPClassUID, sopClassUid).good()) |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
371 { |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
372 connection.AddStorageSOPClass(sopClassUid.c_str()); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
373 } |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
374 |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
375 // Determine whether a new presentation context must be |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
376 // negotiated, depending on the transfer syntax of this instance |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
377 DcmXfer xfer(dcmff.getDataset()->getOriginalXfer()); |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
378 const std::string syntax(xfer.getXferID()); |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
379 bool isGeneric = IsGenericTransferSyntax(syntax); |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
380 |
2161
7219cdce7bba
spelling: negociate -> negotiate
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2131
diff
changeset
|
381 bool renegotiate; |
2580
055d7d4a823f
avoid unecessary openings of DICOM connection for C-Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
382 |
055d7d4a823f
avoid unecessary openings of DICOM connection for C-Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
383 if (!IsOpen()) |
055d7d4a823f
avoid unecessary openings of DICOM connection for C-Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
384 { |
055d7d4a823f
avoid unecessary openings of DICOM connection for C-Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
385 renegotiate = true; |
055d7d4a823f
avoid unecessary openings of DICOM connection for C-Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
386 } |
055d7d4a823f
avoid unecessary openings of DICOM connection for C-Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
387 else if (isGeneric) |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
388 { |
1684
7dae55228b16
Fix issue 4 (C-Store Association not renegotiated on Specific-to-specific transfer syntax change)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1582
diff
changeset
|
389 // Are we making a generic-to-specific or specific-to-generic change of |
7dae55228b16
Fix issue 4 (C-Store Association not renegotiated on Specific-to-specific transfer syntax change)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1582
diff
changeset
|
390 // the transfer syntax? If this is the case, renegotiate the connection. |
2161
7219cdce7bba
spelling: negociate -> negotiate
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2131
diff
changeset
|
391 renegotiate = !IsGenericTransferSyntax(connection.GetPreferredTransferSyntax()); |
2580
055d7d4a823f
avoid unecessary openings of DICOM connection for C-Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
392 |
055d7d4a823f
avoid unecessary openings of DICOM connection for C-Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
393 if (renegotiate) |
055d7d4a823f
avoid unecessary openings of DICOM connection for C-Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
394 { |
055d7d4a823f
avoid unecessary openings of DICOM connection for C-Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
395 LOG(INFO) << "Use of non-generic transfer syntax: the C-Store associated must be renegotiated"; |
055d7d4a823f
avoid unecessary openings of DICOM connection for C-Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
396 } |
1684
7dae55228b16
Fix issue 4 (C-Store Association not renegotiated on Specific-to-specific transfer syntax change)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1582
diff
changeset
|
397 } |
7dae55228b16
Fix issue 4 (C-Store Association not renegotiated on Specific-to-specific transfer syntax change)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1582
diff
changeset
|
398 else |
7dae55228b16
Fix issue 4 (C-Store Association not renegotiated on Specific-to-specific transfer syntax change)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1582
diff
changeset
|
399 { |
2161
7219cdce7bba
spelling: negociate -> negotiate
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2131
diff
changeset
|
400 // We are using a specific transfer syntax. Renegotiate if the |
1684
7dae55228b16
Fix issue 4 (C-Store Association not renegotiated on Specific-to-specific transfer syntax change)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1582
diff
changeset
|
401 // current connection does not match this transfer syntax. |
2161
7219cdce7bba
spelling: negociate -> negotiate
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2131
diff
changeset
|
402 renegotiate = (syntax != connection.GetPreferredTransferSyntax()); |
2580
055d7d4a823f
avoid unecessary openings of DICOM connection for C-Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
403 |
055d7d4a823f
avoid unecessary openings of DICOM connection for C-Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
404 if (renegotiate) |
055d7d4a823f
avoid unecessary openings of DICOM connection for C-Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
405 { |
055d7d4a823f
avoid unecessary openings of DICOM connection for C-Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
406 LOG(INFO) << "Change in the transfer syntax: the C-Store associated must be renegotiated"; |
055d7d4a823f
avoid unecessary openings of DICOM connection for C-Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
407 } |
1684
7dae55228b16
Fix issue 4 (C-Store Association not renegotiated on Specific-to-specific transfer syntax change)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1582
diff
changeset
|
408 } |
7dae55228b16
Fix issue 4 (C-Store Association not renegotiated on Specific-to-specific transfer syntax change)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1582
diff
changeset
|
409 |
2161
7219cdce7bba
spelling: negociate -> negotiate
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2131
diff
changeset
|
410 if (renegotiate) |
1684
7dae55228b16
Fix issue 4 (C-Store Association not renegotiated on Specific-to-specific transfer syntax change)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1582
diff
changeset
|
411 { |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
412 if (isGeneric) |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
413 { |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
414 connection.ResetPreferredTransferSyntax(); |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
415 } |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
416 else |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
417 { |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
418 connection.SetPreferredTransferSyntax(syntax); |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
419 } |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
420 } |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
421 |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
422 if (!connection.IsOpen()) |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
423 { |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
424 connection.Open(); |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
425 } |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
426 |
0 | 427 // Figure out which SOP class and SOP instance is encapsulated in the file |
428 DIC_UI sopClass; | |
429 DIC_UI sopInstance; | |
3117 | 430 |
431 #if DCMTK_VERSION_NUMBER >= 364 | |
432 if (!DU_findSOPClassAndInstanceInDataSet(dcmff.getDataset(), sopClass, sizeof(sopClass), sopInstance, sizeof(sopInstance))) | |
433 #else | |
0 | 434 if (!DU_findSOPClassAndInstanceInDataSet(dcmff.getDataset(), sopClass, sopInstance)) |
3117 | 435 #endif |
0 | 436 { |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
437 throw OrthancException(ErrorCode_NoSopClassOrInstance, |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
438 "Unable to determine the SOP class/instance for C-STORE with AET " + |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
439 connection.remoteAet_); |
0 | 440 } |
441 | |
3734
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
442 sopClassUidOut.assign(sopClass); |
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
443 sopInstanceUidOut.assign(sopInstance); |
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
444 |
0 | 445 // Figure out which of the accepted presentation contexts should be used |
446 int presID = ASC_findAcceptedPresentationContextID(assoc_, sopClass); | |
447 if (presID == 0) | |
448 { | |
449 const char *modalityName = dcmSOPClassUIDToModality(sopClass); | |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
450 if (modalityName == NULL) modalityName = dcmFindNameOfUID(sopClass); |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
451 if (modalityName == NULL) modalityName = "unknown SOP class"; |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
452 throw OrthancException(ErrorCode_NoPresentationContext, |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
453 "Unable to determine the accepted presentation contexts for C-STORE with AET " + |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
454 connection.remoteAet_ + " (" + std::string(modalityName) + ")"); |
0 | 455 } |
456 | |
457 // Prepare the transmission of data | |
1907
5011a597b6ce
Support of Move Originator Message ID (0000,1031) in C-Store responses driven by C-Move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1900
diff
changeset
|
458 T_DIMSE_C_StoreRQ request; |
5011a597b6ce
Support of Move Originator Message ID (0000,1031) in C-Store responses driven by C-Move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1900
diff
changeset
|
459 memset(&request, 0, sizeof(request)); |
5011a597b6ce
Support of Move Originator Message ID (0000,1031) in C-Store responses driven by C-Move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1900
diff
changeset
|
460 request.MessageID = assoc_->nextMsgID++; |
5011a597b6ce
Support of Move Originator Message ID (0000,1031) in C-Store responses driven by C-Move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1900
diff
changeset
|
461 strncpy(request.AffectedSOPClassUID, sopClass, DIC_UI_LEN); |
5011a597b6ce
Support of Move Originator Message ID (0000,1031) in C-Store responses driven by C-Move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1900
diff
changeset
|
462 request.Priority = DIMSE_PRIORITY_MEDIUM; |
5011a597b6ce
Support of Move Originator Message ID (0000,1031) in C-Store responses driven by C-Move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1900
diff
changeset
|
463 request.DataSetType = DIMSE_DATASET_PRESENT; |
5011a597b6ce
Support of Move Originator Message ID (0000,1031) in C-Store responses driven by C-Move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1900
diff
changeset
|
464 strncpy(request.AffectedSOPInstanceUID, sopInstance, DIC_UI_LEN); |
5011a597b6ce
Support of Move Originator Message ID (0000,1031) in C-Store responses driven by C-Move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1900
diff
changeset
|
465 |
2222
21713ce8717b
Fix handling of Move Originator AET and ID in C-MOVE SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2202
diff
changeset
|
466 if (!moveOriginatorAET.empty()) |
21713ce8717b
Fix handling of Move Originator AET and ID in C-MOVE SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2202
diff
changeset
|
467 { |
21713ce8717b
Fix handling of Move Originator AET and ID in C-MOVE SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2202
diff
changeset
|
468 strncpy(request.MoveOriginatorApplicationEntityTitle, |
21713ce8717b
Fix handling of Move Originator AET and ID in C-MOVE SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2202
diff
changeset
|
469 moveOriginatorAET.c_str(), DIC_AE_LEN); |
21713ce8717b
Fix handling of Move Originator AET and ID in C-MOVE SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2202
diff
changeset
|
470 request.opts = O_STORE_MOVEORIGINATORAETITLE; |
1907
5011a597b6ce
Support of Move Originator Message ID (0000,1031) in C-Store responses driven by C-Move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1900
diff
changeset
|
471 |
1997
f9f2aa1cc594
"MoveOriginatorID" can be specified for /modalities/.../store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1929
diff
changeset
|
472 request.MoveOriginatorID = moveOriginatorID; // The type DIC_US is an alias for uint16_t |
1907
5011a597b6ce
Support of Move Originator Message ID (0000,1031) in C-Store responses driven by C-Move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1900
diff
changeset
|
473 request.opts |= O_STORE_MOVEORIGINATORID; |
5011a597b6ce
Support of Move Originator Message ID (0000,1031) in C-Store responses driven by C-Move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1900
diff
changeset
|
474 } |
0 | 475 |
476 // Finally conduct transmission of data | |
3700
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
477 T_DIMSE_C_StoreRSP response; |
0 | 478 DcmDataset* statusDetail = NULL; |
1907
5011a597b6ce
Support of Move Originator Message ID (0000,1031) in C-Store responses driven by C-Move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1900
diff
changeset
|
479 Check(DIMSE_storeUser(assoc_, presID, &request, |
0 | 480 NULL, dcmff.getDataset(), /*progressCallback*/ NULL, NULL, |
3704
58f92b1c8061
Fix issue #167 (Job can't be cancelled - Handling of timeouts after established association)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3700
diff
changeset
|
481 /*opt_blockMode*/ (dimseTimeout_ ? DIMSE_NONBLOCKING : DIMSE_BLOCKING), |
58f92b1c8061
Fix issue #167 (Job can't be cancelled - Handling of timeouts after established association)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3700
diff
changeset
|
482 /*opt_dimse_timeout*/ dimseTimeout_, |
3700
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
483 &response, &statusDetail, NULL), |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
484 connection.remoteAet_, "C-STORE"); |
0 | 485 |
486 if (statusDetail != NULL) | |
487 { | |
488 delete statusDetail; | |
489 } | |
3700
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
490 |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
491 |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
492 /** |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
493 * New in Orthanc 1.6.0: Deal with failures during C-STORE. |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
494 * http://dicom.nema.org/medical/dicom/current/output/chtml/part04/sect_B.2.3.html#table_B.2-1 |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
495 **/ |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
496 |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
497 if (response.DimseStatus != 0x0000 && // Success |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
498 response.DimseStatus != 0xB000 && // Warning - Coercion of Data Elements |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
499 response.DimseStatus != 0xB007 && // Warning - Data Set does not match SOP Class |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
500 response.DimseStatus != 0xB006) // Warning - Elements Discarded |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
501 { |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
502 char buf[16]; |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
503 sprintf(buf, "%04X", response.DimseStatus); |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
504 throw OrthancException(ErrorCode_NetworkProtocol, |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
505 "C-STORE SCU to AET \"" + connection.remoteAet_ + |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
506 "\" has failed with DIMSE status 0x" + buf); |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
507 } |
0 | 508 } |
509 | |
510 | |
1366 | 511 namespace |
512 { | |
513 struct FindPayload | |
514 { | |
515 DicomFindAnswers* answers; | |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
516 const char* level; |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
517 bool isWorklist; |
1366 | 518 }; |
519 } | |
520 | |
521 | |
0 | 522 static void FindCallback( |
523 /* in */ | |
524 void *callbackData, | |
525 T_DIMSE_C_FindRQ *request, /* original find request */ | |
526 int responseCount, | |
527 T_DIMSE_C_FindRSP *response, /* pending response received */ | |
528 DcmDataset *responseIdentifiers /* pending response identifiers */ | |
529 ) | |
530 { | |
1366 | 531 FindPayload& payload = *reinterpret_cast<FindPayload*>(callbackData); |
0 | 532 |
533 if (responseIdentifiers != NULL) | |
534 { | |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
535 if (payload.isWorklist) |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
536 { |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
537 ParsedDicomFile answer(*responseIdentifiers); |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
538 payload.answers->Add(answer); |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
539 } |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
540 else |
1366 | 541 { |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
542 DicomMap m; |
2381
b8969010b534
uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2352
diff
changeset
|
543 FromDcmtkBridge::ExtractDicomSummary(m, *responseIdentifiers); |
b8969010b534
uncoupling DCMTK primitives from Orthanc::Configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2352
diff
changeset
|
544 |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
545 if (!m.HasTag(DICOM_TAG_QUERY_RETRIEVE_LEVEL)) |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
546 { |
2007
655489d9165d
DicomMap::ParseDicomMetaInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2006
diff
changeset
|
547 m.SetValue(DICOM_TAG_QUERY_RETRIEVE_LEVEL, payload.level, false); |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
548 } |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
549 |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
550 payload.answers->Add(m); |
1366 | 551 } |
0 | 552 } |
553 } | |
554 | |
1368 | 555 |
3370
872bd3b6ec72
"/modalities/{id}/query": New argument "Normalize"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3369
diff
changeset
|
556 static void NormalizeFindQuery(DicomMap& fixedQuery, |
872bd3b6ec72
"/modalities/{id}/query": New argument "Normalize"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3369
diff
changeset
|
557 ResourceType level, |
872bd3b6ec72
"/modalities/{id}/query": New argument "Normalize"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3369
diff
changeset
|
558 const DicomMap& fields) |
1368 | 559 { |
560 std::set<DicomTag> allowedTags; | |
561 | |
562 // WARNING: Do not add "break" or reorder items in this switch-case! | |
563 switch (level) | |
564 { | |
565 case ResourceType_Instance: | |
566 DicomTag::AddTagsForModule(allowedTags, DicomModule_Instance); | |
567 | |
568 case ResourceType_Series: | |
569 DicomTag::AddTagsForModule(allowedTags, DicomModule_Series); | |
570 | |
571 case ResourceType_Study: | |
572 DicomTag::AddTagsForModule(allowedTags, DicomModule_Study); | |
573 | |
574 case ResourceType_Patient: | |
575 DicomTag::AddTagsForModule(allowedTags, DicomModule_Patient); | |
576 break; | |
577 | |
578 default: | |
579 throw OrthancException(ErrorCode_InternalError); | |
580 } | |
581 | |
2005
9e021b2b348b
Support of optional tags for counting resources in C-Find SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1998
diff
changeset
|
582 switch (level) |
1371
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
583 { |
2005
9e021b2b348b
Support of optional tags for counting resources in C-Find SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1998
diff
changeset
|
584 case ResourceType_Patient: |
9e021b2b348b
Support of optional tags for counting resources in C-Find SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1998
diff
changeset
|
585 allowedTags.insert(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_STUDIES); |
9e021b2b348b
Support of optional tags for counting resources in C-Find SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1998
diff
changeset
|
586 allowedTags.insert(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_SERIES); |
9e021b2b348b
Support of optional tags for counting resources in C-Find SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1998
diff
changeset
|
587 allowedTags.insert(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_INSTANCES); |
9e021b2b348b
Support of optional tags for counting resources in C-Find SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1998
diff
changeset
|
588 break; |
9e021b2b348b
Support of optional tags for counting resources in C-Find SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1998
diff
changeset
|
589 |
9e021b2b348b
Support of optional tags for counting resources in C-Find SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1998
diff
changeset
|
590 case ResourceType_Study: |
9e021b2b348b
Support of optional tags for counting resources in C-Find SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1998
diff
changeset
|
591 allowedTags.insert(DICOM_TAG_MODALITIES_IN_STUDY); |
9e021b2b348b
Support of optional tags for counting resources in C-Find SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1998
diff
changeset
|
592 allowedTags.insert(DICOM_TAG_NUMBER_OF_STUDY_RELATED_SERIES); |
9e021b2b348b
Support of optional tags for counting resources in C-Find SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1998
diff
changeset
|
593 allowedTags.insert(DICOM_TAG_NUMBER_OF_STUDY_RELATED_INSTANCES); |
9e021b2b348b
Support of optional tags for counting resources in C-Find SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1998
diff
changeset
|
594 allowedTags.insert(DICOM_TAG_SOP_CLASSES_IN_STUDY); |
9e021b2b348b
Support of optional tags for counting resources in C-Find SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1998
diff
changeset
|
595 break; |
9e021b2b348b
Support of optional tags for counting resources in C-Find SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1998
diff
changeset
|
596 |
9e021b2b348b
Support of optional tags for counting resources in C-Find SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1998
diff
changeset
|
597 case ResourceType_Series: |
9e021b2b348b
Support of optional tags for counting resources in C-Find SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1998
diff
changeset
|
598 allowedTags.insert(DICOM_TAG_NUMBER_OF_SERIES_RELATED_INSTANCES); |
9e021b2b348b
Support of optional tags for counting resources in C-Find SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1998
diff
changeset
|
599 break; |
9e021b2b348b
Support of optional tags for counting resources in C-Find SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1998
diff
changeset
|
600 |
9e021b2b348b
Support of optional tags for counting resources in C-Find SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1998
diff
changeset
|
601 default: |
9e021b2b348b
Support of optional tags for counting resources in C-Find SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1998
diff
changeset
|
602 break; |
1371
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
603 } |
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
604 |
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
605 allowedTags.insert(DICOM_TAG_SPECIFIC_CHARACTER_SET); |
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
606 |
1368 | 607 DicomArray query(fields); |
608 for (size_t i = 0; i < query.GetSize(); i++) | |
609 { | |
610 const DicomTag& tag = query.GetElement(i).GetTag(); | |
611 if (allowedTags.find(tag) == allowedTags.end()) | |
612 { | |
1707
9a04ad916831
more tolerant c-find scp
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1684
diff
changeset
|
613 LOG(WARNING) << "Tag not allowed for this C-Find level, will be ignored: " << tag; |
9a04ad916831
more tolerant c-find scp
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1684
diff
changeset
|
614 } |
9a04ad916831
more tolerant c-find scp
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1684
diff
changeset
|
615 else |
9a04ad916831
more tolerant c-find scp
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1684
diff
changeset
|
616 { |
9a04ad916831
more tolerant c-find scp
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1684
diff
changeset
|
617 fixedQuery.SetValue(tag, query.GetElement(i).GetValue()); |
1368 | 618 } |
619 } | |
620 } | |
621 | |
622 | |
2202
9b373b7d6713
Fix handling of encodings in C-FIND requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2161
diff
changeset
|
623 static ParsedDicomFile* ConvertQueryFields(const DicomMap& fields, |
9b373b7d6713
Fix handling of encodings in C-FIND requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2161
diff
changeset
|
624 ModalityManufacturer manufacturer) |
1429
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
625 { |
2335 | 626 // Fix outgoing C-Find requests issue for Syngo.Via and its |
627 // solution was reported by Emsy Chan by private mail on | |
628 // 2015-06-17. According to Robert van Ommen (2015-11-30), the | |
629 // same fix is required for Agfa Impax. This was generalized for | |
630 // generic manufacturer since it seems to affect PhilipsADW, | |
631 // GEWAServer as well: | |
632 // https://bitbucket.org/sjodogne/orthanc/issues/31/ | |
2319
ae6245053bcf
made some manufacturer obsolete: MedInria (that was not used), Syngovia & AgfaImpax (replaced by GenericNoWildcardInDates) + added 'GenericNoWildcards'
amazy
parents:
2244
diff
changeset
|
633 |
1429
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
634 switch (manufacturer) |
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
635 { |
2319
ae6245053bcf
made some manufacturer obsolete: MedInria (that was not used), Syngovia & AgfaImpax (replaced by GenericNoWildcardInDates) + added 'GenericNoWildcards'
amazy
parents:
2244
diff
changeset
|
636 case ModalityManufacturer_GenericNoWildcardInDates: |
2352
3ab96768d144
Fix issue 52 (DICOM level security association problems)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2340
diff
changeset
|
637 case ModalityManufacturer_GenericNoUniversalWildcard: |
1429
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
638 { |
3712
2a170a8f1faf
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3704
diff
changeset
|
639 std::unique_ptr<DicomMap> fix(fields.Clone()); |
1429
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
640 |
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
641 std::set<DicomTag> tags; |
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
642 fix->GetTags(tags); |
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
643 |
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
644 for (std::set<DicomTag>::const_iterator it = tags.begin(); it != tags.end(); ++it) |
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
645 { |
2335 | 646 // Replace a "*" wildcard query by an empty query ("") for |
647 // "date" or "all" value representations depending on the | |
648 // type of manufacturer. | |
2352
3ab96768d144
Fix issue 52 (DICOM level security association problems)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2340
diff
changeset
|
649 if (manufacturer == ModalityManufacturer_GenericNoUniversalWildcard || |
2335 | 650 (manufacturer == ModalityManufacturer_GenericNoWildcardInDates && |
651 FromDcmtkBridge::LookupValueRepresentation(*it) == ValueRepresentation_Date)) | |
1429
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
652 { |
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
653 const DicomValue* value = fix->TestAndGetValue(*it); |
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
654 |
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
655 if (value != NULL && |
1737
ec66a16aa398
removal of DicomStringValue and DicomNullValue
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1707
diff
changeset
|
656 !value->IsNull() && |
ec66a16aa398
removal of DicomStringValue and DicomNullValue
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1707
diff
changeset
|
657 value->GetContent() == "*") |
1429
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
658 { |
2007
655489d9165d
DicomMap::ParseDicomMetaInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2006
diff
changeset
|
659 fix->SetValue(*it, "", false); |
1429
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
660 } |
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
661 } |
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
662 } |
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
663 |
3342
63f59ad9381a
Fix issue #136 (C-Find request fails when found DICOM file does not have certain tags)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3215
diff
changeset
|
664 return new ParsedDicomFile(*fix, GetDefaultDicomEncoding(), false /* be strict */); |
1429
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
665 } |
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
666 |
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
667 default: |
3342
63f59ad9381a
Fix issue #136 (C-Find request fails when found DICOM file does not have certain tags)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3215
diff
changeset
|
668 return new ParsedDicomFile(fields, GetDefaultDicomEncoding(), false /* be strict */); |
1429
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
669 } |
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
670 } |
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
671 |
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
672 |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
673 static void ExecuteFind(DicomFindAnswers& answers, |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
674 T_ASC_Association* association, |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
675 DcmDataset* dataset, |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
676 const char* sopClass, |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
677 bool isWorklist, |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
678 const char* level, |
3208
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
679 uint32_t dimseTimeout, |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
680 const std::string& remoteAet) |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
681 { |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
682 assert(isWorklist ^ (level != NULL)); |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
683 |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
684 FindPayload payload; |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
685 payload.answers = &answers; |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
686 payload.level = level; |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
687 payload.isWorklist = isWorklist; |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
688 |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
689 // Figure out which of the accepted presentation contexts should be used |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
690 int presID = ASC_findAcceptedPresentationContextID(association, sopClass); |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
691 if (presID == 0) |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
692 { |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
693 throw OrthancException(ErrorCode_DicomFindUnavailable, |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
694 "Remote AET is " + remoteAet); |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
695 } |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
696 |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
697 T_DIMSE_C_FindRQ request; |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
698 memset(&request, 0, sizeof(request)); |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
699 request.MessageID = association->nextMsgID++; |
1907
5011a597b6ce
Support of Move Originator Message ID (0000,1031) in C-Store responses driven by C-Move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1900
diff
changeset
|
700 strncpy(request.AffectedSOPClassUID, sopClass, DIC_UI_LEN); |
5011a597b6ce
Support of Move Originator Message ID (0000,1031) in C-Store responses driven by C-Move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1900
diff
changeset
|
701 request.Priority = DIMSE_PRIORITY_MEDIUM; |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
702 request.DataSetType = DIMSE_DATASET_PRESENT; |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
703 |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
704 T_DIMSE_C_FindRSP response; |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
705 DcmDataset* statusDetail = NULL; |
3117 | 706 |
707 #if DCMTK_VERSION_NUMBER >= 364 | |
708 int responseCount; | |
709 #endif | |
710 | |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
711 OFCondition cond = DIMSE_findUser(association, presID, &request, dataset, |
3117 | 712 #if DCMTK_VERSION_NUMBER >= 364 |
713 responseCount, | |
714 #endif | |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
715 FindCallback, &payload, |
3704
58f92b1c8061
Fix issue #167 (Job can't be cancelled - Handling of timeouts after established association)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3700
diff
changeset
|
716 /*opt_blockMode*/ (dimseTimeout ? DIMSE_NONBLOCKING : DIMSE_BLOCKING), |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
717 /*opt_dimse_timeout*/ dimseTimeout, |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
718 &response, &statusDetail); |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
719 |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
720 if (statusDetail) |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
721 { |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
722 delete statusDetail; |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
723 } |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
724 |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
725 Check(cond, remoteAet, "C-FIND"); |
3700
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
726 |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
727 |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
728 /** |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
729 * New in Orthanc 1.6.0: Deal with failures during C-FIND. |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
730 * http://dicom.nema.org/medical/dicom/current/output/chtml/part04/sect_C.4.html#table_C.4-1 |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
731 **/ |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
732 |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
733 if (response.DimseStatus != 0x0000 && // Success |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
734 response.DimseStatus != 0xFF00 && // Pending - Matches are continuing |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
735 response.DimseStatus != 0xFF01) // Pending - Matches are continuing |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
736 { |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
737 char buf[16]; |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
738 sprintf(buf, "%04X", response.DimseStatus); |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
739 throw OrthancException(ErrorCode_NetworkProtocol, |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
740 "C-FIND SCU to AET \"" + remoteAet + |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
741 "\" has failed with DIMSE status 0x" + buf); |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
742 } |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
743 |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
744 } |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
745 |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
746 |
0 | 747 void DicomUserConnection::Find(DicomFindAnswers& result, |
1368 | 748 ResourceType level, |
3370
872bd3b6ec72
"/modalities/{id}/query": New argument "Normalize"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3369
diff
changeset
|
749 const DicomMap& originalFields, |
872bd3b6ec72
"/modalities/{id}/query": New argument "Normalize"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3369
diff
changeset
|
750 bool normalize) |
0 | 751 { |
752 CheckIsOpen(); | |
753 | |
3712
2a170a8f1faf
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3704
diff
changeset
|
754 std::unique_ptr<ParsedDicomFile> query; |
3369 | 755 |
3370
872bd3b6ec72
"/modalities/{id}/query": New argument "Normalize"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3369
diff
changeset
|
756 if (normalize) |
872bd3b6ec72
"/modalities/{id}/query": New argument "Normalize"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3369
diff
changeset
|
757 { |
872bd3b6ec72
"/modalities/{id}/query": New argument "Normalize"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3369
diff
changeset
|
758 DicomMap fields; |
872bd3b6ec72
"/modalities/{id}/query": New argument "Normalize"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3369
diff
changeset
|
759 NormalizeFindQuery(fields, level, originalFields); |
872bd3b6ec72
"/modalities/{id}/query": New argument "Normalize"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3369
diff
changeset
|
760 query.reset(ConvertQueryFields(fields, manufacturer_)); |
872bd3b6ec72
"/modalities/{id}/query": New argument "Normalize"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3369
diff
changeset
|
761 } |
872bd3b6ec72
"/modalities/{id}/query": New argument "Normalize"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3369
diff
changeset
|
762 else |
3369 | 763 { |
764 query.reset(new ParsedDicomFile(originalFields, | |
765 GetDefaultDicomEncoding(), | |
766 false /* be strict */)); | |
767 } | |
768 | |
2202
9b373b7d6713
Fix handling of encodings in C-FIND requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2161
diff
changeset
|
769 DcmDataset* dataset = query->GetDcmtkObject().getDataset(); |
9b373b7d6713
Fix handling of encodings in C-FIND requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2161
diff
changeset
|
770 |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
771 const char* clevel = NULL; |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
772 const char* sopClass = NULL; |
1366 | 773 |
1368 | 774 switch (level) |
0 | 775 { |
1368 | 776 case ResourceType_Patient: |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
777 clevel = "PATIENT"; |
3369 | 778 DU_putStringDOElement(dataset, DCM_QueryRetrieveLevel, "PATIENT"); |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
779 sopClass = UID_FINDPatientRootQueryRetrieveInformationModel; |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
780 break; |
0 | 781 |
1368 | 782 case ResourceType_Study: |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
783 clevel = "STUDY"; |
3369 | 784 DU_putStringDOElement(dataset, DCM_QueryRetrieveLevel, "STUDY"); |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
785 sopClass = UID_FINDStudyRootQueryRetrieveInformationModel; |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
786 break; |
0 | 787 |
1368 | 788 case ResourceType_Series: |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
789 clevel = "SERIES"; |
3369 | 790 DU_putStringDOElement(dataset, DCM_QueryRetrieveLevel, "SERIES"); |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
791 sopClass = UID_FINDStudyRootQueryRetrieveInformationModel; |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
792 break; |
0 | 793 |
1368 | 794 case ResourceType_Instance: |
3561
bdafff1ce443
C-Find SCU at Instance level now sets the 0008,0052 tag to IMAGE per default (was INSTANCE). Source: https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/orthanc-users/FYxHXzlaQ0M/rn6d0SowAAAJ
Alain Mazy <alain@mazy.be>
parents:
3402
diff
changeset
|
795 clevel = "IMAGE"; |
bdafff1ce443
C-Find SCU at Instance level now sets the 0008,0052 tag to IMAGE per default (was INSTANCE). Source: https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/orthanc-users/FYxHXzlaQ0M/rn6d0SowAAAJ
Alain Mazy <alain@mazy.be>
parents:
3402
diff
changeset
|
796 DU_putStringDOElement(dataset, DCM_QueryRetrieveLevel, "IMAGE"); |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
797 sopClass = UID_FINDStudyRootQueryRetrieveInformationModel; |
1368 | 798 break; |
0 | 799 |
1368 | 800 default: |
801 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
802 } | |
803 | |
2888
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
804 |
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
805 const char* universal; |
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
806 if (manufacturer_ == ModalityManufacturer_GE) |
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
807 { |
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
808 universal = "*"; |
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
809 } |
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
810 else |
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
811 { |
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
812 universal = ""; |
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
813 } |
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
814 |
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
815 |
1368 | 816 // Add the expected tags for this query level. |
817 // WARNING: Do not reorder or add "break" in this switch-case! | |
818 switch (level) | |
819 { | |
820 case ResourceType_Instance: | |
3369 | 821 if (!dataset->tagExists(DCM_SOPInstanceUID)) |
2888
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
822 { |
3369 | 823 DU_putStringDOElement(dataset, DCM_SOPInstanceUID, universal); |
2888
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
824 } |
1368 | 825 |
826 case ResourceType_Series: | |
3369 | 827 if (!dataset->tagExists(DCM_SeriesInstanceUID)) |
2888
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
828 { |
3369 | 829 DU_putStringDOElement(dataset, DCM_SeriesInstanceUID, universal); |
2888
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
830 } |
1368 | 831 |
832 case ResourceType_Study: | |
3369 | 833 if (!dataset->tagExists(DCM_AccessionNumber)) |
2888
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
834 { |
3369 | 835 DU_putStringDOElement(dataset, DCM_AccessionNumber, universal); |
2888
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
836 } |
0 | 837 |
3369 | 838 if (!dataset->tagExists(DCM_StudyInstanceUID)) |
2888
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
839 { |
3369 | 840 DU_putStringDOElement(dataset, DCM_StudyInstanceUID, universal); |
2888
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
841 } |
0 | 842 |
1368 | 843 case ResourceType_Patient: |
3369 | 844 if (!dataset->tagExists(DCM_PatientID)) |
2888
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
845 { |
3369 | 846 DU_putStringDOElement(dataset, DCM_PatientID, universal); |
2888
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
847 } |
61a5667f37d9
New modality manufacturer: "GE" for GE Healthcare EA and AW
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2715
diff
changeset
|
848 |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
849 break; |
0 | 850 |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
851 default: |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
852 throw OrthancException(ErrorCode_ParameterOutOfRange); |
0 | 853 } |
854 | |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
855 assert(clevel != NULL && sopClass != NULL); |
3208
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
856 ExecuteFind(result, pimpl_->assoc_, dataset, sopClass, false, clevel, |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
857 pimpl_->dimseTimeout_, remoteAet_); |
0 | 858 } |
859 | |
860 | |
1366 | 861 void DicomUserConnection::MoveInternal(const std::string& targetAet, |
1371
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
862 ResourceType level, |
1366 | 863 const DicomMap& fields) |
0 | 864 { |
865 CheckIsOpen(); | |
866 | |
3712
2a170a8f1faf
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3704
diff
changeset
|
867 std::unique_ptr<ParsedDicomFile> query(ConvertQueryFields(fields, manufacturer_)); |
2202
9b373b7d6713
Fix handling of encodings in C-FIND requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2161
diff
changeset
|
868 DcmDataset* dataset = query->GetDcmtkObject().getDataset(); |
1429
7366a0bdda6a
attempt of fix for Syngo.Via
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1427
diff
changeset
|
869 |
0 | 870 const char* sopClass = UID_MOVEStudyRootQueryRetrieveInformationModel; |
1371
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
871 switch (level) |
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
872 { |
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
873 case ResourceType_Patient: |
3369 | 874 DU_putStringDOElement(dataset, DCM_QueryRetrieveLevel, "PATIENT"); |
1371
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
875 break; |
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
876 |
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
877 case ResourceType_Study: |
3369 | 878 DU_putStringDOElement(dataset, DCM_QueryRetrieveLevel, "STUDY"); |
1371
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
879 break; |
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
880 |
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
881 case ResourceType_Series: |
3369 | 882 DU_putStringDOElement(dataset, DCM_QueryRetrieveLevel, "SERIES"); |
1371
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
883 break; |
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
884 |
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
885 case ResourceType_Instance: |
3561
bdafff1ce443
C-Find SCU at Instance level now sets the 0008,0052 tag to IMAGE per default (was INSTANCE). Source: https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/orthanc-users/FYxHXzlaQ0M/rn6d0SowAAAJ
Alain Mazy <alain@mazy.be>
parents:
3402
diff
changeset
|
886 DU_putStringDOElement(dataset, DCM_QueryRetrieveLevel, "IMAGE"); |
1371
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
887 break; |
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
888 |
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
889 default: |
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
890 throw OrthancException(ErrorCode_ParameterOutOfRange); |
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
891 } |
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
892 |
0 | 893 // Figure out which of the accepted presentation contexts should be used |
894 int presID = ASC_findAcceptedPresentationContextID(pimpl_->assoc_, sopClass); | |
895 if (presID == 0) | |
896 { | |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
897 throw OrthancException(ErrorCode_DicomMoveUnavailable, |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
898 "Remote AET is " + remoteAet_); |
0 | 899 } |
900 | |
901 T_DIMSE_C_MoveRQ request; | |
902 memset(&request, 0, sizeof(request)); | |
903 request.MessageID = pimpl_->assoc_->nextMsgID++; | |
1907
5011a597b6ce
Support of Move Originator Message ID (0000,1031) in C-Store responses driven by C-Move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1900
diff
changeset
|
904 strncpy(request.AffectedSOPClassUID, sopClass, DIC_UI_LEN); |
5011a597b6ce
Support of Move Originator Message ID (0000,1031) in C-Store responses driven by C-Move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1900
diff
changeset
|
905 request.Priority = DIMSE_PRIORITY_MEDIUM; |
0 | 906 request.DataSetType = DIMSE_DATASET_PRESENT; |
1907
5011a597b6ce
Support of Move Originator Message ID (0000,1031) in C-Store responses driven by C-Move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1900
diff
changeset
|
907 strncpy(request.MoveDestination, targetAet.c_str(), DIC_AE_LEN); |
0 | 908 |
909 T_DIMSE_C_MoveRSP response; | |
910 DcmDataset* statusDetail = NULL; | |
911 DcmDataset* responseIdentifiers = NULL; | |
2202
9b373b7d6713
Fix handling of encodings in C-FIND requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2161
diff
changeset
|
912 OFCondition cond = DIMSE_moveUser(pimpl_->assoc_, presID, &request, dataset, |
0 | 913 NULL, NULL, |
3704
58f92b1c8061
Fix issue #167 (Job can't be cancelled - Handling of timeouts after established association)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3700
diff
changeset
|
914 /*opt_blockMode*/ (pimpl_->dimseTimeout_ ? DIMSE_NONBLOCKING : DIMSE_BLOCKING), |
1186
b17b6bd59747
timeouts for HTTP and DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1017
diff
changeset
|
915 /*opt_dimse_timeout*/ pimpl_->dimseTimeout_, |
0 | 916 pimpl_->net_, NULL, NULL, |
917 &response, &statusDetail, &responseIdentifiers); | |
918 | |
919 if (statusDetail) | |
920 { | |
921 delete statusDetail; | |
922 } | |
923 | |
924 if (responseIdentifiers) | |
925 { | |
926 delete responseIdentifiers; | |
927 } | |
928 | |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
929 Check(cond, remoteAet_, "C-MOVE"); |
3700
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
930 |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
931 |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
932 /** |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
933 * New in Orthanc 1.6.0: Deal with failures during C-MOVE. |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
934 * http://dicom.nema.org/medical/dicom/current/output/chtml/part04/sect_C.4.2.html#table_C.4-2 |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
935 **/ |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
936 |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
937 if (response.DimseStatus != 0x0000 && // Success |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
938 response.DimseStatus != 0xFF00) // Pending - Sub-operations are continuing |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
939 { |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
940 char buf[16]; |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
941 sprintf(buf, "%04X", response.DimseStatus); |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
942 throw OrthancException(ErrorCode_NetworkProtocol, |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
943 "C-MOVE SCU to AET \"" + remoteAet_ + |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
944 "\" has failed with DIMSE status 0x" + buf); |
5cbbf14e516b
Fix issue #103 ("queries/.../retrieve" API returns HTTP code 200 even on server errors)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
945 } |
0 | 946 } |
947 | |
948 | |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
949 void DicomUserConnection::ResetStorageSOPClasses() |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
950 { |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
951 CheckStorageSOPClassesInvariant(); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
952 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
953 storageSOPClasses_.clear(); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
954 defaultStorageSOPClasses_.clear(); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
955 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
956 // Copy the short list of storage SOP classes from DCMTK, making |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
957 // room for the 5 SOP classes reserved for C-ECHO, C-FIND, C-MOVE at (**). |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
958 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
959 std::set<std::string> uncommon; |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
960 uncommon.insert(UID_BlendingSoftcopyPresentationStateStorage); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
961 uncommon.insert(UID_GrayscaleSoftcopyPresentationStateStorage); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
962 uncommon.insert(UID_ColorSoftcopyPresentationStateStorage); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
963 uncommon.insert(UID_PseudoColorSoftcopyPresentationStateStorage); |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
964 uncommon.insert(UID_XAXRFGrayscaleSoftcopyPresentationStateStorage); |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
965 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
966 // Add the storage syntaxes for C-STORE |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
967 for (int i = 0; i < numberOfDcmShortSCUStorageSOPClassUIDs - 1; i++) |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
968 { |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
969 if (uncommon.find(dcmShortSCUStorageSOPClassUIDs[i]) == uncommon.end()) |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
970 { |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
971 defaultStorageSOPClasses_.insert(dcmShortSCUStorageSOPClassUIDs[i]); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
972 } |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
973 } |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
974 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
975 CheckStorageSOPClassesInvariant(); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
976 } |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
977 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
978 |
2587
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
979 void DicomUserConnection::DefaultSetup() |
0 | 980 { |
2587
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
981 preferredTransferSyntax_ = DEFAULT_PREFERRED_TRANSFER_SYNTAX; |
3785
763533d6dd67
add PreferredTransferSyntax to RemoteModalityParameters
sylvain.rouquette@incepto-medical.com
parents:
3402
diff
changeset
|
982 modalityPreferredTransferSyntax_ = DEFAULT_PREFERRED_TRANSFER_SYNTAX; |
2587
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
983 localAet_ = "STORESCU"; |
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
984 remoteAet_ = "ANY-SCP"; |
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
985 remoteHost_ = "127.0.0.1"; |
1285
5730f374e4e6
Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1186
diff
changeset
|
986 remotePort_ = 104; |
519
1b2cdc855bd3
Parameter for PACS manufacturer, support for ClearCanvas
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
399
diff
changeset
|
987 manufacturer_ = ModalityManufacturer_Generic; |
0 | 988 |
2069
fabf7820d1f1
New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2007
diff
changeset
|
989 SetTimeout(defaultTimeout_); |
0 | 990 pimpl_->net_ = NULL; |
991 pimpl_->params_ = NULL; | |
992 pimpl_->assoc_ = NULL; | |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
993 |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
994 // SOP classes for C-ECHO, C-FIND and C-MOVE (**) |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
995 reservedStorageSOPClasses_.push_back(UID_VerificationSOPClass); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
996 reservedStorageSOPClasses_.push_back(UID_FINDPatientRootQueryRetrieveInformationModel); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
997 reservedStorageSOPClasses_.push_back(UID_FINDStudyRootQueryRetrieveInformationModel); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
998 reservedStorageSOPClasses_.push_back(UID_MOVEStudyRootQueryRetrieveInformationModel); |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
999 reservedStorageSOPClasses_.push_back(UID_FINDModalityWorklistInformationModel); |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1000 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1001 ResetStorageSOPClasses(); |
0 | 1002 } |
2587
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
1003 |
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
1004 |
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
1005 DicomUserConnection::DicomUserConnection() : |
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
1006 pimpl_(new PImpl) |
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
1007 { |
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
1008 DefaultSetup(); |
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
1009 } |
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
1010 |
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
1011 |
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
1012 DicomUserConnection::DicomUserConnection(const std::string& localAet, |
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
1013 const RemoteModalityParameters& remote) : |
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
1014 pimpl_(new PImpl) |
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
1015 { |
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
1016 DefaultSetup(); |
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
1017 SetLocalApplicationEntityTitle(localAet); |
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
1018 SetRemoteModality(remote); |
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
1019 } |
bf14b037731f
new constructor for DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2580
diff
changeset
|
1020 |
0 | 1021 |
1022 DicomUserConnection::~DicomUserConnection() | |
1023 { | |
1024 Close(); | |
1025 } | |
1026 | |
772
31cc399c7762
RemoteModalityParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1027 |
1427
d710ea64f0fd
Custom setting of the local AET during C-Store SCU (both in Lua and in the REST API)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1371
diff
changeset
|
1028 void DicomUserConnection::SetRemoteModality(const RemoteModalityParameters& parameters) |
772
31cc399c7762
RemoteModalityParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1029 { |
1285
5730f374e4e6
Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1186
diff
changeset
|
1030 SetRemoteApplicationEntityTitle(parameters.GetApplicationEntityTitle()); |
5730f374e4e6
Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1186
diff
changeset
|
1031 SetRemoteHost(parameters.GetHost()); |
2715
73bc0c32547c
fix embedding openssl within a DLL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2601
diff
changeset
|
1032 SetRemotePort(parameters.GetPortNumber()); |
1285
5730f374e4e6
Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1186
diff
changeset
|
1033 SetRemoteManufacturer(parameters.GetManufacturer()); |
3785
763533d6dd67
add PreferredTransferSyntax to RemoteModalityParameters
sylvain.rouquette@incepto-medical.com
parents:
3402
diff
changeset
|
1034 SetPreferredTransferSyntax(parameters.GetPreferredTransferSyntax()); |
763533d6dd67
add PreferredTransferSyntax to RemoteModalityParameters
sylvain.rouquette@incepto-medical.com
parents:
3402
diff
changeset
|
1035 modalityPreferredTransferSyntax_ = parameters.GetPreferredTransferSyntax(); |
772
31cc399c7762
RemoteModalityParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1036 } |
31cc399c7762
RemoteModalityParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1037 |
31cc399c7762
RemoteModalityParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1038 |
0 | 1039 void DicomUserConnection::SetLocalApplicationEntityTitle(const std::string& aet) |
1040 { | |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1041 if (localAet_ != aet) |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1042 { |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1043 Close(); |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1044 localAet_ = aet; |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1045 } |
0 | 1046 } |
1047 | |
1285
5730f374e4e6
Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1186
diff
changeset
|
1048 void DicomUserConnection::SetRemoteApplicationEntityTitle(const std::string& aet) |
0 | 1049 { |
1285
5730f374e4e6
Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1186
diff
changeset
|
1050 if (remoteAet_ != aet) |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1051 { |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1052 Close(); |
1285
5730f374e4e6
Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1186
diff
changeset
|
1053 remoteAet_ = aet; |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1054 } |
0 | 1055 } |
1056 | |
1285
5730f374e4e6
Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1186
diff
changeset
|
1057 void DicomUserConnection::SetRemoteManufacturer(ModalityManufacturer manufacturer) |
519
1b2cdc855bd3
Parameter for PACS manufacturer, support for ClearCanvas
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
399
diff
changeset
|
1058 { |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1059 if (manufacturer_ != manufacturer) |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1060 { |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1061 Close(); |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1062 manufacturer_ = manufacturer; |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1063 } |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1064 } |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1065 |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1066 void DicomUserConnection::ResetPreferredTransferSyntax() |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1067 { |
3785
763533d6dd67
add PreferredTransferSyntax to RemoteModalityParameters
sylvain.rouquette@incepto-medical.com
parents:
3402
diff
changeset
|
1068 SetPreferredTransferSyntax(modalityPreferredTransferSyntax_); |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1069 } |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1070 |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1071 void DicomUserConnection::SetPreferredTransferSyntax(const std::string& preferredTransferSyntax) |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1072 { |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1073 if (preferredTransferSyntax_ != preferredTransferSyntax) |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1074 { |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1075 Close(); |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1076 preferredTransferSyntax_ = preferredTransferSyntax; |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1077 } |
519
1b2cdc855bd3
Parameter for PACS manufacturer, support for ClearCanvas
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
399
diff
changeset
|
1078 } |
1b2cdc855bd3
Parameter for PACS manufacturer, support for ClearCanvas
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
399
diff
changeset
|
1079 |
0 | 1080 |
1285
5730f374e4e6
Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1186
diff
changeset
|
1081 void DicomUserConnection::SetRemoteHost(const std::string& host) |
0 | 1082 { |
1285
5730f374e4e6
Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1186
diff
changeset
|
1083 if (remoteHost_ != host) |
0 | 1084 { |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1085 if (host.size() > HOST_NAME_MAX - 10) |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1086 { |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
1087 throw OrthancException(ErrorCode_ParameterOutOfRange, |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
1088 "Invalid host name (too long): " + host); |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1089 } |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1090 |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1091 Close(); |
1285
5730f374e4e6
Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1186
diff
changeset
|
1092 remoteHost_ = host; |
0 | 1093 } |
1094 } | |
1095 | |
1285
5730f374e4e6
Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1186
diff
changeset
|
1096 void DicomUserConnection::SetRemotePort(uint16_t port) |
0 | 1097 { |
1285
5730f374e4e6
Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1186
diff
changeset
|
1098 if (remotePort_ != port) |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1099 { |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1100 Close(); |
1285
5730f374e4e6
Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1186
diff
changeset
|
1101 remotePort_ = port; |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1102 } |
0 | 1103 } |
1104 | |
3605
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1105 void DicomUserConnection::OpenInternal(Mode mode) |
0 | 1106 { |
662
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1107 if (IsOpen()) |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1108 { |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1109 // Don't reopen the connection |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1110 return; |
70161eb45b5c
orthanc can act as a C-Store SCU for JPEG transfer syntax
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
657
diff
changeset
|
1111 } |
0 | 1112 |
769
3f946e5c3802
ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
766
diff
changeset
|
1113 LOG(INFO) << "Opening a DICOM SCU connection from AET \"" << GetLocalApplicationEntityTitle() |
1285
5730f374e4e6
Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1186
diff
changeset
|
1114 << "\" to AET \"" << GetRemoteApplicationEntityTitle() << "\" on host " |
5730f374e4e6
Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1186
diff
changeset
|
1115 << GetRemoteHost() << ":" << GetRemotePort() |
5730f374e4e6
Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1186
diff
changeset
|
1116 << " (manufacturer: " << EnumerationToString(GetRemoteManufacturer()) << ")"; |
769
3f946e5c3802
ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
766
diff
changeset
|
1117 |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
1118 Check(ASC_initializeNetwork(NET_REQUESTOR, 0, /*opt_acse_timeout*/ pimpl_->acseTimeout_, &pimpl_->net_), remoteAet_, "connecting"); |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
1119 Check(ASC_createAssociationParameters(&pimpl_->params_, /*opt_maxReceivePDULength*/ ASC_DEFAULTMAXPDU), remoteAet_, "connecting"); |
0 | 1120 |
1121 // Set this application's title and the called application's title in the params | |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
1122 Check(ASC_setAPTitles(pimpl_->params_, localAet_.c_str(), remoteAet_.c_str(), NULL), |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
1123 remoteAet_, "connecting"); |
0 | 1124 |
1285
5730f374e4e6
Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1186
diff
changeset
|
1125 // Set the network addresses of the local and remote entities |
0 | 1126 char localHost[HOST_NAME_MAX]; |
1127 gethostname(localHost, HOST_NAME_MAX - 1); | |
1128 | |
1285
5730f374e4e6
Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1186
diff
changeset
|
1129 char remoteHostAndPort[HOST_NAME_MAX]; |
2 | 1130 |
1131 #ifdef _MSC_VER | |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1132 _snprintf |
2 | 1133 #else |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1134 snprintf |
2 | 1135 #endif |
1285
5730f374e4e6
Access to called AET and remote AET from Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1186
diff
changeset
|
1136 (remoteHostAndPort, HOST_NAME_MAX - 1, "%s:%d", remoteHost_.c_str(), remotePort_); |
0 | 1137 |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
1138 Check(ASC_setPresentationAddresses(pimpl_->params_, localHost, remoteHostAndPort), |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
1139 remoteAet_, "connecting"); |
0 | 1140 |
1141 // Set various options | |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
1142 Check(ASC_setTransportLayerType(pimpl_->params_, /*opt_secureConnection*/ false), |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
1143 remoteAet_, "connecting"); |
0 | 1144 |
3605
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1145 SetupPresentationContexts(mode, preferredTransferSyntax_); |
0 | 1146 |
1147 // Do the association | |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
1148 Check(ASC_requestAssociation(pimpl_->net_, pimpl_->params_, &pimpl_->assoc_), |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
1149 remoteAet_, "connecting"); |
0 | 1150 |
1151 if (ASC_countAcceptedPresentationContexts(pimpl_->params_) == 0) | |
1152 { | |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
1153 throw OrthancException(ErrorCode_NoPresentationContext, |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
1154 "Unable to negotiate a presentation context with AET " + |
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
1155 remoteAet_); |
0 | 1156 } |
1157 } | |
1158 | |
1159 void DicomUserConnection::Close() | |
1160 { | |
1161 if (pimpl_->assoc_ != NULL) | |
1162 { | |
1163 ASC_releaseAssociation(pimpl_->assoc_); | |
1164 ASC_destroyAssociation(&pimpl_->assoc_); | |
1165 pimpl_->assoc_ = NULL; | |
1166 pimpl_->params_ = NULL; | |
1167 } | |
1168 else | |
1169 { | |
1170 if (pimpl_->params_ != NULL) | |
1171 { | |
1172 ASC_destroyAssociationParameters(&pimpl_->params_); | |
1173 pimpl_->params_ = NULL; | |
1174 } | |
1175 } | |
1176 | |
1177 if (pimpl_->net_ != NULL) | |
1178 { | |
1179 ASC_dropNetwork(&pimpl_->net_); | |
1180 pimpl_->net_ = NULL; | |
1181 } | |
1182 } | |
1183 | |
1184 bool DicomUserConnection::IsOpen() const | |
1185 { | |
1186 return pimpl_->IsOpen(); | |
1187 } | |
1188 | |
3734
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
1189 void DicomUserConnection::Store(std::string& sopClassUid /* out */, |
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
1190 std::string& sopInstanceUid /* out */, |
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
1191 const char* buffer, |
1907
5011a597b6ce
Support of Move Originator Message ID (0000,1031) in C-Store responses driven by C-Move
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1900
diff
changeset
|
1192 size_t size, |
2222
21713ce8717b
Fix handling of Move Originator AET and ID in C-MOVE SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2202
diff
changeset
|
1193 const std::string& moveOriginatorAET, |
1997
f9f2aa1cc594
"MoveOriginatorID" can be specified for /modalities/.../store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1929
diff
changeset
|
1194 uint16_t moveOriginatorID) |
0 | 1195 { |
1196 // Prepare an input stream for the memory buffer | |
1197 DcmInputBufferStream is; | |
1198 if (size > 0) | |
1199 is.setBuffer(buffer, size); | |
1200 is.setEos(); | |
1201 | |
3734
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
1202 pimpl_->Store(sopClassUid, sopInstanceUid, is, *this, moveOriginatorAET, moveOriginatorID); |
0 | 1203 } |
1204 | |
3734
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
1205 void DicomUserConnection::Store(std::string& sopClassUid /* out */, |
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
1206 std::string& sopInstanceUid /* out */, |
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
1207 const std::string& buffer, |
2222
21713ce8717b
Fix handling of Move Originator AET and ID in C-MOVE SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2202
diff
changeset
|
1208 const std::string& moveOriginatorAET, |
1997
f9f2aa1cc594
"MoveOriginatorID" can be specified for /modalities/.../store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1929
diff
changeset
|
1209 uint16_t moveOriginatorID) |
0 | 1210 { |
1211 if (buffer.size() > 0) | |
3734
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
1212 Store(sopClassUid, sopInstanceUid, &buffer[0], buffer.size(), |
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
1213 moveOriginatorAET, moveOriginatorID); |
0 | 1214 else |
3734
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
1215 Store(sopClassUid, sopInstanceUid, NULL, 0, moveOriginatorAET, moveOriginatorID); |
0 | 1216 } |
1217 | |
3734
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
1218 void DicomUserConnection::StoreFile(std::string& sopClassUid /* out */, |
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
1219 std::string& sopInstanceUid /* out */, |
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
1220 const std::string& path, |
2222
21713ce8717b
Fix handling of Move Originator AET and ID in C-MOVE SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2202
diff
changeset
|
1221 const std::string& moveOriginatorAET, |
1997
f9f2aa1cc594
"MoveOriginatorID" can be specified for /modalities/.../store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1929
diff
changeset
|
1222 uint16_t moveOriginatorID) |
0 | 1223 { |
1224 // Prepare an input stream for the file | |
1225 DcmInputFileStream is(path.c_str()); | |
3734
4fc24b69446a
triggering storage commitment scu from REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3713
diff
changeset
|
1226 pimpl_->Store(sopClassUid, sopInstanceUid, is, *this, moveOriginatorAET, moveOriginatorID); |
0 | 1227 } |
1228 | |
1229 bool DicomUserConnection::Echo() | |
1230 { | |
1231 CheckIsOpen(); | |
1232 DIC_US status; | |
1233 Check(DIMSE_echoUser(pimpl_->assoc_, pimpl_->assoc_->nextMsgID++, | |
3704
58f92b1c8061
Fix issue #167 (Job can't be cancelled - Handling of timeouts after established association)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3700
diff
changeset
|
1234 /*opt_blockMode*/ (pimpl_->dimseTimeout_ ? DIMSE_NONBLOCKING : DIMSE_BLOCKING), |
1186
b17b6bd59747
timeouts for HTTP and DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1017
diff
changeset
|
1235 /*opt_dimse_timeout*/ pimpl_->dimseTimeout_, |
3215
4924972bce77
more verbose errors in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3208
diff
changeset
|
1236 &status, NULL), remoteAet_, "C-ECHO"); |
0 | 1237 return status == STATUS_Success; |
1238 } | |
1239 | |
1240 | |
1366 | 1241 static void TestAndCopyTag(DicomMap& result, |
1242 const DicomMap& source, | |
1243 const DicomTag& tag) | |
1244 { | |
1245 if (!source.HasTag(tag)) | |
1246 { | |
1247 throw OrthancException(ErrorCode_BadRequest); | |
1248 } | |
1249 else | |
1250 { | |
1251 result.SetValue(tag, source.GetValue(tag)); | |
1252 } | |
1253 } | |
1254 | |
1255 | |
1256 void DicomUserConnection::Move(const std::string& targetAet, | |
1998
9b61701c35f2
New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1997
diff
changeset
|
1257 ResourceType level, |
1366 | 1258 const DicomMap& findResult) |
0 | 1259 { |
1366 | 1260 DicomMap move; |
1261 switch (level) | |
1262 { | |
1263 case ResourceType_Patient: | |
1264 TestAndCopyTag(move, findResult, DICOM_TAG_PATIENT_ID); | |
1265 break; | |
1266 | |
1267 case ResourceType_Study: | |
1268 TestAndCopyTag(move, findResult, DICOM_TAG_STUDY_INSTANCE_UID); | |
1269 break; | |
1270 | |
1271 case ResourceType_Series: | |
1272 TestAndCopyTag(move, findResult, DICOM_TAG_STUDY_INSTANCE_UID); | |
1273 TestAndCopyTag(move, findResult, DICOM_TAG_SERIES_INSTANCE_UID); | |
1274 break; | |
1275 | |
1276 case ResourceType_Instance: | |
1277 TestAndCopyTag(move, findResult, DICOM_TAG_STUDY_INSTANCE_UID); | |
1278 TestAndCopyTag(move, findResult, DICOM_TAG_SERIES_INSTANCE_UID); | |
1279 TestAndCopyTag(move, findResult, DICOM_TAG_SOP_INSTANCE_UID); | |
1280 break; | |
1281 | |
1282 default: | |
1283 throw OrthancException(ErrorCode_InternalError); | |
1284 } | |
1285 | |
1371
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
1286 MoveInternal(targetAet, level, move); |
1366 | 1287 } |
1288 | |
1289 | |
1998
9b61701c35f2
New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1997
diff
changeset
|
1290 void DicomUserConnection::Move(const std::string& targetAet, |
9b61701c35f2
New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1997
diff
changeset
|
1291 const DicomMap& findResult) |
9b61701c35f2
New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1997
diff
changeset
|
1292 { |
9b61701c35f2
New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1997
diff
changeset
|
1293 if (!findResult.HasTag(DICOM_TAG_QUERY_RETRIEVE_LEVEL)) |
9b61701c35f2
New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1997
diff
changeset
|
1294 { |
9b61701c35f2
New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1997
diff
changeset
|
1295 throw OrthancException(ErrorCode_InternalError); |
9b61701c35f2
New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1997
diff
changeset
|
1296 } |
9b61701c35f2
New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1997
diff
changeset
|
1297 |
9b61701c35f2
New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1997
diff
changeset
|
1298 const std::string tmp = findResult.GetValue(DICOM_TAG_QUERY_RETRIEVE_LEVEL).GetContent(); |
9b61701c35f2
New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1997
diff
changeset
|
1299 ResourceType level = StringToResourceType(tmp.c_str()); |
9b61701c35f2
New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1997
diff
changeset
|
1300 |
9b61701c35f2
New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1997
diff
changeset
|
1301 Move(targetAet, level, findResult); |
9b61701c35f2
New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1997
diff
changeset
|
1302 } |
9b61701c35f2
New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1997
diff
changeset
|
1303 |
9b61701c35f2
New URI "/modalities/.../move" to issue C-Move SCU requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1997
diff
changeset
|
1304 |
1366 | 1305 void DicomUserConnection::MovePatient(const std::string& targetAet, |
1306 const std::string& patientId) | |
1307 { | |
1308 DicomMap query; | |
2007
655489d9165d
DicomMap::ParseDicomMetaInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2006
diff
changeset
|
1309 query.SetValue(DICOM_TAG_PATIENT_ID, patientId, false); |
1371
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
1310 MoveInternal(targetAet, ResourceType_Patient, query); |
1366 | 1311 } |
1312 | |
1313 void DicomUserConnection::MoveStudy(const std::string& targetAet, | |
1314 const std::string& studyUid) | |
1315 { | |
1316 DicomMap query; | |
2007
655489d9165d
DicomMap::ParseDicomMetaInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2006
diff
changeset
|
1317 query.SetValue(DICOM_TAG_STUDY_INSTANCE_UID, studyUid, false); |
1371
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
1318 MoveInternal(targetAet, ResourceType_Study, query); |
0 | 1319 } |
1320 | |
1321 void DicomUserConnection::MoveSeries(const std::string& targetAet, | |
1322 const std::string& studyUid, | |
1323 const std::string& seriesUid) | |
1324 { | |
1366 | 1325 DicomMap query; |
2007
655489d9165d
DicomMap::ParseDicomMetaInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2006
diff
changeset
|
1326 query.SetValue(DICOM_TAG_STUDY_INSTANCE_UID, studyUid, false); |
655489d9165d
DicomMap::ParseDicomMetaInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2006
diff
changeset
|
1327 query.SetValue(DICOM_TAG_SERIES_INSTANCE_UID, seriesUid, false); |
1371
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
1328 MoveInternal(targetAet, ResourceType_Series, query); |
0 | 1329 } |
1330 | |
1331 void DicomUserConnection::MoveInstance(const std::string& targetAet, | |
1332 const std::string& studyUid, | |
1333 const std::string& seriesUid, | |
1334 const std::string& instanceUid) | |
1335 { | |
1366 | 1336 DicomMap query; |
2007
655489d9165d
DicomMap::ParseDicomMetaInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2006
diff
changeset
|
1337 query.SetValue(DICOM_TAG_STUDY_INSTANCE_UID, studyUid, false); |
655489d9165d
DicomMap::ParseDicomMetaInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2006
diff
changeset
|
1338 query.SetValue(DICOM_TAG_SERIES_INSTANCE_UID, seriesUid, false); |
655489d9165d
DicomMap::ParseDicomMetaInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2006
diff
changeset
|
1339 query.SetValue(DICOM_TAG_SOP_INSTANCE_UID, instanceUid, false); |
1371
f528849ee9f7
DICOM Query/Retrieve available from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
1340 MoveInternal(targetAet, ResourceType_Instance, query); |
0 | 1341 } |
1342 | |
1186
b17b6bd59747
timeouts for HTTP and DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1017
diff
changeset
|
1343 |
b17b6bd59747
timeouts for HTTP and DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1017
diff
changeset
|
1344 void DicomUserConnection::SetTimeout(uint32_t seconds) |
0 | 1345 { |
2069
fabf7820d1f1
New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2007
diff
changeset
|
1346 if (seconds == 0) |
1186
b17b6bd59747
timeouts for HTTP and DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1017
diff
changeset
|
1347 { |
2069
fabf7820d1f1
New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2007
diff
changeset
|
1348 DisableTimeout(); |
1186
b17b6bd59747
timeouts for HTTP and DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1017
diff
changeset
|
1349 } |
2069
fabf7820d1f1
New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2007
diff
changeset
|
1350 else |
fabf7820d1f1
New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2007
diff
changeset
|
1351 { |
fabf7820d1f1
New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2007
diff
changeset
|
1352 dcmConnectionTimeout.set(seconds); |
fabf7820d1f1
New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2007
diff
changeset
|
1353 pimpl_->dimseTimeout_ = seconds; |
3704
58f92b1c8061
Fix issue #167 (Job can't be cancelled - Handling of timeouts after established association)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3700
diff
changeset
|
1354 pimpl_->acseTimeout_ = seconds; // Timeout used during association negociation and ASC_releaseAssociation() |
2069
fabf7820d1f1
New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2007
diff
changeset
|
1355 } |
1186
b17b6bd59747
timeouts for HTTP and DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1017
diff
changeset
|
1356 } |
b17b6bd59747
timeouts for HTTP and DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1017
diff
changeset
|
1357 |
b17b6bd59747
timeouts for HTTP and DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1017
diff
changeset
|
1358 |
b17b6bd59747
timeouts for HTTP and DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1017
diff
changeset
|
1359 void DicomUserConnection::DisableTimeout() |
b17b6bd59747
timeouts for HTTP and DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1017
diff
changeset
|
1360 { |
b17b6bd59747
timeouts for HTTP and DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1017
diff
changeset
|
1361 /** |
b17b6bd59747
timeouts for HTTP and DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1017
diff
changeset
|
1362 * Global timeout (seconds) for connecting to remote hosts. |
b17b6bd59747
timeouts for HTTP and DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1017
diff
changeset
|
1363 * Default value is -1 which selects infinite timeout, i.e. blocking connect(). |
b17b6bd59747
timeouts for HTTP and DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1017
diff
changeset
|
1364 */ |
b17b6bd59747
timeouts for HTTP and DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1017
diff
changeset
|
1365 dcmConnectionTimeout.set(-1); |
b17b6bd59747
timeouts for HTTP and DICOM
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1017
diff
changeset
|
1366 pimpl_->dimseTimeout_ = 0; |
3704
58f92b1c8061
Fix issue #167 (Job can't be cancelled - Handling of timeouts after established association)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3700
diff
changeset
|
1367 pimpl_->acseTimeout_ = 10; // Timeout used during association negociation and ASC_releaseAssociation() |
0 | 1368 } |
1369 | |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1370 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1371 void DicomUserConnection::CheckStorageSOPClassesInvariant() const |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1372 { |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1373 assert(storageSOPClasses_.size() + |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1374 defaultStorageSOPClasses_.size() + |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1375 reservedStorageSOPClasses_.size() <= MAXIMUM_STORAGE_SOP_CLASSES); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1376 } |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1377 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1378 void DicomUserConnection::AddStorageSOPClass(const char* sop) |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1379 { |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1380 CheckStorageSOPClassesInvariant(); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1381 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1382 if (storageSOPClasses_.find(sop) != storageSOPClasses_.end()) |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1383 { |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1384 // This storage SOP class is already explicitly registered. Do |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1385 // nothing. |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1386 return; |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1387 } |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1388 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1389 if (defaultStorageSOPClasses_.find(sop) != defaultStorageSOPClasses_.end()) |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1390 { |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1391 // This storage SOP class is not explicitly registered, but is |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1392 // used by default. Just register it explicitly. |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1393 defaultStorageSOPClasses_.erase(sop); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1394 storageSOPClasses_.insert(sop); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1395 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1396 CheckStorageSOPClassesInvariant(); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1397 return; |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1398 } |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1399 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1400 // This storage SOP class is neither explicitly, nor implicitly |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1401 // registered. Close the connection and register it explicitly. |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1402 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1403 Close(); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1404 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1405 if (reservedStorageSOPClasses_.size() + |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1406 storageSOPClasses_.size() >= MAXIMUM_STORAGE_SOP_CLASSES) // (*) |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1407 { |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1408 // The maximum number of SOP classes is reached |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1409 ResetStorageSOPClasses(); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1410 defaultStorageSOPClasses_.erase(sop); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1411 } |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1412 else if (reservedStorageSOPClasses_.size() + storageSOPClasses_.size() + |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1413 defaultStorageSOPClasses_.size() >= MAXIMUM_STORAGE_SOP_CLASSES) |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1414 { |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1415 // Make room in the default storage syntaxes |
1303 | 1416 assert(!defaultStorageSOPClasses_.empty()); // Necessarily true because condition (*) is false |
763
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1417 defaultStorageSOPClasses_.erase(*defaultStorageSOPClasses_.rbegin()); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1418 } |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1419 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1420 // Explicitly register the new storage syntax |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1421 storageSOPClasses_.insert(sop); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1422 |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1423 CheckStorageSOPClassesInvariant(); |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1424 } |
b5e6d2823115
dynamic negotiation of storage sop classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
732
diff
changeset
|
1425 |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
1426 |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
1427 void DicomUserConnection::FindWorklist(DicomFindAnswers& result, |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
1428 ParsedDicomFile& query) |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
1429 { |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
1430 CheckIsOpen(); |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
1431 |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
1432 DcmDataset* dataset = query.GetDcmtkObject().getDataset(); |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
1433 const char* sopClass = UID_FINDModalityWorklistInformationModel; |
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
1434 |
3208
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
1435 ExecuteFind(result, pimpl_->assoc_, dataset, sopClass, true, |
c4e1977e5ed7
improved logging in DicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3117
diff
changeset
|
1436 NULL, pimpl_->dimseTimeout_, remoteAet_); |
1805
f08978b1f45b
c-find scu for modality worklists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1737
diff
changeset
|
1437 } |
2069
fabf7820d1f1
New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2007
diff
changeset
|
1438 |
fabf7820d1f1
New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2007
diff
changeset
|
1439 |
2601 | 1440 void DicomUserConnection::SetDefaultTimeout(uint32_t seconds) |
2069
fabf7820d1f1
New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2007
diff
changeset
|
1441 { |
fabf7820d1f1
New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2007
diff
changeset
|
1442 LOG(INFO) << "Default timeout for DICOM connections if Orthanc acts as SCU (client): " |
fabf7820d1f1
New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2007
diff
changeset
|
1443 << seconds << " seconds (0 = no timeout)"; |
fabf7820d1f1
New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2007
diff
changeset
|
1444 defaultTimeout_ = seconds; |
fabf7820d1f1
New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2007
diff
changeset
|
1445 } |
2600
140a539b4eba
SequenceOfOperationsJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2587
diff
changeset
|
1446 |
140a539b4eba
SequenceOfOperationsJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2587
diff
changeset
|
1447 |
140a539b4eba
SequenceOfOperationsJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2587
diff
changeset
|
1448 bool DicomUserConnection::IsSameAssociation(const std::string& localAet, |
140a539b4eba
SequenceOfOperationsJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2587
diff
changeset
|
1449 const RemoteModalityParameters& remote) const |
140a539b4eba
SequenceOfOperationsJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2587
diff
changeset
|
1450 { |
140a539b4eba
SequenceOfOperationsJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2587
diff
changeset
|
1451 return (localAet_ == localAet && |
140a539b4eba
SequenceOfOperationsJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2587
diff
changeset
|
1452 remoteAet_ == remote.GetApplicationEntityTitle() && |
140a539b4eba
SequenceOfOperationsJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2587
diff
changeset
|
1453 remoteHost_ == remote.GetHost() && |
2715
73bc0c32547c
fix embedding openssl within a DLL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2601
diff
changeset
|
1454 remotePort_ == remote.GetPortNumber() && |
2600
140a539b4eba
SequenceOfOperationsJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2587
diff
changeset
|
1455 manufacturer_ == remote.GetManufacturer()); |
140a539b4eba
SequenceOfOperationsJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2587
diff
changeset
|
1456 } |
3605
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1457 |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1458 |
3606
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1459 static void FillSopSequence(DcmDataset& dataset, |
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1460 const DcmTagKey& tag, |
3657
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1461 const std::vector<std::string>& sopClassUids, |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1462 const std::vector<std::string>& sopInstanceUids, |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1463 const std::vector<StorageCommitmentFailureReason>& failureReasons, |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1464 bool hasFailureReasons) |
3605
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1465 { |
3657
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1466 assert(sopClassUids.size() == sopInstanceUids.size() && |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1467 (hasFailureReasons ? |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1468 failureReasons.size() == sopClassUids.size() : |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1469 failureReasons.empty())); |
3635
8c0ef729d5a8
StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3613
diff
changeset
|
1470 |
8c0ef729d5a8
StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3613
diff
changeset
|
1471 if (sopInstanceUids.empty()) |
3606
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1472 { |
3635
8c0ef729d5a8
StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3613
diff
changeset
|
1473 // Add an empty sequence |
8c0ef729d5a8
StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3613
diff
changeset
|
1474 if (!dataset.insertEmptyElement(tag).good()) |
3606
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1475 { |
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1476 throw OrthancException(ErrorCode_InternalError); |
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1477 } |
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1478 } |
3635
8c0ef729d5a8
StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3613
diff
changeset
|
1479 else |
8c0ef729d5a8
StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3613
diff
changeset
|
1480 { |
3657
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1481 for (size_t i = 0; i < sopClassUids.size(); i++) |
3635
8c0ef729d5a8
StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3613
diff
changeset
|
1482 { |
3767 | 1483 std::unique_ptr<DcmItem> item(new DcmItem); |
3657
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1484 if (!item->putAndInsertString(DCM_ReferencedSOPClassUID, sopClassUids[i].c_str()).good() || |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1485 !item->putAndInsertString(DCM_ReferencedSOPInstanceUID, sopInstanceUids[i].c_str()).good() || |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1486 (hasFailureReasons && |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1487 !item->putAndInsertUint16(DCM_FailureReason, failureReasons[i]).good()) || |
3635
8c0ef729d5a8
StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3613
diff
changeset
|
1488 !dataset.insertSequenceItem(tag, item.release()).good()) |
8c0ef729d5a8
StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3613
diff
changeset
|
1489 { |
8c0ef729d5a8
StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3613
diff
changeset
|
1490 throw OrthancException(ErrorCode_InternalError); |
8c0ef729d5a8
StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3613
diff
changeset
|
1491 } |
8c0ef729d5a8
StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3613
diff
changeset
|
1492 } |
8c0ef729d5a8
StorageCommitmentScpJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3613
diff
changeset
|
1493 } |
3606
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1494 } |
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1495 |
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1496 |
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1497 |
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1498 |
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1499 void DicomUserConnection::ReportStorageCommitment( |
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1500 const std::string& transactionUid, |
3657
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1501 const std::vector<std::string>& sopClassUids, |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1502 const std::vector<std::string>& sopInstanceUids, |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1503 const std::vector<StorageCommitmentFailureReason>& failureReasons) |
3606
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1504 { |
3657
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1505 if (sopClassUids.size() != sopInstanceUids.size() || |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1506 sopClassUids.size() != failureReasons.size()) |
3606
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1507 { |
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1508 throw OrthancException(ErrorCode_ParameterOutOfRange); |
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1509 } |
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1510 |
3605
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1511 if (IsOpen()) |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1512 { |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1513 Close(); |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1514 } |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1515 |
3657
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1516 std::vector<std::string> successSopClassUids, successSopInstanceUids, failedSopClassUids, failedSopInstanceUids; |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1517 std::vector<StorageCommitmentFailureReason> failedReasons; |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1518 |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1519 successSopClassUids.reserve(sopClassUids.size()); |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1520 successSopInstanceUids.reserve(sopClassUids.size()); |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1521 failedSopClassUids.reserve(sopClassUids.size()); |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1522 failedSopInstanceUids.reserve(sopClassUids.size()); |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1523 failedReasons.reserve(sopClassUids.size()); |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1524 |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1525 for (size_t i = 0; i < sopClassUids.size(); i++) |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1526 { |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1527 switch (failureReasons[i]) |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1528 { |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1529 case StorageCommitmentFailureReason_Success: |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1530 successSopClassUids.push_back(sopClassUids[i]); |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1531 successSopInstanceUids.push_back(sopInstanceUids[i]); |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1532 break; |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1533 |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1534 case StorageCommitmentFailureReason_ProcessingFailure: |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1535 case StorageCommitmentFailureReason_NoSuchObjectInstance: |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1536 case StorageCommitmentFailureReason_ResourceLimitation: |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1537 case StorageCommitmentFailureReason_ReferencedSOPClassNotSupported: |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1538 case StorageCommitmentFailureReason_ClassInstanceConflict: |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1539 case StorageCommitmentFailureReason_DuplicateTransactionUID: |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1540 failedSopClassUids.push_back(sopClassUids[i]); |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1541 failedSopInstanceUids.push_back(sopInstanceUids[i]); |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1542 failedReasons.push_back(failureReasons[i]); |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1543 break; |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1544 |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1545 default: |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1546 { |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1547 char buf[16]; |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1548 sprintf(buf, "%04xH", failureReasons[i]); |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1549 throw OrthancException(ErrorCode_ParameterOutOfRange, |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1550 "Unsupported failure reason for storage commitment: " + std::string(buf)); |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1551 } |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1552 } |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1553 } |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1554 |
3605
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1555 try |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1556 { |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1557 OpenInternal(Mode_ReportStorageCommitment); |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1558 |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1559 /** |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1560 * N-EVENT-REPORT |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1561 * http://dicom.nema.org/medical/dicom/2019a/output/chtml/part04/sect_J.3.3.html |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1562 * http://dicom.nema.org/medical/dicom/2019a/output/chtml/part07/chapter_10.html#table_10.1-1 |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1563 * |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1564 * Status code: |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1565 * http://dicom.nema.org/medical/dicom/2019a/output/chtml/part07/chapter_10.html#sect_10.1.1.1.8 |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1566 **/ |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1567 |
3607
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1568 /** |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1569 * Send the "EVENT_REPORT_RQ" request |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1570 **/ |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1571 |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1572 LOG(INFO) << "Reporting modality \"" << remoteAet_ |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1573 << "\" about storage commitment transaction: " << transactionUid |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1574 << " (" << successSopClassUids.size() << " successes, " |
3657
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1575 << failedSopClassUids.size() << " failures)"; |
3608
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1576 const DIC_US messageId = pimpl_->assoc_->nextMsgID++; |
3607
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1577 |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1578 { |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1579 T_DIMSE_Message message; |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1580 memset(&message, 0, sizeof(message)); |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1581 message.CommandField = DIMSE_N_EVENT_REPORT_RQ; |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1582 |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1583 T_DIMSE_N_EventReportRQ& content = message.msg.NEventReportRQ; |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1584 content.MessageID = messageId; |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1585 strncpy(content.AffectedSOPClassUID, UID_StorageCommitmentPushModelSOPClass, DIC_UI_LEN); |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1586 strncpy(content.AffectedSOPInstanceUID, UID_StorageCommitmentPushModelSOPInstance, DIC_UI_LEN); |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1587 content.DataSetType = DIMSE_DATASET_PRESENT; |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1588 |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1589 DcmDataset dataset; |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1590 if (!dataset.putAndInsertString(DCM_TransactionUID, transactionUid.c_str()).good()) |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1591 { |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1592 throw OrthancException(ErrorCode_InternalError); |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1593 } |
3606
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1594 |
3657
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1595 { |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1596 std::vector<StorageCommitmentFailureReason> empty; |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1597 FillSopSequence(dataset, DCM_ReferencedSOPSequence, successSopClassUids, |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1598 successSopInstanceUids, empty, false); |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1599 } |
3607
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1600 |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1601 // http://dicom.nema.org/medical/dicom/2019a/output/chtml/part04/sect_J.3.3.html |
3657
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1602 if (failedSopClassUids.empty()) |
3607
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1603 { |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1604 content.EventTypeID = 1; // "Storage Commitment Request Successful" |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1605 } |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1606 else |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1607 { |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1608 content.EventTypeID = 2; // "Storage Commitment Request Complete - Failures Exist" |
3613
c1e2b91c2ab4
all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3611
diff
changeset
|
1609 |
c1e2b91c2ab4
all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3611
diff
changeset
|
1610 // Failure reason |
c1e2b91c2ab4
all the abstractions for storage commitment are available
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3611
diff
changeset
|
1611 // http://dicom.nema.org/medical/dicom/2019a/output/chtml/part03/sect_C.14.html#sect_C.14.1.1 |
3657
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1612 FillSopSequence(dataset, DCM_FailedSOPSequence, failedSopClassUids, |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1613 failedSopInstanceUids, failedReasons, true); |
3607
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1614 } |
3606
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1615 |
3607
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1616 int presID = ASC_findAcceptedPresentationContextID( |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1617 pimpl_->assoc_, UID_StorageCommitmentPushModelSOPClass); |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1618 if (presID == 0) |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1619 { |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1620 throw OrthancException(ErrorCode_NetworkProtocol, "Storage commitment - " |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1621 "Unable to send N-EVENT-REPORT request to AET: " + remoteAet_); |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1622 } |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1623 |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1624 if (!DIMSE_sendMessageUsingMemoryData( |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1625 pimpl_->assoc_, presID, &message, NULL /* status detail */, |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1626 &dataset, NULL /* callback */, NULL /* callback context */, |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1627 NULL /* commandSet */).good()) |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1628 { |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1629 throw OrthancException(ErrorCode_NetworkProtocol); |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1630 } |
3606
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1631 } |
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1632 |
3607
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1633 /** |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1634 * Read the "EVENT_REPORT_RSP" response |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1635 **/ |
3606
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1636 |
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1637 { |
3607
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1638 T_ASC_PresentationContextID presID = 0; |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1639 T_DIMSE_Message message; |
3706
bd34b6ac5c08
timeouts in storage commitment SCU and SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3705
diff
changeset
|
1640 |
bd34b6ac5c08
timeouts in storage commitment SCU and SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3705
diff
changeset
|
1641 const int timeout = pimpl_->dimseTimeout_; |
bd34b6ac5c08
timeouts in storage commitment SCU and SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3705
diff
changeset
|
1642 if (!DIMSE_receiveCommand(pimpl_->assoc_, |
bd34b6ac5c08
timeouts in storage commitment SCU and SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3705
diff
changeset
|
1643 (timeout ? DIMSE_NONBLOCKING : DIMSE_BLOCKING), timeout, |
bd34b6ac5c08
timeouts in storage commitment SCU and SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3705
diff
changeset
|
1644 &presID, &message, NULL /* no statusDetail */).good() || |
3607
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1645 message.CommandField != DIMSE_N_EVENT_REPORT_RSP) |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1646 { |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1647 throw OrthancException(ErrorCode_NetworkProtocol, "Storage commitment - " |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1648 "Unable to read N-EVENT-REPORT response from AET: " + remoteAet_); |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1649 } |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1650 |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1651 const T_DIMSE_N_EventReportRSP& content = message.msg.NEventReportRSP; |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1652 if (content.MessageIDBeingRespondedTo != messageId || |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1653 !(content.opts & O_NEVENTREPORT_AFFECTEDSOPCLASSUID) || |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1654 !(content.opts & O_NEVENTREPORT_AFFECTEDSOPINSTANCEUID) || |
3609
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1655 //(content.opts & O_NEVENTREPORT_EVENTTYPEID) || // Pedantic test - The "content.EventTypeID" is not used by Orthanc |
3607
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1656 std::string(content.AffectedSOPClassUID) != UID_StorageCommitmentPushModelSOPClass || |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1657 std::string(content.AffectedSOPInstanceUID) != UID_StorageCommitmentPushModelSOPInstance || |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1658 content.DataSetType != DIMSE_DATASET_NULL) |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1659 { |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1660 throw OrthancException(ErrorCode_NetworkProtocol, "Storage commitment - " |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1661 "Badly formatted N-EVENT-REPORT response from AET: " + remoteAet_); |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1662 } |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1663 |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1664 if (content.DimseStatus != 0 /* success */) |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1665 { |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1666 throw OrthancException(ErrorCode_NetworkProtocol, "Storage commitment - " |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1667 "The request cannot be handled by remote AET: " + remoteAet_); |
d0ecb355db33
DicomUserConnection::ReportStorageCommitment() complete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3606
diff
changeset
|
1668 } |
3606
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1669 } |
33ba63637d48
DicomUserConnection: sending N-EVENT-REPORT-RQ
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3605
diff
changeset
|
1670 |
3605
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1671 Close(); |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1672 } |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1673 catch (OrthancException&) |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1674 { |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1675 Close(); |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1676 throw; |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1677 } |
05872838ebf3
DicomUserConnection: Opening of a connection for N-EVENT-REPORT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3561
diff
changeset
|
1678 } |
3608
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1679 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1680 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1681 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1682 void DicomUserConnection::RequestStorageCommitment( |
3611
0ce9c1c6474f
test route in REST API for storage commitment
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3610
diff
changeset
|
1683 const std::string& transactionUid, |
3657
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1684 const std::vector<std::string>& sopClassUids, |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1685 const std::vector<std::string>& sopInstanceUids) |
3608
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1686 { |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1687 if (sopClassUids.size() != sopInstanceUids.size()) |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1688 { |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1689 throw OrthancException(ErrorCode_ParameterOutOfRange); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1690 } |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1691 |
3741 | 1692 for (size_t i = 0; i < sopClassUids.size(); i++) |
1693 { | |
1694 if (sopClassUids[i].empty() || | |
1695 sopInstanceUids[i].empty()) | |
1696 { | |
1697 throw OrthancException(ErrorCode_ParameterOutOfRange, | |
1698 "The SOP class/instance UIDs cannot be empty, found: \"" + | |
1699 sopClassUids[i] + "\" / \"" + sopInstanceUids[i] + "\""); | |
1700 } | |
1701 } | |
1702 | |
3611
0ce9c1c6474f
test route in REST API for storage commitment
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3610
diff
changeset
|
1703 if (transactionUid.size() < 5 || |
0ce9c1c6474f
test route in REST API for storage commitment
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3610
diff
changeset
|
1704 transactionUid.substr(0, 5) != "2.25.") |
0ce9c1c6474f
test route in REST API for storage commitment
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3610
diff
changeset
|
1705 { |
0ce9c1c6474f
test route in REST API for storage commitment
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3610
diff
changeset
|
1706 throw OrthancException(ErrorCode_ParameterOutOfRange); |
0ce9c1c6474f
test route in REST API for storage commitment
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3610
diff
changeset
|
1707 } |
0ce9c1c6474f
test route in REST API for storage commitment
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3610
diff
changeset
|
1708 |
3608
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1709 if (IsOpen()) |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1710 { |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1711 Close(); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1712 } |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1713 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1714 try |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1715 { |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1716 OpenInternal(Mode_RequestStorageCommitment); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1717 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1718 /** |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1719 * N-ACTION |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1720 * http://dicom.nema.org/medical/dicom/2019a/output/chtml/part04/sect_J.3.2.html |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1721 * http://dicom.nema.org/medical/dicom/2019a/output/chtml/part07/chapter_10.html#table_10.1-4 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1722 * |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1723 * Status code: |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1724 * http://dicom.nema.org/medical/dicom/2019a/output/chtml/part07/chapter_10.html#sect_10.1.1.1.8 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1725 **/ |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1726 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1727 /** |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1728 * Send the "N_ACTION_RQ" request |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1729 **/ |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1730 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1731 LOG(INFO) << "Request to modality \"" << remoteAet_ |
3611
0ce9c1c6474f
test route in REST API for storage commitment
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3610
diff
changeset
|
1732 << "\" about storage commitment for " << sopClassUids.size() |
0ce9c1c6474f
test route in REST API for storage commitment
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3610
diff
changeset
|
1733 << " instances, with transaction UID: " << transactionUid; |
3608
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1734 const DIC_US messageId = pimpl_->assoc_->nextMsgID++; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1735 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1736 { |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1737 T_DIMSE_Message message; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1738 memset(&message, 0, sizeof(message)); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1739 message.CommandField = DIMSE_N_ACTION_RQ; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1740 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1741 T_DIMSE_N_ActionRQ& content = message.msg.NActionRQ; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1742 content.MessageID = messageId; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1743 strncpy(content.RequestedSOPClassUID, UID_StorageCommitmentPushModelSOPClass, DIC_UI_LEN); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1744 strncpy(content.RequestedSOPInstanceUID, UID_StorageCommitmentPushModelSOPInstance, DIC_UI_LEN); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1745 content.ActionTypeID = 1; // "Request Storage Commitment" |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1746 content.DataSetType = DIMSE_DATASET_PRESENT; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1747 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1748 DcmDataset dataset; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1749 if (!dataset.putAndInsertString(DCM_TransactionUID, transactionUid.c_str()).good()) |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1750 { |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1751 throw OrthancException(ErrorCode_InternalError); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1752 } |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1753 |
3657
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1754 { |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1755 std::vector<StorageCommitmentFailureReason> empty; |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1756 FillSopSequence(dataset, DCM_ReferencedSOPSequence, sopClassUids, sopInstanceUids, empty, false); |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1757 } |
115f82775c46
handling of storage commitment failure reasons
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3641
diff
changeset
|
1758 |
3608
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1759 int presID = ASC_findAcceptedPresentationContextID( |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1760 pimpl_->assoc_, UID_StorageCommitmentPushModelSOPClass); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1761 if (presID == 0) |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1762 { |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1763 throw OrthancException(ErrorCode_NetworkProtocol, "Storage commitment - " |
3609
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1764 "Unable to send N-ACTION request to AET: " + remoteAet_); |
3608
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1765 } |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1766 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1767 if (!DIMSE_sendMessageUsingMemoryData( |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1768 pimpl_->assoc_, presID, &message, NULL /* status detail */, |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1769 &dataset, NULL /* callback */, NULL /* callback context */, |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1770 NULL /* commandSet */).good()) |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1771 { |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1772 throw OrthancException(ErrorCode_NetworkProtocol); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1773 } |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1774 } |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1775 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1776 /** |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1777 * Read the "N_ACTION_RSP" response |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1778 **/ |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1779 |
3609
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1780 { |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1781 T_ASC_PresentationContextID presID = 0; |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1782 T_DIMSE_Message message; |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1783 |
3706
bd34b6ac5c08
timeouts in storage commitment SCU and SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3705
diff
changeset
|
1784 const int timeout = pimpl_->dimseTimeout_; |
bd34b6ac5c08
timeouts in storage commitment SCU and SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3705
diff
changeset
|
1785 if (!DIMSE_receiveCommand(pimpl_->assoc_, |
bd34b6ac5c08
timeouts in storage commitment SCU and SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3705
diff
changeset
|
1786 (timeout ? DIMSE_NONBLOCKING : DIMSE_BLOCKING), timeout, |
bd34b6ac5c08
timeouts in storage commitment SCU and SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3705
diff
changeset
|
1787 &presID, &message, NULL /* no statusDetail */).good() || |
3609
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1788 message.CommandField != DIMSE_N_ACTION_RSP) |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1789 { |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1790 throw OrthancException(ErrorCode_NetworkProtocol, "Storage commitment - " |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1791 "Unable to read N-ACTION response from AET: " + remoteAet_); |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1792 } |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1793 |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1794 const T_DIMSE_N_ActionRSP& content = message.msg.NActionRSP; |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1795 if (content.MessageIDBeingRespondedTo != messageId || |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1796 !(content.opts & O_NACTION_AFFECTEDSOPCLASSUID) || |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1797 !(content.opts & O_NACTION_AFFECTEDSOPINSTANCEUID) || |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1798 //(content.opts & O_NACTION_ACTIONTYPEID) || // Pedantic test - The "content.ActionTypeID" is not used by Orthanc |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1799 std::string(content.AffectedSOPClassUID) != UID_StorageCommitmentPushModelSOPClass || |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1800 std::string(content.AffectedSOPInstanceUID) != UID_StorageCommitmentPushModelSOPInstance || |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1801 content.DataSetType != DIMSE_DATASET_NULL) |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1802 { |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1803 throw OrthancException(ErrorCode_NetworkProtocol, "Storage commitment - " |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1804 "Badly formatted N-ACTION response from AET: " + remoteAet_); |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1805 } |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1806 |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1807 if (content.DimseStatus != 0 /* success */) |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1808 { |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1809 throw OrthancException(ErrorCode_NetworkProtocol, "Storage commitment - " |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1810 "The request cannot be handled by remote AET: " + remoteAet_); |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1811 } |
f7ade98d8229
done RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3608
diff
changeset
|
1812 } |
3608
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1813 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1814 Close(); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1815 } |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1816 catch (OrthancException&) |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1817 { |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1818 Close(); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1819 throw; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1820 } |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3607
diff
changeset
|
1821 } |
0 | 1822 } |