changeset 153:158f4fdb0690 dev

sync
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 30 Jun 2016 20:22:44 +0200
parents cb2b84c883d4
children 7dc0481f025a
files Orthanc/Core/Toolbox.cpp Orthanc/Core/Toolbox.h Orthanc/Plugins/Samples/Common/OrthancPluginCppWrapper.cpp Orthanc/Plugins/Samples/Common/OrthancPluginCppWrapper.h Orthanc/Resources/CMake/BoostConfiguration.cmake Orthanc/Sdk-mainline/orthanc/OrthancCPlugin.h Plugin/DicomWebClient.cpp Plugin/QidoRs.cpp Plugin/WadoRs.cpp Plugin/WadoRsRetrieveFrames.cpp Plugin/WadoUri.cpp
diffstat 11 files changed, 207 insertions(+), 77 deletions(-) [+]
line wrap: on
line diff
--- a/Orthanc/Core/Toolbox.cpp	Mon Jun 27 17:20:36 2016 +0200
+++ b/Orthanc/Core/Toolbox.cpp	Thu Jun 30 20:22:44 2016 +0200
@@ -111,6 +111,7 @@
 
 namespace Orthanc
 {
+#if !defined(ORTHANC_SANDBOXED) || ORTHANC_SANDBOXED != 1
   static bool finish_;
   static ServerBarrierEvent barrierEvent_;
 
@@ -188,6 +189,7 @@
     const bool stopFlag = false;
     return ServerBarrierInternal(&stopFlag);
   }
+#endif  /* ORTHANC_SANDBOXED */
 
 
   void Toolbox::ToUpperCase(std::string& s)
@@ -677,11 +679,15 @@
     return std::string(pathbuf);
   }
 
+#elif defined(ORTHANC_SANDBOXED) && ORTHANC_SANDBOXED == 1
+  // Sandboxed Orthanc, no access to the executable
+
 #else
 #error Support your platform here
 #endif
 
 
+#if !defined(ORTHANC_SANDBOXED) || ORTHANC_SANDBOXED != 1
   std::string Toolbox::GetPathToExecutable()
   {
     boost::filesystem::path p(GetPathToExecutableInternal());
@@ -694,6 +700,7 @@
     boost::filesystem::path p(GetPathToExecutableInternal());
     return boost::filesystem::absolute(p.parent_path()).string();
   }
+#endif
 
 
   static const char* GetBoostLocaleEncoding(const Encoding sourceEncoding)
--- a/Orthanc/Core/Toolbox.h	Mon Jun 27 17:20:36 2016 +0200
+++ b/Orthanc/Core/Toolbox.h	Thu Jun 30 20:22:44 2016 +0200
@@ -49,9 +49,11 @@
 
   namespace Toolbox
   {
+#if !defined(ORTHANC_SANDBOXED) || ORTHANC_SANDBOXED != 1
     ServerBarrierEvent ServerBarrier(const bool& stopFlag);
 
     ServerBarrierEvent ServerBarrier();
+#endif
 
     void ToUpperCase(std::string& s);  // Inplace version
 
@@ -77,7 +79,9 @@
                    size_t size,
                    const std::string& path);
 
+#if !defined(ORTHANC_SANDBOXED) || ORTHANC_SANDBOXED != 1
     void USleep(uint64_t microSeconds);
+#endif
 
     void RemoveFile(const std::string& path);
 
@@ -137,9 +141,11 @@
                              const std::string& content);
 #endif
 
+#if !defined(ORTHANC_SANDBOXED) || ORTHANC_SANDBOXED != 1
     std::string GetPathToExecutable();
 
     std::string GetDirectoryOfExecutable();
+#endif
 
     std::string ConvertToUtf8(const std::string& source,
                               Encoding sourceEncoding);
--- a/Orthanc/Plugins/Samples/Common/OrthancPluginCppWrapper.cpp	Mon Jun 27 17:20:36 2016 +0200
+++ b/Orthanc/Plugins/Samples/Common/OrthancPluginCppWrapper.cpp	Thu Jun 30 20:22:44 2016 +0200
@@ -33,6 +33,7 @@
 #include "OrthancPluginCppWrapper.h"
 
 #include <json/reader.h>
+#include <json/writer.h>
 
 
 namespace OrthancPlugins
