# HG changeset patch # User Sebastien Jodogne # Date 1573049805 -3600 # Node ID 87fbeb8233751838ee45eaaf046f5576d819c021 # Parent 0e3a3be313fd780766992b464e75744828aa0588 allocating messages from oracle commands on the stack diff -r 0e3a3be313fd -r 87fbeb823375 Framework/Loaders/LoaderStateMachine.cpp --- a/Framework/Loaders/LoaderStateMachine.cpp Wed Nov 06 12:56:23 2019 +0100 +++ b/Framework/Loaders/LoaderStateMachine.cpp Wed Nov 06 15:16:45 2019 +0100 @@ -144,7 +144,7 @@ activeCommands_--; try { - dynamic_cast(message.GetOrigin().GetPayload()).Handle(message); + dynamic_cast(message.GetCommand().GetPayload()).Handle(message); Step(); } catch (Orthanc::OrthancException& e) diff -r 0e3a3be313fd -r 87fbeb823375 Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.cpp --- a/Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.cpp Wed Nov 06 12:56:23 2019 +0100 +++ b/Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.cpp Wed Nov 06 15:16:45 2019 +0100 @@ -237,7 +237,7 @@ } - static unsigned int GetSliceIndexPayload(const OracleCommandBase& command) + static unsigned int GetSliceIndexPayload(const IOracleCommand& command) { return dynamic_cast< const Orthanc::SingleValueObject& >(command.GetPayload()).GetValue(); } @@ -394,7 +394,7 @@ void OrthancSeriesVolumeProgressiveLoader::LoadBestQualitySliceContent(const GetOrthancImageCommand::SuccessMessage& message) { - SetSliceContent(GetSliceIndexPayload(message.GetOrigin()), message.GetImage(), BEST_QUALITY); + SetSliceContent(GetSliceIndexPayload(message.GetCommand()), message.GetImage(), BEST_QUALITY); } @@ -402,7 +402,7 @@ { unsigned int quality; - switch (message.GetOrigin().GetQuality()) + switch (dynamic_cast(message.GetCommand()).GetQuality()) { case 50: quality = LOW_QUALITY; @@ -416,7 +416,7 @@ throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); } - SetSliceContent(GetSliceIndexPayload(message.GetOrigin()), message.GetImage(), quality); + SetSliceContent(GetSliceIndexPayload(message.GetCommand()), message.GetImage(), quality); } diff -r 0e3a3be313fd -r 87fbeb823375 Framework/Oracle/GenericOracleRunner.cpp --- a/Framework/Oracle/GenericOracleRunner.cpp Wed Nov 06 12:56:23 2019 +0100 +++ b/Framework/Oracle/GenericOracleRunner.cpp Wed Nov 06 15:16:45 2019 +0100 @@ -100,7 +100,9 @@ } - static IMessage* Execute(const HttpCommand& command) + static void RunInternal(boost::weak_ptr receiver, + IMessageEmitter& emitter, + HttpCommand& command) { Orthanc::HttpClient client; client.SetUrl(command.GetUrl()); @@ -126,12 +128,15 @@ DecodeAnswer(answer, answerHeaders); - return new HttpCommand::SuccessMessage(command, answerHeaders, answer); + HttpCommand::SuccessMessage message(command, answerHeaders, answer); + emitter.EmitMessage(receiver, message); } - static IMessage* Execute(const Orthanc::WebServiceParameters& orthanc, - const OrthancRestApiCommand& command) + static void RunInternal(boost::weak_ptr receiver, + IMessageEmitter& emitter, + const Orthanc::WebServiceParameters& orthanc, + OrthancRestApiCommand& command) { Orthanc::HttpClient client(orthanc, command.GetUri()); client.SetMethod(command.GetMethod()); @@ -151,12 +156,15 @@ DecodeAnswer(answer, answerHeaders); - return new OrthancRestApiCommand::SuccessMessage(command, answerHeaders, answer); + OrthancRestApiCommand::SuccessMessage message(command, answerHeaders, answer); + emitter.EmitMessage(receiver, message); } - static IMessage* Execute(const Orthanc::WebServiceParameters& orthanc, - const GetOrthancImageCommand& command) + static void RunInternal(boost::weak_ptr receiver, + IMessageEmitter& emitter, + const Orthanc::WebServiceParameters& orthanc, + GetOrthancImageCommand& command) { Orthanc::HttpClient client(orthanc, command.GetUri()); client.SetTimeout(command.GetTimeout()); @@ -169,12 +177,14 @@ DecodeAnswer(answer, answerHeaders); - return command.ProcessHttpAnswer(answer, answerHeaders); + command.ProcessHttpAnswer(receiver, emitter, answer, answerHeaders); } - static IMessage* Execute(const Orthanc::WebServiceParameters& orthanc, - const GetOrthancWebViewerJpegCommand& command) + static void RunInternal(boost::weak_ptr receiver, + IMessageEmitter& emitter, + const Orthanc::WebServiceParameters& orthanc, + GetOrthancWebViewerJpegCommand& command) { Orthanc::HttpClient client(orthanc, command.GetUri()); client.SetTimeout(command.GetTimeout()); @@ -187,7 +197,7 @@ DecodeAnswer(answer, answerHeaders); - return command.ProcessHttpAnswer(answer); + command.ProcessHttpAnswer(receiver, emitter, answer); } @@ -212,21 +222,26 @@ } - static IMessage* Execute(const std::string& root, - ReadFileCommand& command) + static void RunInternal(boost::weak_ptr receiver, + IMessageEmitter& emitter, + const std::string& root, + ReadFileCommand& command) { std::string path = GetPath(root, command.GetPath()); std::string content; Orthanc::SystemToolbox::ReadFile(content, path, true /* log */); - return new ReadFileCommand::SuccessMessage(command, content); + ReadFileCommand::SuccessMessage message(command, content); + emitter.EmitMessage(receiver, message); } #if ORTHANC_ENABLE_DCMTK == 1 - static ParseDicomFileCommand::SuccessMessage* Execute(const std::string& root, - const ParseDicomFileCommand& command) + static void RunInternal(boost::weak_ptr receiver, + IMessageEmitter& emitter, + const std::string& root, + ParseDicomFileCommand& command) { std::string path = GetPath(root, command.GetPath()); @@ -271,8 +286,10 @@ if (ok) { - return new ParseDicomFileCommand::SuccessMessage - (command, dicom, static_cast(fileSize), command.IsPixelDataIncluded()); + Orthanc::ParsedDicomFile parsed(dicom); + ParseDicomFileCommand::SuccessMessage message + (command, parsed, static_cast(fileSize), command.IsPixelDataIncluded()); + emitter.EmitMessage(receiver, message); } else { @@ -281,10 +298,12 @@ } } - - static ParseDicomFileCommand::SuccessMessage* Execute(boost::shared_ptr cache, - const std::string& root, - const ParseDicomFileCommand& command) + + static void RunInternal(boost::weak_ptr receiver, + IMessageEmitter& emitter, + boost::shared_ptr cache, + const std::string& root, + ParseDicomFileCommand& command) { #if 0 // The code to use the cache is buggy in multithreaded environments => TODO FIX @@ -299,11 +318,13 @@ // Reuse the DICOM file from the cache return new ParseDicomFileCommand::SuccessMessage( command, reader.GetDicom(), reader.GetFileSize(), reader.HasPixelData()); + emitter.EmitMessage(receiver, message); + return; } } // Not in the cache, first read and parse the DICOM file - std::auto_ptr message(Execute(root, command)); + std::auto_ptr message(RunInternal(root, command)); // Secondly, store it into the cache for future use assert(&message->GetOrigin() == &command); @@ -315,18 +336,22 @@ else { // No cache available - return Execute(root, command); + return RunInternal(root, command); } #else - return Execute(root, command); + return RunInternal(receiver, emitter, root, command); #endif } #endif - IMessage* GenericOracleRunner::Run(IOracleCommand& command) + void GenericOracleRunner::Run(boost::weak_ptr receiver, + IMessageEmitter& emitter, + IOracleCommand& command) { + Orthanc::ErrorCode error = Orthanc::ErrorCode_Success; + try { switch (command.GetType()) @@ -336,24 +361,34 @@ "Sleep command cannot be executed by the runner"); case IOracleCommand::Type_Http: - return Execute(dynamic_cast(command)); + RunInternal(receiver, emitter, dynamic_cast(command)); + break; case IOracleCommand::Type_OrthancRestApi: - return Execute(orthanc_, dynamic_cast(command)); + RunInternal(receiver, emitter, orthanc_, + dynamic_cast(command)); + break; case IOracleCommand::Type_GetOrthancImage: - return Execute(orthanc_, dynamic_cast(command)); + RunInternal(receiver, emitter, orthanc_, + dynamic_cast(command)); + break; case IOracleCommand::Type_GetOrthancWebViewerJpeg: - return Execute(orthanc_, dynamic_cast(command)); + RunInternal(receiver, emitter, orthanc_, + dynamic_cast(command)); + break; case IOracleCommand::Type_ReadFile: - return Execute(rootDirectory_, dynamic_cast(command)); + RunInternal(receiver, emitter, rootDirectory_, + dynamic_cast(command)); + break; case IOracleCommand::Type_ParseDicomFile: #if ORTHANC_ENABLE_DCMTK == 1 - return Execute(dicomCache_, rootDirectory_, - dynamic_cast(command)); + RunInternal(receiver, emitter, dicomCache_, rootDirectory_, + dynamic_cast(command)); + break; #else throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, "DCMTK must be enabled to parse DICOM files"); @@ -366,12 +401,15 @@ catch (Orthanc::OrthancException& e) { LOG(ERROR) << "Exception within the oracle: " << e.What(); - return new OracleCommandExceptionMessage(command, e); + error = e.GetErrorCode(); } catch (...) { LOG(ERROR) << "Threaded exception within the oracle"; - return new OracleCommandExceptionMessage(command, Orthanc::ErrorCode_InternalError); + error = Orthanc::ErrorCode_InternalError; } + + OracleCommandExceptionMessage message(command, error); + emitter.EmitMessage(receiver, message); } } diff -r 0e3a3be313fd -r 87fbeb823375 Framework/Oracle/GenericOracleRunner.h --- a/Framework/Oracle/GenericOracleRunner.h Wed Nov 06 12:56:23 2019 +0100 +++ b/Framework/Oracle/GenericOracleRunner.h Wed Nov 06 15:16:45 2019 +0100 @@ -30,6 +30,7 @@ #endif #include "IOracleCommand.h" +#include "../Messages/IMessageEmitter.h" #include // For ORTHANC_OVERRIDE #include @@ -79,6 +80,8 @@ } #endif - IMessage* Run(IOracleCommand& command); + void Run(boost::weak_ptr receiver, + IMessageEmitter& emitter, + IOracleCommand& command); }; } diff -r 0e3a3be313fd -r 87fbeb823375 Framework/Oracle/GetOrthancImageCommand.cpp --- a/Framework/Oracle/GetOrthancImageCommand.cpp Wed Nov 06 12:56:23 2019 +0100 +++ b/Framework/Oracle/GetOrthancImageCommand.cpp Wed Nov 06 15:16:45 2019 +0100 @@ -29,20 +29,6 @@ namespace OrthancStone { - GetOrthancImageCommand::SuccessMessage::SuccessMessage(const GetOrthancImageCommand& command, - Orthanc::ImageAccessor* image, // Takes ownership - Orthanc::MimeType mime) : - OriginMessage(command), - image_(image), - mime_(mime) - { - if (image == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - GetOrthancImageCommand::GetOrthancImageCommand() : uri_("/"), timeout_(600), @@ -82,8 +68,11 @@ } } - IMessage* GetOrthancImageCommand::ProcessHttpAnswer(const std::string& answer, - const HttpHeaders& answerHeaders) const + + void GetOrthancImageCommand::ProcessHttpAnswer(boost::weak_ptr receiver, + IMessageEmitter& emitter, + const std::string& answer, + const HttpHeaders& answerHeaders) { Orthanc::MimeType contentType = Orthanc::MimeType_Binary; @@ -145,6 +134,7 @@ } } - return new SuccessMessage(*this, image.release(), contentType); + SuccessMessage message(*this, *image, contentType); + emitter.EmitMessage(receiver, message); } } diff -r 0e3a3be313fd -r 87fbeb823375 Framework/Oracle/GetOrthancImageCommand.h --- a/Framework/Oracle/GetOrthancImageCommand.h Wed Nov 06 12:56:23 2019 +0100 +++ b/Framework/Oracle/GetOrthancImageCommand.h Wed Nov 06 15:16:45 2019 +0100 @@ -21,7 +21,7 @@ #pragma once -#include "../Messages/IMessage.h" +#include "../Messages/IMessageEmitter.h" #include "OracleCommandBase.h" #include @@ -35,22 +35,27 @@ public: typedef std::map HttpHeaders; - class SuccessMessage : public OriginMessage + class SuccessMessage : public OracleMessageBase { ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); private: - std::auto_ptr image_; - Orthanc::MimeType mime_; + const Orthanc::ImageAccessor& image_; + Orthanc::MimeType mime_; public: - SuccessMessage(const GetOrthancImageCommand& command, - Orthanc::ImageAccessor* image, // Takes ownership - Orthanc::MimeType mime); + SuccessMessage(GetOrthancImageCommand& command, + const Orthanc::ImageAccessor& image, + Orthanc::MimeType mime) : + OracleMessageBase(command), + image_(image), + mime_(mime) + { + } const Orthanc::ImageAccessor& GetImage() const { - return *image_; + return image_; } Orthanc::MimeType GetMimeType() const @@ -111,7 +116,9 @@ return timeout_; } - IMessage* ProcessHttpAnswer(const std::string& answer, - const HttpHeaders& answerHeaders) const; + void ProcessHttpAnswer(boost::weak_ptr receiver, + IMessageEmitter& emitter, + const std::string& answer, + const HttpHeaders& answerHeaders); }; } diff -r 0e3a3be313fd -r 87fbeb823375 Framework/Oracle/GetOrthancWebViewerJpegCommand.cpp --- a/Framework/Oracle/GetOrthancWebViewerJpegCommand.cpp Wed Nov 06 12:56:23 2019 +0100 +++ b/Framework/Oracle/GetOrthancWebViewerJpegCommand.cpp Wed Nov 06 15:16:45 2019 +0100 @@ -34,18 +34,6 @@ namespace OrthancStone { - GetOrthancWebViewerJpegCommand::SuccessMessage::SuccessMessage(const GetOrthancWebViewerJpegCommand& command, - Orthanc::ImageAccessor* image) : // Takes ownership - OriginMessage(command), - image_(image) - { - if (image == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - GetOrthancWebViewerJpegCommand::GetOrthancWebViewerJpegCommand() : frame_(0), quality_(95), @@ -76,7 +64,9 @@ } - IMessage* GetOrthancWebViewerJpegCommand::ProcessHttpAnswer(const std::string& answer) const + void GetOrthancWebViewerJpegCommand::ProcessHttpAnswer(boost::weak_ptr receiver, + IMessageEmitter& emitter, + const std::string& answer) { // This code comes from older "OrthancSlicesLoader::ParseSliceImageJpeg()" @@ -147,7 +137,9 @@ } else { - return new SuccessMessage(*this, reader.release()); + SuccessMessage message(*this, *reader); + emitter.EmitMessage(receiver, message); + return; } } @@ -164,7 +156,9 @@ } else { - return new SuccessMessage(*this, reader.release()); + SuccessMessage message(*this, *reader); + emitter.EmitMessage(receiver, message); + return; } } @@ -205,6 +199,7 @@ Orthanc::ImageProcessing::ShiftScale(*image, offset, scaling, true); } - return new SuccessMessage(*this, image.release()); + SuccessMessage message(*this, *image); + emitter.EmitMessage(receiver, message); } } diff -r 0e3a3be313fd -r 87fbeb823375 Framework/Oracle/GetOrthancWebViewerJpegCommand.h --- a/Framework/Oracle/GetOrthancWebViewerJpegCommand.h Wed Nov 06 12:56:23 2019 +0100 +++ b/Framework/Oracle/GetOrthancWebViewerJpegCommand.h Wed Nov 06 15:16:45 2019 +0100 @@ -21,7 +21,7 @@ #pragma once -#include "../Messages/IMessage.h" +#include "../Messages/IMessageEmitter.h" #include "OracleCommandBase.h" #include @@ -35,20 +35,24 @@ public: typedef std::map HttpHeaders; - class SuccessMessage : public OriginMessage + class SuccessMessage : public OracleMessageBase { ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); private: - std::auto_ptr image_; + const Orthanc::ImageAccessor& image_; public: - SuccessMessage(const GetOrthancWebViewerJpegCommand& command, - Orthanc::ImageAccessor* image); // Takes ownership + SuccessMessage(GetOrthancWebViewerJpegCommand& command, + const Orthanc::ImageAccessor& image) : + OracleMessageBase(command), + image_(image) + { + } const Orthanc::ImageAccessor& GetImage() const { - return *image_; + return image_; } }; @@ -128,6 +132,8 @@ std::string GetUri() const; - IMessage* ProcessHttpAnswer(const std::string& answer) const; + void ProcessHttpAnswer(boost::weak_ptr receiver, + IMessageEmitter& emitter, + const std::string& answer); }; } diff -r 0e3a3be313fd -r 87fbeb823375 Framework/Oracle/HttpCommand.cpp --- a/Framework/Oracle/HttpCommand.cpp Wed Nov 06 12:56:23 2019 +0100 +++ b/Framework/Oracle/HttpCommand.cpp Wed Nov 06 15:16:45 2019 +0100 @@ -28,10 +28,10 @@ namespace OrthancStone { - HttpCommand::SuccessMessage::SuccessMessage(const HttpCommand& command, + HttpCommand::SuccessMessage::SuccessMessage(HttpCommand& command, const HttpHeaders& answerHeaders, - std::string& answer) : - OriginMessage(command), + const std::string& answer) : + OracleMessageBase(command), headers_(answerHeaders), answer_(answer) { diff -r 0e3a3be313fd -r 87fbeb823375 Framework/Oracle/HttpCommand.h --- a/Framework/Oracle/HttpCommand.h Wed Nov 06 12:56:23 2019 +0100 +++ b/Framework/Oracle/HttpCommand.h Wed Nov 06 15:16:45 2019 +0100 @@ -36,18 +36,18 @@ public: typedef std::map HttpHeaders; - class SuccessMessage : public OriginMessage + class SuccessMessage : public OracleMessageBase { ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); private: - HttpHeaders headers_; - std::string answer_; + const HttpHeaders& headers_; + const std::string& answer_; public: - SuccessMessage(const HttpCommand& command, + SuccessMessage(HttpCommand& command, const HttpHeaders& answerHeaders, - std::string& answer /* will be swapped to avoid a memcpy() */); + const std::string& answer); const std::string& GetAnswer() const { @@ -56,7 +56,7 @@ void ParseJsonBody(Json::Value& target) const; - const HttpHeaders& GetAnswerHeaders() const + const HttpHeaders& GetAnswerHeaders() const { return headers_; } diff -r 0e3a3be313fd -r 87fbeb823375 Framework/Oracle/OracleCommandExceptionMessage.h --- a/Framework/Oracle/OracleCommandExceptionMessage.h Wed Nov 06 12:56:23 2019 +0100 +++ b/Framework/Oracle/OracleCommandExceptionMessage.h Wed Nov 06 15:16:45 2019 +0100 @@ -37,13 +37,6 @@ public: OracleCommandExceptionMessage(IOracleCommand& command, - const Orthanc::OrthancException& exception) : - OracleMessageBase(command), - exception_(exception) - { - } - - OracleCommandExceptionMessage(IOracleCommand& command, const Orthanc::ErrorCode& error) : OracleMessageBase(command), exception_(error) diff -r 0e3a3be313fd -r 87fbeb823375 Framework/Oracle/OrthancRestApiCommand.cpp --- a/Framework/Oracle/OrthancRestApiCommand.cpp Wed Nov 06 12:56:23 2019 +0100 +++ b/Framework/Oracle/OrthancRestApiCommand.cpp Wed Nov 06 15:16:45 2019 +0100 @@ -28,16 +28,6 @@ namespace OrthancStone { - OrthancRestApiCommand::SuccessMessage::SuccessMessage(const OrthancRestApiCommand& command, - const HttpHeaders& answerHeaders, - std::string& answer) : - OriginMessage(command), - headers_(answerHeaders), - answer_(answer) - { - } - - void OrthancRestApiCommand::SuccessMessage::ParseJsonBody(Json::Value& target) const { Json::Reader reader; diff -r 0e3a3be313fd -r 87fbeb823375 Framework/Oracle/OrthancRestApiCommand.h --- a/Framework/Oracle/OrthancRestApiCommand.h Wed Nov 06 12:56:23 2019 +0100 +++ b/Framework/Oracle/OrthancRestApiCommand.h Wed Nov 06 15:16:45 2019 +0100 @@ -36,19 +36,24 @@ public: typedef std::map HttpHeaders; - class SuccessMessage : public OriginMessage + class SuccessMessage : public OracleMessageBase { ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); private: - HttpHeaders headers_; - std::string answer_; + const HttpHeaders& headers_; + const std::string& answer_; public: - SuccessMessage(const OrthancRestApiCommand& command, + SuccessMessage(OrthancRestApiCommand& command, const HttpHeaders& answerHeaders, - std::string& answer /* will be swapped to avoid a memcpy() */); - + const std::string& answer) : + OracleMessageBase(command), + headers_(answerHeaders), + answer_(answer) + { + } + const std::string& GetAnswer() const { return answer_; diff -r 0e3a3be313fd -r 87fbeb823375 Framework/Oracle/ParseDicomFileCommand.cpp --- a/Framework/Oracle/ParseDicomFileCommand.cpp Wed Nov 06 12:56:23 2019 +0100 +++ b/Framework/Oracle/ParseDicomFileCommand.cpp Wed Nov 06 15:16:45 2019 +0100 @@ -27,9 +27,16 @@ namespace OrthancStone { - void ParseDicomFileCommand::SuccessMessage::Setup() + ParseDicomFileCommand::SuccessMessage::SuccessMessage(ParseDicomFileCommand& command, + Orthanc::ParsedDicomFile& dicom, + size_t fileSize, + bool hasPixelData) : + OracleMessageBase(command), + dicom_(dicom), + fileSize_(fileSize), + hasPixelData_(hasPixelData) { - if (!dicom_->GetTagValue(sopInstanceUid_, Orthanc::DICOM_TAG_SOP_INSTANCE_UID)) + if (!dicom.GetTagValue(sopInstanceUid_, Orthanc::DICOM_TAG_SOP_INSTANCE_UID)) { throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, "DICOM instance missing tag SOPInstanceUID"); @@ -37,32 +44,6 @@ } - ParseDicomFileCommand::SuccessMessage::SuccessMessage(const ParseDicomFileCommand& command, - DcmFileFormat& dicom, - size_t fileSize, - bool hasPixelData) : - OriginMessage(command), - fileSize_(fileSize), - hasPixelData_(hasPixelData) - { - dicom_.reset(new Orthanc::ParsedDicomFile(dicom)); - Setup(); - } - - - ParseDicomFileCommand::SuccessMessage::SuccessMessage(const ParseDicomFileCommand& command, - boost::shared_ptr dicom, - size_t fileSize, - bool hasPixelData) : - OriginMessage(command), - dicom_(dicom), - fileSize_(fileSize), - hasPixelData_(hasPixelData) - { - Setup(); - } - - std::string ParseDicomFileCommand::GetDicomDirPath(const std::string& dicomDirPath, const std::string& file) { diff -r 0e3a3be313fd -r 87fbeb823375 Framework/Oracle/ParseDicomFileCommand.h --- a/Framework/Oracle/ParseDicomFileCommand.h Wed Nov 06 12:56:23 2019 +0100 +++ b/Framework/Oracle/ParseDicomFileCommand.h Wed Nov 06 15:16:45 2019 +0100 @@ -41,30 +41,23 @@ class ParseDicomFileCommand : public OracleCommandBase { public: - class SuccessMessage : public OriginMessage + class SuccessMessage : public OracleMessageBase { ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); private: - boost::shared_ptr dicom_; - size_t fileSize_; - bool hasPixelData_; - std::string sopInstanceUid_; + Orthanc::ParsedDicomFile& dicom_; + size_t fileSize_; + bool hasPixelData_; + std::string sopInstanceUid_; - void Setup(); - public: - SuccessMessage(const ParseDicomFileCommand& command, - DcmFileFormat& dicom, + SuccessMessage(ParseDicomFileCommand& command, + Orthanc::ParsedDicomFile& dicom, size_t fileSize, bool hasPixelData); - SuccessMessage(const ParseDicomFileCommand& command, - boost::shared_ptr dicom, - size_t fileSize, - bool hasPixelData); - - boost::shared_ptr GetDicom() const + Orthanc::ParsedDicomFile& GetDicom() const { return dicom_; } diff -r 0e3a3be313fd -r 87fbeb823375 Framework/Oracle/ThreadedOracle.cpp --- a/Framework/Oracle/ThreadedOracle.cpp Wed Nov 06 12:56:23 2019 +0100 +++ b/Framework/Oracle/ThreadedOracle.cpp Wed Nov 06 15:16:45 2019 +0100 @@ -189,10 +189,8 @@ } #endif } - - std::auto_ptr message(runner.Run(item.GetCommand())); - - emitter_.EmitMessage(item.GetReceiver(), *message); + + runner.Run(item.GetReceiver(), emitter_, item.GetCommand()); } } }