diff OrthancServer/OrthancRestApi/OrthancRestModalities.cpp @ 3870:09798f2b985f transcoding

added a Timeout argument to every DICOM command + 'TargetAet' not mandatory anymore in /retrieve
author Alain Mazy <alain@mazy.be>
date Wed, 29 Apr 2020 12:26:51 +0200
parents 9973d10bc5c4
children 2effa961f67f
line wrap: on
line diff
--- a/OrthancServer/OrthancRestApi/OrthancRestModalities.cpp	Tue Apr 28 16:46:04 2020 +0200
+++ b/OrthancServer/OrthancRestApi/OrthancRestModalities.cpp	Wed Apr 29 12:26:51 2020 +0200
@@ -80,10 +80,20 @@
     RemoteModalityParameters remote =
       MyGetModalityUsingSymbolicName(call.GetUriComponent("id", ""));
 
+    Json::Value request;
+    call.ParseJsonRequest(request);
+    int timeout = Toolbox::GetJsonIntegerField(request, "Timeout", -1);
+
     try
     {
       DicomControlUserConnection connection(localAet, remote);
-      
+
+      // New in Orthanc 1.7.0
+      if (timeout != -1)
+      {
+        connection.SetTimeout(timeout);
+      }
+
       if (connection.Echo())
       {
         // Echo has succeeded
@@ -605,16 +615,25 @@
     ServerContext& context = OrthancRestApi::GetContext(call);
 
     std::string targetAet;
+    int timeout = -1;
     
     Json::Value body;
     if (call.ParseJsonRequest(body))
     {
-      targetAet = SerializationToolbox::ReadString(body, "TargetAet");
+      targetAet = Toolbox::GetJsonStringField(body, "TargetAet", context.GetDefaultLocalApplicationEntityTitle());
+      timeout = Toolbox::GetJsonIntegerField(body, "Timeout", -1);
     }
     else
     {
       body = Json::objectValue;
-      call.BodyToString(targetAet);
+      if (call.GetBodySize() > 0)
+      {
+        call.BodyToString(targetAet);
+      }
+      else
+      {
+        targetAet = context.GetDefaultLocalApplicationEntityTitle();
+      }
     }
     
     std::unique_ptr<DicomMoveScuJob> job(new DicomMoveScuJob(context));
@@ -624,6 +643,7 @@
       job->SetTargetAet(targetAet);
       job->SetLocalAet(query.GetHandler().GetLocalAet());
       job->SetRemoteModality(query.GetHandler().GetRemoteModality());
+      job->SetTimeout(timeout);
 
       LOG(WARNING) << "Driving C-Move SCU on remote modality "
                    << query.GetHandler().GetRemoteModality().GetApplicationEntityTitle()
@@ -953,6 +973,8 @@
       (request, "MoveOriginatorAet", context.GetDefaultLocalApplicationEntityTitle());
     int moveOriginatorID = Toolbox::GetJsonIntegerField
       (request, "MoveOriginatorID", 0 /* By default, not a C-MOVE */);
+    int timeout = Toolbox::GetJsonIntegerField
+      (request, "Timeout", -1);
 
     job->SetLocalAet(localAet);
     job->SetRemoteModality(MyGetModalityUsingSymbolicName(remote));
@@ -968,6 +990,9 @@
       job->EnableStorageCommitment(true);
     }
 
+    // New in Orthanc 1.7.0
+    job->SetTimeout(timeout);
+
     OrthancRestApi::GetApi(call).SubmitCommandsJob
       (call, job.release(), true /* synchronous by default */, request);
   }
@@ -1022,11 +1047,18 @@
       (request, "LocalAet", context.GetDefaultLocalApplicationEntityTitle());
     std::string targetAet = Toolbox::GetJsonStringField
       (request, "TargetAet", context.GetDefaultLocalApplicationEntityTitle());
+    int timeout = Toolbox::GetJsonIntegerField
+      (request, "Timeout", -1);
 
     const RemoteModalityParameters source =
       MyGetModalityUsingSymbolicName(call.GetUriComponent("id", ""));
 
     DicomControlUserConnection connection(localAet, source);
+
+    if (timeout > -1)
+    {
+      connection.SetTimeout(timeout);
+    }
     
     for (Json::Value::ArrayIndex i = 0; i < request[KEY_RESOURCES].size(); i++)
     {