changeset 2602:c25f1a52acbc jobs

reorganization
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 18 May 2018 15:34:11 +0200
parents 5b6c3d77a2a1
children 988936118354
files OrthancServer/OrthancRestApi/OrthancRestModalities.cpp OrthancServer/ServerJobs/DicomModalityStoreJob.h OrthancServer/ServerJobs/OrthancPeerStoreJob.h
diffstat 3 files changed, 326 insertions(+), 255 deletions(-) [+]
line wrap: on
line diff
--- a/OrthancServer/OrthancRestApi/OrthancRestModalities.cpp	Thu May 17 17:03:40 2018 +0200
+++ b/OrthancServer/OrthancRestApi/OrthancRestModalities.cpp	Fri May 18 15:34:11 2018 +0200
@@ -34,264 +34,14 @@
 #include "../PrecompiledHeadersServer.h"
 #include "OrthancRestApi.h"
 
-#include "../OrthancInitialization.h"
-#include "../../Core/HttpClient.h"
+#include "../../Core/DicomParsing/FromDcmtkBridge.h"
 #include "../../Core/Logging.h"
-#include "../../Core/DicomParsing/FromDcmtkBridge.h"
-#include "../Scheduler/ServerJob.h"
-#include "../Scheduler/StoreScuCommand.h"
-#include "../Scheduler/StorePeerCommand.h"
+#include "../OrthancInitialization.h"
 #include "../QueryRetrieveHandler.h"
+#include "../ServerJobs/DicomModalityStoreJob.h"
+#include "../ServerJobs/OrthancPeerStoreJob.h"
 #include "../ServerToolbox.h"
 