@@ -50,6 +51,15 @@
     }
   }
 
+  
+  void PluginException::Check(OrthancPluginErrorCode code)
+  {
+    if (code != OrthancPluginErrorCode_Success)
+    {
+      throw PluginException(code);
+    }
+  }
+
 
   MemoryBuffer::MemoryBuffer(OrthancPluginContext* context) : 
     context_(context)
@@ -214,6 +224,36 @@
   }
 
 
+  bool MemoryBuffer::RestApiPost(const std::string& uri,
+                                 const Json::Value& body,
+                                 bool applyPlugins)
+  {
+    Json::FastWriter writer;
+    return RestApiPost(uri, writer.write(body), applyPlugins);
+  }
+
+
+  bool MemoryBuffer::RestApiPut(const std::string& uri,
+                                const Json::Value& body,
+                                bool applyPlugins)
+  {
+    Json::FastWriter writer;
+    return RestApiPut(uri, writer.write(body), applyPlugins);
+  }
+
+
+  void MemoryBuffer::CreateDicom(const Json::Value& tags,
+                                 OrthancPluginCreateDicomFlags flags)
+  {
+    Clear();
+
+    Json::FastWriter writer;
+    std::string s = writer.write(tags);
+    
+    PluginException::Check(OrthancPluginCreateDicom(context_, &buffer_, s.c_str(), NULL, flags));
+  }
+
+
   OrthancString::OrthancString(OrthancPluginContext* context,
                                char* str) :
     context_(context),
@@ -738,10 +778,10 @@
   }
 
 
-  bool RestApiGetJson(Json::Value& result,
-                      OrthancPluginContext* context,
-                      const std::string& uri,
-                      bool applyPlugins)
+  bool RestApiGet(Json::Value& result,
+                  OrthancPluginContext* context,
+                  const std::string& uri,
+                  bool applyPlugins)
   {
     MemoryBuffer answer(context);
     if (!answer.RestApiGet(uri, applyPlugins))
@@ -756,12 +796,12 @@
   }
 
 
-  bool RestApiPostJson(Json::Value& result,
-                       OrthancPluginContext* context,
-                       const std::string& uri,
-                       const char* body,
-                       size_t bodySize,
-                       bool applyPlugins)
+  bool RestApiPost(Json::Value& result,
+                   OrthancPluginContext* context,
+                   const std::string& uri,
+                   const char* body,
+                   size_t bodySize,
+                   bool applyPlugins)
   {
     MemoryBuffer answer(context);
     if (!answer.RestApiPost(uri, body, bodySize, applyPlugins))
@@ -776,12 +816,23 @@
   }
 
 
-  bool RestApiPutJson(Json::Value& result,
-                      OrthancPluginContext* context,
-                      const std::string& uri,
-                      const char* body,
-                      size_t bodySize,
-                      bool applyPlugins)
+  bool RestApiPost(Json::Value& result,
+                   OrthancPluginContext* context,
+                   const std::string& uri,
+                   const Json::Value& body,
+                   bool applyPlugins)
+  {
+    Json::FastWriter writer;
+    return RestApiPost(result, context, uri, writer.write(body), applyPlugins);
+  }
+
+
+  bool RestApiPut(Json::Value& result,
+                  OrthancPluginContext* context,
+                  const std::string& uri,
+                  const char* body,
+                  size_t bodySize,
+                  bool applyPlugins)
   {
     MemoryBuffer answer(context);
     if (!answer.RestApiPut(uri, body, bodySize, applyPlugins))
@@ -796,6 +847,17 @@
   }
 
 
+  bool RestApiPut(Json::Value& result,
+                   OrthancPluginContext* context,
+                   const std::string& uri,
+                   const Json::Value& body,
+                   bool applyPlugins)
+  {
+    Json::FastWriter writer;
+    return RestApiPut(result, context, uri, writer.write(body), applyPlugins);
+  }
+
+
   bool RestApiDelete(OrthancPluginContext* context,
                      const std::string& uri,
                      bool applyPlugins)
--- a/Orthanc/Plugins/Samples/Common/OrthancPluginCppWrapper.h	Mon Jun 27 17:20:36 2016 +0200
+++ b/Orthanc/Plugins/Samples/Common/OrthancPluginCppWrapper.h	Thu Jun 30 20:22:44 2016 +0200
@@ -38,7 +38,7 @@
 #include <json/value.h>
 
 #if HAS_ORTHANC_EXCEPTION == 1
