diff OrthancServer/ServerContext.cpp @ 1065:921532f67770

Lua scripts can invoke system commands, with CallSystem()
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 25 Jul 2014 16:59:33 +0200
parents 160dfe770618
children bb82e5e818e9
line wrap: on
line diff
--- a/OrthancServer/ServerContext.cpp	Fri Jul 25 16:13:36 2014 +0200
+++ b/OrthancServer/ServerContext.cpp	Fri Jul 25 16:59:33 2014 +0200
@@ -44,6 +44,7 @@
 #include <dcmtk/dcmdata/dcfilefo.h>
 
 
+#include "Scheduler/CallSystemCommand.h"
 #include "Scheduler/DeleteInstanceCommand.h"
 #include "Scheduler/ModifyInstanceCommand.h"
 #include "Scheduler/StoreScuCommand.h"
@@ -160,6 +161,47 @@
       return command.release();
     }
 
+    if (operation == "call-system")
+    {
+      LOG(INFO) << "Lua script to call system command on " << parameters["Instance"].asString();
+
+      const Json::Value& argsIn = parameters["Arguments"];
+      if (argsIn.type() != Json::arrayValue)
+      {
+        throw OrthancException(ErrorCode_BadParameterType);
+      }
+
+      std::vector<std::string> args;
+      args.reserve(argsIn.size());
+      for (Json::Value::ArrayIndex i = 0; i < argsIn.size(); ++i)
+      {
+        // http://jsoncpp.sourceforge.net/namespace_json.html#7d654b75c16a57007925868e38212b4e
+        switch (argsIn[i].type())
+        {
+          case Json::stringValue:
+            args.push_back(argsIn[i].asString());
+            break;
+
+          case Json::intValue:
+            args.push_back(boost::lexical_cast<std::string>(argsIn[i].asInt()));
+            break;
+
+          case Json::uintValue:
+            args.push_back(boost::lexical_cast<std::string>(argsIn[i].asUInt()));
+            break;
+
+          case Json::realValue:
+            args.push_back(boost::lexical_cast<std::string>(argsIn[i].asFloat()));
+            break;
+
+          default:
+            throw OrthancException(ErrorCode_BadParameterType);
+        }
+      }
+
+      return new CallSystemCommand(context, parameters["Command"].asString(), args);
+    }
+
     throw OrthancException(ErrorCode_ParameterOutOfRange);
   }