diff OrthancServer/OrthancRestApi/OrthancRestSystem.cpp @ 1232:f1c01451a8ee

Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 04 Dec 2014 17:04:40 +0100
parents efece308018e
children eac00401cb96
line wrap: on
line diff
--- a/OrthancServer/OrthancRestApi/OrthancRestSystem.cpp	Fri Nov 28 12:39:22 2014 +0100
+++ b/OrthancServer/OrthancRestApi/OrthancRestSystem.cpp	Thu Dec 04 17:04:40 2014 +0100
@@ -35,6 +35,8 @@
 
 #include "../OrthancInitialization.h"
 #include "../FromDcmtkBridge.h"
+#include "../../Plugins/Engine/PluginsManager.h"
+#include "../../Plugins/Engine/OrthancPlugins.h"
 
 #include <glog/logging.h>
 
@@ -114,6 +116,93 @@
   }
 
 
+  // Plugins information ------------------------------------------------------
+
+  static void ListPlugins(RestApiGetCall& call)
+  {
+    Json::Value v = Json::arrayValue;
+
+    if (OrthancRestApi::GetContext(call).HasPlugins())
+    {
+      std::list<std::string> plugins;
+      OrthancRestApi::GetContext(call).GetPluginsManager().ListPlugins(plugins);
+
+      for (std::list<std::string>::const_iterator 
+             it = plugins.begin(); it != plugins.end(); it++)
+      {
+        v.append(*it);
+      }
+    }
+
+    call.GetOutput().AnswerJson(v);
+  }
+
+
+  static void GetPlugin(RestApiGetCall& call)
+  {
+    if (!OrthancRestApi::GetContext(call).HasPlugins())
+    {
+      return;
+    }
+
+    const PluginsManager& manager = OrthancRestApi::GetContext(call).GetPluginsManager();
+    std::string id = call.GetUriComponent("id", "");
+
+    if (manager.HasPlugin(id))
+    {
+      Json::Value v = Json::objectValue;
+      v["ID"] = id;
+      v["Version"] = manager.GetPluginVersion(id);
+
+      const OrthancPlugins& plugins = OrthancRestApi::GetContext(call).GetOrthancPlugins();
+      const char *c = plugins.GetProperty(id.c_str(), _OrthancPluginProperty_RootUri);
+      if (c != NULL)
+      {
+        v["RootUri"] = c;
+      }
+
+      c = plugins.GetProperty(id.c_str(), _OrthancPluginProperty_Description);
+      if (c != NULL)
+      {
+        v["Description"] = c;
+      }
+
+      c = plugins.GetProperty(id.c_str(), _OrthancPluginProperty_OrthancExplorer);
+      v["ExtendsOrthancExplorer"] = (c != NULL);
+
+      call.GetOutput().AnswerJson(v);
+    }
+  }
+
+
+  static void GetOrthancExplorerPlugins(RestApiGetCall& call)
+  {
+    std::string s = "// Extensions to Orthanc Explorer by the registered plugins\n\n";
+
+    if (OrthancRestApi::GetContext(call).HasPlugins())
+    {
+      const PluginsManager& manager = OrthancRestApi::GetContext(call).GetPluginsManager();
+      const OrthancPlugins& plugins = OrthancRestApi::GetContext(call).GetOrthancPlugins();
+
+      std::list<std::string> lst;
+      OrthancRestApi::GetContext(call).GetPluginsManager().ListPlugins(lst);
+
+      for (std::list<std::string>::const_iterator
+             it = lst.begin(); it != lst.end(); it++)
+      {
+        const char* tmp = plugins.GetProperty(it->c_str(), _OrthancPluginProperty_OrthancExplorer);
+        if (tmp != NULL)
+        {
+          s += "/**\n * From plugin: " + *it + " (version " + manager.GetPluginVersion(*it) + ")\n **/\n\n";
+          s += std::string(tmp) + "\n\n";
+        }
+      }
+    }
+
+    call.GetOutput().AnswerBuffer(s, "application/javascript");
+  }
+
+
   void OrthancRestApi::RegisterSystem()
   {
     Register("/", ServeRoot);
@@ -123,5 +212,9 @@
     Register("/tools/execute-script", ExecuteScript);
     Register("/tools/now", GetNowIsoString);
     Register("/tools/dicom-conformance", GetDicomConformanceStatement);
+
+    Register("/plugins", ListPlugins);
+    Register("/plugins/{id}", GetPlugin);
+    Register("/plugins/explorer.js", GetOrthancExplorerPlugins);
   }
 }