-#  include <OrthancException.h>
+#  include "../../../Core/OrthancException.h"
 #endif
 
 
@@ -65,6 +65,8 @@
     }
 
     const char* GetErrorDescription(OrthancPluginContext* context) const;
+
+    static void Check(OrthancPluginErrorCode code);
   };
 
 
@@ -127,6 +129,14 @@
                     bool applyPlugins);
 
     bool RestApiPost(const std::string& uri,
+                     const Json::Value& body,
+                     bool applyPlugins);
+
+    bool RestApiPut(const std::string& uri,
+                    const Json::Value& body,
+                    bool applyPlugins);
+
+    bool RestApiPost(const std::string& uri,
                      const std::string& body,
                      bool applyPlugins)
     {
@@ -139,6 +149,9 @@
     {
       return RestApiPut(uri, body.empty() ? NULL : body.c_str(), body.size(), applyPlugins);
     }
+
+    void CreateDicom(const Json::Value& tags,
+                     OrthancPluginCreateDicomFlags flags);
   };
 
 
@@ -285,53 +298,92 @@
   };
 
 
-  bool RestApiGetJson(Json::Value& result,
-                      OrthancPluginContext* context,
-                      const std::string& uri,
-                      bool applyPlugins);
+  bool RestApiGet(Json::Value& result,
+                  OrthancPluginContext* context,
+                  const std::string& uri,
+                  bool applyPlugins);
 
-  bool RestApiPostJson(Json::Value& result,
-                       OrthancPluginContext* context,
-                       const std::string& uri,
-                       const char* body,
-                       size_t bodySize,
-                       bool applyPlugins);
+  bool RestApiPost(Json::Value& result,
+                   OrthancPluginContext* context,
+                   const std::string& uri,
+                   const char* body,
+                   size_t bodySize,
+                   bool applyPlugins);
+
+  bool RestApiPost(Json::Value& result,
+                   OrthancPluginContext* context,
+                   const std::string& uri,
+                   const Json::Value& body,
+                   bool applyPlugins);
 
-  bool RestApiPutJson(Json::Value& result,
-                      OrthancPluginContext* context,
-                      const std::string& uri,
-                      const char* body,
-                      size_t bodySize,
-                      bool applyPlugins);
+  inline bool RestApiPost(Json::Value& result,
+                          OrthancPluginContext* context,
+                          const std::string& uri,
+                          const std::string& body,
+                          bool applyPlugins)
+  {
+    return RestApiPost(result, context, uri, body.empty() ? NULL : body.c_str(), 
+                       body.size(), applyPlugins);
+  }
 
-  inline bool RestApiPostJson(Json::Value& result,
-                              OrthancPluginContext* context,
-                              const std::string& uri,
-                              const std::string& body,
-                              bool applyPlugins)
+  bool RestApiPut(Json::Value& result,
+                  OrthancPluginContext* context,
+                  const std::string& uri,
+                  const char* body,
+                  size_t bodySize,
+                  bool applyPlugins);
+
+  bool RestApiPut(Json::Value& result,
+                  OrthancPluginContext* context,
+                  const std::string& uri,
+                  const Json::Value& body,
+                  bool applyPlugins);
+
+  inline bool RestApiPut(Json::Value& result,
+                         OrthancPluginContext* context,
+                         const std::string& uri,
+                         const std::string& body,
+                         bool applyPlugins)
   {
-    return RestApiPostJson(result, context, uri, body.empty() ? NULL : body.c_str(), 
-                           body.size(), applyPlugins);
+    return RestApiPut(result, context, uri, body.empty() ? NULL : body.c_str(), 
+                      body.size(), applyPlugins);
   }
 
   bool RestApiDelete(OrthancPluginContext* context,
                      const std::string& uri,
                      bool applyPlugins);
 
-  inline bool RestApiPutJson(Json::Value& result,
-                             OrthancPluginContext* context,
-                             const std::string& uri,
-                             const std::string& body,
-                             bool applyPlugins)
-  {
-    return RestApiPutJson(result, context, uri, body.empty() ? NULL : body.c_str(), 
-                          body.size(), applyPlugins);
-  }
-
   bool RestApiDelete(OrthancPluginContext* context,
                      const std::string& uri,
                      bool applyPlugins);
 
