changeset 451:f9abaad46bba

preparing for transcoding in WADO-RS retrieve
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 22 Jun 2020 15:02:56 +0200
parents 00a018f4ec05
children 36d04c9586c1
files Plugin/WadoRs.cpp
diffstat 1 files changed, 45 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/Plugin/WadoRs.cpp	Mon Jun 22 14:55:53 2020 +0200
+++ b/Plugin/WadoRs.cpp	Mon Jun 22 15:02:56 2020 +0200
@@ -56,8 +56,11 @@
 
 
 
-static bool AcceptMultipartDicom(const OrthancPluginHttpRequest* request)
+static bool AcceptMultipartDicom(bool& transcode,
+                                 Orthanc::DicomTransferSyntax& transferSyntax /* only if transcoding */,
+                                 const OrthancPluginHttpRequest* request)
 {
+  transcode = false;
   std::string accept;
 
   if (!OrthancPlugins::LookupHttpHeader(accept, request, "accept"))
@@ -90,16 +93,23 @@
 
   static const char* const TRANSFER_SYNTAX = "transfer-syntax";
 
-  /**
-   * The "*" case below is related to Google Healthcare API:
-   * https://groups.google.com/d/msg/orthanc-users/w1Ekrsc6-U8/T2a_DoQ5CwAJ
-   **/
-  if (attributes.find(TRANSFER_SYNTAX) != attributes.end() &&
-      attributes[TRANSFER_SYNTAX] != "*")
+  std::map<std::string, std::string>::const_iterator found = attributes.find(TRANSFER_SYNTAX);
+  if (found != attributes.end())
   {
-    throw Orthanc::OrthancException(Orthanc::ErrorCode_BadRequest,
-                                    "This WADO-RS plugin cannot change the transfer syntax to " + 
-                                    attributes["transfer-syntax"]);
+    /**
+     * The "*" case below is related to Google Healthcare API:
+     * https://groups.google.com/d/msg/orthanc-users/w1Ekrsc6-U8/T2a_DoQ5CwAJ
+     **/
+    if (found->second == "*")
+    {
+      transcode = false;
+    }
+    else
+    {
+      throw Orthanc::OrthancException(Orthanc::ErrorCode_BadRequest,
+                                      "This WADO-RS plugin cannot change the transfer syntax to " + 
+                                      found->second);
+    }
   }
 
   return true;
@@ -222,7 +232,9 @@
 
 static void AnswerListOfDicomInstances(OrthancPluginRestOutput* output,
                                        Orthanc::ResourceType level,
-                                       const std::string& publicId)
+                                       const std::string& publicId,
+                                       bool transcode,
+                                       Orthanc::DicomTransferSyntax transferSyntax /* only if transcoding */)
 {
   if (level != Orthanc::ResourceType_Study &&
       level != Orthanc::ResourceType_Series &&
@@ -263,11 +275,16 @@
     std::string uri = "/instances/" + instances[i]["ID"].asString() + "/file";
 
     OrthancPlugins::MemoryBuffer dicom;
-    if (dicom.RestApiGet(uri, false) &&
+    if (dicom.RestApiGet(uri, false))
+    {
+      if (!
         OrthancPluginSendMultipartItem(context, output, dicom.GetData(), dicom.GetSize()) != 0)
     {
       throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
     }
+
+      /*instance.reset(OrthancPlugins::DicomInstance::Transcode(
+        content.GetData(), content.GetSize(), GetTransferSyntaxUid(targetSyntax)));*/
   }
 }
 
@@ -867,7 +884,10 @@
                         const char* url,
                         const OrthancPluginHttpRequest* request)
 {
-  if (!AcceptMultipartDicom(request))
+  bool transcode;
+  Orthanc::DicomTransferSyntax transferSyntax;
+  
+  if (!AcceptMultipartDicom(transcode, transferSyntax, request))
   {
     OrthancPluginSendHttpStatusCode(OrthancPlugins::GetGlobalContext(), output, 400 /* Bad request */);
   }
@@ -876,7 +896,7 @@
     std::string orthancId, studyInstanceUid;
     if (LocateStudy(output, orthancId, studyInstanceUid, request))
     {
-      AnswerListOfDicomInstances(output, Orthanc::ResourceType_Study, orthancId);
+      AnswerListOfDicomInstances(output, Orthanc::ResourceType_Study, orthancId, transcode, transferSyntax);
     }
   }
 }
@@ -886,7 +906,10 @@
                          const char* url,
                          const OrthancPluginHttpRequest* request)
 {
-  if (!AcceptMultipartDicom(request))
+  bool transcode;
+  Orthanc::DicomTransferSyntax transferSyntax;
+  
+  if (!AcceptMultipartDicom(transcode, transferSyntax, request))
   {
     OrthancPluginSendHttpStatusCode(OrthancPlugins::GetGlobalContext(), output, 400 /* Bad request */);
   }
@@ -895,7 +918,7 @@
     std::string orthancId, studyInstanceUid, seriesInstanceUid;
     if (LocateSeries(output, orthancId, studyInstanceUid, seriesInstanceUid, request))
     {
-      AnswerListOfDicomInstances(output, Orthanc::ResourceType_Series, orthancId);
+      AnswerListOfDicomInstances(output, Orthanc::ResourceType_Series, orthancId, transcode, transferSyntax);
     }
   }
 }
@@ -906,18 +929,19 @@
                            const char* url,
                            const OrthancPluginHttpRequest* request)
 {
-  OrthancPluginContext* context = OrthancPlugins::GetGlobalContext();
-
-  if (!AcceptMultipartDicom(request))
+  bool transcode;
+  Orthanc::DicomTransferSyntax transferSyntax;
+  
+  if (!AcceptMultipartDicom(transcode, transferSyntax, request))
   {
-    OrthancPluginSendHttpStatusCode(context, output, 400 /* Bad request */);
+    OrthancPluginSendHttpStatusCode(OrthancPlugins::GetGlobalContext(), output, 400 /* Bad request */);
   }
   else
   {
     std::string orthancId, studyInstanceUid, seriesInstanceUid, sopInstanceUid;
     if (LocateInstance(output, orthancId, studyInstanceUid, seriesInstanceUid, sopInstanceUid, request))
     {
-      AnswerListOfDicomInstances(output, Orthanc::ResourceType_Instance, orthancId);
+      AnswerListOfDicomInstances(output, Orthanc::ResourceType_Instance, orthancId, transcode, transferSyntax);
     }
   }
 }