Mercurial > hg > orthanc-stone
diff Framework/Loaders/LoaderStateMachine.cpp @ 1381:f4a06ad1580b
Branch broker is now the new default
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Wed, 22 Apr 2020 14:05:47 +0200 |
parents | 8a0a62189f46 556b4bc19118 |
children | 30deba7bc8e2 |
line wrap: on
line diff
--- a/Framework/Loaders/LoaderStateMachine.cpp Mon Apr 20 18:26:32 2020 +0200 +++ b/Framework/Loaders/LoaderStateMachine.cpp Wed Apr 22 14:05:47 2020 +0200 @@ -21,33 +21,35 @@ #include "LoaderStateMachine.h" +#include "../Loaders/ILoadersContext.h" + #include <Core/OrthancException.h> namespace OrthancStone { - void LoaderStateMachine::State::Handle(const OrthancRestApiCommand::SuccessMessage& message) + void LoaderStateMachine::State::Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) { throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); } - void LoaderStateMachine::State::Handle(const GetOrthancImageCommand::SuccessMessage& message) + void LoaderStateMachine::State::Handle(const OrthancStone::GetOrthancImageCommand::SuccessMessage& message) { throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); } - void LoaderStateMachine::State::Handle(const GetOrthancWebViewerJpegCommand::SuccessMessage& message) + void LoaderStateMachine::State::Handle(const OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage& message) { throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); } - void LoaderStateMachine::Schedule(OracleCommandWithPayload* command) + void LoaderStateMachine::Schedule(OrthancStone::OracleCommandBase* command) { LOG(TRACE) << "LoaderStateMachine(" << std::hex << this << std::dec << ")::Schedule()"; - std::unique_ptr<OracleCommandWithPayload> protection(command); + std::unique_ptr<OrthancStone::OracleCommandBase> protection(command); if (command == NULL) { @@ -90,14 +92,18 @@ activeCommands_ < simultaneousDownloads_) { - IOracleCommand* nextCommand = pendingCommands_.front(); + OrthancStone::IOracleCommand* nextCommand = pendingCommands_.front(); LOG(TRACE) << " LoaderStateMachine(" << std::hex << this << std::dec << ")::Step(): activeCommands_ (" << activeCommands_ << ") < simultaneousDownloads_ (" << simultaneousDownloads_ << ") --> will Schedule command addr " << std::hex << nextCommand << std::dec; - oracle_.Schedule(*this, nextCommand); + { + std::unique_ptr<OrthancStone::ILoadersContext::ILock> lock(loadersContext_.Lock()); + boost::shared_ptr<IObserver> observer(GetSharedObserver()); + lock->Schedule(observer, 0, nextCommand); // TODO: priority! + } pendingCommands_.pop_front(); activeCommands_++; @@ -123,9 +129,9 @@ pendingCommands_.clear(); } - + - void LoaderStateMachine::HandleExceptionMessage(const OracleCommandExceptionMessage& message) + void LoaderStateMachine::HandleExceptionMessage(const OrthancStone::OracleCommandExceptionMessage& message) { LOG(ERROR) << "LoaderStateMachine::HandleExceptionMessage: error in the state machine, stopping all processing"; LOG(ERROR) << "Error: " << message.GetException().What() << " Details: " << @@ -136,7 +142,6 @@ template <typename T> void LoaderStateMachine::HandleSuccessMessage(const T& message) { - LOG(TRACE) << "LoaderStateMachine(" << std::hex << this << std::dec << ")::HandleSuccessMessage(). Receiver fingerprint = " << GetFingerprint(); if (activeCommands_ <= 0) { LOG(ERROR) << "LoaderStateMachine(" << std::hex << this << std::dec << ")::HandleSuccessMessage : activeCommands_ should be > 0 but is: " << activeCommands_; } @@ -157,37 +162,40 @@ } - LoaderStateMachine::LoaderStateMachine(IOracle& oracle, - IObservable& oracleObservable) : - IObserver(oracleObservable.GetBroker()), - oracle_(oracle), - oracleObservable_(oracleObservable), - active_(false), - simultaneousDownloads_(4), - activeCommands_(0) + LoaderStateMachine::LoaderStateMachine( + OrthancStone::ILoadersContext& loadersContext) + : loadersContext_(loadersContext) + , active_(false) + , simultaneousDownloads_(4) + , activeCommands_(0) { - LOG(TRACE) << "LoaderStateMachine(" << std::hex << this << std::dec << ")::LoaderStateMachine()"; + using OrthancStone::ILoadersContext; + + LOG(TRACE) + << "LoaderStateMachine(" << std::hex << this + << std::dec << ")::LoaderStateMachine()"; + } - oracleObservable.RegisterObserverCallback( - new Callable<LoaderStateMachine, OrthancRestApiCommand::SuccessMessage> - (*this, &LoaderStateMachine::HandleSuccessMessage)); + void LoaderStateMachine::PostConstructor() + { + std::unique_ptr<OrthancStone::ILoadersContext::ILock> + lock(loadersContext_.Lock()); - oracleObservable.RegisterObserverCallback( - new Callable<LoaderStateMachine, GetOrthancImageCommand::SuccessMessage> - (*this, &LoaderStateMachine::HandleSuccessMessage)); + OrthancStone::IObservable& observable = lock->GetOracleObservable(); - oracleObservable.RegisterObserverCallback( - new Callable<LoaderStateMachine, GetOrthancWebViewerJpegCommand::SuccessMessage> - (*this, &LoaderStateMachine::HandleSuccessMessage)); - - oracleObservable.RegisterObserverCallback( - new Callable<LoaderStateMachine, OracleCommandExceptionMessage> - (*this, &LoaderStateMachine::HandleExceptionMessage)); + // TODO => Move this out of constructor + Register<OrthancStone::OrthancRestApiCommand::SuccessMessage>( + observable, &LoaderStateMachine::HandleSuccessMessage); + Register<OrthancStone::GetOrthancImageCommand::SuccessMessage>( + observable, &LoaderStateMachine::HandleSuccessMessage); + Register<OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage>( + observable, &LoaderStateMachine::HandleSuccessMessage); + Register<OrthancStone::OracleCommandExceptionMessage>( + observable, &LoaderStateMachine::HandleExceptionMessage); } LoaderStateMachine::~LoaderStateMachine() { - oracleObservable_.Unregister(this); LOG(TRACE) << "LoaderStateMachine(" << std::hex << this << std::dec << ")::~LoaderStateMachine()"; Clear(); }