comparison OrthancServer/Sources/ServerJobs/DicomMoveScuJob.cpp @ 4730:7826ac059c31

Added Short/Simplify/Full options to format "/modalities/{id}/find-worklist" and "/queries/{id}/retrieve"
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 25 Jun 2021 18:13:45 +0200
parents 4e2247df6327
children c1d6ce00be3f 7053502fbf97
comparison
equal deleted inserted replaced
4729:4e2247df6327 4730:7826ac059c31
31 **/ 31 **/
32 32
33 33
34 #include "DicomMoveScuJob.h" 34 #include "DicomMoveScuJob.h"
35 35
36 #include "../../../OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h"
36 #include "../../../OrthancFramework/Sources/SerializationToolbox.h" 37 #include "../../../OrthancFramework/Sources/SerializationToolbox.h"
37 #include "../ServerContext.h" 38 #include "../ServerContext.h"
38 39
39 static const char* const LOCAL_AET = "LocalAet"; 40 static const char* const LOCAL_AET = "LocalAet";
41 static const char* const QUERY = "Query";
42 static const char* const QUERY_FORMAT = "QueryFormat"; // New in 1.9.5
43 static const char* const REMOTE = "Remote";
40 static const char* const TARGET_AET = "TargetAet"; 44 static const char* const TARGET_AET = "TargetAet";
41 static const char* const REMOTE = "Remote";
42 static const char* const QUERY = "Query";
43 static const char* const TIMEOUT = "Timeout"; 45 static const char* const TIMEOUT = "Timeout";
44 46
45 namespace Orthanc 47 namespace Orthanc
46 { 48 {
47 class DicomMoveScuJob::Command : public SetOfCommandsJob::ICommand 49 class DicomMoveScuJob::Command : public SetOfCommandsJob::ICommand
90 return new Command(that_, findAnswer); 92 return new Command(that_, findAnswer);
91 } 93 }
92 }; 94 };
93 95
94 96
95
96 void DicomMoveScuJob::Retrieve(const DicomMap& findAnswer) 97 void DicomMoveScuJob::Retrieve(const DicomMap& findAnswer)
97 { 98 {
98 if (connection_.get() == NULL) 99 if (connection_.get() == NULL)
99 { 100 {
100 connection_.reset(new DicomControlUserConnection(parameters_)); 101 connection_.reset(new DicomControlUserConnection(parameters_));
102 103
103 connection_->Move(targetAet_, findAnswer); 104 connection_->Move(targetAet_, findAnswer);
104 } 105 }
105 106
106 107
107 static void AddTagIfString(Json::Value& target, 108 static void AddToQuery(DicomFindAnswers& query,
108 const DicomMap& answer, 109 const DicomMap& item)
109 const DicomTag& tag) 110 {
110 { 111 query.Add(item);
111 const DicomValue* value = answer.TestAndGetValue(tag); 112
112 if (value != NULL && 113 /**
113 !value->IsNull() && 114 * Compatibility with Orthanc <= 1.9.4: Remove the
114 !value->IsBinary()) 115 * "SpecificCharacterSet" (0008,0005) tag that is automatically
115 { 116 * added if creating a ParsedDicomFile object from a DicomMap.
116 target[tag.Format()] = value->GetContent(); 117 **/
117 } 118 query.GetAnswer(query.GetSize() - 1).Remove(DICOM_TAG_SPECIFIC_CHARACTER_SET);
118 } 119 }
119 120
120 121
121 void DicomMoveScuJob::AddFindAnswer(const DicomMap& answer) 122 void DicomMoveScuJob::AddFindAnswer(const DicomMap& answer)
122 { 123 {
123 assert(query_.type() == Json::arrayValue); 124 DicomMap item;
124 125 item.CopyTagIfExists(answer, DICOM_TAG_QUERY_RETRIEVE_LEVEL);
125 // Copy the identifiers tags, if they exist 126 item.CopyTagIfExists(answer, DICOM_TAG_PATIENT_ID);
126 Json::Value item = Json::objectValue; 127 item.CopyTagIfExists(answer, DICOM_TAG_STUDY_INSTANCE_UID);
127 AddTagIfString(item, answer, DICOM_TAG_QUERY_RETRIEVE_LEVEL); 128 item.CopyTagIfExists(answer, DICOM_TAG_SERIES_INSTANCE_UID);
128 AddTagIfString(item, answer, DICOM_TAG_PATIENT_ID); 129 item.CopyTagIfExists(answer, DICOM_TAG_SOP_INSTANCE_UID);
129 AddTagIfString(item, answer, DICOM_TAG_STUDY_INSTANCE_UID); 130 item.CopyTagIfExists(answer, DICOM_TAG_ACCESSION_NUMBER);
130 AddTagIfString(item, answer, DICOM_TAG_SERIES_INSTANCE_UID); 131 AddToQuery(query_, item);
131 AddTagIfString(item, answer, DICOM_TAG_SOP_INSTANCE_UID);
132 AddTagIfString(item, answer, DICOM_TAG_ACCESSION_NUMBER);
133 query_.append(item);
134 132
135 AddCommand(new Command(*this, answer)); 133 AddCommand(new Command(*this, answer));
136 } 134 }
137 135
138 136
220 { 218 {
221 SetOfCommandsJob::GetPublicContent(value); 219 SetOfCommandsJob::GetPublicContent(value);
222 220
223 value[LOCAL_AET] = parameters_.GetLocalApplicationEntityTitle(); 221 value[LOCAL_AET] = parameters_.GetLocalApplicationEntityTitle();
224 value["RemoteAet"] = parameters_.GetRemoteModality().GetApplicationEntityTitle(); 222 value["RemoteAet"] = parameters_.GetRemoteModality().GetApplicationEntityTitle();
225 value["Query"] = query_; 223
224 value[QUERY] = Json::objectValue;
225 query_.ToJson(value[QUERY], queryFormat_);
226 } 226 }
227 227
228 228
229 DicomMoveScuJob::DicomMoveScuJob(ServerContext& context, 229 DicomMoveScuJob::DicomMoveScuJob(ServerContext& context,
230 const Json::Value& serialized) : 230 const Json::Value& serialized) :
231 SetOfCommandsJob(new Unserializer(*this), serialized), 231 SetOfCommandsJob(new Unserializer(*this), serialized),
232 context_(context), 232 context_(context),
233 parameters_(DicomAssociationParameters::UnserializeJob(serialized)), 233 parameters_(DicomAssociationParameters::UnserializeJob(serialized)),
234 targetAet_(SerializationToolbox::ReadString(serialized, TARGET_AET)), 234 targetAet_(SerializationToolbox::ReadString(serialized, TARGET_AET)),
235 query_(Json::arrayValue), 235 query_(true),
236 queryFormat_(DicomToJsonFormat_Short) 236 queryFormat_(DicomToJsonFormat_Short)
237 { 237 {
238 if (serialized.isMember(QUERY) && 238 if (serialized.isMember(QUERY))
239 serialized[QUERY].type() == Json::arrayValue) 239 {
240 { 240 const Json::Value& query = serialized[QUERY];
241 query_ = serialized[QUERY]; 241 if (query.type() == Json::arrayValue)
242 {
243 for (Json::Value::ArrayIndex i = 0; i < query.size(); i++)
244 {
245 DicomMap item;
246 FromDcmtkBridge::FromJson(item, query[i]);
247 AddToQuery(query_, item);
248 }
249 }
250 }
251
252 if (serialized.isMember(QUERY_FORMAT))
253 {
254 queryFormat_ = StringToDicomToJsonFormat(SerializationToolbox::ReadString(serialized, QUERY_FORMAT));
242 } 255 }
243 } 256 }
244 257
245 258
246 bool DicomMoveScuJob::Serialize(Json::Value& target) 259 bool DicomMoveScuJob::Serialize(Json::Value& target)
251 } 264 }
252 else 265 else
253 { 266 {
254 parameters_.SerializeJob(target); 267 parameters_.SerializeJob(target);
255 target[TARGET_AET] = targetAet_; 268 target[TARGET_AET] = targetAet_;
256 target[QUERY] = query_; 269
270 // "Short" is for compatibility with Orthanc <= 1.9.4
271 target[QUERY] = Json::objectValue;
272 query_.ToJson(target[QUERY], DicomToJsonFormat_Short);
273
274 target[QUERY_FORMAT] = EnumerationToString(queryFormat_);
275
257 return true; 276 return true;
258 } 277 }
259 } 278 }
260 } 279 }