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 }