+  inline void LogError(OrthancPluginContext* context,
+                       const std::string& message)
+  {
+    if (context != NULL)
+    {
+      OrthancPluginLogError(context, message.c_str());
+    }
+  }
+
+  inline void LogWarning(OrthancPluginContext* context,
+                         const std::string& message)
+  {
+    if (context != NULL)
+    {
+      OrthancPluginLogWarning(context, message.c_str());
+    }
+  }
+
+  inline void LogInfo(OrthancPluginContext* context,
+                      const std::string& message)
+  {
+    if (context != NULL)
+    {
+      OrthancPluginLogInfo(context, message.c_str());
+    }
+  }
+
 
   namespace Internals
   {
@@ -355,7 +407,7 @@
         return static_cast<OrthancPluginErrorCode>(e.GetErrorCode());
       }
 #endif
-      catch (boost::bad_lexical_cast& e)
+      catch (boost::bad_lexical_cast&)
       {
         return OrthancPluginErrorCode_BadFileFormat;
       }
--- a/Orthanc/Resources/CMake/BoostConfiguration.cmake	Mon Jun 27 17:20:36 2016 +0200
+++ b/Orthanc/Resources/CMake/BoostConfiguration.cmake	Thu Jun 30 20:22:44 2016 +0200
@@ -54,7 +54,8 @@
   if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux" OR
       ${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" OR
       ${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD" OR
-      ${CMAKE_SYSTEM_NAME} STREQUAL "kFreeBSD")
+      ${CMAKE_SYSTEM_NAME} STREQUAL "kFreeBSD" OR
+      ${CMAKE_SYSTEM_NAME} STREQUAL "PNaCl")
     list(APPEND BOOST_SOURCES
       ${BOOST_SOURCES_DIR}/libs/thread/src/pthread/once.cpp
       ${BOOST_SOURCES_DIR}/libs/thread/src/pthread/thread.cpp
@@ -65,7 +66,8 @@
       -DBOOST_LOCALE_NO_STD_BACKEND=1
       )
 
-    if ("${CMAKE_SYSTEM_VERSION}" STREQUAL "LinuxStandardBase")
+    if ("${CMAKE_SYSTEM_VERSION}" STREQUAL "LinuxStandardBase" OR
+        ${CMAKE_SYSTEM_NAME} STREQUAL "PNaCl")
       add_definitions(-DBOOST_HAS_SCHED_YIELD=1)
     endif()
 
