# HG changeset patch # User Sebastien Jodogne # Date 1572100988 -7200 # Node ID 98cdfe5768a40b2b6832f96fc4b10af68ba6c385 # Parent f7759637cdfb68face2d837d424c511711eaaa8d ReadFileCommand diff -r f7759637cdfb -r 98cdfe5768a4 Framework/Oracle/GenericOracleRunner.cpp --- 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 #include #include #include +#include + +#include 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(command).Execute(*this); + case IOracleCommand::Type_ReadFile: + return Execute(rootDirectory_, dynamic_cast(command)); + default: throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); } diff -r f7759637cdfb -r 98cdfe5768a4 Framework/Oracle/GenericOracleRunner.h --- 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; diff -r f7759637cdfb -r 98cdfe5768a4 Framework/Oracle/IOracleCommand.h --- 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() diff -r f7759637cdfb -r 98cdfe5768a4 Framework/Oracle/ReadFileCommand.h --- /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 . + **/ + + +#pragma once + +#include "../Messages/IMessage.h" +#include "OracleCommandWithPayload.h" + +namespace OrthancStone +{ + class ReadFileCommand : public OracleCommandWithPayload + { + public: + class SuccessMessage : public OriginMessage + { + 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_; + } + }; +} diff -r f7759637cdfb -r 98cdfe5768a4 Framework/Oracle/ThreadedOracle.cpp --- 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 message(runner.Run(item.GetCommand())); emitter_.EmitMessage(item.GetReceiver(), *message);