Mercurial > hg > orthanc
diff OrthancServer/Sources/OrthancRestApi/OrthancRestModalities.cpp @ 4340:6fa8bb987be2
"DicomEchoChecksFind" config option + "CheckFind" field in /modalities/.../echo
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 03 Dec 2020 15:58:52 +0100 |
parents | fc5caed6f940 |
children | 189e48f4a92a |
line wrap: on
line diff
--- a/OrthancServer/Sources/OrthancRestApi/OrthancRestModalities.cpp Thu Dec 03 11:47:03 2020 +0100 +++ b/OrthancServer/Sources/OrthancRestApi/OrthancRestModalities.cpp Thu Dec 03 15:58:52 2020 +0100 @@ -60,6 +60,7 @@ static const char* const KEY_RESOURCES = "Resources"; static const char* const KEY_TARGET_AET = "TargetAet"; static const char* const KEY_TIMEOUT = "Timeout"; + static const char* const KEY_CHECK_FIND = "CheckFind"; static const char* const SOP_CLASS_UID = "SOPClassUID"; static const char* const SOP_INSTANCE_UID = "SOPInstanceUID"; @@ -114,15 +115,42 @@ ***************************************************************************/ static void ExecuteEcho(RestApiOutput& output, - const DicomAssociationParameters& parameters) + const DicomAssociationParameters& parameters, + const Json::Value& body) { DicomControlUserConnection connection(parameters); if (connection.Echo()) { + bool find = false; + + if (body.type() == Json::objectValue && + body.isMember(KEY_CHECK_FIND)) + { + find = SerializationToolbox::ReadBoolean(body, KEY_CHECK_FIND); + } + else + { + OrthancConfiguration::ReaderLock lock; + find = lock.GetConfiguration().GetBooleanParameter("DicomEchoChecksFind", false); + } + + if (find) + { + // Issue a C-FIND request at the study level about a random Study Instance UID + const std::string studyInstanceUid = FromDcmtkBridge::GenerateUniqueIdentifier(ResourceType_Study); + + DicomMap query; + query.SetValue(DICOM_TAG_STUDY_INSTANCE_UID, studyInstanceUid, false); + + DicomFindAnswers answers(false /* not a worklist */); + + // The following line throws an exception if the remote modality doesn't support C-FIND + connection.Find(answers, ResourceType_Study, query, false /* normalize */); + } + // Echo has succeeded output.AnswerBuffer("{}", MimeType_Json); - return; } else { @@ -134,7 +162,16 @@ static void DicomEcho(RestApiPostCall& call) { - ExecuteEcho(call.GetOutput(), GetAssociationParameters(call)); + Json::Value body; + if (call.ParseJsonRequest(body)) + { + const DicomAssociationParameters parameters = GetAssociationParameters(call, body); + ExecuteEcho(call.GetOutput(), parameters, body); + } + else + { + throw OrthancException(ErrorCode_BadFileFormat, "Cannot parse the JSON body"); + } } @@ -152,7 +189,7 @@ DicomAssociationParameters params(localAet, modality); InjectAssociationTimeout(params, body); - ExecuteEcho(call.GetOutput(), params); + ExecuteEcho(call.GetOutput(), params, body); } else {