changeset 412:051ba7683c00 transcoding

removing DicomWebFormatter::Locker thanks to new primitives in Orthanc SDK 1.7.0
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 13 May 2020 16:44:13 +0200
parents 0b87924c195b
children 7671ccfc98da
files Plugin/DicomWebFormatter.cpp Plugin/DicomWebFormatter.h Plugin/StowRs.cpp Plugin/WadoRs.cpp
diffstat 4 files changed, 52 insertions(+), 67 deletions(-) [+]
line wrap: on
line diff
--- a/Plugin/DicomWebFormatter.cpp	Tue May 12 21:01:02 2020 +0200
+++ b/Plugin/DicomWebFormatter.cpp	Wed May 13 16:44:13 2020 +0200
@@ -47,9 +47,10 @@
                                    const uint32_t *levelIndex,
                                    uint16_t tagGroup,
                                    uint16_t tagElement,
-                                   OrthancPluginValueRepresentation vr)
+                                   OrthancPluginValueRepresentation vr,
+                                   void* payload)
   {
-    const DicomWebFormatter& that = GetSingleton();
+    const DicomWebFormatter& that = *reinterpret_cast<const DicomWebFormatter*>(payload);
 
     switch (that.mode_)
     {
@@ -60,7 +61,7 @@
 
       case OrthancPluginDicomWebBinaryMode_BulkDataUri:
       {
-        std::string uri = GetSingleton().bulkRoot_;
+        std::string uri = that.bulkRoot_;
 
         for (size_t i = 0; i < levelDepth; i++)
         {
@@ -77,31 +78,25 @@
   }
 
 
-  DicomWebFormatter::Locker::Locker(OrthancPluginDicomWebBinaryMode mode,
-                                    const std::string& bulkRoot) :
-    that_(GetSingleton()),
-    lock_(that_.mutex_)
+  void DicomWebFormatter::Apply(std::string& target,
+                                OrthancPluginContext* context,
+                                const void* data,
+                                size_t size,
+                                bool xml,
+                                OrthancPluginDicomWebBinaryMode mode,
+                                const std::string& bulkRoot)
   {
-    that_.mode_ = mode;
-    that_.bulkRoot_ = bulkRoot;
-  }
-
-
-  void DicomWebFormatter::Locker::Apply(std::string& target,
-                                        OrthancPluginContext* context,
-                                        const void* data,
-                                        size_t size,
-                                        bool xml)
-  {
+    DicomWebFormatter payload(mode, bulkRoot);
+    
     OrthancString s;
 
     if (xml)
     {
-      s.Assign(OrthancPluginEncodeDicomWebXml(context, data, size, Callback));
+      s.Assign(OrthancPluginEncodeDicomWebXml2(context, data, size, Callback, &payload));
     }
     else
     {
-      s.Assign(OrthancPluginEncodeDicomWebJson(context, data, size, Callback));
+      s.Assign(OrthancPluginEncodeDicomWebJson2(context, data, size, Callback, &payload));
     }
 
     if (s.GetContent() == NULL)
@@ -116,14 +111,16 @@
   }
 
 
-  void DicomWebFormatter::Locker::Apply(std::string& target,
-                                        OrthancPluginContext* context,
-                                        const Json::Value& value,
-                                        bool xml)
+  void DicomWebFormatter::Apply(std::string& target,
+                                OrthancPluginContext* context,
+                                const Json::Value& value,
+                                bool xml,
+                                OrthancPluginDicomWebBinaryMode mode,
+                                const std::string& bulkRoot)
   {
     MemoryBuffer dicom;
     dicom.CreateDicom(value, OrthancPluginCreateDicomFlags_None);
-    Apply(target, context, dicom.GetData(), dicom.GetSize(), xml);
+    Apply(target, context, dicom.GetData(), dicom.GetSize(), xml, mode, bulkRoot);
   }
 
 
@@ -166,11 +163,8 @@
 
     std::string item;
 
-    {
-      // TODO - Avoid a global mutex => Need to change Orthanc SDK
-      OrthancPlugins::DicomWebFormatter::Locker locker(mode, bulkRoot);
-      locker.Apply(item, context_, dicom, size, isXml_);
-    }
+    OrthancPlugins::DicomWebFormatter::Apply(
+      item, context_, dicom, size, isXml_, mode, bulkRoot);
    
     if (isXml_)
     {
--- a/Plugin/DicomWebFormatter.h	Tue May 12 21:01:02 2020 +0200
+++ b/Plugin/DicomWebFormatter.h	Wed May 13 16:44:13 2020 +0200
@@ -29,7 +29,6 @@
 #include <json/value.h>
 
 #include <boost/noncopyable.hpp>
-#include <boost/thread/mutex.hpp>
 
 
 namespace OrthancPlugins
@@ -37,16 +36,9 @@
   class DicomWebFormatter : public boost::noncopyable
   {
   private:
-    boost::mutex                     mutex_;
     OrthancPluginDicomWebBinaryMode  mode_;
     std::string                      bulkRoot_;
 
-    static DicomWebFormatter& GetSingleton()
-    {
-      static DicomWebFormatter formatter;
-      return formatter;
-    }
-
     static void Callback(OrthancPluginDicomWebNode *node,
                          OrthancPluginDicomWebSetBinaryNode setter,
                          uint32_t levelDepth,
@@ -55,30 +47,31 @@
                          const uint32_t *levelIndex,
                          uint16_t tagGroup,
                          uint16_t tagElement,
-                         OrthancPluginValueRepresentation vr);
-
-  public:
-    class Locker : public boost::noncopyable
-    {
-    private:
-      DicomWebFormatter&         that_;
-      boost::mutex::scoped_lock  lock_;
+                         OrthancPluginValueRepresentation vr,
+                         void* payload);
 
-    public:
-      Locker(OrthancPluginDicomWebBinaryMode mode,
-             const std::string& bulkRoot);
+    DicomWebFormatter(OrthancPluginDicomWebBinaryMode mode,
+                      const std::string& bulkRoot) :
+      mode_(mode),
+      bulkRoot_(bulkRoot)
+    {
+    }
+    
+  public:
+    static void Apply(std::string& target,
+                      OrthancPluginContext* context,
+                      const void* data,
+                      size_t size,
+                      bool xml,
+                      OrthancPluginDicomWebBinaryMode mode,
+                      const std::string& bulkRoot);
 
-      void Apply(std::string& target,
-                 OrthancPluginContext* context,
-                 const void* data,
-                 size_t size,
-                 bool xml);
-
-      void Apply(std::string& target,
-                 OrthancPluginContext* context,
-                 const Json::Value& value,
-                 bool xml);
-    };
+    static void Apply(std::string& target,
+                      OrthancPluginContext* context,
+                      const Json::Value& value,
+                      bool xml,
+                      OrthancPluginDicomWebBinaryMode mode,
+                      const std::string& bulkRoot);
 
     class HttpWriter : public boost::noncopyable
     {
--- a/Plugin/StowRs.cpp	Tue May 12 21:01:02 2020 +0200
+++ b/Plugin/StowRs.cpp	Wed May 13 16:44:13 2020 +0200
@@ -191,10 +191,8 @@
     
     std::string answer;
     
-    {
-      DicomWebFormatter::Locker locker(OrthancPluginDicomWebBinaryMode_Ignore, "");
-      locker.Apply(answer, context_, result_, xml_);
-    }
+    DicomWebFormatter::Apply(answer, context_, result_, xml_,
+                             OrthancPluginDicomWebBinaryMode_Ignore, "");
       
     OrthancPluginAnswerBuffer(context_, output, answer.c_str(), answer.size(),
                               xml_ ? "application/dicom+xml" : "application/dicom+json");
--- a/Plugin/WadoRs.cpp	Tue May 12 21:01:02 2020 +0200
+++ b/Plugin/WadoRs.cpp	Wed May 13 16:44:13 2020 +0200
@@ -692,9 +692,9 @@
       std::string dicomweb;
       {
         // TODO - Avoid a global mutex => Need to change Orthanc SDK
-        OrthancPlugins::DicomWebFormatter::Locker locker(OrthancPluginDicomWebBinaryMode_Ignore, "");
-        locker.Apply(dicomweb, OrthancPlugins::GetGlobalContext(),
-                     buffer.GetData(), buffer.GetSize(), false /* JSON */);
+        OrthancPlugins::DicomWebFormatter::Apply(
+          dicomweb, OrthancPlugins::GetGlobalContext(), buffer.GetData(), buffer.GetSize(),
+          false /* JSON */, OrthancPluginDicomWebBinaryMode_Ignore, "");
       }
 
       buffer.RestApiPut("/instances/" + orthancId + "/attachments/4444", dicomweb, false);