Mercurial > hg > orthanc
diff OrthancServer/OrthancMoveRequestHandler.cpp @ 2624:714dcddeb65f jobs
asynchronous c-movoe
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 24 May 2018 21:44:22 +0200 |
parents | 5e2730c8e23c |
children | 5469dda691cd |
line wrap: on
line diff
--- a/OrthancServer/OrthancMoveRequestHandler.cpp Wed May 23 14:28:25 2018 +0200 +++ b/OrthancServer/OrthancMoveRequestHandler.cpp Thu May 24 21:44:22 2018 +0200 @@ -38,6 +38,7 @@ #include "../../Core/DicomParsing/FromDcmtkBridge.h" #include "../Core/DicomFormat/DicomArray.h" #include "../Core/Logging.h" +#include "ServerJobs/DicomModalityStoreJob.h" namespace Orthanc { @@ -45,7 +46,7 @@ { // Anonymous namespace to avoid clashes between compilation modules - class OrthancMoveRequestIterator : public IMoveRequestIterator + class SynchronousMove : public IMoveRequestIterator { private: ServerContext& context_; @@ -58,11 +59,11 @@ std::auto_ptr<DicomUserConnection> connection_; public: - OrthancMoveRequestIterator(ServerContext& context, - const std::string& aet, - const std::string& publicId, - const std::string& originatorAet, - uint16_t originatorId) : + SynchronousMove(ServerContext& context, + const std::string& aet, + const std::string& publicId, + const std::string& originatorAet, + uint16_t originatorId) : context_(context), localAet_(context.GetDefaultLocalApplicationEntityTitle()), position_(0), @@ -110,6 +111,66 @@ return Status_Success; } }; + + + class AsynchronousMove : public IMoveRequestIterator + { + private: + ServerContext& context_; + std::auto_ptr<DicomModalityStoreJob> job_; + size_t position_; + + public: + AsynchronousMove(ServerContext& context, + const std::string& aet, + const std::string& publicId, + const std::string& originatorAet, + uint16_t originatorId) : + context_(context), + job_(new DicomModalityStoreJob(context)), + position_(0) + { + LOG(INFO) << "Sending resource " << publicId << " to modality \"" << aet << "\""; + + job_->SetDescription("C-MOVE"); + job_->SetPermissive(true); + job_->SetLocalAet(context.GetDefaultLocalApplicationEntityTitle()); + job_->SetRemoteModality(Configuration::GetModalityUsingAet(aet)); + + if (originatorId != 0) + { + job_->SetMoveOriginator(originatorAet, originatorId); + } + + std::list<std::string> tmp; + context_.GetIndex().GetChildInstances(tmp, publicId); + + job_->Reserve(tmp.size()); + + for (std::list<std::string>::iterator it = tmp.begin(); it != tmp.end(); ++it) + { + job_->AddInstance(*it); + } + } + + virtual unsigned int GetSubOperationCount() const + { + return 1; + } + + virtual Status DoNext() + { + if (position_ == 0) + { + context_.GetJobsEngine().GetRegistry().Submit(job_.release(), 0 /* priority */); + return Status_Success; + } + else + { + return Status_Failure; + } + } + }; } @@ -217,7 +278,8 @@ LookupIdentifier(publicId, ResourceType_Study, input) || LookupIdentifier(publicId, ResourceType_Patient, input)) { - return new OrthancMoveRequestIterator(context_, targetAet, publicId, originatorAet, originatorId); + return new AsynchronousMove(context_, targetAet, publicId, originatorAet, originatorId); + //return new SynchronousMove(context_, targetAet, publicId, originatorAet, originatorId); } else { @@ -238,7 +300,8 @@ if (LookupIdentifier(publicId, level, input)) { - return new OrthancMoveRequestIterator(context_, targetAet, publicId, originatorAet, originatorId); + return new AsynchronousMove(context_, targetAet, publicId, originatorAet, originatorId); + //return new SynchronousMove(context_, targetAet, publicId, originatorAet, originatorId); } else {