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 }