Browse Source

Add option for CGET on a per-server basis

With this change, there's a check box for
each dicom server that indicates if a CGET operation
should be used instead of a CMOVE.  This gets
serialized to settings and should be backward
compatible with previous settings files.
Steve Pieper 13 years ago
parent
commit
cb3af97fc7

+ 15 - 0
Libs/DICOM/Core/ctkDICOMQuery.cpp

@@ -94,6 +94,7 @@ public:
   QString                 CalledAETitle;
   QString                 Host;
   int                     Port;
+  bool                    PreferCGET;
   QMap<QString,QVariant>  Filters;
   ctkDICOMQuerySCUPrivate SCU;
   DcmDataset*             Query;
@@ -201,6 +202,20 @@ int ctkDICOMQuery::port()const
 }
 
 //------------------------------------------------------------------------------
+void ctkDICOMQuery::setPreferCGET ( bool preferCGET )
+{
+  Q_D(ctkDICOMQuery);
+  d->PreferCGET = preferCGET;
+}
+
+//------------------------------------------------------------------------------
+bool ctkDICOMQuery::preferCGET()const
+{
+  Q_D(const ctkDICOMQuery);
+  return d->PreferCGET;
+}
+
+//------------------------------------------------------------------------------
 void ctkDICOMQuery::setFilters( const QMap<QString,QVariant>& filters )
 {
   Q_D(ctkDICOMQuery);

+ 5 - 0
Libs/DICOM/Core/ctkDICOMQuery.h

@@ -43,6 +43,7 @@ class CTK_DICOM_CORE_EXPORT ctkDICOMQuery : public QObject
   Q_PROPERTY(QString calledAETitle READ calledAETitle WRITE setCallingAETitle);
   Q_PROPERTY(QString host READ host WRITE setHost);
   Q_PROPERTY(int port READ port WRITE setPort);
+  Q_PROPERTY(bool preferCGET READ preferCGET WRITE setPreferCGET);
 
 public:
   explicit ctkDICOMQuery(QObject* parent = 0);
@@ -63,6 +64,10 @@ public:
   /// 0 by default.
   void setPort ( int port );
   int port()const;
+  /// Prefer CGET over CMOVE for retrieval of query results
+  /// false by default
+  void setPreferCGET ( bool preferCGET );
+  bool preferCGET()const;
 
   /// Query a remote DICOM Image Store SCP
   /// You must at least set the host and port before calling query()

+ 8 - 0
Libs/DICOM/Widgets/Resources/UI/ctkDICOMServerNodeWidget.ui

@@ -66,6 +66,9 @@
      <layout class="QVBoxLayout" name="verticalLayout">
       <item>
        <widget class="QTableWidget" name="NodeTable">
+        <property name="columnCount">
+         <number>5</number>
+        </property>
         <attribute name="horizontalHeaderStretchLastSection">
          <bool>true</bool>
         </attribute>
@@ -92,6 +95,11 @@
           <string>Port</string>
          </property>
         </column>
+        <column>
+         <property name="text">
+          <string>CGET</string>
+         </property>
+        </column>
        </widget>
       </item>
      </layout>

+ 8 - 3
Libs/DICOM/Widgets/ctkDICOMQueryRetrieveWidget.cpp

@@ -303,9 +303,14 @@ void ctkDICOMQueryRetrieveWidget::retrieve()
     try
       {
       // perform the retrieve
-      // TODO: give the option to use MOVE instead of CGET
-      //retrieve->moveStudy ( studyUID );
-      retrieve->getStudy ( studyUID );
+      if ( query->preferCGET() )
+        {
+        retrieve->getStudy ( studyUID );
+        }
+      else
+        {
+        retrieve->moveStudy ( studyUID );
+        }
       }
     catch (std::exception e)
       {

+ 9 - 2
Libs/DICOM/Widgets/ctkDICOMServerNodeWidget.cpp

@@ -60,7 +60,7 @@ ctkDICOMServerNodeWidget::ctkDICOMServerNodeWidget(QWidget* parentWidget)
   d->setupUi(this);
 
   // checkable headers.
-  d->NodeTable->model()->setHeaderData(0, Qt::Horizontal, Qt::Unchecked, Qt::CheckStateRole);
+  d->NodeTable->model()->setHeaderData(NameColumn, Qt::Horizontal, Qt::Unchecked, Qt::CheckStateRole);
   QHeaderView* previousHeaderView = d->NodeTable->horizontalHeader();
   ctkCheckableHeaderView* headerView = new ctkCheckableHeaderView(Qt::Horizontal, d->NodeTable);
   headerView->setClickable(previousHeaderView->isClickable());
@@ -128,6 +128,9 @@ int ctkDICOMServerNodeWidget::addServerNode(const QMap<QString, QVariant>& node)
   d->NodeTable->setItem(row, AddressColumn, newItem);
   newItem = new QTableWidgetItem( node["Port"].toString() );
   d->NodeTable->setItem(row, PortColumn, newItem);
+  newItem = new QTableWidgetItem( QString("") );
+  newItem->setCheckState( Qt::CheckState(node["CGET"].toInt()) );
+  d->NodeTable->setItem(row, CGETColumn, newItem);
   return row;
 }
 
@@ -193,6 +196,7 @@ void ctkDICOMServerNodeWidget::readSettings()
     defaultServerNode["AETitle"] = QString("AETITLE");
     defaultServerNode["Address"] = QString("dicom.example.com");
     defaultServerNode["Port"] = QString("11112");
+    defaultServerNode["CGET"] = Qt::Unchecked;
     this->addServerNode(defaultServerNode);
 
     // the uk example - see http://www.dicomserver.co.uk/ 
@@ -202,6 +206,7 @@ void ctkDICOMServerNodeWidget::readSettings()
     defaultServerNode["AETitle"] = QString("ANYAE");
     defaultServerNode["Address"] = QString("dicomserver.co.uk");
     defaultServerNode["Port"] = QString("11112");
+    defaultServerNode["CGET"] = Qt::Checked;
     this->addServerNode(defaultServerNode);
 
     return;
@@ -335,6 +340,8 @@ QMap<QString, QVariant> ctkDICOMServerNodeWidget::serverNodeParameters(int row)c
     node[label] = d->NodeTable->item(row, column)->data(Qt::DisplayRole);
     }
   node["CheckState"] = d->NodeTable->item(row, NameColumn) ?
-    d->NodeTable->item(row,0)->checkState() : Qt::Unchecked;
+    d->NodeTable->item(row,NameColumn)->checkState() : Qt::Unchecked;
+  node["CGET"] = d->NodeTable->item(row, CGETColumn) ?
+    d->NodeTable->item(row,CGETColumn)->checkState() : Qt::Unchecked;
   return node;
 }

+ 2 - 1
Libs/DICOM/Widgets/ctkDICOMServerNodeWidget.h

@@ -82,7 +82,8 @@ protected:
     NameColumn = 0,
     AETitleColumn,
     AddressColumn,
-    PortColumn
+    PortColumn,
+    CGETColumn
   };
 private:
   Q_DECLARE_PRIVATE(ctkDICOMServerNodeWidget);