changeset 1104:98cdfe5768a4 broker

ReadFileCommand
author Sebastien Jodogne <s.jodogne@gmail.com>
date Sat, 26 Oct 2019 16:43:08 +0200
parents f7759637cdfb
children 1533cccb5c43
files Framework/Oracle/GenericOracleRunner.cpp Framework/Oracle/GenericOracleRunner.h Framework/Oracle/IOracleCommand.h Framework/Oracle/ReadFileCommand.h Framework/Oracle/ThreadedOracle.cpp
diffstat 5 files changed, 134 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/Framework/Oracle/GenericOracleRunner.cpp	Sat Oct 26 11:44:38 2019 +0200
+++ b/Framework/Oracle/GenericOracleRunner.cpp	Sat Oct 26 16:43:08 2019 +0200
@@ -27,11 +27,15 @@
 #include "HttpCommand.h"
 #include "OracleCommandExceptionMessage.h"
 #include "OrthancRestApiCommand.h"
+#include "ReadFileCommand.h"
 
 #include <Core/Compression/GzipCompressor.h>
 #include <Core/HttpClient.h>
 #include <Core/OrthancException.h>
 #include <Core/Toolbox.h>
+#include <Core/SystemToolbox.h>
+
+#include <boost/filesystem.hpp>
 
 namespace OrthancStone
 {
@@ -178,6 +182,29 @@
   }
 
 
+  static IMessage* Execute(const std::string& root,
+                           const ReadFileCommand& command)
+  {
+    boost::filesystem::path a(root);
+    boost::filesystem::path b(command.GetPath());
+
+    boost::filesystem::path path;
+    if (b.is_absolute())
+    {
+      path = b;
+    }
+    else
+    {
+      path = a / b;
+    }
+
+    std::string content;
+    Orthanc::SystemToolbox::ReadFile(content, path.string(), true /* log */);
+
+    return new ReadFileCommand::SuccessMessage(command, content);
+  }
+
+
   IMessage* GenericOracleRunner::Run(IOracleCommand& command)
   {
     try
@@ -203,6 +230,9 @@
         case IOracleCommand::Type_Custom:
           return dynamic_cast<CustomOracleCommand&>(command).Execute(*this);
 
+        case IOracleCommand::Type_ReadFile:
+          return Execute(rootDirectory_, dynamic_cast<const ReadFileCommand&>(command));
+
         default:
           throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
       }
--- a/Framework/Oracle/GenericOracleRunner.h	Sat Oct 26 11:44:38 2019 +0200
+++ b/Framework/Oracle/GenericOracleRunner.h	Sat Oct 26 16:43:08 2019 +0200
@@ -31,12 +31,33 @@
   class GenericOracleRunner : public IOracleRunner
   {
   private:
-    const Orthanc::WebServiceParameters&  orthanc_;
+    Orthanc::WebServiceParameters  orthanc_;
+    std::string                    rootDirectory_;
 
   public:
-    GenericOracleRunner(const Orthanc::WebServiceParameters& orthanc) :
-      orthanc_(orthanc)
+    GenericOracleRunner() :
+      rootDirectory_(".")
+    {
+    }
+
+    void SetOrthanc(const Orthanc::WebServiceParameters& orthanc)
+    {
+      orthanc_ = orthanc;
+    }
+
+    const Orthanc::WebServiceParameters& GetOrthanc() const
     {
+      return orthanc_;
+    }
+
+    void SetRootDirectory(const std::string& rootDirectory)
+    {
+      rootDirectory_ = rootDirectory;
+    }
+
+    const std::string GetRootDirectory() const
+    {
+      return rootDirectory_;
     }
 
     virtual IMessage* Run(IOracleCommand& command) ORTHANC_OVERRIDE;
--- a/Framework/Oracle/IOracleCommand.h	Sat Oct 26 11:44:38 2019 +0200
+++ b/Framework/Oracle/IOracleCommand.h	Sat Oct 26 16:43:08 2019 +0200
@@ -30,12 +30,13 @@
   public:
     enum Type
     {
-      Type_Http,
-      Type_Sleep,
-      Type_OrthancRestApi,
+      Type_Custom,
       Type_GetOrthancImage,
       Type_GetOrthancWebViewerJpeg,
-      Type_Custom
+      Type_Http,
+      Type_OrthancRestApi,
+      Type_ReadFile,
+      Type_Sleep
     };
 
     virtual ~IOracleCommand()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Framework/Oracle/ReadFileCommand.h	Sat Oct 26 16:43:08 2019 +0200
@@ -0,0 +1,73 @@
+/**
+ * Stone of Orthanc
+ * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
+ * Department, University Hospital of Liege, Belgium
+ * Copyright (C) 2017-2019 Osimis S.A., Belgium
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Affero General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+
+#pragma once
+
+#include "../Messages/IMessage.h"
+#include "OracleCommandWithPayload.h"
+
+namespace OrthancStone
+{
+  class ReadFileCommand : public OracleCommandWithPayload
+  {
+  public:
+    class SuccessMessage : public OriginMessage<ReadFileCommand>
+    {
+      ORTHANC_STONE_MESSAGE(__FILE__, __LINE__);
+      
+    private:
+      std::string  content_;
+
+    public:
+      SuccessMessage(const ReadFileCommand& command,
+                     std::string& content  /* will be swapped to avoid a memcpy() */) :
+        OriginMessage(command)
+      {
+        content_.swap(content);
+      }
+
+      const std::string& GetContent() const
+      {
+        return content_;
+      }
+    };
+
+
+  private:
+    std::string  path_;
+
+  public:
+    ReadFileCommand(const std::string& path) : 
+      path_(path)
+    {
+    }
+
+    virtual Type GetType() const
+    {
+      return Type_ReadFile;
+    }
+
+    const std::string& GetPath() const
+    {
+      return path_;
+    }
+  };
+}
--- a/Framework/Oracle/ThreadedOracle.cpp	Sat Oct 26 11:44:38 2019 +0200
+++ b/Framework/Oracle/ThreadedOracle.cpp	Sat Oct 26 16:43:08 2019 +0200
@@ -175,7 +175,8 @@
       }
       else
       {
-        GenericOracleRunner runner(orthanc_);
+        GenericOracleRunner runner;
+        runner.SetOrthanc(orthanc_);
         std::auto_ptr<IMessage> message(runner.Run(item.GetCommand()));
         
         emitter_.EmitMessage(item.GetReceiver(), *message);