Mercurial > hg > orthanc
comparison 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 |
comparison
equal
deleted
inserted
replaced
4339:fc5caed6f940 | 4340:6fa8bb987be2 |
---|---|
58 static const char* const KEY_NORMALIZE = "Normalize"; | 58 static const char* const KEY_NORMALIZE = "Normalize"; |
59 static const char* const KEY_QUERY = "Query"; | 59 static const char* const KEY_QUERY = "Query"; |
60 static const char* const KEY_RESOURCES = "Resources"; | 60 static const char* const KEY_RESOURCES = "Resources"; |
61 static const char* const KEY_TARGET_AET = "TargetAet"; | 61 static const char* const KEY_TARGET_AET = "TargetAet"; |
62 static const char* const KEY_TIMEOUT = "Timeout"; | 62 static const char* const KEY_TIMEOUT = "Timeout"; |
63 static const char* const KEY_CHECK_FIND = "CheckFind"; | |
63 static const char* const SOP_CLASS_UID = "SOPClassUID"; | 64 static const char* const SOP_CLASS_UID = "SOPClassUID"; |
64 static const char* const SOP_INSTANCE_UID = "SOPInstanceUID"; | 65 static const char* const SOP_INSTANCE_UID = "SOPInstanceUID"; |
65 | 66 |
66 static RemoteModalityParameters MyGetModalityUsingSymbolicName(const std::string& name) | 67 static RemoteModalityParameters MyGetModalityUsingSymbolicName(const std::string& name) |
67 { | 68 { |
112 /*************************************************************************** | 113 /*************************************************************************** |
113 * DICOM C-Echo SCU | 114 * DICOM C-Echo SCU |
114 ***************************************************************************/ | 115 ***************************************************************************/ |
115 | 116 |
116 static void ExecuteEcho(RestApiOutput& output, | 117 static void ExecuteEcho(RestApiOutput& output, |
117 const DicomAssociationParameters& parameters) | 118 const DicomAssociationParameters& parameters, |
119 const Json::Value& body) | |
118 { | 120 { |
119 DicomControlUserConnection connection(parameters); | 121 DicomControlUserConnection connection(parameters); |
120 | 122 |
121 if (connection.Echo()) | 123 if (connection.Echo()) |
122 { | 124 { |
125 bool find = false; | |
126 | |
127 if (body.type() == Json::objectValue && | |
128 body.isMember(KEY_CHECK_FIND)) | |
129 { | |
130 find = SerializationToolbox::ReadBoolean(body, KEY_CHECK_FIND); | |
131 } | |
132 else | |
133 { | |
134 OrthancConfiguration::ReaderLock lock; | |
135 find = lock.GetConfiguration().GetBooleanParameter("DicomEchoChecksFind", false); | |
136 } | |
137 | |
138 if (find) | |
139 { | |
140 // Issue a C-FIND request at the study level about a random Study Instance UID | |
141 const std::string studyInstanceUid = FromDcmtkBridge::GenerateUniqueIdentifier(ResourceType_Study); | |
142 | |
143 DicomMap query; | |
144 query.SetValue(DICOM_TAG_STUDY_INSTANCE_UID, studyInstanceUid, false); | |
145 | |
146 DicomFindAnswers answers(false /* not a worklist */); | |
147 | |
148 // The following line throws an exception if the remote modality doesn't support C-FIND | |
149 connection.Find(answers, ResourceType_Study, query, false /* normalize */); | |
150 } | |
151 | |
123 // Echo has succeeded | 152 // Echo has succeeded |
124 output.AnswerBuffer("{}", MimeType_Json); | 153 output.AnswerBuffer("{}", MimeType_Json); |
125 return; | |
126 } | 154 } |
127 else | 155 else |
128 { | 156 { |
129 // Echo has failed | 157 // Echo has failed |
130 output.SignalError(HttpStatus_500_InternalServerError); | 158 output.SignalError(HttpStatus_500_InternalServerError); |
132 } | 160 } |
133 | 161 |
134 | 162 |
135 static void DicomEcho(RestApiPostCall& call) | 163 static void DicomEcho(RestApiPostCall& call) |
136 { | 164 { |
137 ExecuteEcho(call.GetOutput(), GetAssociationParameters(call)); | 165 Json::Value body; |
166 if (call.ParseJsonRequest(body)) | |
167 { | |
168 const DicomAssociationParameters parameters = GetAssociationParameters(call, body); | |
169 ExecuteEcho(call.GetOutput(), parameters, body); | |
170 } | |
171 else | |
172 { | |
173 throw OrthancException(ErrorCode_BadFileFormat, "Cannot parse the JSON body"); | |
174 } | |
138 } | 175 } |
139 | 176 |
140 | 177 |
141 static void DicomEchoTool(RestApiPostCall& call) | 178 static void DicomEchoTool(RestApiPostCall& call) |
142 { | 179 { |
150 OrthancRestApi::GetContext(call).GetDefaultLocalApplicationEntityTitle(); | 187 OrthancRestApi::GetContext(call).GetDefaultLocalApplicationEntityTitle(); |
151 | 188 |
152 DicomAssociationParameters params(localAet, modality); | 189 DicomAssociationParameters params(localAet, modality); |
153 InjectAssociationTimeout(params, body); | 190 InjectAssociationTimeout(params, body); |
154 | 191 |
155 ExecuteEcho(call.GetOutput(), params); | 192 ExecuteEcho(call.GetOutput(), params, body); |
156 } | 193 } |
157 else | 194 else |
158 { | 195 { |
159 throw OrthancException(ErrorCode_BadFileFormat, "Cannot parse the JSON body"); | 196 throw OrthancException(ErrorCode_BadFileFormat, "Cannot parse the JSON body"); |
160 } | 197 } |