Browse Source

make the scan-folder and scans levels available in the new API

Nicolas Toussaint 12 years ago
parent
commit
4b500619a7

+ 4 - 4
Libs/XNAT/Core/CMakeLists.txt

@@ -14,14 +14,14 @@ set(KIT_SRCS
   ctkXnatObject.cpp
   ctkXnatObjectPrivate.cpp
   ctkXnatProject.cpp
+  ctkXnatScan.cpp
+  ctkXnatScanFolder.cpp
+  #ctkXnatScanResource.cpp
+  #ctkXnatScanResourceFile.cpp
   #ctkXnatReconstruction.cpp
   #ctkXnatReconstructionFolder.cpp
   #ctkXnatReconstructionResource.cpp
   #ctkXnatReconstructionResourceFile.cpp
-  #ctkXnatScan.cpp
-  #ctkXnatScanFolder.cpp
-  #ctkXnatScanResource.cpp
-  #ctkXnatScanResourceFile.cpp
   ctkXnatServer.cpp
   ctkXnatSettings.cpp
   ctkXnatSubject.cpp

+ 161 - 177
Libs/XNAT/Core/ctkXnatConnection.cpp

@@ -232,111 +232,87 @@ void ctkXnatConnection::fetch(const QSharedPointer<ctkXnatExperiment>& experimen
   const QString& projectName = project->getId();
 
   Q_D(ctkXnatConnection);
-
+  
   QString query = QString("/REST/projects/%1/subjects/%2/experiments/%3/scans").arg(projectName, subjectName, experimentName);
   QUuid queryId = d->xnat->get(query);
   qRestResult* restResult = d->xnat->takeResult(queryId);
+  
+  QList<ctkXnatScan*> scans = restResult->results<ctkXnatScan>();
+  
+  if (scans.size() > 0)
+  {
+    ctkXnatObject::Pointer ptr = ctkXnatScanFolder::Create();
+    ptr->d_func()->selfPtr = ptr;
+    // experiment->addChild("Scan", scanFolder);
+    experiment->addChild(ptr);
+  }
+  
+  /** The reconstruction scans are not supported by XNAT so we don't fetch them
+
+      query = QString("/REST/projects/%1/subjects/%2/experiments/%3/reconstructions").arg(projectName, subjectName, experimentName);
+      queryId = d->xnat->get(query);
+      restResult = d->xnat->takeResult(queryId);
+      QList<ctkXnatReconstruction*> rconstructions = restResult->results<ctkXnatReconstruction>();
+      if (reconstructions.size() > 0)
+      {
+        ctkXnatReconstructionFolder* reconstructionFolder = new ctkXnatReconstructionFolder(experiment);
+        experiment->addChild("Reconstruction", reconstructionFolder);
+      }
+  */
 
-//  QList<ctkXnatExperiment*> scans = restResult->results<ctkXnatScan>();
-
-
-//  QString query = QString("/REST/projects/%1/subjects/%2/experiments/%3/scans").arg(projectName, subjectName, experimentName);
-//  QList<QVariantMap> result;
-//  bool success = d->xnat->sync(d->xnat->get(query), result);
-//  if (!success)
-//  {
-//    throw ctkXnatException("Error occurred while retrieving scan list from XNAT.");
-//  }
-
-//  int scanNumber = result.size();
-
-//  query = QString("/REST/projects/%1/subjects/%2/experiments/%3/reconstructions").arg(projectName, subjectName, experimentName);
-//  success = d->xnat->sync(d->xnat->get(query), result);
-//  if (!success)
-//  {
-//    throw ctkXnatException("Error occurred while retrieving reconstruction list from XNAT.");
-//  }
-
-//  int reconstructionNumber = result.size();
-
-//  if (scanNumber > 0)
-//  {
-//    ctkXnatScanFolder* scanFolder = new ctkXnatScanFolder(experiment);
-//    experiment->addChild("Scan", scanFolder);
-//  }
-
-//  if (reconstructionNumber > 0)
-//  {
-//    ctkXnatReconstructionFolder* reconstructionFolder = new ctkXnatReconstructionFolder(experiment);
-//    experiment->addChild("Reconstruction", reconstructionFolder);
-//  }
-
-
+  delete restResult;
 }
 
-//void ctkXnatConnection::fetch(ctkXnatScanFolder* scanFolder)
-//{
-//  ctkXnatObject* experiment = scanFolder->getParent();
-//  const QString& experimentName = experiment->getName();
-//  ctkXnatObject* subject = experiment->getParent();
-//  const QString& subjectName = subject->getName();
-//  ctkXnatObject* project = subject->getParent();
-//  const QString& projectName = project->getName();
-
-//  Q_D(ctkXnatConnection);
-
-//  QString query = QString("/REST/projects/%1/subjects/%2/experiments/%3/scans").arg(projectName, subjectName, experimentName);
-//  QList<QVariantMap> result;
-//  bool success = d->xnat->sync(d->xnat->get(query), result);
-//  if (!success)
-//  {
-//    throw ctkXnatException("Error occurred while retrieving scan list from XNAT.");
-//  }
-
-//  foreach (QVariantMap map, result)
-//  {
-//    ctkXnatScan* scan = new ctkXnatScan(scanFolder);
-//    QString scanID = map["ID"].toString();
-//    scanFolder->addChild(scanID, scan);
-//  }
-////  QUuid queryId = d->xnat->get(query);
-////  qRestResult* restResult = d->xnat->takeResult(queryId);
-////  QList<ctkXnatScan*> scans = restResult->results<ctkXnatScan>();
-////
-////  foreach (ctkXnatScan* scan, scans)
-////  {
-////    experiment->addChild(scan->id(), scan);
-////  }
-////  delete restResult;
-//}
-
-//void ctkXnatConnection::fetch(ctkXnatScan* scan)
-//{
-//  const QString& scanName = scan->getName();
-//  ctkXnatObject* experiment = scan->getParent()->getParent();
-//  const QString& experimentName = experiment->getName();
-//  ctkXnatObject* subject = experiment->getParent();
-//  const QString& subjectName = subject->getName();
-//  ctkXnatObject* project = subject->getParent();
-//  const QString& projectName = project->getName();
-
-//  Q_D(ctkXnatConnection);
+void ctkXnatConnection::fetch(const QSharedPointer<ctkXnatScanFolder>& scanFolder)
+{
+  ctkXnatObject::Pointer experiment = scanFolder->getParent();
+  const QString& experimentName = experiment->getId();
+  ctkXnatObject::Pointer subject = experiment->getParent();
+  const QString& subjectName = subject->getId();
+  ctkXnatObject::Pointer project = subject->getParent();
+  const QString& projectName = project->getId();
+  
+  Q_D(ctkXnatConnection);
+  
+  QString query = QString("/REST/projects/%1/subjects/%2/experiments/%3/scans").arg(projectName, subjectName, experimentName);
+  QUuid queryId = d->xnat->get(query);
+  qRestResult* restResult = d->xnat->takeResult(queryId);
 
-//  QString query = QString("/REST/projects/%1/subjects/%2/experiments/%3/scans/%4/resources").arg(projectName, subjectName, experimentName, scanName);
-//  QList<QVariantMap> result;
-//  bool success = d->xnat->sync(d->xnat->get(query), result);
-//  if (!success)
-//  {
-//    throw ctkXnatException("Error occurred while retrieving scan resource list from XNAT.");
-//  }
+  QList<ctkXnatScan*> scans = restResult->results<ctkXnatScan>();
+  
+  foreach (ctkXnatScan* scan, scans)
+  {
+    ctkXnatObject::Pointer ptr(scan);
+    ptr->d_func()->selfPtr = ptr;
+    scanFolder->addChild(ptr);
+  }
+  
+  delete restResult;
+  
+}
 
-//  foreach (QVariantMap map, result)
-//  {
-//    QString scanResourceLabel = map["label"].toString();
-//    ctkXnatScanResource* scanResource = new ctkXnatScanResource(scan);
-//    scan->addChild(scanResourceLabel, scanResource);
-//  }
-//}
+void ctkXnatConnection::fetch(const QSharedPointer<ctkXnatScan>& scan)
+{
+  const QString& scanName = scan->getId();
+  ctkXnatObject::Pointer experiment = scan->getParent()->getParent();
+  const QString& experimentName = experiment->getId();
+  ctkXnatObject::Pointer subject = experiment->getParent();
+  const QString& subjectName = subject->getId();
+  ctkXnatObject::Pointer project = subject->getParent();
+  const QString& projectName = project->getId();
+  
+  Q_D(ctkXnatConnection);
+  
+  QString query = QString("/REST/projects/%1/subjects/%2/experiments/%3/scans/%4/resources").arg(projectName, subjectName, experimentName, scanName);
+  // QList<ctkXnatScanResource*> resources = restResult->results<ctkXnatScanResource>();
+  
+  // foreach (resource, resources)
+  // {
+  //   ctkXnatObject::Pointer ptr(resource);
+  //   ptr->d_func()->selfPtr = ptr;
+  //   scan->addChild(ptr);
+  // }
+}
 
 //void ctkXnatConnection::fetch(ctkXnatScanResource* scanResource)
 //{
@@ -368,90 +344,98 @@ void ctkXnatConnection::fetch(const QSharedPointer<ctkXnatExperiment>& experimen
 //  }
 //}
 
-//void ctkXnatConnection::fetch(ctkXnatReconstructionFolder* reconstructionFolder)
-//{
-//  ctkXnatObject* experiment = reconstructionFolder->getParent();
-//  const QString& experimentName = experiment->getName();
-//  ctkXnatObject* subject = experiment->getParent();
-//  const QString& subjectName = subject->getName();
-//  ctkXnatObject* project = subject->getParent();
-//  const QString& projectName = project->getName();
-
-//  Q_D(ctkXnatConnection);
-
-//  QString query = QString("/REST/projects/%1/subjects/%2/experiments/%3/reconstructions").arg(projectName, subjectName, experimentName);
-//  QList<QVariantMap> result;
-//  bool success = d->xnat->sync(d->xnat->get(query), result);
-//  if (!success)
-//  {
-//    throw ctkXnatException("Error occurred while retrieving reconstruction list from XNAT.");
-//  }
-
-//  foreach (QVariantMap map, result)
-//  {
-//    QString reconstructionID = map["ID"].toString();
-//    ctkXnatReconstruction* reconstruction = new ctkXnatReconstruction(reconstructionFolder);
-//    reconstructionFolder->addChild(reconstructionID, reconstruction);
-//  }
-//}
-
-//void ctkXnatConnection::fetch(ctkXnatReconstruction* reconstruction)
-//{
-//  const QString& reconstructionName = reconstruction->getName();
-//  ctkXnatObject* experiment = reconstruction->getParent()->getParent();
-//  const QString& experimentName = experiment->getName();
-//  ctkXnatObject* subject = experiment->getParent();
-//  const QString& subjectName = subject->getName();
-//  ctkXnatObject* project = subject->getParent();
-//  const QString& projectName = project->getName();
-
-//  Q_D(ctkXnatConnection);
 
-//  QString query = QString("/REST/projects/%1/subjects/%2/experiments/%3/reconstructions/%4/ALL/resources").arg(projectName, subjectName, experimentName, reconstructionName);
-//  QList<QVariantMap> result;
-//  bool success = d->xnat->sync(d->xnat->get(query), result);
-//  if (!success)
-//  {
-//    throw ctkXnatException("Error occurred while retrieving reconstruction resource list from XNAT.");
-//  }
 
-//  foreach (QVariantMap map, result)
-//  {
-//    QString reconstructionResourceLabel = map["label"].toString();
-//    ctkXnatReconstructionResource* reconstructionResource = new ctkXnatReconstructionResource(reconstruction);
-//    reconstruction->addChild(reconstructionResourceLabel, reconstructionResource);
-//  }
-//}
+  /** The reconstruction scans are not supported by XNAT so we don't fetch them
+
+      void ctkXnatConnection::fetch(ctkXnatReconstructionFolder* reconstructionFolder)
+      {
+      ctkXnatObject* experiment = reconstructionFolder->getParent();
+      const QString& experimentName = experiment->getName();
+      ctkXnatObject* subject = experiment->getParent();
+      const QString& subjectName = subject->getName();
+      ctkXnatObject* project = subject->getParent();
+      const QString& projectName = project->getName();
+
+      Q_D(ctkXnatConnection);
+
+      QString query = QString("/REST/projects/%1/subjects/%2/experiments/%3/reconstructions").arg(projectName, subjectName, experimentName);
+      QList<QVariantMap> result;
+      bool success = d->xnat->sync(d->xnat->get(query), result);
+      if (!success)
+      {
+      throw ctkXnatException("Error occurred while retrieving reconstruction list from XNAT.");
+      }
+
+      foreach (QVariantMap map, result)
+      {
+      QString reconstructionID = map["ID"].toString();
+      ctkXnatReconstruction* reconstruction = new ctkXnatReconstruction(reconstructionFolder);
+      reconstructionFolder->addChild(reconstructionID, reconstruction);
+      }
+      }
+
+      void ctkXnatConnection::fetch(ctkXnatReconstruction* reconstruction)
+      {
+      const QString& reconstructionName = reconstruction->getName();
+      ctkXnatObject* experiment = reconstruction->getParent()->getParent();
+      const QString& experimentName = experiment->getName();
+      ctkXnatObject* subject = experiment->getParent();
+      const QString& subjectName = subject->getName();
+      ctkXnatObject* project = subject->getParent();
+      const QString& projectName = project->getName();
+
+      Q_D(ctkXnatConnection);
+
+      QString query = QString("/REST/projects/%1/subjects/%2/experiments/%3/reconstructions/%4/ALL/resources").arg(projectName, subjectName, experimentName, reconstructionName);
+      QList<QVariantMap> result;
+      bool success = d->xnat->sync(d->xnat->get(query), result);
+      if (!success)
+      {
+      throw ctkXnatException("Error occurred while retrieving reconstruction resource list from XNAT.");
+      }
+
+      foreach (QVariantMap map, result)
+      {
+      QString reconstructionResourceLabel = map["label"].toString();
+      ctkXnatReconstructionResource* reconstructionResource = new ctkXnatReconstructionResource(reconstruction);
+      reconstruction->addChild(reconstructionResourceLabel, reconstructionResource);
+      }
+      }
+
+      void ctkXnatConnection::fetch(ctkXnatReconstructionResource* reconstructionResource)
+      {
+      const QString& resourceName = reconstructionResource->getName();
+      ctkXnatObject* reconstruction = reconstructionResource->getParent();
+      const QString& reconstructionName = reconstruction->getName();
+      ctkXnatObject* experiment = reconstruction->getParent()->getParent();
+      const QString& experimentName = experiment->getName();
+      ctkXnatObject* subject = experiment->getParent();
+      const QString& subjectName = subject->getName();
+      ctkXnatObject* project = subject->getParent();
+      const QString& projectName = project->getName();
+
+      Q_D(ctkXnatConnection);
+
+      QString query = QString("/REST/projects/%1/subjects/%2/experiments/%3/reconstructions/%4/ALL/resources/%5/files").arg(projectName, subjectName, experimentName, reconstructionName, resourceName);
+      QList<QVariantMap> result;
+      bool success = d->xnat->sync(d->xnat->get(query), result);
+      if (!success)
+      {
+      throw ctkXnatException("Error occurred while retrieving reconstruction resource file list from XNAT.");
+      }
+
+      foreach (QVariantMap map, result)
+      {
+      QString reconstructionResourceFileName = map["Name"].toString();
+      ctkXnatReconstructionResourceFile* reconstructionResourceFile = new ctkXnatReconstructionResourceFile(reconstructionResource);
+      reconstructionResource->addChild(reconstructionResourceFileName, reconstructionResourceFile);
+      }
+      }
+
+  */
 
-//void ctkXnatConnection::fetch(ctkXnatReconstructionResource* reconstructionResource)
-//{
-//  const QString& resourceName = reconstructionResource->getName();
-//  ctkXnatObject* reconstruction = reconstructionResource->getParent();
-//  const QString& reconstructionName = reconstruction->getName();
-//  ctkXnatObject* experiment = reconstruction->getParent()->getParent();
-//  const QString& experimentName = experiment->getName();
-//  ctkXnatObject* subject = experiment->getParent();
-//  const QString& subjectName = subject->getName();
-//  ctkXnatObject* project = subject->getParent();
-//  const QString& projectName = project->getName();
-
-//  Q_D(ctkXnatConnection);
-
-//  QString query = QString("/REST/projects/%1/subjects/%2/experiments/%3/reconstructions/%4/ALL/resources/%5/files").arg(projectName, subjectName, experimentName, reconstructionName, resourceName);
-//  QList<QVariantMap> result;
-//  bool success = d->xnat->sync(d->xnat->get(query), result);
-//  if (!success)
-//  {
-//    throw ctkXnatException("Error occurred while retrieving reconstruction resource file list from XNAT.");
-//  }
 
-//  foreach (QVariantMap map, result)
-//  {
-//    QString reconstructionResourceFileName = map["Name"].toString();
-//    ctkXnatReconstructionResourceFile* reconstructionResourceFile = new ctkXnatReconstructionResourceFile(reconstructionResource);
-//    reconstructionResource->addChild(reconstructionResourceFileName, reconstructionResourceFile);
-//  }
-//}
 
 //void ctkXnatConnection::create(ctkXnatProject* project)
 //{

+ 2 - 2
Libs/XNAT/Core/ctkXnatConnection.h

@@ -77,8 +77,8 @@ public:
   void fetch(const QSharedPointer<ctkXnatProject>& project);
   void fetch(const QSharedPointer<ctkXnatSubject>& subject);
   void fetch(const QSharedPointer<ctkXnatExperiment>& experiment);
-//  void fetch(ctkXnatScanFolder* scanFolder);
-//  void fetch(ctkXnatScan* scan);
+  void fetch(const QSharedPointer<ctkXnatScanFolder>& scanFolder);
+  void fetch(const QSharedPointer<ctkXnatScan>& scan);
 //  void fetch(ctkXnatScanResource* scanResource);
 //  void fetch(ctkXnatReconstructionFolder* reconstructionFolder);
 //  void fetch(ctkXnatReconstruction* reconstruction);

+ 6 - 10
Libs/XNAT/Core/ctkXnatExperiment.h

@@ -29,29 +29,25 @@
 class ctkXnatConnection;
 class ctkXnatExperimentPrivate;
 
-
 class CTK_XNAT_CORE_EXPORT ctkXnatExperiment : public ctkXnatObject
 {
-
+  
 public:
-
+  
   typedef QSharedPointer<ctkXnatExperiment> Pointer;
   typedef QWeakPointer<ctkXnatExperiment> WeakPointer;
   
   static Pointer Create();
   virtual ~ctkXnatExperiment();
-
-  const QString& project() const;
-  void setProject(const QString& project);
-
+  
   const QString& uri() const;
   void setUri(const QString& uri);
-
+  
   virtual void reset();
   virtual void remove();
-
+  
 private:
-
+  
   friend class qRestResult;
   explicit ctkXnatExperiment();
   virtual void fetchImpl();

+ 34 - 103
Libs/XNAT/Core/ctkXnatScan.cpp

@@ -22,113 +22,41 @@
 #include "ctkXnatScan.h"
 
 #include "ctkXnatConnection.h"
-#include "ctkXnatScanResource.h"
+#include "ctkXnatObjectPrivate.h"
+// #include "ctkXnatScanResource.h"
 
-class ctkXnatScanPrivate
+class ctkXnatScanPrivate : public ctkXnatObjectPrivate
 {
 public:
-  QString imageScanId;
-  QString id;
-  QString type;
-  QString quality;
-  QString xsiType;
-  QString note;
-  QString seriesDescription;
-  QString uri;
-};
-
-ctkXnatScan::ctkXnatScan(ctkXnatObject* parent)
-: ctkXnatObject(parent)
-, d_ptr(new ctkXnatScanPrivate())
-{
-}
-
-ctkXnatScan::~ctkXnatScan()
-{
-}
-
-const QString& ctkXnatScan::imageScanId() const
-{
-  Q_D(const ctkXnatScan);
-  return d->imageScanId;
-}
-
-void ctkXnatScan::setImageScanId(const QString& imageScanId)
-{
-  Q_D(ctkXnatScan);
-  d->imageScanId = imageScanId;
-}
-
-const QString& ctkXnatScan::id() const
-{
-  Q_D(const ctkXnatScan);
-  return d->id;
-}
-
-void ctkXnatScan::setId(const QString& id)
-{
-  Q_D(ctkXnatScan);
-  d->id = id;
-}
-
-const QString& ctkXnatScan::type() const
-{
-  Q_D(const ctkXnatScan);
-  return d->type;
-}
-
-void ctkXnatScan::setType(const QString& type)
-{
-  Q_D(ctkXnatScan);
-  d->type = type;
-}
 
-const QString& ctkXnatScan::quality() const
-{
-  Q_D(const ctkXnatScan);
-  return d->quality;
-}
+  ctkXnatScanPrivate()
+  : ctkXnatObjectPrivate()
+  {
+  }
 
-void ctkXnatScan::setQuality(const QString& quality)
-{
-  Q_D(ctkXnatScan);
-  d->quality = quality;
-}
-
-const QString& ctkXnatScan::xsiType() const
-{
-  Q_D(const ctkXnatScan);
-  return d->xsiType;
-}
-
-void ctkXnatScan::setXsiType(const QString& xsiType)
-{
-  Q_D(ctkXnatScan);
-  d->xsiType = xsiType;
-}
+  void reset()
+  {
+    uri.clear();
+  }
+  
+  QString uri;
+};
 
-const QString& ctkXnatScan::note() const
-{
-  Q_D(const ctkXnatScan);
-  return d->note;
-}
 
-void ctkXnatScan::setNote(const QString& note)
+ctkXnatScan::ctkXnatScan()
+: ctkXnatObject(new ctkXnatScanPrivate())
 {
-  Q_D(ctkXnatScan);
-  d->note = note;
 }
 
-const QString& ctkXnatScan::seriesDescription() const
+ctkXnatScan::Pointer ctkXnatScan::Create()
 {
-  Q_D(const ctkXnatScan);
-  return d->seriesDescription;
+  Pointer experiment(new ctkXnatScan());
+  experiment->d_func()->selfPtr = experiment;
+  return experiment;
 }
 
-void ctkXnatScan::setSeriesDescription(const QString& seriesDescription)
+ctkXnatScan::~ctkXnatScan()
 {
-  Q_D(ctkXnatScan);
-  d->seriesDescription = seriesDescription;
 }
 
 const QString& ctkXnatScan::uri() const
@@ -143,22 +71,25 @@ void ctkXnatScan::setUri(const QString& uri)
   d->uri = uri;
 }
 
-void ctkXnatScan::fetch(ctkXnatConnection* connection)
+void ctkXnatScan::reset()
 {
-  connection->fetch(this);
+  Q_D(ctkXnatScan);
+  ctkXnatObject::reset();
 }
 
-void ctkXnatScan::download(ctkXnatConnection* connection, const QString& zipFileName)
+void ctkXnatScan::fetchImpl()
 {
-  connection->download(this, zipFileName);
+  Q_D(ctkXnatScan);
+  ctkXnatObject::Pointer self = d->selfPtr;
+  this->getConnection()->fetch(self.staticCast<ctkXnatScan>());
 }
 
-QString ctkXnatScan::getKind() const
+void ctkXnatScan::remove()
 {
-  return "resource";
+  //connection->remove(this);
 }
 
-bool ctkXnatScan::holdsFiles() const
-{
-  return true;
-}
+// void ctkXnatScan::download(ctkXnatConnection* connection, const QString& zipFileName)
+// {
+//   connection->download(this, zipFileName);
+// }

+ 15 - 33
Libs/XNAT/Core/ctkXnatScan.h

@@ -33,43 +33,25 @@ class CTK_XNAT_CORE_EXPORT ctkXnatScan : public ctkXnatObject
 {
 
 public:
-  explicit ctkXnatScan(ctkXnatObject* parent = 0);
-  virtual ~ctkXnatScan();
-
-  const QString& imageScanId() const;
-  void setImageScanId(const QString& imageScanId);
-
-  const QString& id() const;
-  void setId(const QString& id);
-
-  const QString& type() const;
-  void setType(const QString& type);
-
-  const QString& quality() const;
-  void setQuality(const QString& quality);
-
-  const QString& xsiType() const;
-  void setXsiType(const QString& xsiType);
-
-  const QString& note() const;
-  void setNote(const QString& note);
-
-  const QString& seriesDescription() const;
-  void setSeriesDescription(const QString& seriesDescription);
 
+  typedef QSharedPointer<ctkXnatScan> Pointer;
+  typedef QWeakPointer<ctkXnatScan> WeakPointer;
+  
+  static Pointer Create();
+  virtual ~ctkXnatScan();
+  
   const QString& uri() const;
   void setUri(const QString& uri);
-
-  virtual void fetch(ctkXnatConnection* connection);
-
-  virtual void download(ctkXnatConnection* connection, const QString& zipFilename);
-
-  virtual QString getKind() const;
-  virtual bool holdsFiles() const;
-
+  
+  virtual void reset();
+  virtual void remove();
+  
 private:
-  QScopedPointer<ctkXnatScanPrivate> d_ptr;
-
+  
+  friend class qRestResult;
+  explicit ctkXnatScan();
+  virtual void fetchImpl();
+  
   Q_DECLARE_PRIVATE(ctkXnatScan);
   Q_DISABLE_COPY(ctkXnatScan);
 };

+ 53 - 12
Libs/XNAT/Core/ctkXnatScanFolder.cpp

@@ -22,34 +22,75 @@
 #include "ctkXnatScanFolder.h"
 
 #include "ctkXnatConnection.h"
-#include "ctkXnatExperiment.h"
-#include "ctkXnatScan.h"
+#include "ctkXnatObjectPrivate.h"
 
-ctkXnatScanFolder::ctkXnatScanFolder(ctkXnatObject* parent)
-: ctkXnatObject(parent)
+
+class ctkXnatScanFolderPrivate : public ctkXnatObjectPrivate
 {
+public:
+
+  ctkXnatScanFolderPrivate()
+  : ctkXnatObjectPrivate()
+  {
+  }
+
+  void reset()
+  {
+    uri.clear();
+  }
+  
+  QString uri;
+};
+
+
+ctkXnatScanFolder::ctkXnatScanFolder()
+: ctkXnatObject(new ctkXnatScanFolderPrivate())
+{
+  this->setProperty("ID", "Scans");
+}
+
+ctkXnatScanFolder::Pointer ctkXnatScanFolder::Create()
+{
+  Pointer experiment(new ctkXnatScanFolder());
+  experiment->d_func()->selfPtr = experiment;
+  return experiment;
 }
 
 ctkXnatScanFolder::~ctkXnatScanFolder()
 {
 }
 
-void ctkXnatScanFolder::fetch(ctkXnatConnection* connection)
+const QString& ctkXnatScanFolder::uri() const
+{
+  Q_D(const ctkXnatScanFolder);
+  return d->uri;
+}
+
+void ctkXnatScanFolder::setUri(const QString& uri)
 {
-  connection->fetch(this);
+  Q_D(ctkXnatScanFolder);
+  d->uri = uri;
 }
 
-void ctkXnatScanFolder::download(ctkXnatConnection* connection, const QString& zipFileName)
+void ctkXnatScanFolder::reset()
 {
-  connection->downloadScanFiles(dynamic_cast<ctkXnatExperiment*>(getParent()), zipFileName);
+  Q_D(ctkXnatScanFolder);
+  ctkXnatObject::reset();
 }
 
-QString ctkXnatScanFolder::getKind() const
+void ctkXnatScanFolder::fetchImpl()
 {
-  return "scan";
+  Q_D(ctkXnatScanFolder);
+  ctkXnatObject::Pointer self = d->selfPtr;
+  this->getConnection()->fetch(self.staticCast<ctkXnatScanFolder>());
 }
 
-bool ctkXnatScanFolder::holdsFiles() const
+void ctkXnatScanFolder::remove()
 {
-  return true;
+  //connection->remove(this);
 }
+
+// void ctkXnatScanFolder::download(ctkXnatConnection* connection, const QString& zipFileName)
+// {
+//   connection->downloadScanFiles(dynamic_cast<ctkXnatExperiment*>(getParent()), zipFileName);
+// }

+ 21 - 9
Libs/XNAT/Core/ctkXnatScanFolder.h

@@ -27,21 +27,33 @@
 #include "ctkXnatObject.h"
 
 class ctkXnatConnection;
+class ctkXnatScanFolderPrivate;
 
 class CTK_XNAT_CORE_EXPORT ctkXnatScanFolder : public ctkXnatObject
 {
-  Q_OBJECT
 
 public:
-  explicit ctkXnatScanFolder(ctkXnatObject* parent = 0);
+  
+  typedef QSharedPointer<ctkXnatScanFolder> Pointer;
+  typedef QWeakPointer<ctkXnatScanFolder> WeakPointer;
+  
+  static Pointer Create();
   virtual ~ctkXnatScanFolder();
-
-  virtual void fetch(ctkXnatConnection* connection);
-
-  void download(ctkXnatConnection* connection, const QString& zipFilename);
-
-  virtual QString getKind() const;
-  virtual bool holdsFiles() const;
+  
+  const QString& uri() const;
+  void setUri(const QString& uri);
+  
+  virtual void reset();
+  virtual void remove();
+  
+private:
+  
+  friend class qRestResult;
+  explicit ctkXnatScanFolder();
+  virtual void fetchImpl();
+  
+  Q_DECLARE_PRIVATE(ctkXnatScanFolder);
+  Q_DISABLE_COPY(ctkXnatScanFolder);
 };
 
 #endif