Mercurial > hg > orthanc
annotate OrthancServer/Sources/OrthancGetRequestHandler.cpp @ 4819:70d2a97ca8cb openssl-3.x
integration mainline->openssl-3.x
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 25 Nov 2021 13:12:32 +0100 |
parents | f0038043fb97 753f87dac208 |
children | 2e71a08eea15 |
rev | line source |
---|---|
3818 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
4437
d9473bd5ed43
upgrade to year 2021
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4376
diff
changeset
|
5 * Copyright (C) 2017-2021 Osimis S.A., Belgium |
3818 | 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. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU General Public License | |
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 **/ | |
20 | |
21 #include "PrecompiledHeadersServer.h" | |
22 #include "OrthancGetRequestHandler.h" | |
23 | |
4045 | 24 #include "../../OrthancFramework/Sources/DicomFormat/DicomArray.h" |
25 #include "../../OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h" | |
26 #include "../../OrthancFramework/Sources/Logging.h" | |
27 #include "../../OrthancFramework/Sources/MetricsRegistry.h" | |
3818 | 28 #include "OrthancConfiguration.h" |
29 #include "ServerContext.h" | |
30 #include "ServerJobs/DicomModalityStoreJob.h" | |
31 | |
3963 | 32 #include <dcmtk/dcmdata/dcdeftag.h> |
33 #include <dcmtk/dcmdata/dcfilefo.h> | |
34 #include <dcmtk/dcmdata/dcistrmb.h> | |
35 #include <dcmtk/dcmnet/assoc.h> | |
36 #include <dcmtk/dcmnet/dimse.h> | |
37 #include <dcmtk/dcmnet/diutil.h> | |
38 #include <dcmtk/ofstd/ofstring.h> | |
39 | |
3962
d30eb4ae5bb6
trying a fix for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3959
diff
changeset
|
40 #include <sstream> // For std::stringstream |
d30eb4ae5bb6
trying a fix for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3959
diff
changeset
|
41 |
3818 | 42 namespace Orthanc |
43 { | |
4286
526bd8bad850
debug logs for C-MOVE and C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4269
diff
changeset
|
44 static void ProgressCallback(void *callbackData, |
526bd8bad850
debug logs for C-MOVE and C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4269
diff
changeset
|
45 T_DIMSE_StoreProgress *progress, |
526bd8bad850
debug logs for C-MOVE and C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4269
diff
changeset
|
46 T_DIMSE_C_StoreRQ *req) |
3818 | 47 { |
4286
526bd8bad850
debug logs for C-MOVE and C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4269
diff
changeset
|
48 if (req != NULL && |
526bd8bad850
debug logs for C-MOVE and C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4269
diff
changeset
|
49 progress->state == DIMSE_StoreBegin) |
3818 | 50 { |
4286
526bd8bad850
debug logs for C-MOVE and C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4269
diff
changeset
|
51 OFString str; |
526bd8bad850
debug logs for C-MOVE and C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4269
diff
changeset
|
52 CLOG(TRACE, DICOM) << "Sending Store Request following a C-GET:" << std::endl |
526bd8bad850
debug logs for C-MOVE and C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4269
diff
changeset
|
53 << DIMSE_dumpMessage(str, *req, DIMSE_OUTGOING); |
3818 | 54 } |
55 } | |
56 | |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
57 |
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
58 bool OrthancGetRequestHandler::DoNext(T_ASC_Association* assoc) |
3818 | 59 { |
60 if (position_ >= instances_.size()) | |
61 { | |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
62 throw OrthancException(ErrorCode_ParameterOutOfRange); |
3818 | 63 } |
64 | |
65 const std::string& id = instances_[position_++]; | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
66 |
3818 | 67 std::string dicom; |
68 context_.ReadDicom(dicom, id); | |
69 | |
4204 | 70 if (dicom.empty()) |
3818 | 71 { |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
72 throw OrthancException(ErrorCode_BadFileFormat); |
3818 | 73 } |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
74 |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
75 std::unique_ptr<DcmFileFormat> parsed( |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
76 FromDcmtkBridge::LoadFromMemoryBuffer(dicom.c_str(), dicom.size())); |
3954 | 77 |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
78 if (parsed.get() == NULL || |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
79 parsed->getDataset() == NULL) |
3954 | 80 { |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
81 throw OrthancException(ErrorCode_InternalError); |
3954 | 82 } |
3818 | 83 |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
84 DcmDataset& dataset = *parsed->getDataset(); |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
85 |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
86 OFString a, b; |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
87 if (!dataset.findAndGetOFString(DCM_SOPClassUID, a).good() || |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
88 !dataset.findAndGetOFString(DCM_SOPInstanceUID, b).good()) |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
89 { |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
90 throw OrthancException(ErrorCode_NoSopClassOrInstance, |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
91 "Unable to determine the SOP class/instance for C-STORE with AET " + |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
92 originatorAet_); |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
93 } |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
94 |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
95 std::string sopClassUid(a.c_str()); |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
96 std::string sopInstanceUid(b.c_str()); |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
97 |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
98 return PerformGetSubOp(assoc, sopClassUid, sopInstanceUid, parsed.release()); |
3818 | 99 } |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
100 |
3818 | 101 |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
102 void OrthancGetRequestHandler::AddFailedUIDInstance(const std::string& sopInstance) |
3818 | 103 { |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
104 if (failedUIDs_.empty()) |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
105 { |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
106 failedUIDs_ = sopInstance; |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
107 } |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
108 else |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
109 { |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
110 failedUIDs_ += "\\" + sopInstance; |
3818 | 111 } |
112 } | |
113 | |
114 | |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
115 static bool SelectPresentationContext(T_ASC_PresentationContextID& selectedPresentationId, |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
116 DicomTransferSyntax& selectedSyntax, |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
117 T_ASC_Association* assoc, |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
118 const std::string& sopClassUid, |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
119 DicomTransferSyntax sourceSyntax, |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
120 bool allowTranscoding) |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
121 { |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
122 typedef std::map<DicomTransferSyntax, T_ASC_PresentationContextID> Accepted; |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
123 |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
124 Accepted accepted; |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
125 |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
126 /** |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
127 * 1. Inspect and index all the accepted transfer syntaxes. This |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
128 * is similar to the code from "DicomAssociation::Open()". |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
129 **/ |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
130 |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
131 LST_HEAD **l = &assoc->params->DULparams.acceptedPresentationContext; |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
132 if (*l != NULL) |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
133 { |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
134 DUL_PRESENTATIONCONTEXT* pc = (DUL_PRESENTATIONCONTEXT*) LST_Head(l); |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
135 LST_Position(l, (LST_NODE*)pc); |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
136 while (pc) |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
137 { |
3966
fde1355a625a
c-get compatibility with ginkgocadx
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3963
diff
changeset
|
138 DicomTransferSyntax transferSyntax; |
4669
b14989f9ff8b
fix misleading log message about unknown transfer syntax in C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4482
diff
changeset
|
139 if (pc->result == ASC_P_ACCEPTANCE) |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
140 { |
4669
b14989f9ff8b
fix misleading log message about unknown transfer syntax in C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4482
diff
changeset
|
141 if (LookupTransferSyntax(transferSyntax, pc->acceptedTransferSyntax)) |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
142 { |
4669
b14989f9ff8b
fix misleading log message about unknown transfer syntax in C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4482
diff
changeset
|
143 /*CLOG(TRACE, DICOM) << "C-GET SCP accepted: SOP class " << pc->abstractSyntax |
b14989f9ff8b
fix misleading log message about unknown transfer syntax in C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4482
diff
changeset
|
144 << " with transfer syntax " << GetTransferSyntaxUid(transferSyntax);*/ |
b14989f9ff8b
fix misleading log message about unknown transfer syntax in C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4482
diff
changeset
|
145 if (std::string(pc->abstractSyntax) == sopClassUid) |
b14989f9ff8b
fix misleading log message about unknown transfer syntax in C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4482
diff
changeset
|
146 { |
b14989f9ff8b
fix misleading log message about unknown transfer syntax in C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4482
diff
changeset
|
147 accepted[transferSyntax] = pc->presentationContextID; |
b14989f9ff8b
fix misleading log message about unknown transfer syntax in C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4482
diff
changeset
|
148 } |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
149 } |
4669
b14989f9ff8b
fix misleading log message about unknown transfer syntax in C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4482
diff
changeset
|
150 else |
b14989f9ff8b
fix misleading log message about unknown transfer syntax in C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4482
diff
changeset
|
151 { |
b14989f9ff8b
fix misleading log message about unknown transfer syntax in C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4482
diff
changeset
|
152 CLOG(WARNING, DICOM) << "C-GET: Unknown transfer syntax received: " |
b14989f9ff8b
fix misleading log message about unknown transfer syntax in C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4482
diff
changeset
|
153 << pc->acceptedTransferSyntax; |
b14989f9ff8b
fix misleading log message about unknown transfer syntax in C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4482
diff
changeset
|
154 } |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
155 } |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
156 |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
157 pc = (DUL_PRESENTATIONCONTEXT*) LST_Next(l); |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
158 } |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
159 } |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
160 |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
161 |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
162 /** |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
163 * 2. Select the preferred transfer syntaxes, which corresponds to |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
164 * the source transfer syntax, plus all the uncompressed transfer |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
165 * syntaxes if transcoding is enabled. |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
166 **/ |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
167 |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
168 std::list<DicomTransferSyntax> preferred; |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
169 preferred.push_back(sourceSyntax); |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
170 |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
171 if (allowTranscoding) |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
172 { |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
173 if (sourceSyntax != DicomTransferSyntax_LittleEndianImplicit) |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
174 { |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
175 // Default Transfer Syntax for DICOM |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
176 preferred.push_back(DicomTransferSyntax_LittleEndianImplicit); |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
177 } |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
178 |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
179 if (sourceSyntax != DicomTransferSyntax_LittleEndianExplicit) |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
180 { |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
181 preferred.push_back(DicomTransferSyntax_LittleEndianExplicit); |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
182 } |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
183 |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
184 if (sourceSyntax != DicomTransferSyntax_BigEndianExplicit) |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
185 { |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
186 // Retired |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
187 preferred.push_back(DicomTransferSyntax_BigEndianExplicit); |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
188 } |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
189 } |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
190 |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
191 |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
192 /** |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
193 * 3. Lookup whether one of the preferred transfer syntaxes was |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
194 * accepted. |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
195 **/ |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
196 |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
197 for (std::list<DicomTransferSyntax>::const_iterator |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
198 it = preferred.begin(); it != preferred.end(); ++it) |
3966
fde1355a625a
c-get compatibility with ginkgocadx
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3963
diff
changeset
|
199 { |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
200 Accepted::const_iterator found = accepted.find(*it); |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
201 if (found != accepted.end()) |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
202 { |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
203 selectedPresentationId = found->second; |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
204 selectedSyntax = *it; |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
205 return true; |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
206 } |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
207 } |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
208 |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
209 // No preferred syntax was accepted |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
210 return false; |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
211 } |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
212 |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
213 |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
214 bool OrthancGetRequestHandler::PerformGetSubOp(T_ASC_Association* assoc, |
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
215 const std::string& sopClassUid, |
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
216 const std::string& sopInstanceUid, |
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
217 DcmFileFormat* dicomRaw) |
3818 | 218 { |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
219 assert(dicomRaw != NULL); |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
220 std::unique_ptr<DcmFileFormat> dicom(dicomRaw); |
3818 | 221 |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
222 DicomTransferSyntax sourceSyntax; |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
223 if (!FromDcmtkBridge::LookupOrthancTransferSyntax(sourceSyntax, *dicom)) |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
224 { |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
225 failedCount_++; |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
226 AddFailedUIDInstance(sopInstanceUid); |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
227 throw OrthancException(ErrorCode_NetworkProtocol, |
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
228 "C-GET SCP: Unknown transfer syntax: (" + |
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
229 std::string(dcmSOPClassUIDToModality(sopClassUid.c_str(), "OT")) + |
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
230 ") " + sopClassUid); |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
231 } |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
232 |
3972
7f8b30416d50
minor clarification
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3970
diff
changeset
|
233 T_ASC_PresentationContextID presId = 0; // Unnecessary initialization, makes code clearer |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
234 DicomTransferSyntax selectedSyntax; |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
235 if (!SelectPresentationContext(presId, selectedSyntax, assoc, sopClassUid, |
4482
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
236 sourceSyntax, allowTranscoding_) || |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
237 presId == 0) |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
238 { |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
239 failedCount_++; |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
240 AddFailedUIDInstance(sopInstanceUid); |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
241 throw OrthancException(ErrorCode_NetworkProtocol, |
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
242 "C-GET SCP: storeSCU: No presentation context for: (" + |
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
243 std::string(dcmSOPClassUIDToModality(sopClassUid.c_str(), "OT")) + |
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
244 ") " + sopClassUid); |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
245 } |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
246 else |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
247 { |
4287
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
248 CLOG(INFO, DICOM) << "C-GET SCP selected transfer syntax " << GetTransferSyntaxUid(selectedSyntax) |
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
249 << ", for source instance with SOP class " << sopClassUid |
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
250 << " and transfer syntax " << GetTransferSyntaxUid(sourceSyntax); |
3966
fde1355a625a
c-get compatibility with ginkgocadx
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3963
diff
changeset
|
251 |
3818 | 252 // make sure that we can send images in this presentation context |
253 T_ASC_PresentationContext pc; | |
254 ASC_findAcceptedPresentationContext(assoc->params, presId, &pc); | |
255 // the acceptedRole is the association requestor role | |
3966
fde1355a625a
c-get compatibility with ginkgocadx
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3963
diff
changeset
|
256 |
fde1355a625a
c-get compatibility with ginkgocadx
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3963
diff
changeset
|
257 if (pc.acceptedRole != ASC_SC_ROLE_DEFAULT && // "DEFAULT" is necessary for GinkgoCADx |
fde1355a625a
c-get compatibility with ginkgocadx
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3963
diff
changeset
|
258 pc.acceptedRole != ASC_SC_ROLE_SCP && |
fde1355a625a
c-get compatibility with ginkgocadx
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3963
diff
changeset
|
259 pc.acceptedRole != ASC_SC_ROLE_SCUSCP) |
3818 | 260 { |
261 // the role is not appropriate | |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
262 failedCount_++; |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
263 AddFailedUIDInstance(sopInstanceUid); |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
264 throw OrthancException(ErrorCode_NetworkProtocol, |
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
265 "C-GET SCP: storeSCU: [No presentation context with requestor SCP role for: (" + |
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
266 std::string(dcmSOPClassUIDToModality(sopClassUid.c_str(), "OT")) + |
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
267 ") " + sopClassUid); |
3818 | 268 } |
269 } | |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
270 |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
271 const DIC_US msgId = assoc->nextMsgID++; |
3818 | 272 |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
273 T_DIMSE_C_StoreRQ req; |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
274 memset(&req, 0, sizeof(req)); |
3818 | 275 req.MessageID = msgId; |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
276 strncpy(req.AffectedSOPClassUID, sopClassUid.c_str(), DIC_UI_LEN); |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
277 strncpy(req.AffectedSOPInstanceUID, sopInstanceUid.c_str(), DIC_UI_LEN); |
3818 | 278 req.DataSetType = DIMSE_DATASET_PRESENT; |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
279 req.Priority = DIMSE_PRIORITY_MEDIUM; |
3818 | 280 req.opts = 0; |
281 | |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
282 T_DIMSE_C_StoreRSP rsp; |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
283 memset(&rsp, 0, sizeof(rsp)); |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
284 |
4287
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
285 CLOG(INFO, DICOM) << "Store SCU RQ: MsgID " << msgId << ", (" |
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
286 << dcmSOPClassUIDToModality(sopClassUid.c_str(), "OT") << ")"; |
3818 | 287 |
288 T_DIMSE_DetectedCancelParameters cancelParameters; | |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
289 memset(&cancelParameters, 0, sizeof(cancelParameters)); |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
290 |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
291 std::unique_ptr<DcmDataset> stDetail; |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
292 |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
293 OFCondition cond; |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
294 |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
295 if (sourceSyntax == selectedSyntax) |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
296 { |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
297 // No transcoding is required |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
298 DcmDataset *stDetailTmp = NULL; |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
299 cond = DIMSE_storeUser( |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
300 assoc, presId, &req, NULL /* imageFileName */, dicom->getDataset(), |
4286
526bd8bad850
debug logs for C-MOVE and C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4269
diff
changeset
|
301 ProgressCallback, NULL /* callbackData */, |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
302 (timeout_ > 0 ? DIMSE_NONBLOCKING : DIMSE_BLOCKING), timeout_, |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
303 &rsp, &stDetailTmp, &cancelParameters); |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
304 stDetail.reset(stDetailTmp); |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
305 } |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
306 else |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
307 { |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
308 // Transcoding to the selected uncompressed transfer syntax |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
309 IDicomTranscoder::DicomImage source, transcoded; |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
310 source.AcquireParsed(dicom.release()); |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
311 |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
312 std::set<DicomTransferSyntax> ts; |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
313 ts.insert(selectedSyntax); |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
314 |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
315 if (context_.Transcode(transcoded, source, ts, true)) |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
316 { |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
317 // Transcoding has succeeded |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
318 DcmDataset *stDetailTmp = NULL; |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
319 cond = DIMSE_storeUser( |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
320 assoc, presId, &req, NULL /* imageFileName */, |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
321 transcoded.GetParsed().getDataset(), |
4286
526bd8bad850
debug logs for C-MOVE and C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4269
diff
changeset
|
322 ProgressCallback, NULL /* callbackData */, |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
323 (timeout_ > 0 ? DIMSE_NONBLOCKING : DIMSE_BLOCKING), timeout_, |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
324 &rsp, &stDetailTmp, &cancelParameters); |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
325 stDetail.reset(stDetailTmp); |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
326 } |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
327 else |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
328 { |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
329 // Cannot transcode |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
330 failedCount_++; |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
331 AddFailedUIDInstance(sopInstanceUid); |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
332 throw OrthancException(ErrorCode_NotImplemented, |
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
333 "C-GET SCP: Cannot transcode " + sopClassUid + |
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
334 " from transfer syntax " + GetTransferSyntaxUid(sourceSyntax) + |
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
335 " to " + GetTransferSyntaxUid(selectedSyntax)); |
3959
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
336 } |
76a24be12912
c-get: support of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3955
diff
changeset
|
337 } |
4257
c046d559edb3
Fix reporting of client-side store warnings/errors in C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4204
diff
changeset
|
338 |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
339 bool isContinue; |
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
340 |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
341 if (cond.good()) |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
342 { |
4286
526bd8bad850
debug logs for C-MOVE and C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4269
diff
changeset
|
343 { |
526bd8bad850
debug logs for C-MOVE and C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4269
diff
changeset
|
344 OFString str; |
526bd8bad850
debug logs for C-MOVE and C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4269
diff
changeset
|
345 CLOG(TRACE, DICOM) << "Received Store Response following a C-GET:" << std::endl |
526bd8bad850
debug logs for C-MOVE and C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4269
diff
changeset
|
346 << DIMSE_dumpMessage(str, rsp, DIMSE_INCOMING); |
526bd8bad850
debug logs for C-MOVE and C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4269
diff
changeset
|
347 } |
526bd8bad850
debug logs for C-MOVE and C-GET SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4269
diff
changeset
|
348 |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
349 if (cancelParameters.cancelEncountered) |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
350 { |
4287
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
351 CLOG(INFO, DICOM) << "C-GET SCP: Received C-Cancel RQ"; |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
352 isContinue = false; |
3818 | 353 } |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
354 else if (rsp.DimseStatus == STATUS_Success) |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
355 { |
3818 | 356 // everything ok |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
357 completedCount_++; |
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
358 isContinue = true; |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
359 } |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
360 else if ((rsp.DimseStatus & 0xf000) == 0xb000) |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
361 { |
3818 | 362 // a warning status message |
363 warningCount_++; | |
4287
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
364 CLOG(ERROR, DICOM) << "C-GET SCP: Store Warning: Response Status: " |
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
365 << DU_cstoreStatusString(rsp.DimseStatus); |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
366 isContinue = true; |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
367 } |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
368 else |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
369 { |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
370 failedCount_++; |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
371 AddFailedUIDInstance(sopInstanceUid); |
3818 | 372 // print a status message |
4287
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
373 CLOG(ERROR, DICOM) << "C-GET SCP: Store Failed: Response Status: " |
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
374 << DU_cstoreStatusString(rsp.DimseStatus); |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
375 isContinue = true; |
3818 | 376 } |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
377 } |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
378 else |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
379 { |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
380 failedCount_++; |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
381 AddFailedUIDInstance(sopInstanceUid); |
3818 | 382 OFString temp_str; |
4287
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
383 CLOG(ERROR, DICOM) << "C-GET SCP: storeSCU: Store Request Failed: " |
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
384 << DimseCondition::dump(temp_str, cond); |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
385 isContinue = true; |
3818 | 386 } |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
387 |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
388 if (stDetail.get() != NULL) |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
389 { |
4288 | 390 std::stringstream s; // DcmObject::PrintHelper cannot be used with VS2008 |
391 stDetail->print(s); | |
4287
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
392 CLOG(INFO, DICOM) << " Status Detail: " << s.str(); |
3818 | 393 } |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
394 |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
395 return isContinue; |
3818 | 396 } |
397 | |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
398 bool OrthancGetRequestHandler::LookupIdentifiers(std::list<std::string>& publicIds, |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
399 ResourceType level, |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
400 const DicomMap& input) const |
3818 | 401 { |
402 DicomTag tag(0, 0); // Dummy initialization | |
403 | |
404 switch (level) | |
405 { | |
406 case ResourceType_Patient: | |
407 tag = DICOM_TAG_PATIENT_ID; | |
408 break; | |
409 | |
410 case ResourceType_Study: | |
411 tag = (input.HasTag(DICOM_TAG_ACCESSION_NUMBER) ? | |
412 DICOM_TAG_ACCESSION_NUMBER : DICOM_TAG_STUDY_INSTANCE_UID); | |
413 break; | |
414 | |
415 case ResourceType_Series: | |
416 tag = DICOM_TAG_SERIES_INSTANCE_UID; | |
417 break; | |
418 | |
419 case ResourceType_Instance: | |
420 tag = DICOM_TAG_SOP_INSTANCE_UID; | |
421 break; | |
422 | |
423 default: | |
424 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
425 } | |
426 | |
427 if (!input.HasTag(tag)) | |
428 { | |
429 return false; | |
430 } | |
431 | |
432 const DicomValue& value = input.GetValue(tag); | |
433 if (value.IsNull() || | |
434 value.IsBinary()) | |
435 { | |
436 return false; | |
437 } | |
438 else | |
439 { | |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
440 std::vector<std::string> tokens; |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
441 Toolbox::TokenizeString(tokens, value.GetContent(), '\\'); |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
442 |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
443 for (size_t i = 0; i < tokens.size(); i++) |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
444 { |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
445 std::vector<std::string> tmp; |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
446 context_.GetIndex().LookupIdentifierExact(tmp, level, tag, tokens[i]); |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
447 |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
448 if (tmp.empty()) |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
449 { |
4287
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
450 CLOG(ERROR, DICOM) << "C-GET: Cannot locate resource \"" << tokens[i] |
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
451 << "\" at the " << EnumerationToString(level) << " level"; |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
452 return false; |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
453 } |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
454 else |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
455 { |
4204 | 456 for (size_t j = 0; j < tmp.size(); j++) |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
457 { |
4204 | 458 publicIds.push_back(tmp[j]); |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
459 } |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
460 } |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
461 } |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
462 |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
463 return true; |
3818 | 464 } |
465 } | |
466 | |
467 | |
4287
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
468 OrthancGetRequestHandler::OrthancGetRequestHandler(ServerContext& context) : |
4482
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
469 context_(context), |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
470 position_(0), |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
471 completedCount_ (0), |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
472 warningCount_(0), |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
473 failedCount_(0), |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
474 timeout_(0), |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
475 allowTranscoding_(false) |
4287
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
476 { |
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
477 } |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
478 |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
479 |
3818 | 480 bool OrthancGetRequestHandler::Handle(const DicomMap& input, |
481 const std::string& originatorIp, | |
482 const std::string& originatorAet, | |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
483 const std::string& calledAet, |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
484 uint32_t timeout) |
3818 | 485 { |
486 MetricsRegistry::Timer timer(context_.GetMetricsRegistry(), "orthanc_get_scp_duration_ms"); | |
487 | |
4806 | 488 CLOG(INFO, DICOM) << "C-GET-SCU request received from AET \"" << originatorAet << "\""; |
3818 | 489 |
490 { | |
491 DicomArray query(input); | |
492 for (size_t i = 0; i < query.GetSize(); i++) | |
493 { | |
494 if (!query.GetElement(i).GetValue().IsNull()) | |
495 { | |
4313
91554aecff9a
removed a friend method for better abi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4288
diff
changeset
|
496 CLOG(INFO, DICOM) << " (" << query.GetElement(i).GetTag().Format() |
91554aecff9a
removed a friend method for better abi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4288
diff
changeset
|
497 << ") " << FromDcmtkBridge::GetTagName(query.GetElement(i)) |
4376
b002f9abe802
review of changeset 4375:208029732d51
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4375
diff
changeset
|
498 << " = " << context_.GetDeidentifiedContent(query.GetElement(i)); |
3818 | 499 } |
500 } | |
501 } | |
502 | |
503 /** | |
504 * Retrieve the query level. | |
505 **/ | |
506 | |
507 const DicomValue* levelTmp = input.TestAndGetValue(DICOM_TAG_QUERY_RETRIEVE_LEVEL); | |
4376
b002f9abe802
review of changeset 4375:208029732d51
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4375
diff
changeset
|
508 if (levelTmp == NULL || |
b002f9abe802
review of changeset 4375:208029732d51
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4375
diff
changeset
|
509 levelTmp->IsNull() || |
b002f9abe802
review of changeset 4375:208029732d51
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4375
diff
changeset
|
510 levelTmp->IsBinary()) |
b002f9abe802
review of changeset 4375:208029732d51
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4375
diff
changeset
|
511 { |
b002f9abe802
review of changeset 4375:208029732d51
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4375
diff
changeset
|
512 throw OrthancException(ErrorCode_BadRequest, |
b002f9abe802
review of changeset 4375:208029732d51
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4375
diff
changeset
|
513 "C-GET request without the tag 0008,0052 (QueryRetrieveLevel)"); |
b002f9abe802
review of changeset 4375:208029732d51
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4375
diff
changeset
|
514 } |
3818 | 515 |
516 ResourceType level = StringToResourceType(levelTmp->GetContent().c_str()); | |
517 | |
518 | |
519 /** | |
520 * Lookup for the resource to be sent. | |
521 **/ | |
522 | |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
523 std::list<std::string> publicIds; |
3818 | 524 |
3954 | 525 if (!LookupIdentifiers(publicIds, level, input)) |
526 { | |
4287
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
527 CLOG(ERROR, DICOM) << "Cannot determine what resources are requested by C-GET"; |
3954 | 528 return false; |
529 } | |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
530 |
3818 | 531 localAet_ = context_.GetDefaultLocalApplicationEntityTitle(); |
532 position_ = 0; | |
533 originatorAet_ = originatorAet; | |
534 | |
535 { | |
536 OrthancConfiguration::ReaderLock lock; | |
4482
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
537 |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
538 RemoteModalityParameters remote; |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
539 |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
540 if (lock.GetConfiguration().LookupDicomModalityUsingAETitle(remote, originatorAet)) |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
541 { |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
542 allowTranscoding_ = (context_.IsTranscodeDicomProtocol() && |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
543 remote.IsTranscodingAllowed()); |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
544 } |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
545 else if (lock.GetConfiguration().GetBooleanParameter("DicomAlwaysAllowGet", false)) |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
546 { |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
547 CLOG(INFO, DICOM) << "C-GET: Allowing SCU request from unknown modality with AET: " << originatorAet; |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
548 allowTranscoding_ = context_.IsTranscodeDicomProtocol(); |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
549 } |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
550 else |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
551 { |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
552 // This should never happen, given the test at bottom of |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
553 // "OrthancApplicationEntityFilter::IsAllowedRequest()" |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
554 throw OrthancException(ErrorCode_InexistentItem, |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
555 "C-GET: Rejecting SCU request from unknown modality with AET: " + originatorAet); |
8efeaba1b7f9
new configuration options: "DicomAlwaysAllowFind" and "DicomAlwaysAllowGet"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
556 } |
3818 | 557 } |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
558 |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
559 for (std::list<std::string>::const_iterator |
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
560 resource = publicIds.begin(); resource != publicIds.end(); ++resource) |
3818 | 561 { |
4287
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
562 CLOG(INFO, DICOM) << "C-GET: Sending resource " << *resource |
5a3374b6e707
using CLOG in Orthanc DICOM handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4286
diff
changeset
|
563 << " to modality \"" << originatorAet << "\""; |
3818 | 564 |
565 std::list<std::string> tmp; | |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
566 context_.GetIndex().GetChildInstances(tmp, *resource); |
3818 | 567 |
568 instances_.reserve(tmp.size()); | |
569 for (std::list<std::string>::iterator it = tmp.begin(); it != tmp.end(); ++it) | |
570 { | |
571 instances_.push_back(*it); | |
572 } | |
573 } | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
574 |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
575 failedUIDs_.clear(); |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
576 |
4258
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
577 completedCount_ = 0; |
6f5d4bfb2c90
C-GET SCP: Fix responses and handling of cancel
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4257
diff
changeset
|
578 failedCount_ = 0; |
3818 | 579 warningCount_ = 0; |
3955
66879215cbf3
C-GET: add timeout, fix uninitalized priority, support multiple resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3954
diff
changeset
|
580 timeout_ = timeout; |
3818 | 581 |
3954 | 582 return true; |
3818 | 583 } |
584 }; |