-#include "../../Core/JobsEngine/SetOfInstancesJob.h"
-
-
-namespace Orthanc
-{
-  class DicomStoreJob : public SetOfInstancesJob
-  {
-  private:
-    ServerContext&                      context_;
-    std::string                         localAet_;
-    RemoteModalityParameters            remote_;
-    std::string                         moveOriginatorAet_;
-    uint16_t                            moveOriginatorId_;
-    std::auto_ptr<DicomUserConnection>  connection_;
-
-    void OpenConnection()
-    {
-      if (connection_.get() == NULL)
-      {
-        connection_.reset(new DicomUserConnection);
-        connection_->SetLocalApplicationEntityTitle(localAet_);
-        connection_->SetRemoteModality(remote_);
-      }
-    }
-
-  protected:
-    virtual bool HandleInstance(const std::string& instance)
-    {
-      OpenConnection();
-
-      LOG(INFO) << "Sending instance " << instance << " to modality \"" 
-                << remote_.GetApplicationEntityTitle() << "\"";
-
-      std::string dicom;
-      context_.ReadDicom(dicom, instance);
-
-      if (HasMoveOriginator())
-      {
-        connection_->Store(dicom, moveOriginatorAet_, moveOriginatorId_);
-      }
-      else
-      {
-        connection_->Store(dicom);
-      }
-
-      //boost::this_thread::sleep(boost::posix_time::milliseconds(500));
-
-      return true;
-    }
-    
-  public:
-    DicomStoreJob(ServerContext& context) :
-      context_(context),
-      localAet_("ORTHANC"),
-      moveOriginatorId_(0)  // By default, not a C-MOVE
-    {
-    }
-
-    const std::string& GetLocalAet() const
-    {
-      return localAet_;
-    }
-
-    void SetLocalAet(const std::string& aet)
-    {
-      if (IsStarted())
-      {
-        throw OrthancException(ErrorCode_BadSequenceOfCalls);
-      }
-      else
-      {
-        localAet_ = aet;
-      }
-    }
-
-    const RemoteModalityParameters& GetRemoteModality() const
-    {
-      return remote_;
-    }
-
-    void SetRemoteModality(const RemoteModalityParameters& remote)
-    {
-      if (IsStarted())
-      {
-        throw OrthancException(ErrorCode_BadSequenceOfCalls);
-      }
-      else
-      {
-        remote_ = remote;
-      }
-    }
-
-    bool HasMoveOriginator() const
-    {
-      return moveOriginatorId_ != 0;
-    }
-    
-    const std::string& GetMoveOriginatorAet() const
-    {
-      if (HasMoveOriginator())
-      {
-        return moveOriginatorAet_;
-      }
-      else
-      {
-        throw OrthancException(ErrorCode_BadSequenceOfCalls);
-      }
-    }
-    
-    uint16_t GetMoveOriginatorId() const
-    {
-      if (HasMoveOriginator())
-      {
-        return moveOriginatorId_;
-      }
-      else
-      {
-        throw OrthancException(ErrorCode_BadSequenceOfCalls);
-      }
-    }
-
-    void SetMoveOriginator(const std::string& aet,
-                           int id)
-    {
-      if (IsStarted())
-      {
-        throw OrthancException(ErrorCode_BadSequenceOfCalls);
-      }
-      else if (id < 0 || 
-               id >= 65536)
-      {
-        throw OrthancException(ErrorCode_ParameterOutOfRange);
-      }
-      else
-      {
-        moveOriginatorId_ = static_cast<uint16_t>(id);
-        moveOriginatorAet_ = aet;
-      }
-    }
-
-    virtual void ReleaseResources()   // For pausing jobs
-    {
-      connection_.reset(NULL);
-    }
-
-    virtual void GetJobType(std::string& target)
-    {
-      target = "DicomStore";
-    }
-
-    virtual void GetPublicContent(Json::Value& value)
-    {
-      value["LocalAet"] = localAet_;
-      value["RemoteAet"] = remote_.GetApplicationEntityTitle();
-
-      if (HasMoveOriginator())
-      {
-        value["MoveOriginatorAET"] = GetMoveOriginatorAet();
-        value["MoveOriginatorID"] = GetMoveOriginatorId();
-      }
-
-      value["InstancesCount"] = static_cast<uint32_t>(GetInstances().size());
-      value["FailedInstancesCount"] = static_cast<uint32_t>(GetFailedInstances().size());
-    }
-  };
-
-
-  class OrthancPeerStoreJob : public SetOfInstancesJob
-  {
-  private:
-    ServerContext&             context_;
-    WebServiceParameters       peer_;
-    std::auto_ptr<HttpClient>  client_;
-
-  protected:
-    virtual bool HandleInstance(const std::string& instance)
-    {
-      //boost::this_thread::sleep(boost::posix_time::milliseconds(500));
-
-      if (client_.get() == NULL)
-      {
-        client_.reset(new HttpClient(peer_, "instances"));
-        client_->SetMethod(HttpMethod_Post);
-      }
-      
-      LOG(INFO) << "Sending instance " << instance << " to peer \"" 
-                << peer_.GetUrl() << "\"";
-
-      context_.ReadDicom(client_->GetBody(), instance);
-
-      std::string answer;
-      if (client_->Apply(answer))
-      {
-        return true;
-      }
-      else
-      {
-        throw OrthancException(ErrorCode_NetworkProtocol);
-      }
-    }
-    
-  public:
-    OrthancPeerStoreJob(ServerContext& context) :
-      context_(context)
-    {
-    }
-
-    void SetPeer(const WebServiceParameters& peer)
-    {
-      if (IsStarted())
-      {
-        throw OrthancException(ErrorCode_BadSequenceOfCalls);
-      }
-      else
-      {
-        peer_ = peer;
-      }
-    }
-
-    const WebServiceParameters& GetPeer() const
-    {
-      return peer_;
-    }
-
-    virtual void ReleaseResources()   // For pausing jobs
-    {
-      client_.reset(NULL);
-    }
-
-    virtual void GetJobType(std::string& target)
-    {
-      target = "OrthancPeerStore";
-    }
-
-    virtual void GetPublicContent(Json::Value& value)
-    {
-      Json::Value v;
-      peer_.ToJson(v);
-      value["Peer"] = v;
-        
-      value["InstancesCount"] = static_cast<uint32_t>(GetInstances().size());
-      value["FailedInstancesCount"] = static_cast<uint32_t>(GetFailedInstances().size());
-    }
-  };
-}
-
-
-
 
 namespace Orthanc
 {
@@ -1017,7 +767,7 @@
 
     RemoteModalityParameters p = Configuration::GetModalityUsingSymbolicName(remote);
 
-    std::auto_ptr<DicomStoreJob> job(new DicomStoreJob(context));
+    std::auto_ptr<DicomModalityStoreJob> job(new DicomModalityStoreJob(context));
     job->SetLocalAet(localAet);
     job->SetRemoteModality(p);
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancServer/ServerJobs/DicomModalityStoreJob.h	Fri May 18 15:34:11 2018 +0200
@@ -0,0 +1,202 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
+ * Department, University Hospital of Liege, Belgium
+ * Copyright (C) 2017-2018 Osimis S.A., Belgium
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * In addition, as a special exception, the copyright holders of this
+ * program give permission to link the code of its release with the
+ * OpenSSL project's "OpenSSL" library (or with modified versions of it
+ * that use the same license as the "OpenSSL" library), and distribute
+ * the linked executables. You must obey the GNU General Public License
+ * in all respects for all of the code used other than "OpenSSL". If you
+ * modify file(s) with this exception, you may extend this exception to
+ * your version of the file(s), but you are not obligated to do so. If
+ * you do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source files
+ * in the program, then also delete it here.
+ * 
+ * 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+
+#pragma once
+
+#include "../../Core/JobsEngine/SetOfInstancesJob.h"
+#include "../../Core/DicomNetworking/DicomUserConnection.h"
+
+
+namespace Orthanc
+{
+  class DicomModalityStoreJob : public SetOfInstancesJob
+  {
+  private:
+    ServerContext&                      context_;
+    std::string                         localAet_;
+    RemoteModalityParameters            remote_;
+    std::string                         moveOriginatorAet_;
+    uint16_t                            moveOriginatorId_;
+    std::auto_ptr<DicomUserConnection>  connection_;
+
+    void OpenConnection()
+    {
+      if (connection_.get() == NULL)
+      {
+        connection_.reset(new DicomUserConnection);
+        connection_->SetLocalApplicationEntityTitle(localAet_);
+        connection_->SetRemoteModality(remote_);
+      }
+    }
+
+  protected:
+    virtual bool HandleInstance(const std::string& instance)
+    {
+      OpenConnection();
+
+      LOG(INFO) << "Sending instance " << instance << " to modality \"" 
+                << remote_.GetApplicationEntityTitle() << "\"";
+
+      std::string dicom;
+      context_.ReadDicom(dicom, instance);
+
+      if (HasMoveOriginator())
+      {
+        connection_->Store(dicom, moveOriginatorAet_, moveOriginatorId_);
+      }
+      else
+      {
+        connection_->Store(dicom);
+      }
+
+      //boost::this_thread::sleep(boost::posix_time::milliseconds(500));
+
+      return true;
+    }
+    
+  public:
+    DicomModalityStoreJob(ServerContext& context) :
+      context_(context),
+      localAet_("ORTHANC"),
+      moveOriginatorId_(0)  // By default, not a C-MOVE
+    {
+    }
+
+    const std::string& GetLocalAet() const
+    {
+      return localAet_;
+    }
+
+    void SetLocalAet(const std::string& aet)
+    {
+      if (IsStarted())
+      {
+        throw OrthancException(ErrorCode_BadSequenceOfCalls);
+      }
+      else
+      {
+        localAet_ = aet;
+      }
+    }
+
+    const RemoteModalityParameters& GetRemoteModality() const
+    {
+      return remote_;
+    }
+
+    void SetRemoteModality(const RemoteModalityParameters& remote)
+    {
+      if (IsStarted())
+      {
+        throw OrthancException(ErrorCode_BadSequenceOfCalls);
+      }
+      else
+      {
+        remote_ = remote;
+      }
+    }
+
+    bool HasMoveOriginator() const
+    {
+      return moveOriginatorId_ != 0;
+    }
+    
+    const std::string& GetMoveOriginatorAet() const
+    {
+      if (HasMoveOriginator())
+      {
+        return moveOriginatorAet_;
+      }
+      else
+      {
+        throw OrthancException(ErrorCode_BadSequenceOfCalls);
+      }
+    }
+    
+    uint16_t GetMoveOriginatorId() const
+    {
+      if (HasMoveOriginator())
+      {
+        return moveOriginatorId_;
+      }
+      else
+      {
+        throw OrthancException(ErrorCode_BadSequenceOfCalls);
+      }
+    }
+
+    void SetMoveOriginator(const std::string& aet,
+                           int id)
+    {
+      if (IsStarted())
+      {
+        throw OrthancException(ErrorCode_BadSequenceOfCalls);
+      }
+      else if (id < 0 || 
+               id >= 65536)
+      {
+        throw OrthancException(ErrorCode_ParameterOutOfRange);
+      }
+      else
+      {
+        moveOriginatorId_ = static_cast<uint16_t>(id);
+        moveOriginatorAet_ = aet;
+      }
+    }
+
+    virtual void ReleaseResources()   // For pausing jobs
+    {
+      connection_.reset(NULL);
+    }
+
+    virtual void GetJobType(std::string& target)
+    {
+      target = "DicomModalityStore";
+    }
+
+    virtual void GetPublicContent(Json::Value& value)
+    {
+      value["LocalAet"] = localAet_;
+      value["RemoteAet"] = remote_.GetApplicationEntityTitle();
+
+      if (HasMoveOriginator())
+      {
+        value["MoveOriginatorAET"] = GetMoveOriginatorAet();
+        value["MoveOriginatorID"] = GetMoveOriginatorId();
+      }
+
+      value["InstancesCount"] = static_cast<uint32_t>(GetInstances().size());
+      value["FailedInstancesCount"] = static_cast<uint32_t>(GetFailedInstances().size());
+    }
+  };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancServer/ServerJobs/OrthancPeerStoreJob.h	Fri May 18 15:34:11 2018 +0200
@@ -0,0 +1,119 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
+ * Department, University Hospital of Liege, Belgium
+ * Copyright (C) 2017-2018 Osimis S.A., Belgium
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * In addition, as a special exception, the copyright holders of this
+ * program give permission to link the code of its release with the
+ * OpenSSL project's "OpenSSL" library (or with modified versions of it
+ * that use the same license as the "OpenSSL" library), and distribute
+ * the linked executables. You must obey the GNU General Public License
+ * in all respects for all of the code used other than "OpenSSL". If you
+ * modify file(s) with this exception, you may extend this exception to
+ * your version of the file(s), but you are not obligated to do so. If
+ * you do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source files
+ * in the program, then also delete it here.
+ * 
+ * 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+
+#pragma once
+
+#include "../../Core/JobsEngine/SetOfInstancesJob.h"
+#include "../../Core/HttpClient.h"
+
+
+namespace Orthanc
+{
+  class OrthancPeerStoreJob : public SetOfInstancesJob
+  {
+  private:
+    ServerContext&             context_;
+    WebServiceParameters       peer_;
+    std::auto_ptr<HttpClient>  client_;
+
+  protected:
+    virtual bool HandleInstance(const std::string& instance)
+    {
+      //boost::this_thread::sleep(boost::posix_time::milliseconds(500));
+
+      if (client_.get() == NULL)
+      {
+        client_.reset(new HttpClient(peer_, "instances"));
+        client_->SetMethod(HttpMethod_Post);
+      }
+      
+      LOG(INFO) << "Sending instance " << instance << " to peer \"" 
+                << peer_.GetUrl() << "\"";
+
+      context_.ReadDicom(client_->GetBody(), instance);
+
+      std::string answer;
+      if (client_->Apply(answer))
+      {
+        return true;
+      }
+      else
+      {
+        throw OrthancException(ErrorCode_NetworkProtocol);
+      }
+    }
+    
+  public:
+    OrthancPeerStoreJob(ServerContext& context) :
+      context_(context)
+    {
+    }
+
+    void SetPeer(const WebServiceParameters& peer)
+    {
+      if (IsStarted())
+      {
+        throw OrthancException(ErrorCode_BadSequenceOfCalls);
+      }
+      else
+      {
+        peer_ = peer;
+      }
+    }
+
+    const WebServiceParameters& GetPeer() const
+    {
+      return peer_;
+    }
+
+    virtual void ReleaseResources()   // For pausing jobs
+    {
+      client_.reset(NULL);
+    }
+
+    virtual void GetJobType(std::string& target)
+    {
+      target = "OrthancPeerStore";
+    }
+
+    virtual void GetPublicContent(Json::Value& value)
+    {
+      Json::Value v;
+      peer_.ToJson(v);
+      value["Peer"] = v;
+        
+      value["InstancesCount"] = static_cast<uint32_t>(GetInstances().size());
+      value["FailedInstancesCount"] = static_cast<uint32_t>(GetFailedInstances().size());
+    }
+  };
+}