@@ -119,7 +121,8 @@
     if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux" OR
         ${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" OR
         ${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD" OR
-        ${CMAKE_SYSTEM_NAME} STREQUAL "kFreeBSD")
+        ${CMAKE_SYSTEM_NAME} STREQUAL "kFreeBSD" OR
+        ${CMAKE_SYSTEM_NAME} STREQUAL "PNaCl")
       list(APPEND BOOST_SOURCES
         ${BOOST_SOURCES_DIR}/libs/locale/src/posix/codecvt.cpp
         ${BOOST_SOURCES_DIR}/libs/locale/src/posix/collate.cpp
--- a/Orthanc/Sdk-mainline/orthanc/OrthancCPlugin.h	Mon Jun 27 17:20:36 2016 +0200
+++ b/Orthanc/Sdk-mainline/orthanc/OrthancCPlugin.h	Thu Jun 30 20:22:44 2016 +0200
@@ -116,8 +116,8 @@
 #endif
 
 #define ORTHANC_PLUGINS_MINIMAL_MAJOR_NUMBER     1
-#define ORTHANC_PLUGINS_MINIMAL_MINOR_NUMBER     0
-#define ORTHANC_PLUGINS_MINIMAL_REVISION_NUMBER  1
+#define ORTHANC_PLUGINS_MINIMAL_MINOR_NUMBER     1
+#define ORTHANC_PLUGINS_MINIMAL_REVISION_NUMBER  0
 
 
 
--- a/Plugin/DicomWebClient.cpp	Mon Jun 27 17:20:36 2016 +0200
+++ b/Plugin/DicomWebClient.cpp	Thu Jun 30 20:22:44 2016 +0200
@@ -135,17 +135,17 @@
 
     // Test whether this resource is an instance
     Json::Value tmp;
-    if (OrthancPlugins::RestApiGetJson(tmp, context, "/instances/" + resource, false))
+    if (OrthancPlugins::RestApiGet(tmp, context, "/instances/" + resource, false))
     {
       AddInstance(instances, tmp);
     }
     // This was not an instance, successively try with series/studies/patients
-    else if ((OrthancPlugins::RestApiGetJson(tmp, context, "/series/" + resource, false) &&
-              OrthancPlugins::RestApiGetJson(tmp, context, "/series/" + resource + "/instances", false)) ||
-             (OrthancPlugins::RestApiGetJson(tmp, context, "/studies/" + resource, false) &&
-              OrthancPlugins::RestApiGetJson(tmp, context, "/studies/" + resource + "/instances", false)) ||
-             (OrthancPlugins::RestApiGetJson(tmp, context, "/patients/" + resource, false) &&
-              OrthancPlugins::RestApiGetJson(tmp, context, "/patients/" + resource + "/instances", false)))
+    else if ((OrthancPlugins::RestApiGet(tmp, context, "/series/" + resource, false) &&
+              OrthancPlugins::RestApiGet(tmp, context, "/series/" + resource + "/instances", false)) ||
+             (OrthancPlugins::RestApiGet(tmp, context, "/studies/" + resource, false) &&
+              OrthancPlugins::RestApiGet(tmp, context, "/studies/" + resource + "/instances", false)) ||
+             (OrthancPlugins::RestApiGet(tmp, context, "/patients/" + resource, false) &&
+              OrthancPlugins::RestApiGet(tmp, context, "/patients/" + resource + "/instances", false)))
     {
       if (tmp.type() != Json::arrayValue)
       {
--- a/Plugin/QidoRs.cpp	Mon Jun 27 17:20:36 2016 +0200
+++ b/Plugin/QidoRs.cpp	Thu Jun 30 20:22:44 2016 +0200
@@ -288,8 +288,8 @@
         case QueryLevel_Study:
         {
           Json::Value series, instances;
-          if (OrthancPlugins::RestApiGetJson(series, context, "/studies/" + resource + "/series?expand", false) &&
-              OrthancPlugins::RestApiGetJson(instances, context, "/studies/" + resource + "/instances", false))
+          if (OrthancPlugins::RestApiGet(series, context, "/studies/" + resource + "/series?expand", false) &&
+              OrthancPlugins::RestApiGet(instances, context, "/studies/" + resource + "/instances", false))
           {
             // Number of Study Related Series
             target[gdcm::Tag(0x0020, 0x1206)] = boost::lexical_cast<std::string>(series.size());
@@ -335,7 +335,7 @@
         case QueryLevel_Series:
         {
           Json::Value instances;
-          if (OrthancPlugins::RestApiGetJson(instances, context, "/series/" + resource + "/instances", false))
+          if (OrthancPlugins::RestApiGet(instances, context, "/series/" + resource + "/instances", false))
           {
             // Number of Series Related Instances
             target[gdcm::Tag(0x0020, 0x1209)] = boost::lexical_cast<std::string>(instances.size());
@@ -507,7 +507,7 @@
   std::string body = writer.write(find);
   
   Json::Value resources;
-  if (!OrthancPlugins::RestApiPostJson(resources, context, "/tools/find", body, false) ||
+  if (!OrthancPlugins::RestApiPost(resources, context, "/tools/find", body, false) ||
       resources.type() != Json::arrayValue)
   {
     throw OrthancPlugins::PluginException(OrthancPluginErrorCode_InternalError);
@@ -527,7 +527,7 @@
     {
       // Find one child instance of this resource
       Json::Value tmp;
-      if (OrthancPlugins::RestApiGetJson(tmp, context, root + resource + "/instances", false) &&
+      if (OrthancPlugins::RestApiGet(tmp, context, root + resource + "/instances", false) &&
           tmp.type() == Json::arrayValue &&
           tmp.size() > 0)
       {
@@ -585,7 +585,7 @@
          it = resourcesAndInstances.begin(); it != resourcesAndInstances.end(); ++it)
   {
     Json::Value tags;
-    if (OrthancPlugins::RestApiGetJson(tags, context, "/instances/" + it->second + "/tags", false))
+    if (OrthancPlugins::RestApiGet(tags, context, "/instances/" + it->second + "/tags", false))
     {
       std::string wadoUrl = OrthancPlugins::Configuration::GetWadoUrl(
         wadoBase, 
--- a/Plugin/WadoRs.cpp	Mon Jun 27 17:20:36 2016 +0200
+++ b/Plugin/WadoRs.cpp	Thu Jun 30 20:22:44 2016 +0200
@@ -174,7 +174,7 @@
   OrthancPluginContext* context = OrthancPlugins::Configuration::GetContext();
 
   Json::Value instances;
-  if (!OrthancPlugins::RestApiGetJson(instances, context, resource + "/instances", false))
+  if (!OrthancPlugins::RestApiGet(instances, context, resource + "/instances", false))
   {
     // Internal error
     OrthancPluginSendHttpStatusCode(context, output, 400);
@@ -217,7 +217,7 @@
   else
   {
     Json::Value instances;
-    if (!OrthancPlugins::RestApiGetJson(instances, context, resource + "/instances", false))
+    if (!OrthancPlugins::RestApiGet(instances, context, resource + "/instances", false))
     {
       // Internal error
       OrthancPluginSendHttpStatusCode(context, output, 400);
@@ -310,7 +310,7 @@
   }
   
   Json::Value study;
-  if (!OrthancPlugins::RestApiGetJson(study, context, "/series/" + id + "/study", false))
+  if (!OrthancPlugins::RestApiGet(study, context, "/series/" + id + "/study", false))
   {
     OrthancPluginSendHttpStatusCode(context, output, 404);
     return false;
@@ -358,8 +358,8 @@
   }
   
   Json::Value study, series;
-  if (!OrthancPlugins::RestApiGetJson(series, context, "/instances/" + id + "/series", false) ||
-      !OrthancPlugins::RestApiGetJson(study, context, "/instances/" + id + "/study", false))
+  if (!OrthancPlugins::RestApiGet(series, context, "/instances/" + id + "/series", false) ||
+      !OrthancPlugins::RestApiGet(study, context, "/instances/" + id + "/study", false))
   {
     OrthancPluginSendHttpStatusCode(context, output, 404);
     return false;
--- a/Plugin/WadoRsRetrieveFrames.cpp	Mon Jun 27 17:20:36 2016 +0200
+++ b/Plugin/WadoRsRetrieveFrames.cpp	Thu Jun 30 20:22:44 2016 +0200
@@ -413,7 +413,7 @@
   OrthancPlugins::MemoryBuffer content(context);
   if (LocateInstance(output, uri, request) &&
       content.RestApiGet(uri + "/file", false) &&
-      OrthancPlugins::RestApiGetJson(header, context, uri + "/header?simplify", false))
+      OrthancPlugins::RestApiGet(header, context, uri + "/header?simplify", false))
   {
     {
       std::string s = "DICOMweb RetrieveFrames on " + uri + ", frames: ";
--- a/Plugin/WadoUri.cpp	Mon Jun 27 17:20:36 2016 +0200
+++ b/Plugin/WadoUri.cpp	Thu Jun 30 20:22:44 2016 +0200
@@ -116,7 +116,7 @@
     else
     {
       Json::Value info;
-      if (!OrthancPlugins::RestApiGetJson(info, context, "/instances/" + instance + "/series", false) ||
+      if (!OrthancPlugins::RestApiGet(info, context, "/instances/" + instance + "/series", false) ||
           info["MainDicomTags"]["SeriesInstanceUID"] != seriesUid)
       {
         OrthancPlugins::Configuration::LogError("WADO-URI: Instance " + objectUid + " does not belong to series " + seriesUid);
@@ -136,7 +136,7 @@
     else
     {
       Json::Value info;
-      if (!OrthancPlugins::RestApiGetJson(info, context, "/instances/" + instance + "/study", false) ||
+      if (!OrthancPlugins::RestApiGet(info, context, "/instances/" + instance + "/study", false) ||
           info["MainDicomTags"]["StudyInstanceUID"] != studyUid)
       {
         OrthancPlugins::Configuration::LogError("WADO-URI: Instance " + objectUid + " does not belong to study " + studyUid);