瀏覽代碼

Add ctkDICOMRetrieveTest1 and ctkDICOMRetrieveTest2

to test ctkDICOMRetrieve.
Julien Finet 14 年之前
父節點
當前提交
314a8a917e

+ 9 - 0
Libs/DICOM/Core/Testing/Cpp/CMakeLists.txt

@@ -9,6 +9,8 @@ CREATE_TEST_SOURCELIST(Tests ${KIT}CppTests.cpp
   ctkDICOMQueryTest1.cpp
   ctkDICOMQueryTest2.cpp
   ctkDICOMPersonNameTest1.cpp
+  ctkDICOMRetrieveTest1.cpp
+  ctkDICOMRetrieveTest2.cpp
   ctkDICOMTest1.cpp
   ctkDICOMTesterTest1.cpp
   ctkDICOMTesterTest2.cpp
@@ -53,6 +55,13 @@ ADD_TEST( ctkDICOMQueryTest2 ${KIT_TESTS}
           ctkDICOMQueryTest2 ${CTKData_DIR}/Data/DICOM/MRHEAD/000055.IMA ${CTKData_DIR}/Data/DICOM/MRHEAD/000056.IMA)
 SET_PROPERTY(TEST ctkDICOMQueryTest2 PROPERTY LABELS ${PROJECT_NAME})
 
+# ctkDICOMRetrieve
+SIMPLE_TEST( ctkDICOMRetrieveTest1)
+ADD_TEST( ctkDICOMRetrieveTest2 ${KIT_TESTS}
+          ctkDICOMRetrieveTest2 ${CTKData_DIR}/Data/DICOM/MRHEAD/000055.IMA ${CTKData_DIR}/Data/DICOM/MRHEAD/000056.IMA)
+SET_PROPERTY(TEST ctkDICOMRetrieveTest2 PROPERTY LABELS ${PROJECT_NAME})
+
+# ctkDICOMTest
 ADD_TEST( ctkDICOMTest1 ${KIT_TESTS}
           ctkDICOMTest1 ${CMAKE_CURRENT_BINARY_DIR}/dicom.db
                         ${CMAKE_CURRENT_SOURCE_DIR}/../../Resources/dicom-sample.sql)

+ 0 - 8
Libs/DICOM/Core/Testing/Cpp/ctkDICOMQueryTest1.cpp

@@ -86,14 +86,6 @@ int ctkDICOMQueryTest1( int argc, char * argv [] )
     return EXIT_FAILURE;
     }
 
-  query.setCallingAETitle("CallingAETitle");
-  if (query.callingAETitle() != "CallingAETitle")
-    {
-    std::cerr << "ctkDICOMQuery::setCallingAETitle() failed: "
-              << qPrintable(query.callingAETitle()) << std::endl;
-    return EXIT_FAILURE;
-    }
-
   QMap<QString,QVariant> filters;
   filters["Name"] = QString("JohnDoe");
   filters["StartDate"] = QString("20090101");

+ 125 - 0
Libs/DICOM/Core/Testing/Cpp/ctkDICOMRetrieveTest1.cpp

