Mercurial > hg > orthanc
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 } |