Mercurial > hg > orthanc
annotate OrthancServer/OrthancGetRequestHandler.cpp @ 3953:620e87e9e816 c-get
c-get: fixing memory with failedUIDs_
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 20 May 2020 09:19:35 +0200 |
parents | d30bce4bdae9 |
children | 67b457283499 |
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 | |
5 * Copyright (C) 2017-2019 Osimis S.A., Belgium | |
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 * 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. | |
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 #include "PrecompiledHeadersServer.h" | |
34 #include "OrthancGetRequestHandler.h" | |
35 | |
36 #include <dcmtk/dcmnet/assoc.h> | |
37 #include <dcmtk/dcmnet/dimse.h> | |
38 #include <dcmtk/dcmdata/dcdeftag.h> | |
39 #include <dcmtk/dcmdata/dcistrmb.h> | |
40 #include <dcmtk/dcmnet/diutil.h> | |
41 | |
42 #include "../../Core/DicomParsing/FromDcmtkBridge.h" | |
43 #include "../Core/DicomFormat/DicomArray.h" | |
44 #include "../Core/Logging.h" | |
45 #include "../Core/MetricsRegistry.h" | |
46 #include "OrthancConfiguration.h" | |
47 #include "ServerContext.h" | |
48 #include "ServerJobs/DicomModalityStoreJob.h" | |
49 | |
50 | |
51 | |
52 namespace Orthanc | |
53 { | |
54 namespace | |
55 { | |
56 // Anonymous namespace to avoid clashes between compilation modules | |
57 | |
58 static void getSubOpProgressCallback(void * /* callbackData */, | |
59 T_DIMSE_StoreProgress *progress, | |
60 T_DIMSE_C_StoreRQ * /*req*/) | |
61 { | |
62 // SBL - no logging to be done here. | |
63 } | |
64 } | |
65 | |
66 OrthancGetRequestHandler::Status OrthancGetRequestHandler::DoNext(T_ASC_Association* assoc) | |
67 { | |
68 if (position_ >= instances_.size()) | |
69 { | |
70 return Status_Failure; | |
71 } | |
72 | |
73 const std::string& id = instances_[position_++]; | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
74 |
3818 | 75 std::string dicom; |
76 context_.ReadDicom(dicom, id); | |
77 | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
78 if (dicom.size() <= 0) |
3818 | 79 { |
80 return Status_Failure; | |
81 } | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
82 |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
83 std::unique_ptr<DcmFileFormat> parsed( |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
84 FromDcmtkBridge::LoadFromMemoryBuffer(dicom.c_str(), dicom.size())); |
3818 | 85 |
86 // Determine the storage SOP class UID for this instance | |
87 DIC_UI sopClass; | |
88 DIC_UI sopInstance; | |
89 | |
90 #if DCMTK_VERSION_NUMBER >= 364 | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
91 if (!DU_findSOPClassAndInstanceInDataSet(static_cast<DcmItem *> (parsed->getDataset()), |
3818 | 92 sopClass, sizeof(sopClass), |
93 sopInstance, sizeof(sopInstance))) | |
94 #else | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
95 if (!DU_findSOPClassAndInstanceInDataSet(parsed->getDataset(), sopClass, sopInstance)) |
3818 | 96 #endif |
97 { | |
98 throw OrthancException(ErrorCode_NoSopClassOrInstance, | |
99 "Unable to determine the SOP class/instance for C-STORE with AET " + | |
100 originatorAet_); | |
101 } | |
102 | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
103 OFCondition cond = performGetSubOp(assoc, sopClass, sopInstance, parsed->getDataset()); |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
104 if (getCancelled_) |
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 LOG(INFO) << "Get SCP: Received C-Cancel RQ"; |
3818 | 107 } |
108 | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
109 if (cond.bad() || getCancelled_) |
3818 | 110 { |
111 return Status_Failure; | |
112 } | |
113 | |
114 return Status_Success; | |
115 } | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
116 |
3818 | 117 |
118 void OrthancGetRequestHandler::addFailedUIDInstance(const char *sopInstance) | |
119 { | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
120 if (failedUIDs_.empty()) |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
121 { |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
122 failedUIDs_ = sopInstance; |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
123 } |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
124 else |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
125 { |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
126 failedUIDs_ += "\\" + std::string(sopInstance); |
3818 | 127 } |
128 } | |
129 | |
130 | |
131 OFCondition OrthancGetRequestHandler::performGetSubOp(T_ASC_Association* assoc, | |
132 DIC_UI sopClass, | |
133 DIC_UI sopInstance, | |
134 DcmDataset *dataset) | |
135 { | |
136 OFCondition cond = EC_Normal; | |
137 T_DIMSE_C_StoreRQ req; | |
138 T_DIMSE_C_StoreRSP rsp; | |
139 DIC_US msgId; | |
140 T_ASC_PresentationContextID presId; | |
141 DcmDataset *stDetail = NULL; | |
142 | |
143 msgId = assoc->nextMsgID++; | |
144 | |
145 // which presentation context should be used | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
146 presId = ASC_findAcceptedPresentationContextID(assoc, sopClass); |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
147 |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
148 if (presId == 0) |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
149 { |
3818 | 150 nFailed_++; |
151 addFailedUIDInstance(sopInstance); | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
152 LOG(ERROR) << "Get SCP: storeSCU: No presentation context for: (" |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
153 << dcmSOPClassUIDToModality(sopClass, "OT") << ") " << sopClass; |
3818 | 154 return DIMSE_NOVALIDPRESENTATIONCONTEXTID; |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
155 } |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
156 else |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
157 { |
3818 | 158 // make sure that we can send images in this presentation context |
159 T_ASC_PresentationContext pc; | |
160 ASC_findAcceptedPresentationContext(assoc->params, presId, &pc); | |
161 // the acceptedRole is the association requestor role | |
162 if ((pc.acceptedRole != ASC_SC_ROLE_SCP) && (pc.acceptedRole != ASC_SC_ROLE_SCUSCP)) | |
163 { | |
164 // the role is not appropriate | |
165 nFailed_++; | |
166 addFailedUIDInstance(sopInstance); | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
167 LOG(ERROR) <<"Get SCP: storeSCU: [No presentation context with requestor SCP role for: (" |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
168 << dcmSOPClassUIDToModality(sopClass, "OT") << ") " << sopClass; |
3818 | 169 return DIMSE_NOVALIDPRESENTATIONCONTEXTID; |
170 } | |
171 } | |
172 | |
173 req.MessageID = msgId; | |
174 strcpy(req.AffectedSOPClassUID, sopClass); | |
175 strcpy(req.AffectedSOPInstanceUID, sopInstance); | |
176 req.DataSetType = DIMSE_DATASET_PRESENT; | |
177 req.Priority = priority_; | |
178 req.opts = 0; | |
179 | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
180 LOG(INFO) << "Store SCU RQ: MsgID " << msgId << ", (" |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
181 << dcmSOPClassUIDToModality(sopClass, "OT") << ")"; |
3818 | 182 |
183 T_DIMSE_DetectedCancelParameters cancelParameters; | |
184 | |
185 cond = DIMSE_storeUser(assoc, presId, &req, | |
186 NULL, dataset, getSubOpProgressCallback, this, DIMSE_BLOCKING, 0, | |
187 &rsp, &stDetail, &cancelParameters); | |
188 | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
189 if (cond.good()) |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
190 { |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
191 if (cancelParameters.cancelEncountered) |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
192 { |
3818 | 193 if (origPresId == cancelParameters.presId && |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
194 origMsgId == cancelParameters.req.MessageIDBeingRespondedTo) |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
195 { |
3818 | 196 getCancelled_ = OFTrue; |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
197 } |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
198 else |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
199 { |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
200 LOG(ERROR) << "Get SCP: Unexpected C-Cancel-RQ encountered: pid=" << (int)cancelParameters.presId |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
201 << ", mid=" << (int)cancelParameters.req.MessageIDBeingRespondedTo; |
3818 | 202 } |
203 } | |
204 | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
205 if (rsp.DimseStatus == STATUS_Success) |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
206 { |
3818 | 207 // everything ok |
208 nCompleted_++; | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
209 } |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
210 else if ((rsp.DimseStatus & 0xf000) == 0xb000) |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
211 { |
3818 | 212 // a warning status message |
213 warningCount_++; | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
214 LOG(ERROR) << "Get SCP: Store Warning: Response Status: " |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
215 << DU_cstoreStatusString(rsp.DimseStatus); |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
216 } |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
217 else |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
218 { |
3818 | 219 nFailed_++; |
220 addFailedUIDInstance(sopInstance); | |
221 // print a status message | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
222 LOG(ERROR) << "Get SCP: Store Failed: Response Status: " |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
223 << DU_cstoreStatusString(rsp.DimseStatus); |
3818 | 224 } |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
225 } |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
226 else |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
227 { |
3818 | 228 nFailed_++; |
229 addFailedUIDInstance(sopInstance); | |
230 OFString temp_str; | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
231 LOG(ERROR) << "Get SCP: storeSCU: Store Request Failed: " << DimseCondition::dump(temp_str, cond); |
3818 | 232 } |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
233 |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
234 if (stDetail) |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
235 { |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
236 LOG(INFO) << " Status Detail:" << OFendl << DcmObject::PrintHelper(*stDetail); |
3818 | 237 delete stDetail; |
238 } | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
239 |
3818 | 240 return cond; |
241 } | |
242 | |
243 bool OrthancGetRequestHandler::LookupIdentifiers(std::vector<std::string>& publicIds, | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
244 ResourceType level, |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
245 const DicomMap& input) |
3818 | 246 { |
247 DicomTag tag(0, 0); // Dummy initialization | |
248 | |
249 switch (level) | |
250 { | |
251 case ResourceType_Patient: | |
252 tag = DICOM_TAG_PATIENT_ID; | |
253 break; | |
254 | |
255 case ResourceType_Study: | |
256 tag = (input.HasTag(DICOM_TAG_ACCESSION_NUMBER) ? | |
257 DICOM_TAG_ACCESSION_NUMBER : DICOM_TAG_STUDY_INSTANCE_UID); | |
258 break; | |
259 | |
260 case ResourceType_Series: | |
261 tag = DICOM_TAG_SERIES_INSTANCE_UID; | |
262 break; | |
263 | |
264 case ResourceType_Instance: | |
265 tag = DICOM_TAG_SOP_INSTANCE_UID; | |
266 break; | |
267 | |
268 default: | |
269 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
270 } | |
271 | |
272 if (!input.HasTag(tag)) | |
273 { | |
274 return false; | |
275 } | |
276 | |
277 const DicomValue& value = input.GetValue(tag); | |
278 if (value.IsNull() || | |
279 value.IsBinary()) | |
280 { | |
281 return false; | |
282 } | |
283 else | |
284 { | |
285 const std::string& content = value.GetContent(); | |
286 context_.GetIndex().LookupIdentifierExact(publicIds, level, tag, content); | |
287 return true; | |
288 } | |
289 } | |
290 | |
291 | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
292 OrthancGetRequestHandler::OrthancGetRequestHandler(ServerContext& context) : |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
293 context_(context) |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
294 { |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
295 position_ = 0; |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
296 nRemaining_ = 0; |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
297 nCompleted_ = 0; |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
298 warningCount_ = 0; |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
299 nFailed_ = 0; |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
300 } |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
301 |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
302 |
3818 | 303 bool OrthancGetRequestHandler::Handle(const DicomMap& input, |
304 const std::string& originatorIp, | |
305 const std::string& originatorAet, | |
306 const std::string& calledAet) | |
307 { | |
308 MetricsRegistry::Timer timer(context_.GetMetricsRegistry(), "orthanc_get_scp_duration_ms"); | |
309 | |
310 LOG(WARNING) << "Get-SCU request received from AET \"" << originatorAet << "\""; | |
311 | |
312 { | |
313 DicomArray query(input); | |
314 for (size_t i = 0; i < query.GetSize(); i++) | |
315 { | |
316 if (!query.GetElement(i).GetValue().IsNull()) | |
317 { | |
318 LOG(INFO) << " " << query.GetElement(i).GetTag() | |
319 << " " << FromDcmtkBridge::GetTagName(query.GetElement(i)) | |
320 << " = " << query.GetElement(i).GetValue().GetContent(); | |
321 } | |
322 } | |
323 } | |
324 | |
325 /** | |
326 * Retrieve the query level. | |
327 **/ | |
328 | |
329 const DicomValue* levelTmp = input.TestAndGetValue(DICOM_TAG_QUERY_RETRIEVE_LEVEL); | |
330 | |
331 assert(levelTmp != NULL); | |
332 ResourceType level = StringToResourceType(levelTmp->GetContent().c_str()); | |
333 | |
334 | |
335 /** | |
336 * Lookup for the resource to be sent. | |
337 **/ | |
338 | |
339 std::vector<std::string> publicIds; | |
340 | |
341 bool retVal = LookupIdentifiers(publicIds, level, input); | |
342 localAet_ = context_.GetDefaultLocalApplicationEntityTitle(); | |
343 position_ = 0; | |
344 originatorAet_ = originatorAet; | |
345 | |
346 { | |
347 OrthancConfiguration::ReaderLock lock; | |
348 remote_ = lock.GetConfiguration().GetModalityUsingAet(originatorAet); | |
349 } | |
350 | |
351 for (size_t i = 0; i < publicIds.size(); i++) | |
352 { | |
353 LOG(INFO) << "Sending resource " << publicIds[i] << " to modality \"" | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
354 << originatorAet << "\" in synchronous mode"; |
3818 | 355 |
356 std::list<std::string> tmp; | |
357 context_.GetIndex().GetChildInstances(tmp, publicIds[i]); | |
358 | |
359 instances_.reserve(tmp.size()); | |
360 for (std::list<std::string>::iterator it = tmp.begin(); it != tmp.end(); ++it) | |
361 { | |
362 instances_.push_back(*it); | |
363 } | |
364 } | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
365 |
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
366 failedUIDs_.clear(); |
3818 | 367 getCancelled_ = OFFalse; |
368 | |
369 nRemaining_ = GetSubOperationCount(); | |
370 nCompleted_ = 0; | |
371 nFailed_ = 0; | |
372 warningCount_ = 0; | |
373 | |
3953
620e87e9e816
c-get: fixing memory with failedUIDs_
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3859
diff
changeset
|
374 return retVal; |
3818 | 375 } |
376 }; |