@@ -0,0 +1,125 @@
+/*=========================================================================
+
+  Library:   CTK
+
+  Copyright (c) Kitware Inc.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.commontk.org/LICENSE
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+=========================================================================*/
+
+// Qt includes
+#include <QCoreApplication>
+#include <QStringList>
+#include <QVariant>
+
+// ctkDICOMCore includes
+#include "ctkDICOMRetrieve.h"
+
+// STD includes
+#include <cstdlib>
+#include <iostream>
+
+// Simple test that check the values are correctly set
+int ctkDICOMRetrieveTest1( int argc, char * argv [] )
+{
+  QCoreApplication app(argc, argv);
+
+  ctkDICOMRetrieve retrieve;
+
+  // check default values
+  if (!retrieve.callingAETitle().isEmpty() ||
+      !retrieve.calledAETitle().isEmpty() ||
+      !retrieve.host().isEmpty() ||
+      retrieve.callingPort() != 0 ||
+      retrieve.calledPort() != 0 ||
+      !retrieve.moveDestinationAETitle().isEmpty())
+    {
+    std::cerr << "ctkDICOMRetrieve::ctkDICOMRetrieve() failed: "
+              << qPrintable(retrieve.callingAETitle()) << " "
+              << qPrintable(retrieve.calledAETitle()) << " "
+              << qPrintable(retrieve.host()) << " "
+              << retrieve.callingPort() << " "
+              << retrieve.calledPort() << " "
+              << qPrintable(retrieve.moveDestinationAETitle()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  retrieve.setCallingAETitle("CallingAETitle");
+  if (retrieve.callingAETitle() != "CallingAETitle")
+    {
+    std::cerr << "ctkDICOMRetrieve::setCallingAETitle() failed: "
+              << qPrintable(retrieve.callingAETitle()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  retrieve.setCalledAETitle("CalledAETitle");
+  if (retrieve.calledAETitle() != "CalledAETitle")
+    {
+    std::cerr << "ctkDICOMRetrieve::setCalledAETitle() failed: "
+              << qPrintable(retrieve.calledAETitle()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  retrieve.setHost("host");
+  if (retrieve.host() != "host")
+    {
+    std::cerr << "ctkDICOMRetrieve::setHost() failed: "
+              << qPrintable(retrieve.host()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  retrieve.setCallingPort(80);
+  if (retrieve.callingPort() != 80)
+    {
+    std::cerr << "ctkDICOMRetrieve::setCallingPort() failed: "
+              << retrieve.callingPort() << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  retrieve.setCalledPort(80);
+  if (retrieve.calledPort() != 80)
+    {
+    std::cerr << "ctkDICOMRetrieve::setCalledPort() failed: "
+              << retrieve.calledPort() << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  QSharedPointer<ctkDICOMDatabase> dicomDatabase(new ctkDICOMDatabase);
+  retrieve.setRetrieveDatabase(dicomDatabase);
+
+  if (retrieve.retrieveDatabase() != dicomDatabase)
+    {
+    std::cerr << __LINE__ << ": ctkDICOMRetrieve::setRetrieveDatabase() failed."
+              << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  bool res = retrieve.retrieveSeries(QString());
+  if (res)
+    {
+    std::cerr << __LINE__ << ": ctkDICOMRetrieve::retrieveSeries() should fail."
+              << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  res = retrieve.retrieveStudy(QString());
+  if (res)
+    {
+    std::cerr << __LINE__ << ": ctkDICOMRetrieve::retrieveStudy() should fail."
+              << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  return EXIT_SUCCESS;
+}

+ 106 - 0
Libs/DICOM/Core/Testing/Cpp/ctkDICOMRetrieveTest2.cpp

@@ -0,0 +1,106 @@
+/*=========================================================================
+
+  Library:   CTK
+
+  Copyright (c) Kitware Inc.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.commontk.org/LICENSE
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+=========================================================================*/
+
+// Qt includes
+#include <QCoreApplication>
+#include <QDebug>
+#include <QStringList>
+#include <QVariant>
+
+// ctkDICOMCore includes
+#include "ctkDICOMDatabase.h"
+#include "ctkDICOMQuery.h"
+#include "ctkDICOMRetrieve.h"
+#include "ctkDICOMTester.h"
+
+// STD includes
+#include <iostream>
+
+void ctkDICOMRetrieveTest2PrintUsage()
+{
+  std::cout << " ctkDICOMRetrieveTest2 images" << std::endl;
+}
+
+// Test on a real local database
+int ctkDICOMRetrieveTest2( int argc, char * argv [] )
+{
+  QCoreApplication app(argc, argv);
+
+  ctkDICOMTester tester;
+  tester.startDCMQRSCP();
+  
+  QStringList arguments = app.arguments();
+  arguments.pop_front(); // remove application name
+  arguments.pop_front(); // remove test name
+  if (!arguments.count())
+    {
+    ctkDICOMRetrieveTest2PrintUsage();
+    return EXIT_FAILURE;
+    }
+  tester.storeData(arguments);
+
+  ctkDICOMDatabase queryDatabase;
+
+  ctkDICOMQuery query;
+  query.setCallingAETitle("CTK_AE");
+  query.setCalledAETitle("CTK_AE");
+  query.setHost("localhost");
+  query.setPort(tester.dcmqrscpPort());
+
+  bool res = query.query(queryDatabase);
+  if (!res)
+    {
+    std::cout << "ctkDICOMQuery::query() failed" << std::endl;
+    return EXIT_FAILURE;
+    }
+  if (query.studyInstanceUIDQueried().count() == 0)
+    {
+    std::cout << "ctkDICOMQuery::query() failed."
+              << "No study instance retrieved" << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  QSharedPointer<ctkDICOMDatabase> retrieveDatabase(new ctkDICOMDatabase);
+  retrieveDatabase->openDatabase( "./ctkDICOM.sql" );
+
+  ctkDICOMRetrieve retrieve;
+  retrieve.setCallingAETitle("CTK_AE");
+  retrieve.setCallingPort(11113);
+  retrieve.setCalledAETitle("CTK_AE");
+  retrieve.setCalledPort(tester.dcmqrscpPort());
+  retrieve.setHost("localhost");
+  retrieve.setMoveDestinationAETitle("CTK_CLIENT_AE");
+
+  retrieve.setRetrieveDatabase(retrieveDatabase);
+
+  foreach(const QString& study, query.studyInstanceUIDQueried())
+    {
+    bool res = retrieve.retrieveStudy(study);
+    if (!res)
+      {
+      std::cout << "ctkDICOMRetrieve::retrieveStudy() failed. "
+                << "Study " << qPrintable(study) << " can't be retrieved"
+                << std::endl;
+      return EXIT_FAILURE;
+      }
+    }
+
+  return EXIT_SUCCESS;
+}

+ 104 - 95
Libs/DICOM/Core/ctkDICOMRetrieve.cpp

@@ -69,19 +69,19 @@ class ctkDICOMRetrievePrivate
 public:
   ctkDICOMRetrievePrivate();
   ~ctkDICOMRetrievePrivate();
-  QString CallingAETitle;
-  QString CalledAETitle;
-  QString Host;
-  int CallingPort;
-  int CalledPort;
-  DcmSCU SCU;
-  DcmDataset* parameters;
-  QString MoveDestinationAETitle;
+  QString       CallingAETitle;
+  QString       CalledAETitle;
+  QString       Host;
+  int           CallingPort;
+  int           CalledPort;
+  DcmSCU        SCU; // TODO: not used yet.
+  DcmDataset*   parameters;
+  QString       MoveDestinationAETitle;
   QSharedPointer<ctkDICOMDatabase> RetrieveDatabase;
 
   // do the retrieve, handling both series and study retrieves
   enum RetrieveType { RetrieveSeries, RetrieveStudy };
-  void retrieve ( QString UID, RetrieveType retriveType );
+  bool retrieve ( QString UID, RetrieveType retriveType );
 };
 
 //------------------------------------------------------------------------------
@@ -90,23 +90,25 @@ public:
 //------------------------------------------------------------------------------
 ctkDICOMRetrievePrivate::ctkDICOMRetrievePrivate()
 {
-  parameters = new DcmDataset();
-  RetrieveDatabase = QSharedPointer<ctkDICOMDatabase> (0);
+  this->parameters = new DcmDataset();
+  this->RetrieveDatabase = QSharedPointer<ctkDICOMDatabase> (0);
+  this->CallingPort = 0;
+  this->CalledPort = 0;
 }
 
 //------------------------------------------------------------------------------
 ctkDICOMRetrievePrivate::~ctkDICOMRetrievePrivate()
 {
-  delete parameters;
+  delete this->parameters;
 }
 
 //------------------------------------------------------------------------------
-void ctkDICOMRetrievePrivate::retrieve ( QString UID, RetrieveType retriveType ) {
+bool ctkDICOMRetrievePrivate::retrieve ( QString UID, RetrieveType retriveType ) {
 
-  if ( !RetrieveDatabase )
+  if ( !this->RetrieveDatabase )
     {
     logger.error ( "Must have RetrieveDatabase for retrieve transaction" );
-    return;
+    return false;
     }
 
   // Register the JPEG libraries in case we need them
@@ -124,13 +126,14 @@ void ctkDICOMRetrievePrivate::retrieve ( QString UID, RetrieveType retriveType )
   log4cplus::Logger rootLogger = log4cplus::Logger::getRoot();
   rootLogger.setLogLevel(log4cplus::DEBUG_LOG_LEVEL);
 
+  // TODO: use this->SCU instead ?
   DcmSCU scu;
-  scu.setAETitle ( OFString(CallingAETitle.toStdString().c_str()) );
-  scu.setPort ( CallingPort );
-  scu.setPeerAETitle ( OFString(CalledAETitle.toStdString().c_str()) );
-  scu.setPeerHostName ( OFString(Host.toStdString().c_str()) );
-  scu.setPeerPort ( CalledPort );
-  scu.setMoveDestinationAETitle ( OFString(MoveDestinationAETitle.toStdString().c_str()) );
+  scu.setAETitle ( OFString(this->CallingAETitle.toStdString().c_str()) );
+  scu.setPort ( this->CallingPort );
+  scu.setPeerAETitle ( OFString(this->CalledAETitle.toStdString().c_str()) );
+  scu.setPeerHostName ( OFString(this->Host.toStdString().c_str()) );
+  scu.setPeerPort ( this->CalledPort );
+  scu.setMoveDestinationAETitle ( OFString(this->MoveDestinationAETitle.toStdString().c_str()) );
 
   logger.info ( "Setting Transfer Syntaxes" );
   OFList<OFString> transferSyntaxes;
@@ -140,17 +143,16 @@ void ctkDICOMRetrievePrivate::retrieve ( QString UID, RetrieveType retriveType )
   scu.addPresentationContext ( UID_FINDStudyRootQueryRetrieveInformationModel, transferSyntaxes );
   scu.addPresentationContext ( UID_MOVEStudyRootQueryRetrieveInformationModel, transferSyntaxes );
 
-
   if ( !scu.initNetwork().good() ) 
     {
     logger.error ( "Error initializing the network" );
-    throw std::runtime_error( std::string("Error initializing the network") );
+    return false;
     }
   logger.debug ( "Negotiating Association" );
   if ( !scu.negotiateAssociation().good() )
     {
     logger.error ( "Error negotiating association" );
-    throw std::runtime_error( std::string("Error negotiating association") );
+    return false;;
     }
 
   logger.debug ( "Setting Parameters" );
@@ -175,66 +177,67 @@ void ctkDICOMRetrievePrivate::retrieve ( QString UID, RetrieveType retriveType )
   logger.debug ( "Sending Move Request" );
   MOVEResponses *responses = new MOVEResponses();
   OFCondition status = scu.sendMOVERequest ( 0, this->parameters, responses );
-  if ( status.good() )
+  if (!status.good())
     {
-    logger.debug ( "Find succeded" );
+    logger.error ( "MOVE Request failed: " + QString ( status.text() ) );
+    return false;
+    }
 
-    logger.debug ( "Making Output Directory" );
-    QDir directory = QDir( RetrieveDatabase->databaseDirectory() );
+  logger.debug ( "Find succeded" );
 
-    if ( responses->begin() == responses->end() )
-      {
-      logger.error ( "No responses!" );
-      throw std::runtime_error( std::string("No responses!") );
-      }
+  logger.debug ( "Making Output Directory" );
+  QDir directory = QDir( RetrieveDatabase->databaseDirectory() );
 
-    // Write the responses out to disk
-    for ( OFListIterator(FINDResponse*) it = responses->begin(); it != responses->end(); it++ )
+  if ( responses->begin() == responses->end() )
+    {
+    logger.error ( "No responses!" );
+    throw std::runtime_error( std::string("No responses!") );
+    }
+
+  // Write the responses out to disk
+  for ( OFListIterator(FINDResponse*) it = responses->begin(); it != responses->end(); it++ )
+    {
+    DcmDataset *dataset = (*it)->m_dataset;
+    if ( dataset != NULL )
       {
-      DcmDataset *dataset = (*it)->m_dataset;
-      if ( dataset != NULL )
+      logger.debug ( "Got a valid dataset" );
+      // Save in correct directory
+      E_TransferSyntax output_transfersyntax = dataset->getOriginalXfer();
+      dataset->chooseRepresentation( output_transfersyntax, NULL );
+        
+      if ( !dataset->canWriteXfer( output_transfersyntax ) )
         {
-        logger.debug ( "Got a valid dataset" );
-        // Save in correct directory
-        E_TransferSyntax output_transfersyntax = dataset->getOriginalXfer();
-        dataset->chooseRepresentation( output_transfersyntax, NULL );
+        // Pick EXS_LittleEndianExplicit as our default
+        output_transfersyntax = EXS_LittleEndianExplicit;
+        }
         
-        if ( !dataset->canWriteXfer( output_transfersyntax ) )
+      DcmXfer opt_oxferSyn( output_transfersyntax );
+      if ( !dataset->chooseRepresentation( opt_oxferSyn.getXfer(), NULL ).bad() )
+        {
+        DcmFileFormat* fileformat = new DcmFileFormat ( dataset );
+          
+        // Follow dcmdjpeg example
+        fileformat->loadAllDataIntoMemory();
+        OFString SOPInstanceUID;
+        dataset->findAndGetOFString ( DCM_SOPInstanceUID, SOPInstanceUID );
+        QFileInfo fi ( directory, QString ( SOPInstanceUID.c_str() ) );
+        logger.debug ( "Saving file: " + fi.absoluteFilePath() );
+        status = fileformat->saveFile ( fi.absoluteFilePath().toStdString().c_str(), opt_oxferSyn.getXfer() );
+        if ( !status.good() )
           {
-          // Pick EXS_LittleEndianExplicit as our default
-          output_transfersyntax = EXS_LittleEndianExplicit;
+          logger.error ( "Error saving file: " + fi.absoluteFilePath() + " Error is " + status.text() );
           }
-        
-        DcmXfer opt_oxferSyn( output_transfersyntax );
-        if ( !dataset->chooseRepresentation( opt_oxferSyn.getXfer(), NULL ).bad() )
-          {
-          DcmFileFormat* fileformat = new DcmFileFormat ( dataset );
-          
-          // Follow dcmdjpeg example
-          fileformat->loadAllDataIntoMemory();
-          OFString SOPInstanceUID;
-          dataset->findAndGetOFString ( DCM_SOPInstanceUID, SOPInstanceUID );
-          QFileInfo fi ( directory, QString ( SOPInstanceUID.c_str() ) );
-          logger.debug ( "Saving file: " + fi.absoluteFilePath() );
-          status = fileformat->saveFile ( fi.absoluteFilePath().toStdString().c_str(), opt_oxferSyn.getXfer() );
-          if ( !status.good() )
-            {
-            logger.error ( "Error saving file: " + fi.absoluteFilePath() + " Error is " + status.text() );
-            }
-
-          RetrieveDatabase->insert( dataset, true );
+
+        RetrieveDatabase->insert( dataset, true );
           
-          delete fileformat;
-          }
+        delete fileformat;
         }
       }
     }
-  else
-    {
-    logger.error ( "MOVE Request failed: " + QString ( status.text() ) );
-    throw std::runtime_error( std::string("Move Request Failed") );
-    }
+
+
   delete responses;
+  return true;
 }
 
 //------------------------------------------------------------------------------
@@ -253,85 +256,85 @@ ctkDICOMRetrieve::~ctkDICOMRetrieve()
 
 //------------------------------------------------------------------------------
 /// Set methods for connectivity
-void ctkDICOMRetrieve::setCallingAETitle ( QString callingAETitle )
+void ctkDICOMRetrieve::setCallingAETitle( const QString& callingAETitle )
 {
   Q_D(ctkDICOMRetrieve);
   d->CallingAETitle = callingAETitle;
 }
 
 //------------------------------------------------------------------------------
-const QString& ctkDICOMRetrieve::callingAETitle() 
+QString ctkDICOMRetrieve::callingAETitle() const
 {
-  Q_D(ctkDICOMRetrieve);
+  Q_D(const ctkDICOMRetrieve);
   return d->CallingAETitle;
 }
 
 //------------------------------------------------------------------------------
-void ctkDICOMRetrieve::setCalledAETitle ( QString calledAETitle )
+void ctkDICOMRetrieve::setCalledAETitle( const QString& calledAETitle )
 {
   Q_D(ctkDICOMRetrieve);
   d->CalledAETitle = calledAETitle;
 }
 
 //------------------------------------------------------------------------------
-const QString& ctkDICOMRetrieve::calledAETitle()
+QString ctkDICOMRetrieve::calledAETitle()const
 {
-  Q_D(ctkDICOMRetrieve);
+  Q_D(const ctkDICOMRetrieve);
   return d->CalledAETitle;
 }
 
 //------------------------------------------------------------------------------
-void ctkDICOMRetrieve::setHost ( QString host )
+void ctkDICOMRetrieve::setHost( const QString& host )
 {
   Q_D(ctkDICOMRetrieve);
   d->Host = host;
 }
 
 //------------------------------------------------------------------------------
-const QString& ctkDICOMRetrieve::host()
+QString ctkDICOMRetrieve::host()const
 {
-  Q_D(ctkDICOMRetrieve);
+  Q_D(const ctkDICOMRetrieve);
   return d->Host;
 }
 
 //------------------------------------------------------------------------------
-void ctkDICOMRetrieve::setCallingPort ( int port ) 
+void ctkDICOMRetrieve::setCallingPort( int port )
 {
   Q_D(ctkDICOMRetrieve);
   d->CallingPort = port;
 }
 
 //------------------------------------------------------------------------------
-int ctkDICOMRetrieve::callingPort()
+int ctkDICOMRetrieve::callingPort()const
 {
-  Q_D(ctkDICOMRetrieve);
+  Q_D(const ctkDICOMRetrieve);
   return d->CallingPort;
 }
 
 //------------------------------------------------------------------------------
-void ctkDICOMRetrieve::setCalledPort ( int port ) 
+void ctkDICOMRetrieve::setCalledPort( int port )
 {
   Q_D(ctkDICOMRetrieve);
   d->CalledPort = port;
 }
 
 //------------------------------------------------------------------------------
-int ctkDICOMRetrieve::calledPort()
+int ctkDICOMRetrieve::calledPort()const
 {
-  Q_D(ctkDICOMRetrieve);
+  Q_D(const ctkDICOMRetrieve);
   return d->CalledPort;
 }
 
 //------------------------------------------------------------------------------
-void ctkDICOMRetrieve::setMoveDestinationAETitle ( QString moveDestinationAETitle )
+void ctkDICOMRetrieve::setMoveDestinationAETitle( const QString& moveDestinationAETitle )
 {
   Q_D(ctkDICOMRetrieve);
   d->MoveDestinationAETitle = moveDestinationAETitle;
 }
 //------------------------------------------------------------------------------
-const QString& ctkDICOMRetrieve::moveDestinationAETitle()
+QString ctkDICOMRetrieve::moveDestinationAETitle()const
 {
-  Q_D(ctkDICOMRetrieve);
+  Q_D(const ctkDICOMRetrieve);
   return d->MoveDestinationAETitle;
 }
 
@@ -343,18 +346,24 @@ void ctkDICOMRetrieve::setRetrieveDatabase(QSharedPointer<ctkDICOMDatabase> dico
 }
 
 //------------------------------------------------------------------------------
-void ctkDICOMRetrieve::retrieveSeries ( QString seriesInstanceUID ) {
+QSharedPointer<ctkDICOMDatabase> ctkDICOMRetrieve::retrieveDatabase()const
+{
+  Q_D(const ctkDICOMRetrieve);
+  return d->RetrieveDatabase;
+}
+
+//------------------------------------------------------------------------------
+bool ctkDICOMRetrieve::retrieveSeries( const QString& seriesInstanceUID )
+{
   Q_D(ctkDICOMRetrieve);
   logger.info ( "Starting retrieveSeries" );
-  d->retrieve ( seriesInstanceUID, ctkDICOMRetrievePrivate::RetrieveSeries );
-  return;
+  return d->retrieve ( seriesInstanceUID, ctkDICOMRetrievePrivate::RetrieveSeries );
 }
 
 //------------------------------------------------------------------------------
-void ctkDICOMRetrieve::retrieveStudy ( QString studyInstanceUID ) {
+bool ctkDICOMRetrieve::retrieveStudy( const QString& studyInstanceUID )
+{
   Q_D(ctkDICOMRetrieve);
   logger.info ( "Starting retrieveStudy" );
-  d->retrieve ( studyInstanceUID, ctkDICOMRetrievePrivate::RetrieveStudy );
-  return;
+  return d->retrieve ( studyInstanceUID, ctkDICOMRetrievePrivate::RetrieveStudy );
 }
-

+ 33 - 18
Libs/DICOM/Core/ctkDICOMRetrieve.h

@@ -36,36 +36,51 @@ class ctkDICOMRetrievePrivate;
 class CTK_DICOM_CORE_EXPORT ctkDICOMRetrieve : public QObject
 {
   Q_OBJECT
+  Q_PROPERTY(QString callingAETitle READ callingAETitle WRITE setCallingAETitle);
+  Q_PROPERTY(QString calledAETitle READ calledAETitle WRITE setCallingAETitle);
+  Q_PROPERTY(QString host READ host WRITE setHost);
+  Q_PROPERTY(int callingPort READ callingPort WRITE setCallingPort);
+  Q_PROPERTY(int calledPort READ calledPort WRITE setCalledPort);
+  Q_PROPERTY(QString moveDestinationAETitle READ moveDestinationAETitle WRITE setMoveDestinationAETitle)
+
 public:
   explicit ctkDICOMRetrieve();
   virtual ~ctkDICOMRetrieve();
 
   /// Set methods for connectivity
-  void setCallingAETitle ( QString callingAETitle );
-  const QString& callingAETitle();
-  void setCalledAETitle ( QString calledAETitle );
-  const QString& calledAETitle();
-  void setHost ( QString host );
-  const QString& host();
-  void setCallingPort ( int port );
-  int callingPort();
-  void setCalledPort ( int port );
-  int calledPort();
-  void setMoveDestinationAETitle ( QString moveDestinationAETitle );
-  const QString& moveDestinationAETitle();
-  
+  /// CTK_AE
+  void setCallingAETitle( const QString& callingAETitle );
+  QString callingAETitle() const;
+  /// CTK_AE
+  void setCalledAETitle( const QString& calledAETitle );
+  QString calledAETitle() const;
+  /// localhost
+  void setHost( const QString& host );
+  QString host() const;
+  /// [0, 65365] 11113
+  void setCallingPort( int port );
+  int callingPort() const;
+  /// [0, 65365] 11112
+  void setCalledPort( int port );
+  int calledPort() const;
+  /// Typically CTK_CLIENT_AE
+  void setMoveDestinationAETitle( const QString& moveDestinationAETitle );
+  QString moveDestinationAETitle() const;
+
   /// method for database
   void setRetrieveDatabase(QSharedPointer<ctkDICOMDatabase> dicomDatabase);
+  QSharedPointer<ctkDICOMDatabase> retrieveDatabase()const;
+
   // Could be a slot...
-  void retrieveSeries ( QString seriesInstanceUID );
-  void retrieveStudy ( QString studyInstanceUID );
+  bool retrieveSeries( const QString& seriesInstanceUID );
+  bool retrieveStudy( const QString& studyInstanceUID );
 
 protected:
   QScopedPointer<ctkDICOMRetrievePrivate> d_ptr;
-  
+
 private:
-  void retrieve ( QDir directory );
-  
+  void retrieve( QDir directory );
+
   Q_DECLARE_PRIVATE(ctkDICOMRetrieve);
   Q_DISABLE_COPY(ctkDICOMRetrieve);