diff OrthancServer/DicomProtocol/DicomServer.cpp @ 1680:4113a9a668b1

refactoring
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 06 Oct 2015 13:36:09 +0200
parents d3ba98d6b6e9
children ee4367497d0d
line wrap: on
line diff
--- a/OrthancServer/DicomProtocol/DicomServer.cpp	Tue Oct 06 13:31:40 2015 +0200
+++ b/OrthancServer/DicomProtocol/DicomServer.cpp	Tue Oct 06 13:36:09 2015 +0200
@@ -58,38 +58,34 @@
   };
 
 
-  void DicomServer::ServerThread(DicomServer* server)
+  void DicomServer::ServerThread(DicomServer* server,
+                                 T_ASC_Network *network)
   {
-    /* initialize network, i.e. create an instance of T_ASC_Network*. */
-    T_ASC_Network *net;
-    OFCondition cond = ASC_initializeNetwork
-      (NET_ACCEPTOR, OFstatic_cast(int, server->port_), /*opt_acse_timeout*/ 30, &net);
-    if (cond.bad())
-    {
-      LOG(ERROR) << "cannot create network: " << cond.text();
-      throw OrthancException(ErrorCode_DicomPortInUse);
-    }
-
     LOG(INFO) << "DICOM server started";
 
-    server->started_ = true;
-
     while (server->continue_)
     {
       /* receive an association and acknowledge or reject it. If the association was */
       /* acknowledged, offer corresponding services and invoke one or more if required. */
-      std::auto_ptr<Internals::CommandDispatcher> dispatcher(Internals::AcceptAssociation(*server, net));
+      std::auto_ptr<Internals::CommandDispatcher> dispatcher(Internals::AcceptAssociation(*server, network));
 
-      if (dispatcher.get() != NULL)
+      try
       {
-        if (server->isThreaded_)
+        if (dispatcher.get() != NULL)
         {
-          server->bagOfDispatchers_.Add(dispatcher.release());
+          if (server->isThreaded_)
+          {
+            server->bagOfDispatchers_.Add(dispatcher.release());
+          }
+          else
+          {
+            IRunnableBySteps::RunUntilDone(*dispatcher);
+          }
         }
-        else
-        {
-          IRunnableBySteps::RunUntilDone(*dispatcher);
-        }
+      }
+      catch (OrthancException& e)
+      {
+        LOG(ERROR) << "Exception in the DICOM server thread: " << e.What();
       }
     }
 
@@ -102,12 +98,12 @@
 
     /* drop the network, i.e. free memory of T_ASC_Network* structure. This call */
     /* is the counterpart of ASC_initializeNetwork(...) which was called above. */
-    cond = ASC_dropNetwork(&net);
+    OFCondition cond = ASC_dropNetwork(&network);
     if (cond.bad())
     {
       LOG(ERROR) << "Error while dropping the network: " << cond.text();
     }
-  }                           
+  }
 
 
   DicomServer::DicomServer() : 
@@ -122,8 +118,7 @@
     checkCalledAet_ = true;
     clientTimeout_ = 30;
     isThreaded_ = true;
-    continue_ = false;
-    started_ = false;
+    continue_ = true;
   }
 
   DicomServer::~DicomServer()
@@ -308,14 +303,19 @@
   void DicomServer::Start()
   {
     Stop();
-    continue_ = true;
-    started_ = false;
-    pimpl_->thread_ = boost::thread(ServerThread, this);
 
-    while (!started_)
+    /* initialize network, i.e. create an instance of T_ASC_Network*. */
+    T_ASC_Network *network;
+    OFCondition cond = ASC_initializeNetwork
+      (NET_ACCEPTOR, OFstatic_cast(int, port_), /*opt_acse_timeout*/ 30, &network);
+    if (cond.bad())
     {
-      Toolbox::USleep(50000);  // Wait 50ms
+      LOG(ERROR) << "cannot create network: " << cond.text();
+      throw OrthancException(ErrorCode_DicomPortInUse);
     }
+
+    continue_ = true;
+    pimpl_->thread_ = boost::thread(ServerThread, this, network);
   }