Mercurial > hg > orthanc
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); } }