diff OrthancServer/OrthancRestApi/OrthancRestArchive.cpp @ 3913:6ddad3e0b569 transcoding

transcoding ZIP archive and media
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 08 May 2020 19:15:28 +0200
parents 2a170a8f1faf
children
line wrap: on
line diff
--- a/OrthancServer/OrthancRestApi/OrthancRestArchive.cpp	Fri May 08 13:43:50 2020 +0200
+++ b/OrthancServer/OrthancRestApi/OrthancRestArchive.cpp	Fri May 08 19:15:28 2020 +0200
@@ -46,6 +46,7 @@
 {
   static const char* const KEY_RESOURCES = "Resources";
   static const char* const KEY_EXTENDED = "Extended";
+  static const char* const KEY_TRANSCODE = "Transcode";
   
   static void AddResourcesOfInterestFromArray(ArchiveJob& job,
                                               const Json::Value& resources)
@@ -98,11 +99,28 @@
   }
 
 
-  static void GetJobParameters(bool& synchronous,         /* out */
-                               bool& extended,            /* out */
-                               int& priority,             /* out */
-                               const Json::Value& body,   /* in */
-                               const bool defaultExtended /* in */)
+  static DicomTransferSyntax GetTransferSyntax(const std::string& value)
+  {
+    DicomTransferSyntax syntax;
+    if (LookupTransferSyntax(syntax, value))
+    {
+      return syntax;
+    }
+    else
+    {
+      throw OrthancException(ErrorCode_ParameterOutOfRange,
+                             "Unknown transfer syntax: " + value);
+    }
+  }
+  
+  
+  static void GetJobParameters(bool& synchronous,            /* out */
+                               bool& extended,               /* out */
+                               bool& transcode,              /* out */
+                               DicomTransferSyntax& syntax,  /* out */
+                               int& priority,                /* out */
+                               const Json::Value& body,      /* in */
+                               const bool defaultExtended    /* in */)
   {
     synchronous = OrthancRestApi::IsSynchronousJobRequest
       (true /* synchronous by default */, body);
@@ -118,6 +136,17 @@
     {
       extended = defaultExtended;
     }
+
+    if (body.type() == Json::objectValue &&
+        body.isMember(KEY_TRANSCODE))
+    {
+      transcode = true;
+      syntax = GetTransferSyntax(SerializationToolbox::ReadString(body, KEY_TRANSCODE));
+    }
+    else
+    {
+      transcode = false;
+    }
   }
 
 
@@ -175,12 +204,20 @@
     Json::Value body;
     if (call.ParseJsonRequest(body))
     {
-      bool synchronous, extended;
+      bool synchronous, extended, transcode;
+      DicomTransferSyntax transferSyntax;
       int priority;
-      GetJobParameters(synchronous, extended, priority, body, DEFAULT_IS_EXTENDED);
+      GetJobParameters(synchronous, extended, transcode, transferSyntax,
+                       priority, body, DEFAULT_IS_EXTENDED);
       
       std::unique_ptr<ArchiveJob> job(new ArchiveJob(context, IS_MEDIA, extended));
       AddResourcesOfInterest(*job, body);
+
+      if (transcode)
+      {
+        job->SetTranscode(transferSyntax);
+      }
+      
       SubmitJob(call.GetOutput(), context, job, priority, synchronous, "Archive.zip");
     }
     else
@@ -208,10 +245,16 @@
     {
       extended = false;
     }
-    
+
     std::unique_ptr<ArchiveJob> job(new ArchiveJob(context, IS_MEDIA, extended));
     job->AddResource(id);
 
+    static const char* const TRANSCODE = "transcode";
+    if (call.HasArgument(TRANSCODE))
+    {
+      job->SetTranscode(GetTransferSyntax(call.GetArgument(TRANSCODE, "")));
+    }
+
     SubmitJob(call.GetOutput(), context, job, 0 /* priority */,
               true /* synchronous */, id + ".zip");
   }
@@ -228,12 +271,20 @@
     Json::Value body;
     if (call.ParseJsonRequest(body))
     {
-      bool synchronous, extended;
+      bool synchronous, extended, transcode;
+      DicomTransferSyntax transferSyntax;
       int priority;
-      GetJobParameters(synchronous, extended, priority, body, DEFAULT_IS_EXTENDED);
+      GetJobParameters(synchronous, extended, transcode, transferSyntax,
+                       priority, body, DEFAULT_IS_EXTENDED);
       
       std::unique_ptr<ArchiveJob> job(new ArchiveJob(context, IS_MEDIA, extended));
       job->AddResource(id);
+
+      if (transcode)
+      {
+        job->SetTranscode(transferSyntax);
+      }
+
       SubmitJob(call.GetOutput(), context, job, priority, synchronous, id + ".zip");
     }
     else