Mercurial > hg > orthanc
comparison OrthancServer/Sources/ServerJobs/DicomMoveScuJob.cpp @ 4740:c1d6ce00be3f openssl-3.x
integration mainline->openssl-3.x
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 06 Jul 2021 08:40:43 +0200 |
parents | f0038043fb97 7826ac059c31 |
children | 2e71a08eea15 |
comparison
equal
deleted
inserted
replaced
4739:8cc9137b5c2e | 4740:c1d6ce00be3f |
---|---|
19 **/ | 19 **/ |
20 | 20 |
21 | 21 |
22 #include "DicomMoveScuJob.h" | 22 #include "DicomMoveScuJob.h" |
23 | 23 |
24 #include "../../../OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h" | |
24 #include "../../../OrthancFramework/Sources/SerializationToolbox.h" | 25 #include "../../../OrthancFramework/Sources/SerializationToolbox.h" |
25 #include "../ServerContext.h" | 26 #include "../ServerContext.h" |
26 | 27 |
27 static const char* const LOCAL_AET = "LocalAet"; | 28 static const char* const LOCAL_AET = "LocalAet"; |
29 static const char* const QUERY = "Query"; | |
30 static const char* const QUERY_FORMAT = "QueryFormat"; // New in 1.9.5 | |
31 static const char* const REMOTE = "Remote"; | |
28 static const char* const TARGET_AET = "TargetAet"; | 32 static const char* const TARGET_AET = "TargetAet"; |
29 static const char* const REMOTE = "Remote"; | |
30 static const char* const QUERY = "Query"; | |
31 static const char* const TIMEOUT = "Timeout"; | 33 static const char* const TIMEOUT = "Timeout"; |
32 | 34 |
33 namespace Orthanc | 35 namespace Orthanc |
34 { | 36 { |
35 class DicomMoveScuJob::Command : public SetOfCommandsJob::ICommand | 37 class DicomMoveScuJob::Command : public SetOfCommandsJob::ICommand |
78 return new Command(that_, findAnswer); | 80 return new Command(that_, findAnswer); |
79 } | 81 } |
80 }; | 82 }; |
81 | 83 |
82 | 84 |
83 | |
84 void DicomMoveScuJob::Retrieve(const DicomMap& findAnswer) | 85 void DicomMoveScuJob::Retrieve(const DicomMap& findAnswer) |
85 { | 86 { |
86 if (connection_.get() == NULL) | 87 if (connection_.get() == NULL) |
87 { | 88 { |
88 connection_.reset(new DicomControlUserConnection(parameters_)); | 89 connection_.reset(new DicomControlUserConnection(parameters_)); |
90 | 91 |
91 connection_->Move(targetAet_, findAnswer); | 92 connection_->Move(targetAet_, findAnswer); |
92 } | 93 } |
93 | 94 |
94 | 95 |
95 static void AddTagIfString(Json::Value& target, | 96 static void AddToQuery(DicomFindAnswers& query, |
96 const DicomMap& answer, | 97 const DicomMap& item) |
97 const DicomTag& tag) | 98 { |
98 { | 99 query.Add(item); |
99 const DicomValue* value = answer.TestAndGetValue(tag); | 100 |
100 if (value != NULL && | 101 /** |
101 !value->IsNull() && | 102 * Compatibility with Orthanc <= 1.9.4: Remove the |
102 !value->IsBinary()) | 103 * "SpecificCharacterSet" (0008,0005) tag that is automatically |
103 { | 104 * added if creating a ParsedDicomFile object from a DicomMap. |
104 target[tag.Format()] = value->GetContent(); | 105 **/ |
105 } | 106 query.GetAnswer(query.GetSize() - 1).Remove(DICOM_TAG_SPECIFIC_CHARACTER_SET); |
106 } | 107 } |
107 | 108 |
108 | 109 |
109 void DicomMoveScuJob::AddFindAnswer(const DicomMap& answer) | 110 void DicomMoveScuJob::AddFindAnswer(const DicomMap& answer) |
110 { | 111 { |
111 assert(query_.type() == Json::arrayValue); | 112 DicomMap item; |
112 | 113 item.CopyTagIfExists(answer, DICOM_TAG_QUERY_RETRIEVE_LEVEL); |
113 // Copy the identifiers tags, if they exist | 114 item.CopyTagIfExists(answer, DICOM_TAG_PATIENT_ID); |
114 Json::Value item = Json::objectValue; | 115 item.CopyTagIfExists(answer, DICOM_TAG_STUDY_INSTANCE_UID); |
115 AddTagIfString(item, answer, DICOM_TAG_QUERY_RETRIEVE_LEVEL); | 116 item.CopyTagIfExists(answer, DICOM_TAG_SERIES_INSTANCE_UID); |
116 AddTagIfString(item, answer, DICOM_TAG_PATIENT_ID); | 117 item.CopyTagIfExists(answer, DICOM_TAG_SOP_INSTANCE_UID); |
117 AddTagIfString(item, answer, DICOM_TAG_STUDY_INSTANCE_UID); | 118 item.CopyTagIfExists(answer, DICOM_TAG_ACCESSION_NUMBER); |
118 AddTagIfString(item, answer, DICOM_TAG_SERIES_INSTANCE_UID); | 119 AddToQuery(query_, item); |
119 AddTagIfString(item, answer, DICOM_TAG_SOP_INSTANCE_UID); | |
120 AddTagIfString(item, answer, DICOM_TAG_ACCESSION_NUMBER); | |
121 query_.append(item); | |
122 | 120 |
123 AddCommand(new Command(*this, answer)); | 121 AddCommand(new Command(*this, answer)); |
124 } | 122 } |
125 | 123 |
126 | 124 |
189 { | 187 { |
190 connection_.reset(); | 188 connection_.reset(); |
191 } | 189 } |
192 | 190 |
193 | 191 |
192 void DicomMoveScuJob::SetQueryFormat(DicomToJsonFormat format) | |
193 { | |
194 if (IsStarted()) | |
195 { | |
196 throw OrthancException(ErrorCode_BadSequenceOfCalls); | |
197 } | |
198 else | |
199 { | |
200 queryFormat_ = format; | |
201 } | |
202 } | |
203 | |
204 | |
194 void DicomMoveScuJob::GetPublicContent(Json::Value& value) | 205 void DicomMoveScuJob::GetPublicContent(Json::Value& value) |
195 { | 206 { |
196 SetOfCommandsJob::GetPublicContent(value); | 207 SetOfCommandsJob::GetPublicContent(value); |
197 | 208 |
198 value["LocalAet"] = parameters_.GetLocalApplicationEntityTitle(); | 209 value[LOCAL_AET] = parameters_.GetLocalApplicationEntityTitle(); |
199 value["RemoteAet"] = parameters_.GetRemoteModality().GetApplicationEntityTitle(); | 210 value["RemoteAet"] = parameters_.GetRemoteModality().GetApplicationEntityTitle(); |
200 value["Query"] = query_; | 211 |
212 value[QUERY] = Json::objectValue; | |
213 query_.ToJson(value[QUERY], queryFormat_); | |
201 } | 214 } |
202 | 215 |
203 | 216 |
204 DicomMoveScuJob::DicomMoveScuJob(ServerContext& context, | 217 DicomMoveScuJob::DicomMoveScuJob(ServerContext& context, |
205 const Json::Value& serialized) : | 218 const Json::Value& serialized) : |
206 SetOfCommandsJob(new Unserializer(*this), serialized), | 219 SetOfCommandsJob(new Unserializer(*this), serialized), |
207 context_(context), | 220 context_(context), |
208 parameters_(DicomAssociationParameters::UnserializeJob(serialized)), | 221 parameters_(DicomAssociationParameters::UnserializeJob(serialized)), |
209 targetAet_(SerializationToolbox::ReadString(serialized, TARGET_AET)), | 222 targetAet_(SerializationToolbox::ReadString(serialized, TARGET_AET)), |
210 query_(Json::arrayValue) | 223 query_(true), |
211 { | 224 queryFormat_(DicomToJsonFormat_Short) |
212 if (serialized.isMember(QUERY) && | 225 { |
213 serialized[QUERY].type() == Json::arrayValue) | 226 if (serialized.isMember(QUERY)) |
214 { | 227 { |
215 query_ = serialized[QUERY]; | 228 const Json::Value& query = serialized[QUERY]; |
229 if (query.type() == Json::arrayValue) | |
230 { | |
231 for (Json::Value::ArrayIndex i = 0; i < query.size(); i++) | |
232 { | |
233 DicomMap item; | |
234 FromDcmtkBridge::FromJson(item, query[i]); | |
235 AddToQuery(query_, item); | |
236 } | |
237 } | |
238 } | |
239 | |
240 if (serialized.isMember(QUERY_FORMAT)) | |
241 { | |
242 queryFormat_ = StringToDicomToJsonFormat(SerializationToolbox::ReadString(serialized, QUERY_FORMAT)); | |
216 } | 243 } |
217 } | 244 } |
218 | 245 |
219 | 246 |
220 bool DicomMoveScuJob::Serialize(Json::Value& target) | 247 bool DicomMoveScuJob::Serialize(Json::Value& target) |
225 } | 252 } |
226 else | 253 else |
227 { | 254 { |
228 parameters_.SerializeJob(target); | 255 parameters_.SerializeJob(target); |
229 target[TARGET_AET] = targetAet_; | 256 target[TARGET_AET] = targetAet_; |
230 target[QUERY] = query_; | 257 |
258 // "Short" is for compatibility with Orthanc <= 1.9.4 | |
259 target[QUERY] = Json::objectValue; | |
260 query_.ToJson(target[QUERY], DicomToJsonFormat_Short); | |
261 | |
262 target[QUERY_FORMAT] = EnumerationToString(queryFormat_); | |
263 | |
231 return true; | 264 return true; |
232 } | 265 } |
233 } | 266 } |
234 } | 267 } |