changeset 29:1ffcfc3b0e24

All the APIs are now under the same root
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 03 Jul 2015 17:31:02 +0200
parents caa0bf9511bc
children 08dccfd9b1e5
files NEWS Plugin/Plugin.cpp
diffstat 2 files changed, 105 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/NEWS	Fri Jul 03 10:46:05 2015 +0200
+++ b/NEWS	Fri Jul 03 17:31:02 2015 +0200
@@ -3,6 +3,7 @@
 
 No official release yet. Still work in progress.
 
+* All the APIs are now under the same root
 * Use of Orthanc built-in API for multipart answers (requires Orthanc >= 0.9.1)
 * Support of WADO-RS - RetrieveMetadata
 * Support of Visual Studio 2008
--- a/Plugin/Plugin.cpp	Fri Jul 03 10:46:05 2015 +0200
+++ b/Plugin/Plugin.cpp	Fri Jul 03 17:31:02 2015 +0200
@@ -37,6 +37,60 @@
 Json::Value configuration_;
 const gdcm::Dict* dictionary_ = NULL;
 
+static std::string root_ = "/dicom-web/";
+
+
+static int32_t SwitchStudies(OrthancPluginRestOutput* output,
+                             const char* url,
+                             const OrthancPluginHttpRequest* request)
+{
+  switch (request->method)
+  {
+    case OrthancPluginHttpMethod_Get:
+      // This is QIDO-RS
+      return SearchForStudies(output, url, request);
+
+    case OrthancPluginHttpMethod_Post:
+      // This is STOW-RS
+      return StowCallback(output, url, request);
+
+    default:
+      OrthancPluginSendMethodNotAllowed(context_, output, "GET,POST");
+      return 0;
+  }
+}
+
+
+static int32_t SwitchStudy(OrthancPluginRestOutput* output,
+                           const char* url,
+                           const OrthancPluginHttpRequest* request)
+{
+  switch (request->method)
+  {
+    case OrthancPluginHttpMethod_Get:
+      // This is WADO-RS
+      return RetrieveDicomStudy(output, url, request);
+
+    case OrthancPluginHttpMethod_Post:
+      // This is STOW-RS
+      return StowCallback(output, url, request);
+
+    default:
+      OrthancPluginSendMethodNotAllowed(context_, output, "GET,POST");
+      return 0;
+  }
+}
+
+
+static void Register(const std::string& uri,
+                     OrthancPluginRestCallback callback)
+{
+  assert(!uri.empty() && uri[0] != '/');
+  std::string s = root_ + uri;
+  OrthancPluginRegisterRestCallback(context_, s.c_str(), callback);
+}
+
+
 
 extern "C"
 {
@@ -68,30 +122,58 @@
       return -1;
     }
 
+    if (configuration_.isMember("DicomWeb") &&
+        configuration_["DicomWeb"].isMember("Root"))
+    {
+      if (configuration_["DicomWeb"]["Root"].type() == Json::stringValue)
+      {
+        root_ = configuration_["DicomWeb"]["Root"].asString();
+      }
+      else
+      {
+        OrthancPluginLogError(context_, "Bad data type for DicomWeb::Root inside the configuration file");
+        return -1;
+      }
+    }
+
+    // Make sure the root URI starts and ends with a slash
+    if (root_.empty())
+    {
+      root_ = "/";
+    }
+    else
+    {
+      if (root_[0] != '/')
+      {
+        root_ = "/" + root_;
+      }
+    
+      if (root_[root_.length() - 1] != '/')
+      {
+        root_ += "/";
+      }
+    }
+
+    {
+      std::string message = "URI to the DICOMweb REST API: " + root_;
+      OrthancPluginLogWarning(context_, message.c_str());
+    }
+
     OrthancPluginSetDescription(context_, "Implementation of DICOM Web (QIDO-RS, STOW-RS and WADO-RS).");
 
-    // WADO-RS callbacks
-    OrthancPluginRegisterRestCallback(context, "/wado-rs/studies/([^/]*)", RetrieveDicomStudy);
-    OrthancPluginRegisterRestCallback(context, "/wado-rs/studies/([^/]*)/series/([^/]*)", RetrieveDicomSeries);
-    OrthancPluginRegisterRestCallback(context, "/wado-rs/studies/([^/]*)/series/([^/]*)/instances/([^/]*)", RetrieveDicomInstance);
-    OrthancPluginRegisterRestCallback(context, "/wado-rs/studies/([^/]*)/metadata", RetrieveStudyMetadata);
-    OrthancPluginRegisterRestCallback(context, "/wado-rs/studies/([^/]*)/series/([^/]*)/metadata", RetrieveSeriesMetadata);
-    OrthancPluginRegisterRestCallback(context, "/wado-rs/studies/([^/]*)/series/([^/]*)/instances/([^/]*)/metadata", RetrieveInstanceMetadata);
-    OrthancPluginRegisterRestCallback(context, "/wado-rs/studies/([^/]*)/series/([^/]*)/instances/([^/]*)/bulk/(.*)", RetrieveBulkData);
-
-    // STOW-RS callbacks
-    OrthancPluginRegisterRestCallback(context, "/stow-rs/studies", StowCallback);
-    OrthancPluginRegisterRestCallback(context, "/stow-rs/studies/([^/]*)", StowCallback);
-
-    // QIDO-RS callbacks
-    OrthancPluginRegisterRestCallback(context, "/qido-rs/studies", SearchForStudies);    
-
-    OrthancPluginRegisterRestCallback(context, "/qido-rs/studies/([^/]*)/series", SearchForSeries);    
-    OrthancPluginRegisterRestCallback(context, "/qido-rs/series", SearchForSeries);    
-
-    OrthancPluginRegisterRestCallback(context, "/qido-rs/studies/([^/]*)/series/([^/]*)/instances", SearchForInstances);    
-    OrthancPluginRegisterRestCallback(context, "/qido-rs/studies/([^/]*)/instances", SearchForInstances);    
-    OrthancPluginRegisterRestCallback(context, "/qido-rs/instances", SearchForInstances);    
+    Register("instances", SearchForInstances);    
+    Register("series", SearchForSeries);    
+    Register("studies", SwitchStudies);
+    Register("studies/([^/]*)", SwitchStudy);
+    Register("studies/([^/]*)/instances", SearchForInstances);    
+    Register("studies/([^/]*)/metadata", RetrieveStudyMetadata);
+    Register("studies/([^/]*)/series", SearchForSeries);    
+    Register("studies/([^/]*)/series/([^/]*)", RetrieveDicomSeries);
+    Register("studies/([^/]*)/series/([^/]*)/instances", SearchForInstances);    
+    Register("studies/([^/]*)/series/([^/]*)/instances/([^/]*)", RetrieveDicomInstance);
+    Register("studies/([^/]*)/series/([^/]*)/instances/([^/]*)/bulk/(.*)", RetrieveBulkData);
+    Register("studies/([^/]*)/series/([^/]*)/instances/([^/]*)/metadata", RetrieveInstanceMetadata);
+    Register("studies/([^/]*)/series/([^/]*)/metadata", RetrieveSeriesMetadata);
 
     return 0;
   }